#ifndef h_test_framework #define h_test_framework #ifndef TOL_EQ_TEST #define TOL_EQ_TEST 1e-9 #endif static size_t num_tests = 0; static size_t num_tests_ok = 0; static size_t num_tests_ko = 0; #define PRINT_VAR(x) std::cout << #x << "\t= " << (x) << std::endl // EXPECT_EQ macro #define EXPECT_EQ(actual, expected) EXPECT_EQ_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_EQ_IMPL(actual, expected, file, line) \ do { \ num_tests++; \ auto&& e = (expected); \ auto&& a = (actual); \ if (e != a) { \ std::cout << file << ":" << line << " : " << "Expected: " << (#expected) << " = " << e << ", actual: " << (#actual) << " = " << a << " " << std::endl; \ num_tests_ko++; \ } \ else { \ num_tests_ok++; \ } \ } while (false) // EXPECT_DOUBLE_EQ macro #define EXPECT_DOUBLE_EQ(actual, expected) EXPECT_DOUBLE_EQ_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_DOUBLE_EQ_IMPL(actual, expected, file, line) \ do { \ num_tests++; \ double e = (expected); \ double a = (actual); \ if (std::abs(e - a) > TOL_EQ_TEST) { \ std::cout << file << ":" << line << " : " << "Expected: " << (#expected) << " = " << e << ", actual: " << (#actual) << " = " << a << " " << std::endl; \ num_tests_ko++; \ } \ else { \ num_tests_ok++; \ } \ } while (false) // EXPECT_LT macro #define EXPECT_LT(actual, expected) EXPECT_LT_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_LT_IMPL(actual, expected, file, line) \ do { \ num_tests++; \ auto&& e = (expected); \ auto&& a = (actual); \ if (a < e) { \ num_tests_ok++; \ } \ else { \ std::cout << file << ":" << line << " : " << "Expected " << a << " < " << (#expected) << " = " << e << ", actual: " << (#actual) << std::endl; \ num_tests_ko++; \ } \ } while (false) // EXPECT_LE macro #define EXPECT_LE(actual, expected) EXPECT_LE_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_LE_IMPL(actual, expected, file, line) \ do { \ num_tests++; \ auto&& e = (expected); \ auto&& a = (actual); \ if (a <= e) { \ num_tests_ok++; \ } \ else { \ std::cout << file << ":" << line << " : " << "Expected " << a << " <= " << (#expected) << " = " << e << ", actual: " << (#actual) << std::endl; \ num_tests_ko++; \ } \ } while (false) // EXPECT_GT macro #define EXPECT_GT(actual, expected) EXPECT_GT_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_GT_IMPL(actual, expected, file, line) \ do { \ num_tests++; \ auto&& e = (expected); \ auto&& a = (actual); \ if (a > e) { \ num_tests_ok++; \ } \ else { \ std::cout << file << ":" << line << " : " << "Expected " << a << " > " << (#expected) << " = " << e << ", actual: " << (#actual) << std::endl; \ num_tests_ko++; \ } \ } while (false) // EXPECT_GE macro #define EXPECT_GE(actual, expected) EXPECT_GE_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_GE_IMPL(actual, expected, file, line) \ do { \ num_tests++; \ auto&& e = (expected); \ auto&& a = (actual); \ if (a >= e) { \ num_tests_ok++; \ } \ else { \ std::cout << file << ":" << line << " : " << "Expected " << a << " >= " << (#expected) << " = " << e << ", actual: " << (#actual) << std::endl; \ num_tests_ko++; \ } \ } while (false) // EXPECT_VEC_EQ macro #define EXPECT_VEC_EQ(actual, expected) EXPECT_VEC_EQ_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_VEC_EQ_IMPL(actual, expected, file, line) \ do { \ for(unsigned int i = 0 ; i < (expected).size() ; i++) { \ EXPECT_DOUBLE_EQ_IMPL((actual)[i], (expected)[i], file, line); \ } \ } while (false) // EXPECT_MAT_EQ macro #define EXPECT_MAT_EQ(actual, expected) EXPECT_MAT_EQ_IMPL(actual, expected, __FILE__, __LINE__) #define EXPECT_MAT_EQ_IMPL(actual, expected, file, line) \ do { \ for(unsigned int i = 0 ; i < (expected).rows() ; i++) { \ for(unsigned int j = 0 ; j < (expected).rows() ; j++) { \ EXPECT_DOUBLE_EQ_IMPL((actual)(i,j), (expected)(i,j), file, line); \ } \ } \ } while (false) #define PRINT_TESTS_SUMMARY() \ do { \ std::cout << "Tests summary: " << num_tests << " tests in total\n " << num_tests_ok << "/" << num_tests << " OK (" << ((100.0*(double)num_tests_ok)/num_tests) << " %)\n " << num_tests_ko << "/" << num_tests << " KO (" << ((100.0*(double)num_tests_ko)/num_tests) << " %)" << std::endl; \ } while (false) #endif