Sierra Toolkit  Version of the Day
stk_utest_macros.hpp
1 /*------------------------------------------------------------------------*/
2 /* Copyright 2010 Sandia Corporation. */
3 /* Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive */
4 /* license for use of this work by or on behalf of the U.S. Government. */
5 /* Export of this program may require a license from the */
6 /* United States Government. */
7 /*------------------------------------------------------------------------*/
8 
9 #ifndef stk_mesh_unit_tests_stk_utest_macros_hpp
10 #define stk_mesh_unit_tests_stk_utest_macros_hpp
11 
12 #ifndef STK_BUILT_IN_SIERRA
13 #include <STKClassic_config.h>
14 #else
15 #define HAVE_MPI
16 #endif
17 #if defined(HAVE_MPI)
18 #include <mpi.h>
19 #endif
20 //
21 //This file is kind of like a unit-test abstraction layer:
22 //A series of STKUNIT_* macros are defined in terms of either
23 //gtest macros, or trilinos/teuchos unit-test macros, depending
24 //on whether stk_mesh is being built as a sierra product or Trilinos package.
25 //
26 #ifdef HAVE_MPI
27 #define RUN_TEST_REDUCE(error) \
28  int tmp_error = error; \
29  int reduce_result = MPI_Allreduce ( &tmp_error, &error, 1 /*count*/, \
30  MPI_INT, MPI_MAX, MPI_COMM_WORLD ); \
31  if (reduce_result != MPI_SUCCESS) { \
32  std::cerr << "MPI_Allreduce FAILED" << std::endl; \
33  error = true; \
34  } \
35  if ( !error ) \
36  std::cout << "STKUNIT_ALL_PASS" << std::endl;
37 #else
38 #define RUN_TEST_REDUCE(error) \
39  if (error != 0) { \
40  std::cerr << "Test FAILED" << std::endl; \
41  error = true; \
42  } \
43  if ( !error ) \
44  std::cout << "STKUNIT_ALL_PASS" << std::endl;
45 #endif
46 
47 
48 #ifdef HAVE_STK_Trilinos
49 //If we're building as a Trilinos package, then we'll use the Teuchos unit-test macros.
50 
51 #include <Teuchos_UnitTestHarness.hpp>
52 #include <Teuchos_UnitTestRepository.hpp>
53 #include <Teuchos_GlobalMPISession.hpp>
54 
55 #define STKUNIT_UNIT_TEST(testclass,testmethod) TEUCHOS_UNIT_TEST(testclass,testmethod)
56 
57 #define STKUNIT_ASSERT(A) \
58  {bool success = true; TEUCHOS_TEST_ASSERT(A,std::cout,success); if (!success) throw 1;}
59 #define STKUNIT_ASSERT_EQUAL(A,B) \
60  {bool success = true; TEUCHOS_TEST_EQUALITY(B,A,std::cout,success); if (!success) throw 1;}
61 #define STKUNIT_EXPECT_EQUAL(A,B) STKUNIT_ASSERT_EQUAL(A,B)
62 #define STKUNIT_ASSERT_EQ(A,B) STKUNIT_ASSERT_EQUAL(A,B)
63 #define STKUNIT_ASSERT_NE(A,B) \
64  {bool success = true; TEUCHOS_TEST_INEQUALITY(B,A,std::cout,success); if (!success) throw 1;}
65 #define STKUNIT_ASSERT_LE(A,B) \
66  {bool success = true; TEUCHOS_TEST_COMPARE(A,<=,B,std::cout,success); if (!success) throw 1;}
67 #define STKUNIT_ASSERT_LT(A,B) \
68  {bool success = true; TEUCHOS_TEST_COMPARE(A,<,B,std::cout,success); if (!success) throw 1;}
69 #define STKUNIT_ASSERT_GE(A,B) \
70  {bool success = true; TEUCHOS_TEST_COMPARE(A,>=,B,std::cout,success); if (!success) throw 1;}
71 #define STKUNIT_ASSERT_GT(A,B) \
72  {bool success = true; TEUCHOS_TEST_COMPARE(A,>,B,std::cout,success); if (!success) throw 1;}
73 #define STKUNIT_EXPECT_EQ(A,B) STKUNIT_ASSERT_EQ(A,B)
74 #define STKUNIT_EXPECT_NE(A,B) STKUNIT_ASSERT_NE(A,B)
75 #define STKUNIT_EXPECT_LE(A,B) STKUNIT_ASSERT_LE(A,B)
76 #define STKUNIT_EXPECT_LT(A,B) STKUNIT_ASSERT_LT(A,B)
77 #define STKUNIT_EXPECT_GE(A,B) STKUNIT_ASSERT_GE(A,B)
78 #define STKUNIT_EXPECT_GT(A,B) STKUNIT_ASSERT_GT(A,B)
79 #define STKUNIT_ASSERT_STREQ(A,B) STKUNIT_ASSERT_EQ(A,B)
80 #define STKUNIT_ASSERT_STRNE(A,B) STKUNIT_ASSERT_NE(A,B)
81 #define STKUNIT_ASSERT_STRCASEEQ(A,B) STKUNIT_ASSERT_STREQ(toupper(A),toupper(B))
82 #define STKUNIT_ASSERT_STRCASENE(A,B) STKUNIT_ASSERT_STRNE(toupper(A),toupper(B))
83 #define STKUNIT_EXPECT_STREQ(A,B) STKUNIT_EXPECT_EQ(A,B)
84 #define STKUNIT_EXPECT_STRNE(A,B) STKUNIT_EXPECT_NE(A,B)
85 #define STKUNIT_EXPECT_STRCASEEQ(A,B) STKUNIT_EXPECT_STREQ(toupper(A),toupper(B))
86 #define STKUNIT_EXPECT_STRCASENE(A,B) STKUNIT_EXPECT_STRNE(toupper(A),toupper(B))
87 #define STKUNIT_ASSERT_THROW(A,B) \
88  {bool success = true; TEUCHOS_TEST_THROW(A,B,std::cout,success); if (!success) throw 1;}
89 #define STKUNIT_ASSERT_NO_THROW(A) \
90  {TEUCHOS_TEST_NOTHROW(A,out,success)}
91 #define STKUNIT_EXPECT_TRUE(A) \
92  {bool success = true; TEUCHOS_TEST_ASSERT(A,std::cout,success); if (!success) throw 1;}
93 #define STKUNIT_EXPECT_FALSE(A) \
94  {bool success = true; TEUCHOS_TEST_ASSERT(!(A),std::cout,success); if (!success) throw 1;}
95 #define STKUNIT_ASSERT_TRUE(A) STKUNIT_EXPECT_TRUE(A)
96 #define STKUNIT_ASSERT_FALSE(A) STKUNIT_EXPECT_FALSE(A)
97 #define STKUNIT_ASSERT_DOUBLE_EQ(A,B) \
98  {bool success = true; TEUCHOS_TEST_EQUALITY(B,A,std::cout,success); if (!success) throw 1;}
99 #define STKUNIT_EXPECT_DOUBLE_EQ(A,B) STKUNIT_ASSERT_DOUBLE_EQ(A,B)
100 #define STKUNIT_ASSERT_NEAR(A,B, tol) \
101  {bool success = true; TEUCHOS_TEST_FLOATING_EQUALITY(B,A,tol,std::cout,success); if (!success) throw 1;}
102 #define STKUNIT_EXPECT_NEAR(A,B, tol) STKUNIT_ASSERT_NEAR(A, B, tol)
103 
104 #define STKUNIT_MAIN(argc,argv) \
105 int* STKUNIT_ARGC; \
106 char** STKUNIT_ARGV; \
107 int main(int argc,char**argv) {\
108 STKUNIT_ARGC = &argc; \
109 STKUNIT_ARGV = argv; \
110  Teuchos::GlobalMPISession mpiSession(&argc, &argv); \
111  int error = Teuchos::UnitTestRepository::runUnitTestsFromMain(argc, argv); \
112  RUN_TEST_REDUCE(error); \
113  return error; \
114 }
115 
116 #else // HAVE_STK_GTEST
117 
118 #include <gtest/gtest.h>
119 
120 #define STKUNIT_ASSERT(A) ASSERT_TRUE(A)
121 #define STKUNIT_ASSERT_EQUAL(A,B) ASSERT_EQ(A,B)
122 #define STKUNIT_EXPECT_EQUAL(A,B) EXPECT_EQ(A,B)
123 #define STKUNIT_ASSERT_EQ(A,B) ASSERT_EQ(A,B)
124 #define STKUNIT_ASSERT_NE(A,B) ASSERT_NE(A,B)
125 #define STKUNIT_ASSERT_LE(A,B) ASSERT_LE(A,B)
126 #define STKUNIT_ASSERT_LT(A,B) ASSERT_LT(A,B)
127 #define STKUNIT_ASSERT_GE(A,B) ASSERT_GE(A,B)
128 #define STKUNIT_ASSERT_GT(A,B) ASSERT_GT(A,B)
129 #define STKUNIT_EXPECT_EQ(A,B) EXPECT_EQ(A,B)
130 #define STKUNIT_EXPECT_NE(A,B) EXPECT_NE(A,B)
131 #define STKUNIT_EXPECT_LE(A,B) EXPECT_LE(A,B)
132 #define STKUNIT_EXPECT_LT(A,B) EXPECT_LT(A,B)
133 #define STKUNIT_EXPECT_GE(A,B) EXPECT_GE(A,B)
134 #define STKUNIT_EXPECT_GT(A,B) EXPECT_GT(A,B)
135 #define STKUNIT_ASSERT_STREQ(A,B) ASSERT_STREQ(A,B)
136 #define STKUNIT_ASSERT_STRNE(A,B) ASSERT_STRNE(A,B)
137 #define STKUNIT_ASSERT_STRCASEEQ(A,B) ASSERT_STRCASEEQ(A,B)
138 #define STKUNIT_ASSERT_STRCASENE(A,B) ASSERT_STRCASENE(A,B)
139 #define STKUNIT_EXPECT_STREQ(A,B) EXPECT_STREQ(A,B)
140 #define STKUNIT_EXPECT_STRNE(A,B) EXPECT_STRNE(A,B)
141 #define STKUNIT_EXPECT_STRCASEEQ(A,B) EXPECT_STRCASEEQ(A,B)
142 #define STKUNIT_EXPECT_STRCASENE(A,B) EXPECT_STRCASENE(A,B)
143 #define STKUNIT_ASSERT_THROW(A,B) ASSERT_THROW(A,B)
144 #define STKUNIT_ASSERT_NO_THROW(A) ASSERT_NO_THROW(A)
145 #define STKUNIT_EXPECT_TRUE(A) EXPECT_TRUE(A)
146 #define STKUNIT_EXPECT_FALSE(A) EXPECT_FALSE(A)
147 #define STKUNIT_ASSERT_TRUE(A) ASSERT_TRUE(A)
148 #define STKUNIT_ASSERT_FALSE(A) ASSERT_FALSE(A)
149 #define STKUNIT_ASSERT_DOUBLE_EQ(A,B) ASSERT_DOUBLE_EQ(A,B)
150 #define STKUNIT_EXPECT_DOUBLE_EQ(A,B) EXPECT_DOUBLE_EQ(A,B)
151 #define STKUNIT_ASSERT_NEAR(A,B,tol) ASSERT_NEAR(A,B,tol)
152 #define STKUNIT_EXPECT_NEAR(A,B,tol) EXPECT_NEAR(A,B,tol)
153 
154 #define STKUNIT_UNIT_TEST(testclass,testmethod) TEST(testclass,testmethod)
155 
156 #define STKUNIT_MAIN(argc,argv) \
157 int* STKUNIT_ARGC; \
158 char** STKUNIT_ARGV; \
159 int main(int argc, char **argv) { \
160  if ( MPI_SUCCESS != MPI_Init( & argc , & argv ) ) { \
161  std::cerr << "MPI_Init FAILED" << std::endl ; \
162  std::abort(); \
163  } \
164  STKUNIT_ARGC = &argc; \
165  STKUNIT_ARGV = argv; \
166  std::cout << "Running main() from gtest_main.cc\n"; \
167  testing::InitGoogleTest(&argc, argv); \
168  int error = RUN_ALL_TESTS(); \
169  RUN_TEST_REDUCE(error); \
170  MPI_Finalize(); \
171  return error; \
172 }
173 
174 #define STKUNIT_WITH_TRACING_MAIN(argc, argv) \
175 int* STKUNIT_ARGC; \
176 char** STKUNIT_ARGV; \
177 int main(int argc, char **argv) { \
178  use_case::UseCaseEnvironment use_case_environment(&argc, &argv); \
179  std::cout << "Running main() from gtest_main.cc\n"; \
180  testing::InitGoogleTest(&argc, argv); \
181  STKUNIT_ARGC = &argc; \
182  STKUNIT_ARGV = argv; \
183  int error = RUN_ALL_TESTS(); \
184  RUN_TEST_REDUCE(error); \
185  return error; \
186 }
187 
188 #define STKUNIT_WITH_SIERRA_MAIN(argc,argv,prod) \
189 int main(int argc, char **argv) { \
190  sierra::Env::set_input_file_required(false); \
191  testing::InitGoogleTest(&argc, argv); \
192  sierra::Env::Startup startup__(&argc, &argv, sierra::prod::get_product_name(), __DATE__ " " __TIME__); \
193  int error = RUN_ALL_TESTS(); \
194  RUN_TEST_REDUCE(error); \
195  return error; \
196 }
197 
198 #endif // HAVE_STK_Trilinos
199 
200 #endif // stk_mesh_unit_tests_stk_utest_macros_hpp
201