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 152 : PuzzleTest(std::shared_ptr<Puzzle> const &puzzle) : _puzzle(puzzle) {}
10 :
11 : protected:
12 304 : 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 76 : void TestBody() override {
23 76 : std::string const result = puzzle().runPart1();
24 76 : ASSERT_EQ(result, puzzle().solutionPart1());
25 76 : }
26 : };
27 :
28 : class PuzzleTestPt2 : public PuzzleTest {
29 : public:
30 : using PuzzleTest::PuzzleTest;
31 :
32 76 : void TestBody() override {
33 76 : std::string const result = puzzle().runPart2();
34 76 : ASSERT_EQ(result, puzzle().solutionPart2());
35 76 : }
36 : };
37 :
38 153 : void registerTests() {
39 153 : std::vector<std::unique_ptr<Puzzle>> puzzles = Puzzle::createAll();
40 153 : std::vector<std::shared_ptr<Puzzle>> sharedPuzzles;
41 153 : std::ranges::move(puzzles, std::back_inserter(sharedPuzzles));
42 :
43 11628 : for (auto const &p : sharedPuzzles) {
44 11628 : std::string suiteName = p->name();
45 11628 : testing::RegisterTest(suiteName.c_str(), "Pt1", nullptr, nullptr, __FILE__, __LINE__,
46 : // Important to use the fixture type as the return type here.
47 11628 : [=]() -> PuzzleTest * { return new PuzzleTestPt1(p); });
48 :
49 11628 : testing::RegisterTest(suiteName.c_str(), "Pt2", nullptr, nullptr, __FILE__, __LINE__,
50 : // Important to use the fixture type as the return type here.
51 11628 : [=]() -> PuzzleTest * { return new PuzzleTestPt2(p); });
52 11628 : }
53 153 : }
54 :
55 153 : int main(int argc, char **argv) {
56 :
57 153 : testing::InitGoogleTest(&argc, argv);
58 153 : registerTests();
59 153 : return RUN_ALL_TESTS();
60 153 : }
|