Line data Source code
1 : #include "Puzzle.h"
2 :
3 : #include <gtest/gtest.h>
4 :
5 : #include <algorithm>
6 :
7 : class PuzzleTest : public testing::Test {
8 : public:
9 156 : PuzzleTest(std::shared_ptr<Puzzle> const &puzzle) : _puzzle(puzzle) {}
10 :
11 : protected:
12 312 : Puzzle const &puzzle() { return *_puzzle; }
13 :
14 : private:
15 : std::shared_ptr<Puzzle> _puzzle;
16 : };
17 :
18 : class PuzzleTestPt1 : public PuzzleTest {
19 : public:
20 : using PuzzleTest::PuzzleTest;
21 :
22 78 : void TestBody() override {
23 78 : std::string const result = puzzle().runPart1();
24 78 : ASSERT_EQ(result, puzzle().solutionPart1());
25 78 : }
26 : };
27 :
28 : class PuzzleTestPt2 : public PuzzleTest {
29 : public:
30 : using PuzzleTest::PuzzleTest;
31 :
32 78 : void TestBody() override {
33 78 : std::string const result = puzzle().runPart2();
34 78 : ASSERT_EQ(result, puzzle().solutionPart2());
35 78 : }
36 : };
37 :
38 157 : void registerTests() {
39 157 : std::vector<std::unique_ptr<Puzzle>> puzzles = Puzzle::createAll();
40 157 : std::vector<std::shared_ptr<Puzzle>> sharedPuzzles;
41 157 : std::ranges::move(puzzles, std::back_inserter(sharedPuzzles));
42 :
43 12246 : for (auto const &p : sharedPuzzles) {
44 12246 : std::string suiteName = p->name();
45 12246 : testing::RegisterTest(suiteName.c_str(), "Pt1", nullptr, nullptr, __FILE__, __LINE__,
46 : // Important to use the fixture type as the return type here.
47 12246 : [=]() -> PuzzleTest * { return new PuzzleTestPt1(p); });
48 :
49 12246 : testing::RegisterTest(suiteName.c_str(), "Pt2", nullptr, nullptr, __FILE__, __LINE__,
50 : // Important to use the fixture type as the return type here.
51 12246 : [=]() -> PuzzleTest * { return new PuzzleTestPt2(p); });
52 12246 : }
53 157 : }
54 :
55 157 : int main(int argc, char **argv) {
56 :
57 157 : testing::InitGoogleTest(&argc, argv);
58 157 : registerTests();
59 157 : return RUN_ALL_TESTS();
60 157 : }
|