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