From c92794c7e0a2066ac470a80b077bb2ce7363edb9 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 22:50:43 +0200 Subject: [PATCH 01/32] Moved notion of "next test" from Test class to dedicated class TestListNode for being able to manage several TestList undependently instead of a single one --- UnitTest++/Test.cpp | 1 - UnitTest++/Test.h | 1 - UnitTest++/TestList.cpp | 22 ++++++++++++++++------ UnitTest++/TestList.h | 16 ++++++++++++---- UnitTest++/TestRunner.h | 8 ++++---- tests/TestTestList.cpp | 18 +++++++++--------- tests/TestTestMacros.cpp | 18 +++++++++--------- 7 files changed, 50 insertions(+), 34 deletions(-) diff --git a/UnitTest++/Test.cpp b/UnitTest++/Test.cpp index 82ed710..2258899 100644 --- a/UnitTest++/Test.cpp +++ b/UnitTest++/Test.cpp @@ -20,7 +20,6 @@ namespace UnitTest { Test::Test(char const* testName, char const* suiteName, char const* filename, int lineNumber) : m_details(testName, suiteName, filename, lineNumber) - , m_nextTest(0) , m_isMockTest(false) {} diff --git a/UnitTest++/Test.h b/UnitTest++/Test.h index beb0769..5250452 100644 --- a/UnitTest++/Test.h +++ b/UnitTest++/Test.h @@ -16,7 +16,6 @@ namespace UnitTest { void Run(); TestDetails const m_details; - Test* m_nextTest; mutable bool m_isMockTest; diff --git a/UnitTest++/TestList.cpp b/UnitTest++/TestList.cpp index a2bc4b7..75946f9 100644 --- a/UnitTest++/TestList.cpp +++ b/UnitTest++/TestList.cpp @@ -5,27 +5,37 @@ namespace UnitTest { + TestListNode::TestListNode(Test* test) + : m_test(test), + m_next(0) + { + } + TestList::TestList() : m_head(0) , m_tail(0) {} - void TestList::Add(Test* test) + TestListNode* TestList::Add(Test* test) { + TestListNode* node = 0; if (m_tail == 0) { assert(m_head == 0); - m_head = test; - m_tail = test; + node = new TestListNode(test); + m_head = node; + m_tail = node; } else { - m_tail->m_nextTest = test; - m_tail = test; + node = new TestListNode(test); + m_tail->m_next = node; + m_tail = node; } + return node; } - Test* TestList::GetHead() const + TestListNode* TestList::GetHead() const { return m_head; } diff --git a/UnitTest++/TestList.h b/UnitTest++/TestList.h index d52ab51..21c0dab 100644 --- a/UnitTest++/TestList.h +++ b/UnitTest++/TestList.h @@ -7,17 +7,25 @@ namespace UnitTest { class Test; + class UNITTEST_LINKAGE TestListNode + { + public: + TestListNode(Test* test); + Test* m_test; + TestListNode* m_next; + }; + class UNITTEST_LINKAGE TestList { public: TestList(); - void Add (Test* test); + TestListNode* Add(Test* test); - Test* GetHead() const; + TestListNode* GetHead() const; private: - Test* m_head; - Test* m_tail; + TestListNode* m_head; + TestListNode* m_tail; }; diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 914249a..51ebefd 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -31,14 +31,14 @@ namespace UnitTest { int RunTestsIf(TestList const& list, char const* suiteName, const Predicate& predicate, int maxTestTimeInMs) const { - Test* curTest = list.GetHead(); + TestListNode* curTest = list.GetHead(); while (curTest != 0) { - if (IsTestInSuite(curTest, suiteName) && predicate(curTest)) - RunTest(m_result, curTest, maxTestTimeInMs); + if (IsTestInSuite(curTest->m_test, suiteName) && predicate(curTest->m_test)) + RunTest(m_result, curTest->m_test, maxTestTimeInMs); - curTest = curTest->m_nextTest; + curTest = curTest->m_next; } return Finish(); diff --git a/tests/TestTestList.cpp b/tests/TestTestList.cpp index 4a0bdcb..7b4faad 100644 --- a/tests/TestTestList.cpp +++ b/tests/TestTestList.cpp @@ -18,8 +18,8 @@ namespace { TestList list; list.Add(&test); - CHECK(list.GetHead() == &test); - CHECK(test.m_nextTest == 0); + CHECK(list.GetHead()->m_test == &test); + CHECK(list.GetHead()->m_next == 0); } TEST(AddingSecondTestAddsItToEndOfList) @@ -28,12 +28,12 @@ namespace { Test test2("test2"); TestList list; - list.Add(&test1); - list.Add(&test2); + TestListNode* test1Node = list.Add(&test1); + TestListNode* test2Node = list.Add(&test2); - CHECK(list.GetHead() == &test1); - CHECK(test1.m_nextTest == &test2); - CHECK(test2.m_nextTest == 0); + CHECK(list.GetHead()->m_test == &test1); + CHECK(test1Node->m_next->m_test == &test2); + CHECK(test2Node->m_next == 0); } TEST(ListAdderAddsTestToList) @@ -43,8 +43,8 @@ namespace { Test test(""); ListAdder adder(list, &test); - CHECK(list.GetHead() == &test); - CHECK(test.m_nextTest == 0); + CHECK(list.GetHead()->m_test == &test); + CHECK(list.GetHead()->m_next == 0); } } diff --git a/tests/TestTestMacros.cpp b/tests/TestTestMacros.cpp index e66bfb6..5f31149 100644 --- a/tests/TestTestMacros.cpp +++ b/tests/TestTestMacros.cpp @@ -52,7 +52,7 @@ namespace { TEST (TestsAreAddedToTheListThroughMacro) { CHECK(list1.GetHead() != 0); - CHECK(list1.GetHead()->m_nextTest == 0); + CHECK(list1.GetHead()->m_next == 0); } #ifndef UNITTEST_NO_EXCEPTIONS @@ -78,7 +78,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResults(result); - list2.GetHead()->Run(); + list2.GetHead()->m_test->Run(); } CHECK(strstr(reporter.lastFailedMessage, "xception")); @@ -119,8 +119,8 @@ namespace { TEST(TestAddedWithTEST_EXMacroGetsDefaultSuite) { CHECK(macroTestList1.GetHead() != NULL); - CHECK_EQUAL ("MacroTestHelper1", macroTestList1.GetHead()->m_details.testName); - CHECK_EQUAL ("DefaultSuite", macroTestList1.GetHead()->m_details.suiteName); + CHECK_EQUAL ("MacroTestHelper1", macroTestList1.GetHead()->m_test->m_details.testName); + CHECK_EQUAL ("DefaultSuite", macroTestList1.GetHead()->m_test->m_details.suiteName); } TestList macroTestList2; @@ -130,8 +130,8 @@ namespace { TEST(TestAddedWithTEST_FIXTURE_EXMacroGetsDefaultSuite) { CHECK(macroTestList2.GetHead() != NULL); - CHECK_EQUAL ("MacroTestHelper2", macroTestList2.GetHead()->m_details.testName); - CHECK_EQUAL ("DefaultSuite", macroTestList2.GetHead()->m_details.suiteName); + CHECK_EQUAL ("MacroTestHelper2", macroTestList2.GetHead()->m_test->m_details.testName); + CHECK_EQUAL ("DefaultSuite", macroTestList2.GetHead()->m_test->m_details.suiteName); } #ifndef UNITTEST_NO_EXCEPTIONS @@ -154,7 +154,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResult(result); - throwingFixtureTestList1.GetHead()->Run(); + throwingFixtureTestList1.GetHead()->m_test->Run(); } int const failureCount = result.GetFailedTestCount(); @@ -181,7 +181,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResult(result); - throwingFixtureTestList2.GetHead()->Run(); + throwingFixtureTestList2.GetHead()->m_test->Run(); } int const failureCount = result.GetFailedTestCount(); @@ -209,7 +209,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResults(result); - ctorAssertFixtureTestList.GetHead()->Run(); + ctorAssertFixtureTestList.GetHead()->m_test->Run(); } const int failureCount = result.GetFailedTestCount(); From 546801f8295d4bed4ad6a7d70385df9028985e4b Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:19:43 +0200 Subject: [PATCH 02/32] Created method for compare TestDetails --- UnitTest++/TestDetails.cpp | 25 +++++++++++++++++++++++++ UnitTest++/TestDetails.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/UnitTest++/TestDetails.cpp b/UnitTest++/TestDetails.cpp index deb6639..61c6a65 100644 --- a/UnitTest++/TestDetails.cpp +++ b/UnitTest++/TestDetails.cpp @@ -1,4 +1,5 @@ #include "TestDetails.h" +#include namespace UnitTest { @@ -18,5 +19,29 @@ namespace UnitTest { , timeConstraintExempt(details.timeConstraintExempt) {} + bool TestDetails::sameTest(const TestDetails & details) const + { + if (&details == this) + { + return true; + } + // Fast pointer comparison + if (details.suiteName == suiteName && + details.testName == testName && + details.filename == filename) + { + return true; + } + + // Long string comparison + if (!strcmp(details.suiteName, suiteName) && + !strcmp(details.testName, testName) && + !strcmp(details.filename, filename)) + { + return true; + } + + return false; + } } diff --git a/UnitTest++/TestDetails.h b/UnitTest++/TestDetails.h index cf6f1d3..1dac653 100644 --- a/UnitTest++/TestDetails.h +++ b/UnitTest++/TestDetails.h @@ -17,6 +17,8 @@ namespace UnitTest { int const lineNumber; mutable bool timeConstraintExempt; + bool sameTest(const TestDetails & details) const; + TestDetails(TestDetails const&); // Why is it public? --> http://gcc.gnu.org/bugs.html#cxx_rvalbind private: TestDetails& operator=(TestDetails const&); From 2b10f11baf1b2d74a69d974afc96e5705895e2b4 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:20:09 +0200 Subject: [PATCH 03/32] created predicate "SuitePredicate" --- UnitTest++/SuitePredicate.cpp | 69 +++++++++++++++++++++++++++++++++++ UnitTest++/SuitePredicate.h | 34 +++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 UnitTest++/SuitePredicate.cpp create mode 100644 UnitTest++/SuitePredicate.h diff --git a/UnitTest++/SuitePredicate.cpp b/UnitTest++/SuitePredicate.cpp new file mode 100644 index 0000000..8a5748d --- /dev/null +++ b/UnitTest++/SuitePredicate.cpp @@ -0,0 +1,69 @@ +#include "SuitePredicate.h" + +using namespace std; +using namespace UnitTest; + + +SuitePredicate::SuitePredicate() + : _all(false) +{ +} + + +SuitePredicate::~SuitePredicate() +{ +} + + +void SuitePredicate::addSuite(char const* suiteName) +{ + _suiteNames.push_back(suiteName); +} + + +void SuitePredicate::addTest(char const* testName) +{ + _testNames.push_back(testName); +} + + +void SuitePredicate::addAll() +{ + _all = true; +} + + +bool SuitePredicate::operator()(Test const * const test) const +{ + if (_all) + { + return true; + } + return (mustExecuteSuite(test) || mustExecuteTest(test)); +} + + +bool SuitePredicate::mustExecuteSuite(Test const * const test) const +{ + for (size_t i = 0; i < _suiteNames.size(); i++) + { + if (_suiteNames[i] == test->m_details.suiteName) + { + return true; + } + } + return false; +} + + +bool SuitePredicate::mustExecuteTest(Test const * const test) const +{ + for (size_t i = 0; i < _testNames.size(); i++) + { + if (_testNames[i] == test->m_details.testName) + { + return true; + } + } + return false; +} diff --git a/UnitTest++/SuitePredicate.h b/UnitTest++/SuitePredicate.h new file mode 100644 index 0000000..f9fb31c --- /dev/null +++ b/UnitTest++/SuitePredicate.h @@ -0,0 +1,34 @@ +#ifndef UNITTEST_SUITEPREDICATE_H +#define UNITTEST_SUITEPREDICATE_H + +#include +#include +#include "Test.h" + +namespace UnitTest +{ + using namespace std; + + class UNITTEST_LINKAGE SuitePredicate + { + public: + SuitePredicate(); + virtual ~SuitePredicate(); + + void addSuite(char const* suiteName); + void addTest(char const* testName); + void addAll(); + + bool operator()(Test const * const test) const; + + private: + bool mustExecuteSuite(Test const * const test) const; + bool mustExecuteTest(Test const * const test) const; + + vector _suiteNames; + vector _testNames; + bool _all; + }; +} + +#endif \ No newline at end of file From 468ed147219e0c5523d1702b337ef340ba9d1642 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:20:42 +0200 Subject: [PATCH 04/32] Created tests for TestDetails comparison --- tests/TestTestDetails.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 tests/TestTestDetails.cpp diff --git a/tests/TestTestDetails.cpp b/tests/TestTestDetails.cpp new file mode 100644 index 0000000..4a3c8c4 --- /dev/null +++ b/tests/TestTestDetails.cpp @@ -0,0 +1,35 @@ +#include "UnitTest++/UnitTestPP.h" +#include "UnitTest++/TestDetails.h" + +using namespace UnitTest; + +namespace { + + TEST(SameTest_SameValues_AreEqual) + { + TestDetails details1("test1", "suite1", "file1", 1234); + TestDetails details2("test1", "suite1", "file1", 1234); + CHECK(details1.sameTest(details2)); + } + + TEST(SameTest_DifferentValues_AreNotEqual) + { + TestDetails details1("test1", "suite1", "file1", 1234); + TestDetails details2("test2", "suite2", "file2", 4321); + CHECK(!details1.sameTest(details2)); + } + + TEST(SameTest_LineNumber_AreIgnored) + { + TestDetails details1("test1", "suite1", "file1", 1234); + TestDetails details2("test1", "suite1", "file1", 0); + CHECK(details1.sameTest(details2)); + } + + TEST(SameTest_CopyConstructor_AreEqual) + { + TestDetails details1("test1", "suite1", "file1", 1234); + TestDetails details2(details1, 4321); + CHECK(details1.sameTest(details2)); + } +} From 7772acd087aefa1aebae86031989f467f950b2c0 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:21:39 +0200 Subject: [PATCH 05/32] Imported first basic version of RunTestsCmd --- UnitTest++/TestRunner.cpp | 91 +++++++++++++++++++++++++++++++++++++++ UnitTest++/TestRunner.h | 11 +++++ 2 files changed, 102 insertions(+) diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 8e0581d..6b9944e 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -4,6 +4,7 @@ #include "TestReporterStdout.h" #include "TimeHelpers.h" #include "MemoryOutStream.h" +#include "SuitePredicate.h" #include @@ -17,6 +18,96 @@ namespace UnitTest { return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0); } + bool findArgumentListIndex(int argc, char**argv, char const* argument, int & outFrom, int & outCount) + { + if (argc <= 1) + { + return false; + } + + outCount = 0; + if (strlen(argument) > 0) + { + outFrom = 0; + for (int i = 1; i < argc; i++) + { + if (strcmp(argument, argv[i]) == 0) + { + outFrom = i + 1; + break; + } + } + if (outFrom == 0) + { + return false; + } + } + else + { + outFrom = 1; + } + + for (int i = outFrom; i < argc; i++) + { + char* value = argv[i]; + if (strlen(value) >= 2 && value[0] == '-'&& value[1] == '-') + { + break; + } + outCount++; + } + + return true; + } + + bool readSuiteArgument(SuitePredicate & predicate, int argc, char**argv, char const* argument) + { + int from, count; + if (!findArgumentListIndex(argc, argv, argument, from, count)) + { + return false; + } + for (int i = from; i < from + count; i++) + { + predicate.addSuite(argv[i]); + } + return true; + } + + bool readTestArgument(SuitePredicate & predicate, int argc, char**argv, char const* argument) + { + int from, count; + if (!findArgumentListIndex(argc, argv, argument, from, count)) + { + return false; + } + for (int i = from; i < from + count; i++) + { + predicate.addTest(argv[i]); + } + return true; + } + + int RunTestsCmd(int argc, char**argv, char const* suiteArgument, char const* testArgument) + { + SuitePredicate predicate; + + bool specific = false; + specific |= readSuiteArgument(predicate, argc, argv, suiteArgument); + specific |= readTestArgument(predicate, argc, argv, testArgument); + specific |= readTestArgument(predicate, argc, argv, ""); + + if (!specific) + { + predicate.addAll(); + } + + //run selected test(s) only + TestReporterStdout reporter; + TestRunner runner(reporter); + + return runner.RunTestsIf(Test::GetTestList(), 0, predicate, 0); + } TestRunner::TestRunner(TestReporter& reporter) : m_reporter(&reporter) diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 51ebefd..f6fc10f 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -13,6 +13,17 @@ namespace UnitTest { UNITTEST_LINKAGE int RunAllTests(); + /** + * Commands: + * --test One or multiple test names to execute (specify "--test" is optional if it is the first argument), can be combined with --suite + * --suite One or multiple suite names to execute, can be combined with --test + * + * Usage examples: + * myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest + * myTests.exe MySpecialTest MyOtherTest --suite MySuite1 + */ + UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, char const* suiteArgument = "--suite", char const* testArgument = "--test"); + struct True { bool operator()(const Test* const) const From 5d0847ea3b7a5a6506490bc58252a4219f26909a Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:21:47 +0200 Subject: [PATCH 06/32] Used in main() --- tests/Main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Main.cpp b/tests/Main.cpp index 4a0f402..3a629a4 100644 --- a/tests/Main.cpp +++ b/tests/Main.cpp @@ -1,6 +1,6 @@ #include "UnitTest++/UnitTestPP.h" -int main(int, char const *[]) +int main(int argc, char**argv) { - return UnitTest::RunAllTests(); + return UnitTest::RunTestsCmd(argc, argv); } From 83b30403647280c44462b42ce8259852a65cefd8 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:56:24 +0200 Subject: [PATCH 07/32] Minor simplification --- UnitTest++/TestRunner.cpp | 6 +++--- UnitTest++/TestRunner.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 6b9944e..1f7556c 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -88,13 +88,13 @@ namespace UnitTest { return true; } - int RunTestsCmd(int argc, char**argv, char const* suiteArgument, char const* testArgument) + int RunTestsCmd(int argc, char**argv) { SuitePredicate predicate; bool specific = false; - specific |= readSuiteArgument(predicate, argc, argv, suiteArgument); - specific |= readTestArgument(predicate, argc, argv, testArgument); + specific |= readSuiteArgument(predicate, argc, argv, "--suite"); + specific |= readTestArgument(predicate, argc, argv, "--test"); specific |= readTestArgument(predicate, argc, argv, ""); if (!specific) diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index f6fc10f..6425adb 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -11,8 +11,6 @@ namespace UnitTest { class TestResults; class Timer; - UNITTEST_LINKAGE int RunAllTests(); - /** * Commands: * --test One or multiple test names to execute (specify "--test" is optional if it is the first argument), can be combined with --suite @@ -22,7 +20,9 @@ namespace UnitTest { * myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest * myTests.exe MySpecialTest MyOtherTest --suite MySuite1 */ - UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, char const* suiteArgument = "--suite", char const* testArgument = "--test"); + UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv); + + UNITTEST_LINKAGE int RunAllTests(); struct True { From 53c478d5010b860cfbe6271c8fe3470c0a269c04 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 29 Aug 2016 23:56:40 +0200 Subject: [PATCH 08/32] Partially extracted ArgumentsReader --- UnitTest++/ArgumentsReader.h | 69 ++++++++++++++++++++++++++++++++++++ UnitTest++/TestRunner.cpp | 61 ++++++------------------------- 2 files changed, 80 insertions(+), 50 deletions(-) create mode 100644 UnitTest++/ArgumentsReader.h diff --git a/UnitTest++/ArgumentsReader.h b/UnitTest++/ArgumentsReader.h new file mode 100644 index 0000000..6acaa22 --- /dev/null +++ b/UnitTest++/ArgumentsReader.h @@ -0,0 +1,69 @@ +#include +#include + +namespace UnitTest { + + using namespace std; + + class ArgumentsReader + { + public: + ArgumentsReader(int argc, char**argv) + { + _arguments.reserve(argc); + for (int i = 1; i < argc; i++) + { + _arguments.push_back(argv[i]); + } + } + + bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) + { + if (_arguments.empty()) + { + return false; + } + outCount = 0; + if (argumentName.empty()) + { + outFrom = 1; + } + else + { + outFrom = 0; + for (size_t i = 1; i < _arguments.size(); i++) + { + if (argumentName == _arguments[i]) + { + outFrom = i + 1; + break; + } + } + if (outFrom == 0) + { + return false; + } + } + + for (size_t i = outFrom; i < _arguments.size(); i++) + { + string value = _arguments[i]; + if (value.size() >= 2 && value.substr(0, 2) == "--") + { + break; + } + outCount++; + } + + return true; + } + + string getArgument(int index) + { + return _arguments[index]; + } + + private: + vector _arguments; + }; +} \ No newline at end of file diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 1f7556c..2e3539a 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -5,6 +5,7 @@ #include "TimeHelpers.h" #include "MemoryOutStream.h" #include "SuitePredicate.h" +#include "ArgumentsReader.h" #include @@ -18,84 +19,44 @@ namespace UnitTest { return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0); } - bool findArgumentListIndex(int argc, char**argv, char const* argument, int & outFrom, int & outCount) - { - if (argc <= 1) - { - return false; - } - - outCount = 0; - if (strlen(argument) > 0) - { - outFrom = 0; - for (int i = 1; i < argc; i++) - { - if (strcmp(argument, argv[i]) == 0) - { - outFrom = i + 1; - break; - } - } - if (outFrom == 0) - { - return false; - } - } - else - { - outFrom = 1; - } - - for (int i = outFrom; i < argc; i++) - { - char* value = argv[i]; - if (strlen(value) >= 2 && value[0] == '-'&& value[1] == '-') - { - break; - } - outCount++; - } - - return true; - } - bool readSuiteArgument(SuitePredicate & predicate, int argc, char**argv, char const* argument) + bool readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, char const* argument) { int from, count; - if (!findArgumentListIndex(argc, argv, argument, from, count)) + if (!arguments.findArgumentListIndex(argument, from, count)) { return false; } for (int i = from; i < from + count; i++) { - predicate.addSuite(argv[i]); + predicate.addSuite(arguments.getArgument(i).c_str()); } return true; } - bool readTestArgument(SuitePredicate & predicate, int argc, char**argv, char const* argument) + bool readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, char const* argument) { int from, count; - if (!findArgumentListIndex(argc, argv, argument, from, count)) + if (!arguments.findArgumentListIndex(argument, from, count)) { return false; } for (int i = from; i < from + count; i++) { - predicate.addTest(argv[i]); + predicate.addTest(arguments.getArgument(i).c_str()); } return true; } int RunTestsCmd(int argc, char**argv) { + ArgumentsReader arguments(argc, argv); SuitePredicate predicate; bool specific = false; - specific |= readSuiteArgument(predicate, argc, argv, "--suite"); - specific |= readTestArgument(predicate, argc, argv, "--test"); - specific |= readTestArgument(predicate, argc, argv, ""); + specific |= readSuiteArgument(arguments, predicate, "--suite"); + specific |= readTestArgument(arguments, predicate, "--test"); + specific |= readTestArgument(arguments, predicate, ""); if (!specific) { From a6e914c7018b6c597afa54ee467d5ae1af0885c3 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 16:06:58 +0200 Subject: [PATCH 09/32] extracted in a dedicated class --- UnitTest++/SuitePredicateCmdBuilder.cpp | 56 +++++++++++++++++++++++++ UnitTest++/SuitePredicateCmdBuilder.h | 24 +++++++++++ UnitTest++/TestRunner.cpp | 47 ++------------------- 3 files changed, 83 insertions(+), 44 deletions(-) create mode 100644 UnitTest++/SuitePredicateCmdBuilder.cpp create mode 100644 UnitTest++/SuitePredicateCmdBuilder.h diff --git a/UnitTest++/SuitePredicateCmdBuilder.cpp b/UnitTest++/SuitePredicateCmdBuilder.cpp new file mode 100644 index 0000000..35af5b9 --- /dev/null +++ b/UnitTest++/SuitePredicateCmdBuilder.cpp @@ -0,0 +1,56 @@ +#include "SuitePredicateCmdBuilder.h" + +using namespace UnitTest; + + +SuitePredicateCmdBuilder::SuitePredicateCmdBuilder(int argc, char**argv) + : _arguments(argc, argv) +{ +} + + +SuitePredicate SuitePredicateCmdBuilder::buildPredicate() +{ + SuitePredicate predicate; + + bool specific = false; + specific |= readSuiteArgument(_arguments, predicate, "--suite"); + specific |= readTestArgument(_arguments, predicate, "--test"); + specific |= readTestArgument(_arguments, predicate, ""); + + if (!specific) + { + predicate.addAll(); + } + return predicate; +} + + +bool SuitePredicateCmdBuilder::readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg) +{ + int from, count; + if (!arguments.findArgumentListIndex(arg, from, count)) + { + return false; + } + for (int i = from; i < from + count; i++) + { + predicate.addSuite(arguments.getArgument(i).c_str()); + } + return true; +} + + +bool SuitePredicateCmdBuilder::readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg) +{ + int from, count; + if (!arguments.findArgumentListIndex(arg, from, count)) + { + return false; + } + for (int i = from; i < from + count; i++) + { + predicate.addTest(arguments.getArgument(i).c_str()); + } + return true; +} diff --git a/UnitTest++/SuitePredicateCmdBuilder.h b/UnitTest++/SuitePredicateCmdBuilder.h new file mode 100644 index 0000000..928f1e2 --- /dev/null +++ b/UnitTest++/SuitePredicateCmdBuilder.h @@ -0,0 +1,24 @@ +#ifndef UNITTEST_TESTRUNNERCMD_H +#define UNITTEST_TESTRUNNERCMD_H + +#include "ArgumentsReader.h" +#include "SuitePredicate.h" + +namespace UnitTest { + + class SuitePredicateCmdBuilder + { + public: + SuitePredicateCmdBuilder(int argc, char**argv); + SuitePredicate buildPredicate(); + + protected: + bool readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg); + bool readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg); + + private: + ArgumentsReader _arguments; + }; +} + +#endif \ No newline at end of file diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 2e3539a..c349eb6 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -5,7 +5,7 @@ #include "TimeHelpers.h" #include "MemoryOutStream.h" #include "SuitePredicate.h" -#include "ArgumentsReader.h" +#include "SuitePredicateCmdBuilder.h" #include @@ -20,54 +20,13 @@ namespace UnitTest { } - bool readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, char const* argument) - { - int from, count; - if (!arguments.findArgumentListIndex(argument, from, count)) - { - return false; - } - for (int i = from; i < from + count; i++) - { - predicate.addSuite(arguments.getArgument(i).c_str()); - } - return true; - } - - bool readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, char const* argument) - { - int from, count; - if (!arguments.findArgumentListIndex(argument, from, count)) - { - return false; - } - for (int i = from; i < from + count; i++) - { - predicate.addTest(arguments.getArgument(i).c_str()); - } - return true; - } - int RunTestsCmd(int argc, char**argv) { - ArgumentsReader arguments(argc, argv); - SuitePredicate predicate; - - bool specific = false; - specific |= readSuiteArgument(arguments, predicate, "--suite"); - specific |= readTestArgument(arguments, predicate, "--test"); - specific |= readTestArgument(arguments, predicate, ""); - - if (!specific) - { - predicate.addAll(); - } - - //run selected test(s) only + SuitePredicateCmdBuilder suiteCmd(argc, argv); TestReporterStdout reporter; TestRunner runner(reporter); - return runner.RunTestsIf(Test::GetTestList(), 0, predicate, 0); + return runner.RunTestsIf(Test::GetTestList(), 0, suiteCmd.buildPredicate(), 0); } TestRunner::TestRunner(TestReporter& reporter) From 93a5df8013667ca3775d7180c4307ca5b45f56e0 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 16:35:03 +0200 Subject: [PATCH 10/32] simplification --- UnitTest++/ArgumentsReader.h | 17 ++++++++++ UnitTest++/SuitePredicate.cpp | 40 ++++++++++++++++++++++-- UnitTest++/SuitePredicate.h | 7 +++-- UnitTest++/SuitePredicateCmdBuilder.cpp | 41 ++++--------------------- UnitTest++/SuitePredicateCmdBuilder.h | 4 --- 5 files changed, 66 insertions(+), 43 deletions(-) diff --git a/UnitTest++/ArgumentsReader.h b/UnitTest++/ArgumentsReader.h index 6acaa22..9adc495 100644 --- a/UnitTest++/ArgumentsReader.h +++ b/UnitTest++/ArgumentsReader.h @@ -58,6 +58,23 @@ namespace UnitTest { return true; } + + vector extractValues(const string & argumentName) + { + int from, count; + if (!findArgumentListIndex(argumentName, from, count)) + { + return vector(); + } + vector values; + for (int i = from; i < from + count; i++) + { + values.push_back(getArgument(i)); + } + return values; + } + + string getArgument(int index) { return _arguments[index]; diff --git a/UnitTest++/SuitePredicate.cpp b/UnitTest++/SuitePredicate.cpp index 8a5748d..ff819c6 100644 --- a/UnitTest++/SuitePredicate.cpp +++ b/UnitTest++/SuitePredicate.cpp @@ -15,24 +15,60 @@ SuitePredicate::~SuitePredicate() } -void SuitePredicate::addSuite(char const* suiteName) +void SuitePredicate::addSuite(const string & suiteName) { _suiteNames.push_back(suiteName); } -void SuitePredicate::addTest(char const* testName) +void SuitePredicate::addTest(const string & testName) { _testNames.push_back(testName); } +void SuitePredicate::addSuites(const vector & suiteNames) +{ + for (size_t i = 0; i < suiteNames.size(); i++) + { + _suiteNames.push_back(suiteNames[i]); + } +} + + +void SuitePredicate::addTests(const vector & testNames) +{ + for (size_t i = 0; i < testNames.size(); i++) + { + _testNames.push_back(testNames[i]); + } +} + + void SuitePredicate::addAll() { _all = true; } +bool SuitePredicate::empty() +{ + if (!_suiteNames.empty()) + { + return false; + } + if (!_testNames.empty()) + { + return false; + } + if (_all) + { + return false; + } + return true; +} + + bool SuitePredicate::operator()(Test const * const test) const { if (_all) diff --git a/UnitTest++/SuitePredicate.h b/UnitTest++/SuitePredicate.h index f9fb31c..5f7e51f 100644 --- a/UnitTest++/SuitePredicate.h +++ b/UnitTest++/SuitePredicate.h @@ -15,9 +15,12 @@ namespace UnitTest SuitePredicate(); virtual ~SuitePredicate(); - void addSuite(char const* suiteName); - void addTest(char const* testName); + void addSuite(const string & suiteName); + void addTest(const string & testName); + void addSuites(const vector & suiteNames); + void addTests(const vector & testNames); void addAll(); + bool empty(); bool operator()(Test const * const test) const; diff --git a/UnitTest++/SuitePredicateCmdBuilder.cpp b/UnitTest++/SuitePredicateCmdBuilder.cpp index 35af5b9..4d08041 100644 --- a/UnitTest++/SuitePredicateCmdBuilder.cpp +++ b/UnitTest++/SuitePredicateCmdBuilder.cpp @@ -9,48 +9,19 @@ SuitePredicateCmdBuilder::SuitePredicateCmdBuilder(int argc, char**argv) } -SuitePredicate SuitePredicateCmdBuilder::buildPredicate() +SuitePredicate SuitePredicateCmdBuilder::buildPredicate(bool allowImplicitTestArg) { SuitePredicate predicate; - bool specific = false; - specific |= readSuiteArgument(_arguments, predicate, "--suite"); - specific |= readTestArgument(_arguments, predicate, "--test"); - specific |= readTestArgument(_arguments, predicate, ""); + predicate.addSuites(_arguments.extractValues("--suite")); + predicate.addTests(_arguments.extractValues("--test")); + predicate.addTests(_arguments.extractValues("")); - if (!specific) + if (predicate.empty()) { predicate.addAll(); } - return predicate; -} - -bool SuitePredicateCmdBuilder::readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg) -{ - int from, count; - if (!arguments.findArgumentListIndex(arg, from, count)) - { - return false; - } - for (int i = from; i < from + count; i++) - { - predicate.addSuite(arguments.getArgument(i).c_str()); - } - return true; + return predicate; } - -bool SuitePredicateCmdBuilder::readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg) -{ - int from, count; - if (!arguments.findArgumentListIndex(arg, from, count)) - { - return false; - } - for (int i = from; i < from + count; i++) - { - predicate.addTest(arguments.getArgument(i).c_str()); - } - return true; -} diff --git a/UnitTest++/SuitePredicateCmdBuilder.h b/UnitTest++/SuitePredicateCmdBuilder.h index 928f1e2..fa8d217 100644 --- a/UnitTest++/SuitePredicateCmdBuilder.h +++ b/UnitTest++/SuitePredicateCmdBuilder.h @@ -12,10 +12,6 @@ namespace UnitTest { SuitePredicateCmdBuilder(int argc, char**argv); SuitePredicate buildPredicate(); - protected: - bool readSuiteArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg); - bool readTestArgument(ArgumentsReader & arguments, SuitePredicate & predicate, const string & arg); - private: ArgumentsReader _arguments; }; From a4a3b247c3b831d86e42b2482f6f1cf9b3c3414e Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 16:37:50 +0200 Subject: [PATCH 11/32] optionally allow implicit suite/test argument --- UnitTest++/SuitePredicateCmdBuilder.cpp | 10 ++++++++-- UnitTest++/SuitePredicateCmdBuilder.h | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/UnitTest++/SuitePredicateCmdBuilder.cpp b/UnitTest++/SuitePredicateCmdBuilder.cpp index 4d08041..50c9ba8 100644 --- a/UnitTest++/SuitePredicateCmdBuilder.cpp +++ b/UnitTest++/SuitePredicateCmdBuilder.cpp @@ -9,13 +9,19 @@ SuitePredicateCmdBuilder::SuitePredicateCmdBuilder(int argc, char**argv) } -SuitePredicate SuitePredicateCmdBuilder::buildPredicate(bool allowImplicitTestArg) +SuitePredicate SuitePredicateCmdBuilder::buildPredicate(bool allowImplicitArgs) { SuitePredicate predicate; predicate.addSuites(_arguments.extractValues("--suite")); predicate.addTests(_arguments.extractValues("--test")); - predicate.addTests(_arguments.extractValues("")); + + if (allowImplicitArgs) + { + vector implicitArguments = _arguments.extractValues(""); + predicate.addSuites(implicitArguments); + predicate.addTests(implicitArguments); + } if (predicate.empty()) { diff --git a/UnitTest++/SuitePredicateCmdBuilder.h b/UnitTest++/SuitePredicateCmdBuilder.h index fa8d217..9a994e5 100644 --- a/UnitTest++/SuitePredicateCmdBuilder.h +++ b/UnitTest++/SuitePredicateCmdBuilder.h @@ -10,7 +10,7 @@ namespace UnitTest { { public: SuitePredicateCmdBuilder(int argc, char**argv); - SuitePredicate buildPredicate(); + SuitePredicate buildPredicate(bool allowImplicitArgs = true); private: ArgumentsReader _arguments; From c5ede398c4175273c5412b93491c3a3b15d3042b Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 16:48:25 +0200 Subject: [PATCH 12/32] Revert "Moved notion of "next test" from Test class to dedicated class TestListNode for being able to manage several TestList undependently instead of a single one" This reverts commit c92794c7e0a2066ac470a80b077bb2ce7363edb9. --- UnitTest++/Test.cpp | 1 + UnitTest++/Test.h | 1 + UnitTest++/TestList.cpp | 22 ++++++---------------- UnitTest++/TestList.h | 16 ++++------------ UnitTest++/TestRunner.h | 8 ++++---- tests/TestTestList.cpp | 18 +++++++++--------- tests/TestTestMacros.cpp | 18 +++++++++--------- 7 files changed, 34 insertions(+), 50 deletions(-) diff --git a/UnitTest++/Test.cpp b/UnitTest++/Test.cpp index 2258899..82ed710 100644 --- a/UnitTest++/Test.cpp +++ b/UnitTest++/Test.cpp @@ -20,6 +20,7 @@ namespace UnitTest { Test::Test(char const* testName, char const* suiteName, char const* filename, int lineNumber) : m_details(testName, suiteName, filename, lineNumber) + , m_nextTest(0) , m_isMockTest(false) {} diff --git a/UnitTest++/Test.h b/UnitTest++/Test.h index 5250452..beb0769 100644 --- a/UnitTest++/Test.h +++ b/UnitTest++/Test.h @@ -16,6 +16,7 @@ namespace UnitTest { void Run(); TestDetails const m_details; + Test* m_nextTest; mutable bool m_isMockTest; diff --git a/UnitTest++/TestList.cpp b/UnitTest++/TestList.cpp index 75946f9..a2bc4b7 100644 --- a/UnitTest++/TestList.cpp +++ b/UnitTest++/TestList.cpp @@ -5,37 +5,27 @@ namespace UnitTest { - TestListNode::TestListNode(Test* test) - : m_test(test), - m_next(0) - { - } - TestList::TestList() : m_head(0) , m_tail(0) {} - TestListNode* TestList::Add(Test* test) + void TestList::Add(Test* test) { - TestListNode* node = 0; if (m_tail == 0) { assert(m_head == 0); - node = new TestListNode(test); - m_head = node; - m_tail = node; + m_head = test; + m_tail = test; } else { - node = new TestListNode(test); - m_tail->m_next = node; - m_tail = node; + m_tail->m_nextTest = test; + m_tail = test; } - return node; } - TestListNode* TestList::GetHead() const + Test* TestList::GetHead() const { return m_head; } diff --git a/UnitTest++/TestList.h b/UnitTest++/TestList.h index 21c0dab..d52ab51 100644 --- a/UnitTest++/TestList.h +++ b/UnitTest++/TestList.h @@ -7,25 +7,17 @@ namespace UnitTest { class Test; - class UNITTEST_LINKAGE TestListNode - { - public: - TestListNode(Test* test); - Test* m_test; - TestListNode* m_next; - }; - class UNITTEST_LINKAGE TestList { public: TestList(); - TestListNode* Add(Test* test); + void Add (Test* test); - TestListNode* GetHead() const; + Test* GetHead() const; private: - TestListNode* m_head; - TestListNode* m_tail; + Test* m_head; + Test* m_tail; }; diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 6425adb..227c88f 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -42,14 +42,14 @@ namespace UnitTest { int RunTestsIf(TestList const& list, char const* suiteName, const Predicate& predicate, int maxTestTimeInMs) const { - TestListNode* curTest = list.GetHead(); + Test* curTest = list.GetHead(); while (curTest != 0) { - if (IsTestInSuite(curTest->m_test, suiteName) && predicate(curTest->m_test)) - RunTest(m_result, curTest->m_test, maxTestTimeInMs); + if (IsTestInSuite(curTest, suiteName) && predicate(curTest)) + RunTest(m_result, curTest, maxTestTimeInMs); - curTest = curTest->m_next; + curTest = curTest->m_nextTest; } return Finish(); diff --git a/tests/TestTestList.cpp b/tests/TestTestList.cpp index 7b4faad..4a0bdcb 100644 --- a/tests/TestTestList.cpp +++ b/tests/TestTestList.cpp @@ -18,8 +18,8 @@ namespace { TestList list; list.Add(&test); - CHECK(list.GetHead()->m_test == &test); - CHECK(list.GetHead()->m_next == 0); + CHECK(list.GetHead() == &test); + CHECK(test.m_nextTest == 0); } TEST(AddingSecondTestAddsItToEndOfList) @@ -28,12 +28,12 @@ namespace { Test test2("test2"); TestList list; - TestListNode* test1Node = list.Add(&test1); - TestListNode* test2Node = list.Add(&test2); + list.Add(&test1); + list.Add(&test2); - CHECK(list.GetHead()->m_test == &test1); - CHECK(test1Node->m_next->m_test == &test2); - CHECK(test2Node->m_next == 0); + CHECK(list.GetHead() == &test1); + CHECK(test1.m_nextTest == &test2); + CHECK(test2.m_nextTest == 0); } TEST(ListAdderAddsTestToList) @@ -43,8 +43,8 @@ namespace { Test test(""); ListAdder adder(list, &test); - CHECK(list.GetHead()->m_test == &test); - CHECK(list.GetHead()->m_next == 0); + CHECK(list.GetHead() == &test); + CHECK(test.m_nextTest == 0); } } diff --git a/tests/TestTestMacros.cpp b/tests/TestTestMacros.cpp index 5f31149..e66bfb6 100644 --- a/tests/TestTestMacros.cpp +++ b/tests/TestTestMacros.cpp @@ -52,7 +52,7 @@ namespace { TEST (TestsAreAddedToTheListThroughMacro) { CHECK(list1.GetHead() != 0); - CHECK(list1.GetHead()->m_next == 0); + CHECK(list1.GetHead()->m_nextTest == 0); } #ifndef UNITTEST_NO_EXCEPTIONS @@ -78,7 +78,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResults(result); - list2.GetHead()->m_test->Run(); + list2.GetHead()->Run(); } CHECK(strstr(reporter.lastFailedMessage, "xception")); @@ -119,8 +119,8 @@ namespace { TEST(TestAddedWithTEST_EXMacroGetsDefaultSuite) { CHECK(macroTestList1.GetHead() != NULL); - CHECK_EQUAL ("MacroTestHelper1", macroTestList1.GetHead()->m_test->m_details.testName); - CHECK_EQUAL ("DefaultSuite", macroTestList1.GetHead()->m_test->m_details.suiteName); + CHECK_EQUAL ("MacroTestHelper1", macroTestList1.GetHead()->m_details.testName); + CHECK_EQUAL ("DefaultSuite", macroTestList1.GetHead()->m_details.suiteName); } TestList macroTestList2; @@ -130,8 +130,8 @@ namespace { TEST(TestAddedWithTEST_FIXTURE_EXMacroGetsDefaultSuite) { CHECK(macroTestList2.GetHead() != NULL); - CHECK_EQUAL ("MacroTestHelper2", macroTestList2.GetHead()->m_test->m_details.testName); - CHECK_EQUAL ("DefaultSuite", macroTestList2.GetHead()->m_test->m_details.suiteName); + CHECK_EQUAL ("MacroTestHelper2", macroTestList2.GetHead()->m_details.testName); + CHECK_EQUAL ("DefaultSuite", macroTestList2.GetHead()->m_details.suiteName); } #ifndef UNITTEST_NO_EXCEPTIONS @@ -154,7 +154,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResult(result); - throwingFixtureTestList1.GetHead()->m_test->Run(); + throwingFixtureTestList1.GetHead()->Run(); } int const failureCount = result.GetFailedTestCount(); @@ -181,7 +181,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResult(result); - throwingFixtureTestList2.GetHead()->m_test->Run(); + throwingFixtureTestList2.GetHead()->Run(); } int const failureCount = result.GetFailedTestCount(); @@ -209,7 +209,7 @@ namespace { TestResults result(&reporter); { ScopedCurrentTest scopedResults(result); - ctorAssertFixtureTestList.GetHead()->m_test->Run(); + ctorAssertFixtureTestList.GetHead()->Run(); } const int failureCount = result.GetFailedTestCount(); From 0b15cf58d790e564b18b8d5f57d0d4ac8229b954 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 16:52:01 +0200 Subject: [PATCH 13/32] fixed wrong include --- UnitTest++/TestDetails.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTest++/TestDetails.cpp b/UnitTest++/TestDetails.cpp index 61c6a65..5a0c540 100644 --- a/UnitTest++/TestDetails.cpp +++ b/UnitTest++/TestDetails.cpp @@ -1,5 +1,5 @@ #include "TestDetails.h" -#include +#include namespace UnitTest { From 25b44bab7b63c619c156f1d908c05e64438e5b5b Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 17:00:09 +0200 Subject: [PATCH 14/32] splitted "ArgumentsReader" h/cpp --- UnitTest++/ArgumentsReader.cpp | 75 ++++++++++++++++++++++++++++++++++ UnitTest++/ArgumentsReader.h | 75 ++-------------------------------- 2 files changed, 79 insertions(+), 71 deletions(-) create mode 100644 UnitTest++/ArgumentsReader.cpp diff --git a/UnitTest++/ArgumentsReader.cpp b/UnitTest++/ArgumentsReader.cpp new file mode 100644 index 0000000..d68fae0 --- /dev/null +++ b/UnitTest++/ArgumentsReader.cpp @@ -0,0 +1,75 @@ +#include "ArgumentsReader.h" + +using namespace UnitTest; + +ArgumentsReader::ArgumentsReader(int argc, char**argv) +{ + _arguments.reserve(argc); + for (int i = 1; i < argc; i++) + { + _arguments.push_back(argv[i]); + } +} + +bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) +{ + if (_arguments.empty()) + { + return false; + } + outCount = 0; + if (argumentName.empty()) + { + outFrom = 1; + } + else + { + outFrom = 0; + for (size_t i = 1; i < _arguments.size(); i++) + { + if (argumentName == _arguments[i]) + { + outFrom = i + 1; + break; + } + } + if (outFrom == 0) + { + return false; + } + } + + for (size_t i = outFrom; i < _arguments.size(); i++) + { + string value = _arguments[i]; + if (value.size() >= 2 && value.substr(0, 2) == "--") + { + break; + } + outCount++; + } + + return true; +} + + +vector ArgumentsReader::extractValues(const string & argumentName) +{ + int from, count; + if (!findArgumentListIndex(argumentName, from, count)) + { + return vector(); + } + vector values; + for (int i = from; i < from + count; i++) + { + values.push_back(getArgument(i)); + } + return values; +} + + +string ArgumentsReader::getArgument(int index) +{ + return _arguments[index]; +} diff --git a/UnitTest++/ArgumentsReader.h b/UnitTest++/ArgumentsReader.h index 9adc495..18016b9 100644 --- a/UnitTest++/ArgumentsReader.h +++ b/UnitTest++/ArgumentsReader.h @@ -8,77 +8,10 @@ namespace UnitTest { class ArgumentsReader { public: - ArgumentsReader(int argc, char**argv) - { - _arguments.reserve(argc); - for (int i = 1; i < argc; i++) - { - _arguments.push_back(argv[i]); - } - } - - bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) - { - if (_arguments.empty()) - { - return false; - } - outCount = 0; - if (argumentName.empty()) - { - outFrom = 1; - } - else - { - outFrom = 0; - for (size_t i = 1; i < _arguments.size(); i++) - { - if (argumentName == _arguments[i]) - { - outFrom = i + 1; - break; - } - } - if (outFrom == 0) - { - return false; - } - } - - for (size_t i = outFrom; i < _arguments.size(); i++) - { - string value = _arguments[i]; - if (value.size() >= 2 && value.substr(0, 2) == "--") - { - break; - } - outCount++; - } - - return true; - } - - - vector extractValues(const string & argumentName) - { - int from, count; - if (!findArgumentListIndex(argumentName, from, count)) - { - return vector(); - } - vector values; - for (int i = from; i < from + count; i++) - { - values.push_back(getArgument(i)); - } - return values; - } - - - string getArgument(int index) - { - return _arguments[index]; - } + ArgumentsReader(int argc, char**argv); + bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount); + vector extractValues(const string & argumentName); + string getArgument(int index); private: vector _arguments; From 79326cbc94256669606afad8219476ccd2e0d9d0 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 17:14:48 +0200 Subject: [PATCH 15/32] bug fix: wrong index --- UnitTest++/ArgumentsReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTest++/ArgumentsReader.cpp b/UnitTest++/ArgumentsReader.cpp index d68fae0..5b0f5c2 100644 --- a/UnitTest++/ArgumentsReader.cpp +++ b/UnitTest++/ArgumentsReader.cpp @@ -5,7 +5,7 @@ using namespace UnitTest; ArgumentsReader::ArgumentsReader(int argc, char**argv) { _arguments.reserve(argc); - for (int i = 1; i < argc; i++) + for (int i = 0; i < argc; i++) { _arguments.push_back(argv[i]); } From f12885acf829c4ad7c58bf32ec3eb1c3d039d386 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Thu, 8 Sep 2016 17:40:47 +0200 Subject: [PATCH 16/32] created tests for ArgumentsReader --- tests/TestArgumentsReader.cpp | 88 +++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 tests/TestArgumentsReader.cpp diff --git a/tests/TestArgumentsReader.cpp b/tests/TestArgumentsReader.cpp new file mode 100644 index 0000000..b86427b --- /dev/null +++ b/tests/TestArgumentsReader.cpp @@ -0,0 +1,88 @@ +#include "UnitTest++/UnitTestPP.h" +#include "UnitTest++/ArgumentsReader.h" + +using namespace UnitTest; + +SUITE(ArgumentsReader) +{ + TEST(Extract_IgnoreUndesired) + { + char full[] = "C:\\myProgram.exe"; + char valFake1[] = "fake"; + char valFake2[] = "fakeBis"; + char* argv[] = { full, valFake1, valFake2 }; + ArgumentsReader args(3, argv); + + CHECK(args.extractValues("--unexisting").empty()); + } + + TEST(Extract_CanExtractImplicitly) + { + char full[] = "C:\\myProgram.exe"; + char val1[] = "val1"; + char val2[] = "val2"; + char* argv[] = { full, val1, val2 }; + ArgumentsReader args(3, argv); + + vector values = args.extractValues(""); + REQUIRE CHECK_EQUAL(2, values.size()); + CHECK_EQUAL(val1, values[0]); + CHECK_EQUAL(val2, values[1]); + } + + + TEST(Extract_ReadSimple) + { + char full[] = "C:\\myProgram.exe"; + char paramToto[] = "--toto"; + char val1[] = "myTest"; + char* argv[] = { full, paramToto, val1 }; + ArgumentsReader args(3, argv); + + vector values = args.extractValues(paramToto); + REQUIRE CHECK_EQUAL(1, values.size()); + CHECK_EQUAL(val1, values[0]); + } + + + TEST(Extract_CanReadMultiple) + { + char full[] = "C:\\myProgram.exe"; + char fake[] = "fake"; + char paramToto[] = "--toto"; + char val1[] = "myTest"; + char val2[] = "myOtherTest"; + char* argv[] = { full, fake, paramToto, val1, val2 }; + ArgumentsReader args(5, argv); + + CHECK(args.extractValues("--unexisting").empty()); + + vector values = args.extractValues(paramToto); + REQUIRE CHECK_EQUAL(2, values.size()); + CHECK_EQUAL(val1, values[0]); + CHECK_EQUAL(val2, values[1]); + } + + + TEST(Extract_BlindTest) + { + char full[] = "C:\\myProgram.exe"; + char fake[] = "fake"; + char paramToto[] = "--toto"; + char totoVal1[] = "myTest"; + char totoVal2[] = "myOtherTest"; + char paramTiti[] = "--titi"; + char titiVal[] = "yourTest"; + char* argv[] = { full, fake, paramToto, totoVal1, totoVal2, paramTiti, titiVal }; + ArgumentsReader args(7, argv); + + vector valuesToto = args.extractValues(paramToto); + REQUIRE CHECK_EQUAL(2, valuesToto.size()); + CHECK_EQUAL(totoVal1, valuesToto[0]); + CHECK_EQUAL(totoVal2, valuesToto[1]); + + vector valuesTiti = args.extractValues(paramTiti); + REQUIRE CHECK_EQUAL(1, valuesTiti.size()); + CHECK_EQUAL(titiVal, valuesTiti[0]); + } +} From 6b6006ee4e6cea0db322ad20e8c5c686da87e426 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 10:54:55 +0200 Subject: [PATCH 17/32] use method instead of direct data --- UnitTest++/SuitePredicate.cpp | 4 ++-- UnitTest++/SuitePredicate.h | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/UnitTest++/SuitePredicate.cpp b/UnitTest++/SuitePredicate.cpp index ff819c6..9157059 100644 --- a/UnitTest++/SuitePredicate.cpp +++ b/UnitTest++/SuitePredicate.cpp @@ -31,7 +31,7 @@ void SuitePredicate::addSuites(const vector & suiteNames) { for (size_t i = 0; i < suiteNames.size(); i++) { - _suiteNames.push_back(suiteNames[i]); + addSuite(suiteNames[i]); } } @@ -40,7 +40,7 @@ void SuitePredicate::addTests(const vector & testNames) { for (size_t i = 0; i < testNames.size(); i++) { - _testNames.push_back(testNames[i]); + addTest(testNames[i]); } } diff --git a/UnitTest++/SuitePredicate.h b/UnitTest++/SuitePredicate.h index 5f7e51f..b7589f2 100644 --- a/UnitTest++/SuitePredicate.h +++ b/UnitTest++/SuitePredicate.h @@ -24,6 +24,9 @@ namespace UnitTest bool operator()(Test const * const test) const; + const vector & getSuites() const { return _suiteNames; } + const vector & getTests() const { return _testNames; } + private: bool mustExecuteSuite(Test const * const test) const; bool mustExecuteTest(Test const * const test) const; From a68d7b78dc7780f2774259f694db044e362021d3 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 10:55:12 +0200 Subject: [PATCH 18/32] created tests for SuitePredicate --- tests/TestSuitePredicate.cpp | 100 +++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 tests/TestSuitePredicate.cpp diff --git a/tests/TestSuitePredicate.cpp b/tests/TestSuitePredicate.cpp new file mode 100644 index 0000000..2f9046c --- /dev/null +++ b/tests/TestSuitePredicate.cpp @@ -0,0 +1,100 @@ +#include "UnitTest++/UnitTestPP.h" +#include "UnitTest++/SuitePredicate.h" + +SUITE(SuitePredicate) +{ + using namespace UnitTest; + + + TEST(Operator_DetectsTests) + { + SuitePredicate predicate; + predicate.addTest("test1"); + predicate.addTest("testFake"); + + Test test1("test1", "suite1"); + Test test2("test2"); + + CHECK(predicate.operator()(&test1)); + CHECK(!predicate.operator()(&test2)); + } + + + TEST(Operator_DetectsSuites) + { + SuitePredicate predicate; + predicate.addSuite("suite1"); + predicate.addSuite("suiteFake"); + + Test test1("test1", "suite1"); + Test test2("test2"); + + CHECK(predicate.operator()(&test1)); + CHECK(!predicate.operator()(&test2)); + } + + + TEST(Operator_WhenAddAll_AllAreAdded) + { + SuitePredicate predicate; + predicate.addAll(); + + Test test1("test1", "suite1"); + Test test2("test2"); + + CHECK(predicate.operator()(&test1)); + CHECK(predicate.operator()(&test2)); + } + + TEST(AddMultiple_AndCheckWithGetters) + { + vector tests; + tests.push_back("test1"); + tests.push_back("test2"); + + vector suites; + suites.push_back("suite1"); + suites.push_back("suite2"); + + SuitePredicate predicate; + predicate.addTests(tests); + predicate.addSuites(suites); + + REQUIRE CHECK_EQUAL(tests.size(), predicate.getTests().size()); + CHECK_ARRAY_EQUAL(tests, predicate.getTests(), tests.size()); + + REQUIRE CHECK_EQUAL(suites.size(), predicate.getSuites().size()); + CHECK_ARRAY_EQUAL(suites, predicate.getSuites(), suites.size()); + } + + + TEST(EmptyPredicate_IsFlaggedAsEmpty) + { + SuitePredicate predicate; + CHECK(predicate.empty()); + } + + + TEST(EmptyPredicate_WhenTestAdded_IsFlaggedAsNonEmpty) + { + SuitePredicate predicate; + predicate.addTest("toto"); + CHECK(!predicate.empty()); + } + + + TEST(EmptyPredicate_WhenSuiteAdded_IsFlaggedAsNonEmpty) + { + SuitePredicate predicate; + predicate.addSuite("toto"); + CHECK(!predicate.empty()); + } + + + TEST(EmptyPredicate_WhenAllAdded_IsFlaggedAsNonEmpty) + { + SuitePredicate predicate; + predicate.addAll(); + CHECK(!predicate.empty()); + } +} From 1e5d6ecfbb3e33130ee1581ac20f01c1fd7b9e0d Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:11:47 +0200 Subject: [PATCH 19/32] const methods --- UnitTest++/ArgumentsReader.cpp | 6 +++--- UnitTest++/ArgumentsReader.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTest++/ArgumentsReader.cpp b/UnitTest++/ArgumentsReader.cpp index 5b0f5c2..399da95 100644 --- a/UnitTest++/ArgumentsReader.cpp +++ b/UnitTest++/ArgumentsReader.cpp @@ -11,7 +11,7 @@ ArgumentsReader::ArgumentsReader(int argc, char**argv) } } -bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) +bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) const { if (_arguments.empty()) { @@ -53,7 +53,7 @@ bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & o } -vector ArgumentsReader::extractValues(const string & argumentName) +vector ArgumentsReader::extractValues(const string & argumentName) const { int from, count; if (!findArgumentListIndex(argumentName, from, count)) @@ -69,7 +69,7 @@ vector ArgumentsReader::extractValues(const string & argumentName) } -string ArgumentsReader::getArgument(int index) +string ArgumentsReader::getArgument(int index) const { return _arguments[index]; } diff --git a/UnitTest++/ArgumentsReader.h b/UnitTest++/ArgumentsReader.h index 18016b9..e3438f6 100644 --- a/UnitTest++/ArgumentsReader.h +++ b/UnitTest++/ArgumentsReader.h @@ -9,9 +9,9 @@ namespace UnitTest { { public: ArgumentsReader(int argc, char**argv); - bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount); - vector extractValues(const string & argumentName); - string getArgument(int index); + bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) const; + vector extractValues(const string & argumentName) const; + string getArgument(int index) const; private: vector _arguments; From 449a77cb2ee6c69a73779e29601ef53febaa9977 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:16:26 +0200 Subject: [PATCH 20/32] small refactor --- UnitTest++/PredicateCmdBuilder.cpp | 23 +++++++++++++++++ UnitTest++/PredicateCmdBuilder.h | 16 ++++++++++++ UnitTest++/SuitePredicateCmdBuilder.cpp | 33 ------------------------- UnitTest++/SuitePredicateCmdBuilder.h | 20 --------------- UnitTest++/TestRunner.cpp | 11 +++++---- 5 files changed, 45 insertions(+), 58 deletions(-) create mode 100644 UnitTest++/PredicateCmdBuilder.cpp create mode 100644 UnitTest++/PredicateCmdBuilder.h delete mode 100644 UnitTest++/SuitePredicateCmdBuilder.cpp delete mode 100644 UnitTest++/SuitePredicateCmdBuilder.h diff --git a/UnitTest++/PredicateCmdBuilder.cpp b/UnitTest++/PredicateCmdBuilder.cpp new file mode 100644 index 0000000..7896fb9 --- /dev/null +++ b/UnitTest++/PredicateCmdBuilder.cpp @@ -0,0 +1,23 @@ +#include "PredicateCmdBuilder.h" + +using namespace UnitTest; + + +void PredicateCmdBuilder::fillSuitePredicate(const ArgumentsReader & arguments, SuitePredicate & outPredicate, bool allowImplicitArgs) +{ + outPredicate.addSuites(arguments.extractValues("--suite")); + outPredicate.addTests(arguments.extractValues("--test")); + + if (allowImplicitArgs) + { + vector implicitArguments = arguments.extractValues(""); + outPredicate.addSuites(implicitArguments); + outPredicate.addTests(implicitArguments); + } + + if (outPredicate.empty()) + { + outPredicate.addAll(); + } +} + diff --git a/UnitTest++/PredicateCmdBuilder.h b/UnitTest++/PredicateCmdBuilder.h new file mode 100644 index 0000000..cfafe08 --- /dev/null +++ b/UnitTest++/PredicateCmdBuilder.h @@ -0,0 +1,16 @@ +#ifndef UNITTEST_PredicateCmdBuilder_H +#define UNITTEST_TESTRUNNERCMD_H + +#include "ArgumentsReader.h" +#include "SuitePredicate.h" + +namespace UnitTest { + + class PredicateCmdBuilder + { + public: + static void fillSuitePredicate(const ArgumentsReader & arguments, SuitePredicate & outPredicate, bool allowImplicitArgs = true); + }; +} + +#endif \ No newline at end of file diff --git a/UnitTest++/SuitePredicateCmdBuilder.cpp b/UnitTest++/SuitePredicateCmdBuilder.cpp deleted file mode 100644 index 50c9ba8..0000000 --- a/UnitTest++/SuitePredicateCmdBuilder.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "SuitePredicateCmdBuilder.h" - -using namespace UnitTest; - - -SuitePredicateCmdBuilder::SuitePredicateCmdBuilder(int argc, char**argv) - : _arguments(argc, argv) -{ -} - - -SuitePredicate SuitePredicateCmdBuilder::buildPredicate(bool allowImplicitArgs) -{ - SuitePredicate predicate; - - predicate.addSuites(_arguments.extractValues("--suite")); - predicate.addTests(_arguments.extractValues("--test")); - - if (allowImplicitArgs) - { - vector implicitArguments = _arguments.extractValues(""); - predicate.addSuites(implicitArguments); - predicate.addTests(implicitArguments); - } - - if (predicate.empty()) - { - predicate.addAll(); - } - - return predicate; -} - diff --git a/UnitTest++/SuitePredicateCmdBuilder.h b/UnitTest++/SuitePredicateCmdBuilder.h deleted file mode 100644 index 9a994e5..0000000 --- a/UnitTest++/SuitePredicateCmdBuilder.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef UNITTEST_TESTRUNNERCMD_H -#define UNITTEST_TESTRUNNERCMD_H - -#include "ArgumentsReader.h" -#include "SuitePredicate.h" - -namespace UnitTest { - - class SuitePredicateCmdBuilder - { - public: - SuitePredicateCmdBuilder(int argc, char**argv); - SuitePredicate buildPredicate(bool allowImplicitArgs = true); - - private: - ArgumentsReader _arguments; - }; -} - -#endif \ No newline at end of file diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index c349eb6..085d02a 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -5,7 +5,7 @@ #include "TimeHelpers.h" #include "MemoryOutStream.h" #include "SuitePredicate.h" -#include "SuitePredicateCmdBuilder.h" +#include "PredicateCmdBuilder.h" #include @@ -19,14 +19,15 @@ namespace UnitTest { return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0); } - int RunTestsCmd(int argc, char**argv) { - SuitePredicateCmdBuilder suiteCmd(argc, argv); + SuitePredicate predicate; + ArgumentsReader arguments(argc, argv); + PredicateCmdBuilder::fillSuitePredicate(arguments, predicate); + TestReporterStdout reporter; TestRunner runner(reporter); - - return runner.RunTestsIf(Test::GetTestList(), 0, suiteCmd.buildPredicate(), 0); + return runner.RunTestsIf(Test::GetTestList(), 0, predicate, 0); } TestRunner::TestRunner(TestReporter& reporter) From 78fd0963981a0f4c633620b82ef437f773715f63 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:24:50 +0200 Subject: [PATCH 21/32] improved comment of explainations --- UnitTest++/TestRunner.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 227c88f..44f63e5 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -12,10 +12,16 @@ namespace UnitTest { class Timer; /** + * Run tests/suites using custom selection from command line. + * * Commands: - * --test One or multiple test names to execute (specify "--test" is optional if it is the first argument), can be combined with --suite + * --test One or multiple test names to execute, can be combined with --suite * --suite One or multiple suite names to execute, can be combined with --test * + * Special feature: You do not have to specify explicitely --test and --suite, you + * can mix suite names and test names and the cmd will find the way. The + * constraint is that it must have no arguments beginning with -- before + * * Usage examples: * myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest * myTests.exe MySpecialTest MyOtherTest --suite MySuite1 From 7e5608e773ad645f3b55dbd84fd7c6f68c66f8a6 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:26:34 +0200 Subject: [PATCH 22/32] added virtual destructor --- UnitTest++/ArgumentsReader.cpp | 6 ++++++ UnitTest++/ArgumentsReader.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/UnitTest++/ArgumentsReader.cpp b/UnitTest++/ArgumentsReader.cpp index 399da95..1192e80 100644 --- a/UnitTest++/ArgumentsReader.cpp +++ b/UnitTest++/ArgumentsReader.cpp @@ -11,6 +11,12 @@ ArgumentsReader::ArgumentsReader(int argc, char**argv) } } + +ArgumentsReader::~ArgumentsReader() +{ +} + + bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) const { if (_arguments.empty()) diff --git a/UnitTest++/ArgumentsReader.h b/UnitTest++/ArgumentsReader.h index e3438f6..c10a53e 100644 --- a/UnitTest++/ArgumentsReader.h +++ b/UnitTest++/ArgumentsReader.h @@ -9,6 +9,8 @@ namespace UnitTest { { public: ArgumentsReader(int argc, char**argv); + virtual ~ArgumentsReader(); + bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) const; vector extractValues(const string & argumentName) const; string getArgument(int index) const; From 8b6a85d09f3b4cb3e300310e1e4cd6cd7a85d935 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:33:30 +0200 Subject: [PATCH 23/32] minor optimisation --- UnitTest++/ArgumentsReader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTest++/ArgumentsReader.cpp b/UnitTest++/ArgumentsReader.cpp index 1192e80..7ce6729 100644 --- a/UnitTest++/ArgumentsReader.cpp +++ b/UnitTest++/ArgumentsReader.cpp @@ -47,7 +47,7 @@ bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & o for (size_t i = outFrom; i < _arguments.size(); i++) { - string value = _arguments[i]; + const string & value = _arguments[i]; if (value.size() >= 2 && value.substr(0, 2) == "--") { break; From 8d91f324e2453f4463dbf64b2413b979c5b49f5b Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:35:13 +0200 Subject: [PATCH 24/32] removed useless include --- UnitTest++/TestRunner.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 085d02a..5cb0e71 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -4,7 +4,6 @@ #include "TestReporterStdout.h" #include "TimeHelpers.h" #include "MemoryOutStream.h" -#include "SuitePredicate.h" #include "PredicateCmdBuilder.h" #include From 5dd0975a0e51c1fba70affd28f53ab11bb5d2f5a Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:40:23 +0200 Subject: [PATCH 25/32] named suite TestDetails --- tests/TestTestDetails.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/TestTestDetails.cpp b/tests/TestTestDetails.cpp index 4a3c8c4..b5c6a28 100644 --- a/tests/TestTestDetails.cpp +++ b/tests/TestTestDetails.cpp @@ -1,9 +1,10 @@ #include "UnitTest++/UnitTestPP.h" #include "UnitTest++/TestDetails.h" -using namespace UnitTest; -namespace { +SUITE(TestDetails) +{ + using namespace UnitTest; TEST(SameTest_SameValues_AreEqual) { From 6ca1119f1df594231f9e44b39fa86d1e607efae7 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:41:01 +0200 Subject: [PATCH 26/32] possibility to disable implicit args --- UnitTest++/TestRunner.cpp | 4 ++-- UnitTest++/TestRunner.h | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 5cb0e71..638d6bd 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -18,11 +18,11 @@ namespace UnitTest { return runner.RunTestsIf(Test::GetTestList(), NULL, True(), 0); } - int RunTestsCmd(int argc, char**argv) + int RunTestsCmd(int argc, char**argv, bool allowImplicitArgs) { SuitePredicate predicate; ArgumentsReader arguments(argc, argv); - PredicateCmdBuilder::fillSuitePredicate(arguments, predicate); + PredicateCmdBuilder::fillSuitePredicate(arguments, predicate, allowImplicitArgs); TestReporterStdout reporter; TestRunner runner(reporter); diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 44f63e5..da7a438 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -20,13 +20,14 @@ namespace UnitTest { * * Special feature: You do not have to specify explicitely --test and --suite, you * can mix suite names and test names and the cmd will find the way. The - * constraint is that it must have no arguments beginning with -- before + * constraint is that it must have no arguments beginning with --. + * For disabling this feature, set allowImplicitArgs=false * * Usage examples: * myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest * myTests.exe MySpecialTest MyOtherTest --suite MySuite1 */ - UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv); + UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, bool allowImplicitArgs = true); UNITTEST_LINKAGE int RunAllTests(); From cd287cf795ad1eaa0b9794ff5c9253bd0a12d146 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 11:45:35 +0200 Subject: [PATCH 27/32] changed comment --- UnitTest++/TestRunner.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index da7a438..4baf51b 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -24,8 +24,8 @@ namespace UnitTest { * For disabling this feature, set allowImplicitArgs=false * * Usage examples: - * myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest - * myTests.exe MySpecialTest MyOtherTest --suite MySuite1 + * Explicit: myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest + * Implicit: myTests.exe MySpecialTest MyOtherTest MySuite1 */ UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, bool allowImplicitArgs = true); From ef3c0c833011bc58bdc002ea1a5d9658d33f372b Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 14:33:41 +0200 Subject: [PATCH 28/32] Fixed warnings (treated as error) --- tests/TestArgumentsReader.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/TestArgumentsReader.cpp b/tests/TestArgumentsReader.cpp index b86427b..b6c808e 100644 --- a/tests/TestArgumentsReader.cpp +++ b/tests/TestArgumentsReader.cpp @@ -25,7 +25,7 @@ SUITE(ArgumentsReader) ArgumentsReader args(3, argv); vector values = args.extractValues(""); - REQUIRE CHECK_EQUAL(2, values.size()); + REQUIRE CHECK_EQUAL(2u, values.size()); CHECK_EQUAL(val1, values[0]); CHECK_EQUAL(val2, values[1]); } @@ -40,7 +40,7 @@ SUITE(ArgumentsReader) ArgumentsReader args(3, argv); vector values = args.extractValues(paramToto); - REQUIRE CHECK_EQUAL(1, values.size()); + REQUIRE CHECK_EQUAL(1u, values.size()); CHECK_EQUAL(val1, values[0]); } @@ -58,7 +58,7 @@ SUITE(ArgumentsReader) CHECK(args.extractValues("--unexisting").empty()); vector values = args.extractValues(paramToto); - REQUIRE CHECK_EQUAL(2, values.size()); + REQUIRE CHECK_EQUAL(2u, values.size()); CHECK_EQUAL(val1, values[0]); CHECK_EQUAL(val2, values[1]); } @@ -77,12 +77,12 @@ SUITE(ArgumentsReader) ArgumentsReader args(7, argv); vector valuesToto = args.extractValues(paramToto); - REQUIRE CHECK_EQUAL(2, valuesToto.size()); + REQUIRE CHECK_EQUAL(2u, valuesToto.size()); CHECK_EQUAL(totoVal1, valuesToto[0]); CHECK_EQUAL(totoVal2, valuesToto[1]); vector valuesTiti = args.extractValues(paramTiti); - REQUIRE CHECK_EQUAL(1, valuesTiti.size()); + REQUIRE CHECK_EQUAL(1u, valuesTiti.size()); CHECK_EQUAL(titiVal, valuesTiti[0]); } } From d5e6fe15a8cc531661f8d4e5785b75848d519a6a Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Fri, 9 Sep 2016 14:45:55 +0200 Subject: [PATCH 29/32] =?UTF-8?q?fix=20for=20gcc:=20TestDetails.cpp:38:47:?= =?UTF-8?q?=20error:=20=E2=80=98strcmp=E2=80=99=20was=20not=20declared=20i?= =?UTF-8?q?n=20this=20scope?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UnitTest++/TestDetails.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTest++/TestDetails.cpp b/UnitTest++/TestDetails.cpp index 5a0c540..3c76dbb 100644 --- a/UnitTest++/TestDetails.cpp +++ b/UnitTest++/TestDetails.cpp @@ -1,5 +1,5 @@ #include "TestDetails.h" -#include +#include // "c" version required for gcc namespace UnitTest { From f8e366b19b8b2fdd57bfcfa0dec776350f4c22f7 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 12 Sep 2016 09:43:06 +0200 Subject: [PATCH 30/32] added overload with same signatire as "int main(int argc, char**argv)" --- UnitTest++/TestRunner.cpp | 5 +++++ UnitTest++/TestRunner.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/UnitTest++/TestRunner.cpp b/UnitTest++/TestRunner.cpp index 638d6bd..d79ddea 100644 --- a/UnitTest++/TestRunner.cpp +++ b/UnitTest++/TestRunner.cpp @@ -29,6 +29,11 @@ namespace UnitTest { return runner.RunTestsIf(Test::GetTestList(), 0, predicate, 0); } + int RunTestsCmd(int argc, char**argv) + { + return RunTestsCmd(argc, argv, true); + } + TestRunner::TestRunner(TestReporter& reporter) : m_reporter(&reporter) , m_result(new TestResults(&reporter)) diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 4baf51b..049f0de 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -27,7 +27,8 @@ namespace UnitTest { * Explicit: myTests.exe --suite MySuite1 MyOtherSuite --test MySpecialTest MyOtherTest * Implicit: myTests.exe MySpecialTest MyOtherTest MySuite1 */ - UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, bool allowImplicitArgs = true); + UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, bool allowImplicitArgs); + UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv); UNITTEST_LINKAGE int RunAllTests(); From b3b3df95886e3b44c0da54cc14d0edb3185670ab Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 12 Sep 2016 09:45:25 +0200 Subject: [PATCH 31/32] added comment --- UnitTest++/TestRunner.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UnitTest++/TestRunner.h b/UnitTest++/TestRunner.h index 049f0de..d0605f8 100644 --- a/UnitTest++/TestRunner.h +++ b/UnitTest++/TestRunner.h @@ -28,7 +28,7 @@ namespace UnitTest { * Implicit: myTests.exe MySpecialTest MyOtherTest MySuite1 */ UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv, bool allowImplicitArgs); - UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv); + UNITTEST_LINKAGE int RunTestsCmd(int argc, char**argv); // Important: keep version with same signature as int main() UNITTEST_LINKAGE int RunAllTests(); From 7c98f0a674418793badd39e1f5e5adce056b9536 Mon Sep 17 00:00:00 2001 From: Gabriel Schlozer Date: Mon, 12 Sep 2016 10:31:15 +0200 Subject: [PATCH 32/32] fixed some int -> size_t --- UnitTest++/ArgumentsReader.cpp | 8 ++++---- UnitTest++/ArgumentsReader.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/UnitTest++/ArgumentsReader.cpp b/UnitTest++/ArgumentsReader.cpp index 7ce6729..2470dda 100644 --- a/UnitTest++/ArgumentsReader.cpp +++ b/UnitTest++/ArgumentsReader.cpp @@ -17,7 +17,7 @@ ArgumentsReader::~ArgumentsReader() } -bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) const +bool ArgumentsReader::findArgumentListIndex(const string & argumentName, size_t & outFrom, size_t & outCount) const { if (_arguments.empty()) { @@ -61,13 +61,13 @@ bool ArgumentsReader::findArgumentListIndex(const string & argumentName, int & o vector ArgumentsReader::extractValues(const string & argumentName) const { - int from, count; + size_t from, count; if (!findArgumentListIndex(argumentName, from, count)) { return vector(); } vector values; - for (int i = from; i < from + count; i++) + for (size_t i = from; i < from + count; i++) { values.push_back(getArgument(i)); } @@ -75,7 +75,7 @@ vector ArgumentsReader::extractValues(const string & argumentName) const } -string ArgumentsReader::getArgument(int index) const +string ArgumentsReader::getArgument(size_t index) const { return _arguments[index]; } diff --git a/UnitTest++/ArgumentsReader.h b/UnitTest++/ArgumentsReader.h index c10a53e..52fb02b 100644 --- a/UnitTest++/ArgumentsReader.h +++ b/UnitTest++/ArgumentsReader.h @@ -11,9 +11,9 @@ namespace UnitTest { ArgumentsReader(int argc, char**argv); virtual ~ArgumentsReader(); - bool findArgumentListIndex(const string & argumentName, int & outFrom, int & outCount) const; + bool findArgumentListIndex(const string & argumentName, size_t & outFrom, size_t & outCount) const; vector extractValues(const string & argumentName) const; - string getArgument(int index) const; + string getArgument(size_t index) const; private: vector _arguments;