GCC Code Coverage Report


Directory: ./
File: TestArray.cpp
Date: 2026-03-21 20:51:59
Exec Total Coverage
Lines: 66 66 100.0%
Functions: 12 12 100.0%
Branches: 113 334 33.8%

Line Branch Exec Source
1 #include "Array.hpp"
2 #include "Verbose.hpp"
3 #include <gmock/gmock.h>
4
5 using namespace testing;
6 using namespace testing::internal;
7
8 namespace { // anonymous namespace for definitions that are local to this file
9 class TestableArray : public Verbose<Array> {
10 public:
11 using Verbose<Array>::Verbose;
12 using Verbose<Array>::data_;
13 using Verbose<Array>::size_;
14 };
15 } // anonymous namespace
16
17 8 TEST(Array, DefaultConstructor) {
18
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 auto a = TestableArray{"a"}; // constructor
19
2/10
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_EQ(0, a.size());
20 4 }
21
22 8 TEST(Array, MoveConstructor) {
23 2 constexpr auto size = gsl::index{3};
24
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 auto a0 = TestableArray{"a0", size}; // constructor
25
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (auto i = gsl::index{0}; i < size; i++) {
26
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
6 a0[i] = gsl::narrow_cast<double>(2 * i); // even
27 }
28
29
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CaptureStdout();
30 4 auto a1 = std::move(a0); // move constructor
31
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto actual = GetCapturedStdout();
32
33
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
2 EXPECT_THAT(actual, HasSubstr("move constructor"));
34
5/16
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
2 EXPECT_THAT(actual, Not(HasSubstr("copy")));
35
5/16
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
2 EXPECT_THAT(actual, Not(HasSubstr("assignment")));
36
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 std::cout << std::endl << actual << std::endl;
37
38 2 const auto& const0 = a0;
39 2 const auto& const1 = a1;
40
2/10
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_EQ(0, const0.size_);
41
2/10
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_EQ(nullptr, const0.data_);
42
2/10
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
2 EXPECT_EQ(size, const1.size());
43
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (auto i = gsl::index{0}; i < size; i++) {
44
3/12
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
6 EXPECT_EQ(const1[i], 2 * i); // even
45 }
46 4 }
47
48 8 TEST(Array, CopyAssignment) {
49 2 constexpr auto size = gsl::index{3};
50
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 auto a0 = TestableArray{"a0", size}; // constructor
51
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 auto a1 = TestableArray{"a1", size}; // constructor
52
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (auto i = gsl::index{0}; i < size; i++) {
53
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
6 a0[i] = gsl::narrow_cast<double>(2 * i); // even
54
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
6 a1[i] = gsl::narrow_cast<double>(2 * i + 1); // odd
55 }
56
57
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CaptureStdout();
58
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 a0 = a1; // copy assignment
59
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto actual = GetCapturedStdout();
60
61
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
2 EXPECT_THAT(actual, HasSubstr("copy assignment"));
62
5/16
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
2 EXPECT_THAT(actual, Not(HasSubstr("move")));
63
5/16
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
2 EXPECT_THAT(actual, Not(HasSubstr("constructor")));
64
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 std::cout << std::endl << actual << std::endl;
65
66 2 const auto& const0 = a0;
67 2 const auto& const1 = a1;
68
2/10
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
2 EXPECT_NE(const0.data_, const1.data_); // pointers should differ
69
2/10
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
2 EXPECT_EQ(const0.size(), const1.size());
70
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (auto i = gsl::index{0}; i < size; i++) {
71
4/14
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 17 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
6 EXPECT_EQ(const0[i], const1[i]);
72 }
73 4 }
74
75 8 TEST(Array, MoveAssignment) {
76 2 constexpr auto size = gsl::index{3};
77
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 auto a0 = TestableArray{"a0", size}; // constructor
78
2/4
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 auto a1 = TestableArray{"a1", size}; // constructor
79
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (auto i = gsl::index{0}; i < size; i++) {
80
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
6 a0[i] = gsl::narrow_cast<double>(2 * i); // even
81
1/2
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
6 a1[i] = gsl::narrow_cast<double>(2 * i + 1); // odd
82 }
83
84
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CaptureStdout();
85 2 a0 = std::move(a1); // move assignment
86
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto actual = GetCapturedStdout();
87
88
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
2 EXPECT_THAT(actual, HasSubstr("move assignment"));
89
5/16
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
2 EXPECT_THAT(actual, Not(HasSubstr("copy")));
90
5/16
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
2 EXPECT_THAT(actual, Not(HasSubstr("constructor")));
91
3/6
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
2 std::cout << std::endl << actual << std::endl;
92
93 2 const auto& const0 = a0;
94 2 const auto& const1 = a1;
95
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
8 for (auto i = gsl::index{0}; i < size; i++) {
96
3/12
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
6 EXPECT_EQ(const0[i], 2 * i + 1); // odd
97 }
98
2/10
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_EQ(0, const1.size_);
99
2/10
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_EQ(nullptr, const1.data_);
100 4 }
101