Framework.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "tests/framework/Framework.h"
  2. #include <iostream>
  3. #include <cstring>
  4. #include <malloc.h>
  5. namespace anki {
  6. //==============================================================================
  7. void Test::run()
  8. {
  9. std::cout << "========\nRunning " << suite->name << " " << name
  10. << "\n========" << std::endl;
  11. struct mallinfo a = mallinfo();
  12. callback(*this);
  13. struct mallinfo b = mallinfo();
  14. int diff = b.uordblks - a.uordblks;
  15. if(diff > 0)
  16. {
  17. std::cerr << "Test leaks memory: " << diff << std::endl;
  18. }
  19. std::cout << std::endl;
  20. }
  21. //==============================================================================
  22. void Tester::addTest(const char* name, const char* suiteName,
  23. TestCallback callback)
  24. {
  25. PtrVector<TestSuite>::iterator it;
  26. for(it = suites.begin(); it != suites.end(); it++)
  27. {
  28. if((*it)->name == suiteName)
  29. {
  30. break;
  31. }
  32. }
  33. // Not found
  34. TestSuite* suite = nullptr;
  35. if(it == suites.end())
  36. {
  37. suite = new TestSuite;
  38. suite->name = suiteName;
  39. suites.push_back(suite);
  40. }
  41. else
  42. {
  43. suite = *it;
  44. }
  45. // Sanity check
  46. PtrVector<Test>::iterator it1;
  47. for(it1 = suite->tests.begin(); it1 != suite->tests.end(); it1++)
  48. {
  49. if((*it)->name == name)
  50. {
  51. std::cerr << "Test already exists: " << name << std::endl;
  52. return;
  53. }
  54. }
  55. // Add the test
  56. Test* test = new Test;
  57. suite->tests.push_back(test);
  58. test->name = name;
  59. test->suite = suite;
  60. test->callback = callback;
  61. }
  62. //==============================================================================
  63. int Tester::run(int argc, char** argv)
  64. {
  65. // Parse args
  66. //
  67. programName = argv[0];
  68. std::string helpMessage = "Usage: " + programName + R"( [options]
  69. Options:
  70. --help Print this message
  71. --list-tests List all the tests
  72. --suite <name> Run tests only from this suite
  73. --test <name> Run this test. --suite needs to be specified)";
  74. std::string suiteName;
  75. std::string testName;
  76. for(int i = 1; i < argc; i++)
  77. {
  78. const char* arg = argv[i];
  79. if(strcmp(arg, "--list-tests") == 0)
  80. {
  81. listTests();
  82. return 0;
  83. }
  84. else if(strcmp(arg, "--help") == 0)
  85. {
  86. std::cout << helpMessage << std::endl;
  87. return 0;
  88. }
  89. else if(strcmp(arg, "--suite") == 0)
  90. {
  91. ++i;
  92. if(i >= argc)
  93. {
  94. std::cerr << "<name> is missing after --suite" << std::endl;
  95. return 1;
  96. }
  97. suiteName = argv[i];
  98. }
  99. else if(strcmp(arg, "--test") == 0)
  100. {
  101. ++i;
  102. if(i >= argc)
  103. {
  104. std::cerr << "<name> is missing after --test" << std::endl;
  105. return 1;
  106. }
  107. testName = argv[i];
  108. }
  109. }
  110. // Sanity check
  111. if(testName.length() > 0 && suiteName.length() == 0)
  112. {
  113. std::cout << "Specify --suite as well" << std::endl;
  114. return 1;
  115. }
  116. // Run tests
  117. //
  118. int passed = 0;
  119. int run = 0;
  120. if(argc == 1)
  121. {
  122. // Run all
  123. for(TestSuite* suite : suites)
  124. {
  125. for(Test* test : suite->tests)
  126. {
  127. ++run;
  128. try
  129. {
  130. test->run();
  131. ++passed;
  132. }
  133. catch(const std::exception& e)
  134. {
  135. std::cerr << e.what() << std::endl;
  136. }
  137. }
  138. }
  139. }
  140. else
  141. {
  142. for(TestSuite* suite : suites)
  143. {
  144. if(suite->name == suiteName)
  145. {
  146. for(Test* test : suite->tests)
  147. {
  148. if(test->name == testName || testName.length() == 0)
  149. {
  150. ++run;
  151. try
  152. {
  153. test->run();
  154. ++passed;
  155. }
  156. catch(const std::exception& e)
  157. {
  158. std::cerr << e.what() << std::endl;
  159. }
  160. }
  161. }
  162. }
  163. }
  164. }
  165. std::cout << "========\nRun " << run << " tests, failed " << (run - passed)
  166. << "\n" << std::endl;
  167. return run - passed;
  168. }
  169. //==============================================================================
  170. int Tester::listTests()
  171. {
  172. for(TestSuite* suite : suites)
  173. {
  174. for(Test* test : suite->tests)
  175. {
  176. std::cout << programName << " --suite \"" << suite->name
  177. << "\" --test \"" << test->name << "\"" << std::endl;
  178. }
  179. }
  180. return 0;
  181. }
  182. } // end namespace anki