Ticket #9223: anyvalueset.cpp

File anyvalueset.cpp, 4.1 KB (added by mjklaim@…, 9 years ago)

Test of the real world example.

Line 
1#include <gtest/gtest.h>
2
3#include <string>
4
5#include <netrush/system/view/anyvalueset.hpp>
6
7using namespace netrush::view;
8
9struct Foo
10{
11 int k;
12 float l;
13};
14
15bool operator==( const Foo& a, const Foo& b )
16{
17 return a.k == b.k
18 && a.l == b.l
19 ;
20}
21
22bool operator< ( const Foo& a, const Foo& b )
23{
24 return a.k < b.k
25 && a.l < a.l
26 ;
27}
28
29struct Id
30{
31 int value;
32};
33
34bool operator==( const Id& a, const Id& b )
35{
36 return a.value == b.value;
37}
38
39bool operator< ( const Id& a, const Id& b )
40{
41 return a.value < b.value;
42}
43
44
45struct Entity
46{
47 Id id;
48 std::string name;
49};
50
51bool operator==( const Entity& a, const Entity& b )
52{
53 return a.id == b.id;
54}
55
56bool operator< ( const Entity& a, const Entity& b )
57{
58 return a.id < b.id;
59}
60
61bool operator==( const Id& a, const Entity& b )
62{
63 return a == b.id;
64}
65bool operator==( const Entity& a, const Id& b )
66{
67 return b == a;
68}
69
70template< class T >
71void 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
85TEST( 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
96TEST( 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
108TEST( 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
122TEST( 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
162TEST( 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}