GCC Code Coverage Report


Directory: ./
File: tests/TestTypeConstraints.cpp
Date: 2023-01-04 16:32:12
Exec Total Coverage
Lines: 36 36 100.0%
Functions: 24 24 100.0%
Branches: 38 164 23.2%

Line Branch Exec Source
1 #include <array>
2 #include <vector>
3 #include <string>
4 #include <set>
5 #include <map>
6 #include <list>
7 #include <deque>
8 #include <unordered_set>
9 #include <unordered_map>
10 #include <optional>
11
12 #include "TestCommon.h"
13
14 using namespace CXXIter;
15
16 // ################################################################################################
17 // CONCEPTS & TYPE CONSTRAINTS & TYPE HELPERS
18 // ################################################################################################
19
20 8 TEST(CXXIter, IterValue) {
21 { // Move out of IterValue has to clear source
22 {
23 2 IterValue<size_t> src = 1337;
24 2 IterValue<size_t> dst = std::move(src);
25
2/12
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_FALSE(src.has_value());
26
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_EQ(dst.value(), 1337);
27 }
28 {
29
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 IterValue<std::string> src = std::string("1337");
30 2 IterValue<std::string> dst = std::move(src);
31
2/12
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_FALSE(src.has_value());
32
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_EQ(dst.value(), "1337");
33
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 }
34 {
35 2 IterValue<size_t> src = 1337;
36 2 IterValue<size_t> dst(std::move(src));
37
2/12
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_FALSE(src.has_value());
38
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_EQ(dst.value(), 1337);
39 }
40 {
41
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 IterValue<std::string> src = std::string("1337");
42 2 IterValue<std::string> dst(std::move(src));
43
2/12
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_FALSE(src.has_value());
44
4/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
2 ASSERT_EQ(dst.value(), "1337");
45
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 }
46 }
47 }
48
49 8 TEST(CXXIter, invocable_byvalue) {
50 auto fnRValueRef = [](std::string&&) {};
51 auto fnLValueRef = [](std::string&) {};
52 auto fnByValue = [](std::string) {};
53
54
55 static_assert(!CXXIter::util::invocable_byvalue<typeof(fnRValueRef), std::string>);
56 static_assert(!CXXIter::util::invocable_byvalue<typeof(fnLValueRef), std::string>);
57 // should also forbid const lvalue ref - but seems impossible
58 static_assert( CXXIter::util::invocable_byvalue<typeof(fnByValue), std::string>);
59 2 }
60
61 8 TEST(CXXIter, is_const_reference_v) {
62 using TestType = std::vector<int>;
63
64
2/12
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
2 ASSERT_FALSE(CXXIter::util::is_const_reference_v<TestType>);
65
2/12
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
2 ASSERT_FALSE(CXXIter::util::is_const_reference_v<TestType&>);
66
2/12
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
2 ASSERT_FALSE(CXXIter::util::is_const_reference_v<TestType&&>);
67
68
2/12
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
2 ASSERT_TRUE(CXXIter::util::is_const_reference_v<const TestType&>);
69 }
70
71 8 TEST(CXXIter, are_same_v) {
72 static_assert( CXXIter::util::are_same_v<int, int, int>);
73 static_assert( CXXIter::util::are_same_v<std::vector<int>, std::vector<int>, std::vector<int>>);
74 static_assert( CXXIter::util::are_same_v<float, float, float>);
75 static_assert( CXXIter::util::are_same_v<std::optional<int>, std::optional<int>, std::optional<int>>);
76 static_assert(!CXXIter::util::are_same_v<int, float, int>);
77 static_assert(!CXXIter::util::are_same_v<std::vector<int>, std::vector<int>, std::vector<float>>);
78 static_assert(!CXXIter::util::are_same_v<float, float, int>);
79 static_assert(!CXXIter::util::are_same_v<std::vector<float>, std::optional<int>, std::optional<int>>);
80 2 }
81
82 8 TEST(CXXIter, CXXIterIterator) {
83 using TestSrc = std::vector<int>;
84
85 static_assert( CXXIter::CXXIterIterator< CXXIter::SrcRef<TestSrc> >);
86 static_assert( CXXIter::CXXIterIterator< CXXIter::SrcMov<TestSrc> >);
87 static_assert( CXXIter::CXXIterIterator< CXXIter::SrcCRef<TestSrc> >);
88 static_assert(!CXXIter::CXXIterIterator< std::vector<int> >);
89 static_assert(!CXXIter::CXXIterIterator< std::vector<float> >);
90 static_assert(!CXXIter::CXXIterIterator< std::vector<CXXIter::SrcCRef<TestSrc>> >);
91 static_assert(!CXXIter::CXXIterIterator< int >);
92 static_assert(!CXXIter::CXXIterIterator< void >);
93 2 }
94
95 8 TEST(CXXIter, stlCollections) {
96 using TestKey = int;
97 using TestValue = std::string;
98
99 static_assert( CXXIter::util::BackInsertableContainerTemplate<std::vector , TestValue>);
100 static_assert( CXXIter::util::BackInsertableContainerTemplate<std::list , TestValue>);
101 static_assert( CXXIter::util::BackInsertableContainerTemplate<std::deque , TestValue>);
102 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::set , TestValue>);
103 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::multiset , TestValue>);
104 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::unordered_set , TestValue>);
105 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::unordered_multiset , TestValue>);
106 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::map , TestValue>);
107 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::multimap , TestValue>);
108 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::unordered_map , TestValue>);
109 static_assert(!CXXIter::util::BackInsertableContainerTemplate<std::unordered_multimap , TestValue>);
110
111 static_assert(!CXXIter::util::InsertableContainerTemplate<std::vector , TestValue>);
112 static_assert(!CXXIter::util::InsertableContainerTemplate<std::list , TestValue>);
113 static_assert(!CXXIter::util::InsertableContainerTemplate<std::deque , TestValue>);
114 static_assert( CXXIter::util::InsertableContainerTemplate<std::set , TestValue>);
115 static_assert( CXXIter::util::InsertableContainerTemplate<std::multiset , TestValue>);
116 static_assert( CXXIter::util::InsertableContainerTemplate<std::unordered_set , TestValue>);
117 static_assert( CXXIter::util::InsertableContainerTemplate<std::unordered_multiset , TestValue>);
118 static_assert(!CXXIter::util::InsertableContainerTemplate<std::map , TestValue>);
119 static_assert(!CXXIter::util::InsertableContainerTemplate<std::multimap , TestValue>);
120 static_assert(!CXXIter::util::InsertableContainerTemplate<std::unordered_map , TestValue>);
121 static_assert(!CXXIter::util::InsertableContainerTemplate<std::unordered_multimap , TestValue>);
122
123 //static_assert(!CXXIter::util::AssocContainerTemplate<std::vector ,TestKey, TestValue>);
124 //static_assert(!CXXIter::util::AssocContainerTemplate<std::list ,TestKey, TestValue>);
125 //static_assert(!CXXIter::util::AssocContainerTemplate<std::deque ,TestKey, TestValue>);
126 static_assert(!CXXIter::util::AssocContainerTemplate<std::set ,TestKey, TestValue>);
127 static_assert(!CXXIter::util::AssocContainerTemplate<std::multiset ,TestKey, TestValue>);
128 static_assert(!CXXIter::util::AssocContainerTemplate<std::unordered_set ,TestKey, TestValue>);
129 static_assert(!CXXIter::util::AssocContainerTemplate<std::unordered_multiset ,TestKey, TestValue>);
130 static_assert( CXXIter::util::AssocContainerTemplate<std::map ,TestKey, TestValue>);
131 static_assert( CXXIter::util::AssocContainerTemplate<std::multimap ,TestKey, TestValue>);
132 static_assert( CXXIter::util::AssocContainerTemplate<std::unordered_map ,TestKey, TestValue>);
133 static_assert( CXXIter::util::AssocContainerTemplate<std::unordered_multimap ,TestKey, TestValue>);
134
135 // std::array concept
136 static_assert( CXXIter::util::StdArrayContainer<std::array<TestValue, 3>, TestValue>);
137 static_assert(!CXXIter::util::StdArrayContainer<std::vector<TestValue>, TestValue>);
138 static_assert(!CXXIter::util::StdArrayContainer<std::list<TestValue>, TestValue>);
139 static_assert(!CXXIter::util::StdArrayContainer<std::deque<TestValue>, TestValue>);
140 static_assert(!CXXIter::util::StdArrayContainer<std::set<TestValue>, TestValue>);
141 static_assert(!CXXIter::util::StdArrayContainer<std::multiset<TestValue>, TestValue>);
142 static_assert(!CXXIter::util::StdArrayContainer<std::unordered_set<TestValue>, TestValue>);
143 static_assert(!CXXIter::util::StdArrayContainer<std::unordered_multiset<TestValue>, TestValue>);
144 static_assert(!CXXIter::util::StdArrayContainer<std::map<TestKey, TestValue>, TestValue>);
145 static_assert(!CXXIter::util::StdArrayContainer<std::multimap<TestKey, TestValue>, TestValue>);
146 static_assert(!CXXIter::util::StdArrayContainer<std::unordered_map<TestKey, TestValue>, TestValue>);
147 static_assert(!CXXIter::util::StdArrayContainer<std::unordered_multimap<TestKey, TestValue>, TestValue>);
148 2 }
149
150 8 TEST(CXXIter, is_pair) {
151 static_assert(!CXXIter::util::is_pair< int >);
152 static_assert(!CXXIter::util::is_pair< float >);
153 static_assert(!CXXIter::util::is_pair< std::vector<int> >);
154 static_assert(!CXXIter::util::is_pair< std::vector<std::pair<int, int>> >);
155
156 static_assert( CXXIter::util::is_pair< std::pair<int, int> >);
157 static_assert( CXXIter::util::is_pair< std::pair<float, float> >);
158 static_assert( CXXIter::util::is_pair< std::pair<float, int> >);
159 static_assert( CXXIter::util::is_pair< std::pair<int, std::vector<int>> >);
160 2 }
161
162 8 TEST(CXXIter, is_optional) {
163 static_assert(!CXXIter::util::is_optional< int >);
164 static_assert(!CXXIter::util::is_optional< float >);
165 static_assert(!CXXIter::util::is_optional< std::vector<int> >);
166 static_assert(!CXXIter::util::is_optional< std::vector<std::optional<int>> >);
167
168 static_assert( CXXIter::util::is_optional< std::optional<int> >);
169 static_assert( CXXIter::util::is_optional< std::optional<float> >);
170 static_assert( CXXIter::util::is_optional< std::optional<std::string> >);
171 static_assert( CXXIter::util::is_optional< std::optional<std::pair<float, int>> >);
172 static_assert( CXXIter::util::is_optional< std::optional<std::vector<int>> >);
173 2 }
174