1 | #include <gtest/gtest.h>
|
---|
2 |
|
---|
3 | #include <string>
|
---|
4 |
|
---|
5 | #include <netrush/system/view/anyvalueset.hpp>
|
---|
6 |
|
---|
7 | using namespace netrush::view;
|
---|
8 |
|
---|
9 | struct Foo
|
---|
10 | {
|
---|
11 | int k;
|
---|
12 | float l;
|
---|
13 | };
|
---|
14 |
|
---|
15 | bool operator==( const Foo& a, const Foo& b )
|
---|
16 | {
|
---|
17 | return a.k == b.k
|
---|
18 | && a.l == b.l
|
---|
19 | ;
|
---|
20 | }
|
---|
21 |
|
---|
22 | bool operator< ( const Foo& a, const Foo& b )
|
---|
23 | {
|
---|
24 | return a.k < b.k
|
---|
25 | && a.l < a.l
|
---|
26 | ;
|
---|
27 | }
|
---|
28 |
|
---|
29 | struct Id
|
---|
30 | {
|
---|
31 | int value;
|
---|
32 | };
|
---|
33 |
|
---|
34 | bool operator==( const Id& a, const Id& b )
|
---|
35 | {
|
---|
36 | return a.value == b.value;
|
---|
37 | }
|
---|
38 |
|
---|
39 | bool operator< ( const Id& a, const Id& b )
|
---|
40 | {
|
---|
41 | return a.value < b.value;
|
---|
42 | }
|
---|
43 |
|
---|
44 |
|
---|
45 | struct Entity
|
---|
46 | {
|
---|
47 | Id id;
|
---|
48 | std::string name;
|
---|
49 | };
|
---|
50 |
|
---|
51 | bool operator==( const Entity& a, const Entity& b )
|
---|
52 | {
|
---|
53 | return a.id == b.id;
|
---|
54 | }
|
---|
55 |
|
---|
56 | bool operator< ( const Entity& a, const Entity& b )
|
---|
57 | {
|
---|
58 | return a.id < b.id;
|
---|
59 | }
|
---|
60 |
|
---|
61 | bool operator==( const Id& a, const Entity& b )
|
---|
62 | {
|
---|
63 | return a == b.id;
|
---|
64 | }
|
---|
65 | bool operator==( const Entity& a, const Id& b )
|
---|
66 | {
|
---|
67 | return b == a;
|
---|
68 | }
|
---|
69 |
|
---|
70 | template< class T >
|
---|
71 | void test_all_operations( AnyValueSet& value_set, T value )
|
---|
72 | {
|
---|
73 | const auto begin_size = value_set.size();
|
---|
74 | value_set.add( value );
|
---|
75 | ASSERT_TRUE( value_set.contains( value ) );
|
---|
76 | const auto stored_value = value_set.find( value );
|
---|
77 | ASSERT_EQ( value, *stored_value );
|
---|
78 | ASSERT_EQ( begin_size + 1, value_set.size() );
|
---|
79 |
|
---|
80 | auto values = value_set.all<T>();
|
---|
81 | auto find_it = std::find( begin( values ), end( values ), value );
|
---|
82 | ASSERT_NE( end( values ), find_it );
|
---|
83 | }
|
---|
84 |
|
---|
85 | TEST( Test_AnyValueSet, any_kind_of_values )
|
---|
86 | {
|
---|
87 | AnyValueSet value_set;
|
---|
88 | test_all_operations( value_set, 42 );
|
---|
89 | test_all_operations( value_set, 3.14 );
|
---|
90 | test_all_operations( value_set, 0.5f );
|
---|
91 | test_all_operations( value_set, Foo{ 42, 0.5f } );
|
---|
92 | test_all_operations( value_set, Id{ 1234 } );
|
---|
93 | test_all_operations( value_set, Entity{ Id{ 5678 }, "A" } );
|
---|
94 | }
|
---|
95 |
|
---|
96 | TEST( Test_AnyValueSet, unique_simple_values )
|
---|
97 | {
|
---|
98 | AnyValueSet value_set;
|
---|
99 | value_set.add( 42 );
|
---|
100 | value_set.add( 42 );
|
---|
101 | value_set.add( 42 );
|
---|
102 | value_set.add( 42 );
|
---|
103 | value_set.add( 42 );
|
---|
104 | ASSERT_EQ( 1, value_set.size() );
|
---|
105 |
|
---|
106 | }
|
---|
107 |
|
---|
108 | TEST( Test_AnyValueSet, unique_key_values )
|
---|
109 | {
|
---|
110 | AnyValueSet value_set;
|
---|
111 | value_set.add( Entity{ Id{ 42 }, "A" } );
|
---|
112 | value_set.add( Entity{ Id{ 42 }, "B" } );
|
---|
113 | value_set.add( Entity{ Id{ 42 }, "C" } );
|
---|
114 | value_set.add( Entity{ Id{ 42 }, "D" } );
|
---|
115 | value_set.add( Entity{ Id{ 42 }, "E" } );
|
---|
116 |
|
---|
117 | ASSERT_EQ( 1, value_set.size() );
|
---|
118 | ASSERT_EQ( "E", value_set.find<Entity>( Id{ 42 } )->name );
|
---|
119 | }
|
---|
120 |
|
---|
121 |
|
---|
122 | TEST( Test_AnyValueSet, merge_sets_same_type )
|
---|
123 | {
|
---|
124 | AnyValueSet set_a, set_b;
|
---|
125 |
|
---|
126 | set_a.add( 1 );
|
---|
127 | set_a.add( 2 );
|
---|
128 | set_a.add( 3 );
|
---|
129 | set_a.add( 4 );
|
---|
130 |
|
---|
131 | set_b.add( 1 );
|
---|
132 | set_b.add( 2 );
|
---|
133 | set_b.add( 3 );
|
---|
134 | set_b.add( 4 );
|
---|
135 | set_b.add( 5 );
|
---|
136 | set_b.add( 6 );
|
---|
137 | set_b.add( 7 );
|
---|
138 | set_b.add( 8 );
|
---|
139 |
|
---|
140 | set_a.insert( set_b );
|
---|
141 | ASSERT_EQ( set_a.size(), set_b.size() );
|
---|
142 | auto b_values = set_b.all<int>();
|
---|
143 | for( const auto i : b_values )
|
---|
144 | {
|
---|
145 | ASSERT_TRUE( set_a.contains( i ) );
|
---|
146 | }
|
---|
147 |
|
---|
148 | AnyValueSet set_c;
|
---|
149 | set_c.insert( set_a );
|
---|
150 | auto c_values = set_c.all<int>();
|
---|
151 | for( const auto i : c_values )
|
---|
152 | {
|
---|
153 | ASSERT_TRUE( set_a.contains( i ) );
|
---|
154 | }
|
---|
155 | for( const auto i : b_values )
|
---|
156 | {
|
---|
157 | ASSERT_TRUE( set_c.contains( i ) );
|
---|
158 | }
|
---|
159 |
|
---|
160 | }
|
---|
161 |
|
---|
162 | TEST( Test_AnyValueSet, merge_sets_different_types )
|
---|
163 | {
|
---|
164 | AnyValueSet set_a, set_b;
|
---|
165 |
|
---|
166 | set_a.add( 1 );
|
---|
167 | set_a.add( 2 );
|
---|
168 | set_a.add( 3 );
|
---|
169 | set_a.add( 4 );
|
---|
170 |
|
---|
171 | set_b.add( 1.f );
|
---|
172 | set_b.add( 2.f );
|
---|
173 | set_b.add( 3.f );
|
---|
174 | set_b.add( 4.f );
|
---|
175 | set_b.add( 5.f );
|
---|
176 | set_b.add( 6.f );
|
---|
177 | set_b.add( 7.f );
|
---|
178 | set_b.add( 8.f );
|
---|
179 |
|
---|
180 | set_a.insert( set_b );
|
---|
181 | AnyValueSet set_c;
|
---|
182 | set_c.insert( set_a );
|
---|
183 |
|
---|
184 | {
|
---|
185 |
|
---|
186 | auto b_values = set_b.all<int>();
|
---|
187 | for( const auto i : b_values )
|
---|
188 | {
|
---|
189 | ASSERT_TRUE( set_a.contains( i ) );
|
---|
190 | }
|
---|
191 | auto c_values = set_c.all<int>();
|
---|
192 | for( const auto i : c_values )
|
---|
193 | {
|
---|
194 | ASSERT_TRUE( set_a.contains( i ) );
|
---|
195 | }
|
---|
196 | for( const auto i : b_values )
|
---|
197 | {
|
---|
198 | ASSERT_TRUE( set_c.contains( i ) );
|
---|
199 | }
|
---|
200 | }
|
---|
201 | {
|
---|
202 |
|
---|
203 | auto b_values = set_b.all<float>();
|
---|
204 | for( const auto i : b_values )
|
---|
205 | {
|
---|
206 | ASSERT_TRUE( set_a.contains( i ) );
|
---|
207 | }
|
---|
208 | auto c_values = set_c.all<float>();
|
---|
209 | for( const auto i : c_values )
|
---|
210 | {
|
---|
211 | ASSERT_TRUE( set_a.contains( i ) );
|
---|
212 | }
|
---|
213 | for( const auto i : b_values )
|
---|
214 | {
|
---|
215 | ASSERT_TRUE( set_c.contains( i ) );
|
---|
216 | }
|
---|
217 | }
|
---|
218 |
|
---|
219 |
|
---|
220 | }
|
---|