GCC Code Coverage Report


Directory: ./
File: TestSharedRef.cpp
Date: 2026-03-21 20:51:59
Exec Total Coverage
Lines: 101 101 100.0%
Functions: 24 24 100.0%
Branches: 218 724 30.1%

Line Branch Exec Source
1 #include "SharedRef.hpp"
2
3 #include "Shape.hpp"
4 #include "Verbose.hpp"
5 #include "compat/gsl14.hpp"
6
7 #include <gmock/gmock.h>
8 #include <vector>
9
10 using namespace testing;
11 using namespace testing::internal;
12
13 // Anonymous namespace for definitions that are local to this file.
14 namespace {
15 template <typename T>
16 using SharedContainer = std::vector<SharedRef<T>>;
17
18 // Both refer to the same object (same address)
19 template <typename T>
20 3 bool same(const SharedRef<T>& a, const SharedRef<T>& b) {
21 3 return &a.get() == &b.get();
22 }
23
24 6 bool less(const Verbose<>& left, const Verbose<>& right) {
25 6 return left.name() < right.name();
26 }
27
28 28 const std::string& name(const Verbose<Circle>& v) { return v.name(); }
29
30 39 const std::string& name(const Verbose<>& v) { return v.name(); }
31
32 9 double area(const Shape& a) { return a.area(); }
33
34 // Print the elements of a container of smart references.
35 template <typename T>
36 4 void print(
37 const SharedContainer<Verbose<T>>& container,
38 const std::string& prefix = "print: ") {
39
2/2
✓ Branch 9 taken 12 times.
✓ Branch 10 taken 4 times.
16 for (const auto& elem : container) {
40
3/6
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 12 taken 12 times.
✗ Branch 13 not taken.
✓ Branch 18 taken 12 times.
✗ Branch 19 not taken.
12 std::cout << prefix << name(elem) << std::endl;
41
5/16
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 12 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
12 EXPECT_THAT(name(elem), Not(HasSubstr("copy")));
42
5/16
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 12 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
12 EXPECT_THAT(name(elem), Not(HasSubstr("move")));
43 }
44 4 }
45 } // anonymous namespace
46
47 // NOLINTBEGIN(*-avoid-magic-numbers)
48
49 8 TEST(SharedRef, constructor) {
50
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto a = makeSharedRef<Verbose<Circle>>("one", 1.0);
51
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto b = makeSharedRef<Verbose<Circle>>("two", 2.0);
52 // auto c = SharedRef<Verbose<Circle>> { }; // no dangling references!
53
54
2/12
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_FALSE(same(a, b));
55
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(name(a), name(b));
56
4/14
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ 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_NE(area(a), area(b));
57 4 }
58
59 8 TEST(SharedRef, copy) {
60 // SharedRef is copyable because shared_ptr is copyable.
61
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
2 EXPECT_TRUE(std::is_copy_constructible<SharedRef<Shape>>::value);
62
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
2 EXPECT_TRUE(std::is_copy_assignable<SharedRef<Shape>>::value);
63
64
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto a = makeSharedRef<Verbose<Circle>>("one", 1.0);
65
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto b = makeSharedRef<Verbose<Circle>>("two", 2.0);
66
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto c = makeSharedRef<Verbose<Circle>>("three", 3.0);
67 2 auto d = SharedRef<Verbose<Circle>>{a}; // copy constructor
68
69 2 c = b; // copy assignment
70
71 // Copying modifies the reference, not the object.
72
73
2/12
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_TRUE(same(a, d)); // both refer to same object
74
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_EQ(name(a), name(d));
75
4/14
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ 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(area(a), area(d));
76
77
2/12
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 EXPECT_TRUE(same(b, c)); // both refer to same object
78
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_EQ(name(b), name(c));
79
4/14
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ 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(area(b), area(c));
80
81
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
2 EXPECT_THAT(name(c), EndsWith("two"));
82
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("three")));
83
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("copy")));
84
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("move")));
85
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("construct")));
86
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("assign")));
87
88
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
2 EXPECT_THAT(name(d), EndsWith("one"));
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), 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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("move")));
91
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("construct")));
92
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("assign")));
93 4 }
94
95 8 TEST(SharedRef, move) {
96 // SharedRef is moveable because shared_ptr is moveable.
97
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
2 EXPECT_TRUE(std::is_move_constructible<SharedRef<Shape>>::value);
98
1/10
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
2 EXPECT_TRUE(std::is_move_assignable<SharedRef<Shape>>::value);
99
100
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto a = makeSharedRef<Verbose<Circle>>("one", 1.0);
101
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto b = makeSharedRef<Verbose<Circle>>("two", 2.0);
102
1/2
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 auto c = makeSharedRef<Verbose<Circle>>("three", 3.0);
103 4 auto d = SharedRef<Verbose<Circle>>{std::move(a)}; // move constructor
104
105 2 c = std::move(b); // move assignment
106
107 // Moving modifies the reference, not the object.
108
109
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
2 EXPECT_THAT(name(c), EndsWith("two"));
110
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("three")));
111
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("copy")));
112
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("move")));
113
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("construct")));
114
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(c), Not(HasSubstr("assign")));
115
116
4/14
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
2 EXPECT_THAT(name(d), EndsWith("one"));
117
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("copy")));
118
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("move")));
119
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("construct")));
120
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 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
2 EXPECT_THAT(name(d), Not(HasSubstr("assign")));
121 4 }
122
123 8 TEST(SharedRef, rebind) {
124
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CaptureStdout();
125
4/10
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
6 auto a = SharedRef<Shape>{new Verbose<Square>{"square", 3.0}};
126 2 auto b = a; // copy reference, not object
127
4/10
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
6 b = SharedRef<Shape>{new Verbose<Circle>{"circle", 3.0}};
128
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto actual = GetCapturedStdout();
129
4/14
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 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_NE(area(a), area(b));
130
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")));
131
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")));
132
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;
133 4 }
134
135 8 TEST(SharedRef, swap) {
136
4/10
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
6 auto a = SharedRef<Shape>{new Verbose<Square>{"square", 1.0}};
137
4/10
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
6 auto b = SharedRef<Shape>{new Verbose<Circle>{"circle", 2.0}};
138
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 CaptureStdout();
139 2 swap(a, b); // swap references, not objects
140
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto actual = GetCapturedStdout();
141
3/12
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 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_EQ(1.0, area(b));
142
1/12
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
2 EXPECT_TRUE(actual.empty()) << actual;
143 4 }
144
145 8 TEST(SharedRef, container) {
146 2 auto container = SharedContainer<Verbose<>>{};
147
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 container.emplace_back(std::make_shared<Verbose<>>("one"));
148
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 container.emplace_back(std::make_shared<Verbose<>>("two"));
149
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 container.emplace_back(std::make_shared<Verbose<>>("three"));
150
151
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 print(container, "original :");
152
2/10
✓ Branch 10 taken 1 times.
✗ Branch 11 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("two", name(container[1]));
153
154 // Copying a container of references
155 // does not copy the referenced objects.
156
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 auto container_copy = container;
157
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 print(container_copy, "copy: ");
158
159 // Sorting a container of references
160 // does not affect the original container.
161 #if __cplusplus >= 202002L // since C++20
162
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 std::ranges::sort(container_copy, less);
163 #else // until C++20
164 std::sort(container_copy.begin(), container_copy.end(), less);
165 #endif // C++20
166
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 print(container_copy, "sorted: ");
167
2/10
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
2 EXPECT_EQ(name(container[2]), name(container_copy[1]));
168
169 // Moving a container of references
170 // does not move the objects.
171 4 auto container_move = std::move(container);
172
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
6 print(container_move, "move: ");
173 4 }
174
175 // NOLINTEND(*-avoid-magic-numbers)
176