TestTestRunner.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #include "../UnitTest++.h"
  2. #include "RecordingReporter.h"
  3. #include "../ReportAssert.h"
  4. #include "../TestList.h"
  5. #include "../TimeHelpers.h"
  6. #include "../TimeConstraint.h"
  7. using namespace UnitTest;
  8. namespace
  9. {
  10. struct MockTest : public Test
  11. {
  12. MockTest(char const* testName, bool const success_, bool const assert_, int const count_ = 1)
  13. : Test(testName)
  14. , success(success_)
  15. , asserted(assert_)
  16. , count(count_)
  17. {
  18. }
  19. virtual void RunImpl(TestResults& testResults_) const
  20. {
  21. for (int i=0; i < count; ++i)
  22. {
  23. if (asserted)
  24. ReportAssert("desc", "file", 0);
  25. else if (!success)
  26. testResults_.OnTestFailure(m_details, "message");
  27. }
  28. }
  29. bool const success;
  30. bool const asserted;
  31. int const count;
  32. };
  33. struct TestRunnerFixture
  34. {
  35. TestRunnerFixture()
  36. : runner(reporter)
  37. {
  38. }
  39. RecordingReporter reporter;
  40. TestList list;
  41. TestRunner runner;
  42. };
  43. TEST_FIXTURE(TestRunnerFixture, TestStartIsReportedCorrectly)
  44. {
  45. MockTest test("goodtest", true, false);
  46. list.Add(&test);
  47. runner.RunTestsIf(list, NULL, True(), 0);
  48. CHECK_EQUAL(1, reporter.testRunCount);
  49. CHECK_EQUAL("goodtest", reporter.lastStartedTest);
  50. }
  51. TEST_FIXTURE(TestRunnerFixture, TestFinishIsReportedCorrectly)
  52. {
  53. MockTest test("goodtest", true, false);
  54. list.Add(&test);
  55. runner.RunTestsIf(list, NULL, True(), 0);
  56. CHECK_EQUAL(1, reporter.testFinishedCount);
  57. CHECK_EQUAL("goodtest", reporter.lastFinishedTest);
  58. }
  59. class SlowTest : public Test
  60. {
  61. public:
  62. SlowTest() : Test("slow", "somesuite", "filename", 123) {}
  63. virtual void RunImpl(TestResults&) const
  64. {
  65. TimeHelpers::SleepMs(20);
  66. }
  67. };
  68. TEST_FIXTURE(TestRunnerFixture, TestFinishIsCalledWithCorrectTime)
  69. {
  70. SlowTest test;
  71. list.Add(&test);
  72. runner.RunTestsIf(list, NULL, True(), 0);
  73. CHECK(reporter.lastFinishedTestTime >= 0.005f && reporter.lastFinishedTestTime <= 0.050f);
  74. }
  75. TEST_FIXTURE(TestRunnerFixture, FailureCountIsZeroWhenNoTestsAreRun)
  76. {
  77. CHECK_EQUAL(0, runner.RunTestsIf(list, NULL, True(), 0));
  78. CHECK_EQUAL(0, reporter.testRunCount);
  79. CHECK_EQUAL(0, reporter.testFailedCount);
  80. }
  81. TEST_FIXTURE(TestRunnerFixture, CallsReportFailureOncePerFailingTest)
  82. {
  83. MockTest test1("test", false, false);
  84. list.Add(&test1);
  85. MockTest test2("test", true, false);
  86. list.Add(&test2);
  87. MockTest test3("test", false, false);
  88. list.Add(&test3);
  89. CHECK_EQUAL(2, runner.RunTestsIf(list, NULL, True(), 0));
  90. CHECK_EQUAL(2, reporter.testFailedCount);
  91. }
  92. TEST_FIXTURE(TestRunnerFixture, TestsThatAssertAreReportedAsFailing)
  93. {
  94. MockTest test("test", true, true);
  95. list.Add(&test);
  96. runner.RunTestsIf(list, NULL, True(), 0);
  97. CHECK_EQUAL(1, reporter.testFailedCount);
  98. }
  99. TEST_FIXTURE(TestRunnerFixture, ReporterNotifiedOfTestCount)
  100. {
  101. MockTest test1("test", true, false);
  102. MockTest test2("test", true, false);
  103. MockTest test3("test", true, false);
  104. list.Add(&test1);
  105. list.Add(&test2);
  106. list.Add(&test3);
  107. runner.RunTestsIf(list, NULL, True(), 0);
  108. CHECK_EQUAL(3, reporter.summaryTotalTestCount);
  109. }
  110. TEST_FIXTURE(TestRunnerFixture, ReporterNotifiedOfFailedTests)
  111. {
  112. MockTest test1("test", false, false, 2);
  113. MockTest test2("test", true, false);
  114. MockTest test3("test", false, false, 3);
  115. list.Add(&test1);
  116. list.Add(&test2);
  117. list.Add(&test3);
  118. runner.RunTestsIf(list, NULL, True(), 0);
  119. CHECK_EQUAL(2, reporter.summaryFailedTestCount);
  120. }
  121. TEST_FIXTURE(TestRunnerFixture, ReporterNotifiedOfFailures)
  122. {
  123. MockTest test1("test", false, false, 2);
  124. MockTest test2("test", true, false);
  125. MockTest test3("test", false, false, 3);
  126. list.Add(&test1);
  127. list.Add(&test2);
  128. list.Add(&test3);
  129. runner.RunTestsIf(list, NULL, True(), 0);
  130. CHECK_EQUAL(5, reporter.summaryFailureCount);
  131. }
  132. TEST_FIXTURE(TestRunnerFixture, SlowTestPassesForHighTimeThreshold)
  133. {
  134. SlowTest test;
  135. list.Add(&test);
  136. runner.RunTestsIf(list, NULL, True(), 0);
  137. CHECK_EQUAL(0, reporter.testFailedCount);
  138. }
  139. TEST_FIXTURE(TestRunnerFixture, SlowTestFailsForLowTimeThreshold)
  140. {
  141. SlowTest test;
  142. list.Add(&test);
  143. runner.RunTestsIf(list, NULL, True(), 3);
  144. CHECK_EQUAL(1, reporter.testFailedCount);
  145. }
  146. TEST_FIXTURE(TestRunnerFixture, SlowTestHasCorrectFailureInformation)
  147. {
  148. SlowTest test;
  149. list.Add(&test);
  150. runner.RunTestsIf(list, NULL, True(), 3);
  151. using namespace std;
  152. CHECK_EQUAL(test.m_details.testName, reporter.lastFailedTest);
  153. CHECK(strstr(test.m_details.filename, reporter.lastFailedFile));
  154. CHECK_EQUAL(test.m_details.lineNumber, reporter.lastFailedLine);
  155. CHECK(strstr(reporter.lastFailedMessage, "Global time constraint failed"));
  156. CHECK(strstr(reporter.lastFailedMessage, "3ms"));
  157. }
  158. TEST_FIXTURE(TestRunnerFixture, SlowTestWithTimeExemptionPasses)
  159. {
  160. class SlowExemptedTest : public Test
  161. {
  162. public:
  163. SlowExemptedTest() : Test("slowexempted", "", 0) {}
  164. virtual void RunImpl(TestResults&) const
  165. {
  166. UNITTEST_TIME_CONSTRAINT_EXEMPT();
  167. TimeHelpers::SleepMs(20);
  168. }
  169. };
  170. SlowExemptedTest test;
  171. list.Add(&test);
  172. runner.RunTestsIf(list, NULL, True(), 3);
  173. CHECK_EQUAL(0, reporter.testFailedCount);
  174. }
  175. struct TestSuiteFixture
  176. {
  177. TestSuiteFixture()
  178. : test1("TestInDefaultSuite")
  179. , test2("TestInOtherSuite", "OtherSuite")
  180. , test3("SecondTestInDefaultSuite")
  181. , runner(reporter)
  182. {
  183. list.Add(&test1);
  184. list.Add(&test2);
  185. }
  186. Test test1;
  187. Test test2;
  188. Test test3;
  189. RecordingReporter reporter;
  190. TestList list;
  191. TestRunner runner;
  192. };
  193. TEST_FIXTURE(TestSuiteFixture, TestRunnerRunsAllSuitesIfNullSuiteIsPassed)
  194. {
  195. runner.RunTestsIf(list, NULL, True(), 0);
  196. CHECK_EQUAL(2, reporter.summaryTotalTestCount);
  197. }
  198. TEST_FIXTURE(TestSuiteFixture,TestRunnerRunsOnlySpecifiedSuite)
  199. {
  200. runner.RunTestsIf(list, "OtherSuite", True(), 0);
  201. CHECK_EQUAL(1, reporter.summaryTotalTestCount);
  202. CHECK_EQUAL("TestInOtherSuite", reporter.lastFinishedTest);
  203. }
  204. struct RunTestIfNameIs
  205. {
  206. RunTestIfNameIs(char const* name_)
  207. : name(name_)
  208. {
  209. }
  210. bool operator()(const Test* const test) const
  211. {
  212. using namespace std;
  213. return (0 == strcmp(test->m_details.testName, name));
  214. }
  215. char const* name;
  216. };
  217. TEST(TestMockPredicateBehavesCorrectly)
  218. {
  219. RunTestIfNameIs predicate("pass");
  220. Test pass("pass");
  221. Test fail("fail");
  222. CHECK(predicate(&pass));
  223. CHECK(!predicate(&fail));
  224. }
  225. TEST_FIXTURE(TestRunnerFixture, TestRunnerRunsTestsThatPassPredicate)
  226. {
  227. Test should_run("goodtest");
  228. list.Add(&should_run);
  229. Test should_not_run("badtest");
  230. list.Add(&should_not_run);
  231. runner.RunTestsIf(list, NULL, RunTestIfNameIs("goodtest"), 0);
  232. CHECK_EQUAL(1, reporter.testRunCount);
  233. CHECK_EQUAL("goodtest", reporter.lastStartedTest);
  234. }
  235. TEST_FIXTURE(TestRunnerFixture, TestRunnerOnlyRunsTestsInSpecifiedSuiteAndThatPassPredicate)
  236. {
  237. Test runningTest1("goodtest", "suite");
  238. Test skippedTest2("goodtest");
  239. Test skippedTest3("badtest", "suite");
  240. Test skippedTest4("badtest");
  241. list.Add(&runningTest1);
  242. list.Add(&skippedTest2);
  243. list.Add(&skippedTest3);
  244. list.Add(&skippedTest4);
  245. runner.RunTestsIf(list, "suite", RunTestIfNameIs("goodtest"), 0);
  246. CHECK_EQUAL(1, reporter.testRunCount);
  247. CHECK_EQUAL("goodtest", reporter.lastStartedTest);
  248. CHECK_EQUAL("suite", reporter.lastStartedSuite);
  249. }
  250. }