KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_base_set.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19#define BOOST_TEST_NO_MAIN
20#include <boost/test/unit_test.hpp>
21#include "base_set.h"
22
23BOOST_AUTO_TEST_SUITE( BaseSetTests )
24
25BOOST_AUTO_TEST_CASE( ConstructionAndSize )
26{
27 BASE_SET bs( 10 );
28 BOOST_CHECK_EQUAL( bs.size(), 10 );
29 BOOST_CHECK_EQUAL( bs.count(), 0 );
30
31 bs.resize( 20 );
32 BOOST_CHECK_EQUAL( bs.size(), 20 );
33 BOOST_CHECK_EQUAL( bs.count(), 0 );
34}
35
36BOOST_AUTO_TEST_CASE( BitSettingAndResetting )
37{
38 BASE_SET bs( 10 );
39 bs.set( 2 );
40 BOOST_CHECK( bs.test( 2 ) );
41 BOOST_CHECK_EQUAL( bs.count(), 1 );
42
43 bs.reset( 2 );
44 BOOST_CHECK( !bs.test( 2 ) );
45 BOOST_CHECK_EQUAL( bs.count(), 0 );
46}
47
48BOOST_AUTO_TEST_CASE( SetOutOfRange )
49{
50 BASE_SET bs( 10 );
51 BOOST_CHECK_EQUAL( bs.size(), 10 );
52 BOOST_CHECK_EQUAL( bs.count(), 0 );
53
54 bs.set( 10 );
55 BOOST_CHECK_EQUAL( bs.size(), 11 );
56 BOOST_CHECK_EQUAL( bs.count(), 1 );
57
58 bs.reset( 10 );
59 BOOST_CHECK_EQUAL( bs.size(), 11 );
60 BOOST_CHECK_EQUAL( bs.count(), 0 );
61
62 bs.reset( 20 );
63 BOOST_CHECK_EQUAL( bs.size(), 21 );
64 BOOST_CHECK_EQUAL( bs.count(), 0 );
65}
66
67BOOST_AUTO_TEST_CASE( IteratingSetBits )
68{
69 BASE_SET bs( 10 );
70 bs.set( 2 );
71 bs.set( 4 );
72
73 auto it = bs.set_bits_begin();
74 BOOST_CHECK_EQUAL( *it, 2 );
75 ++it;
76 BOOST_CHECK_EQUAL( *it, 4 );
77 ++it;
78 BOOST_CHECK( it == bs.set_bits_end() );
79
80 // Custom reverse iterator test
81 std::vector<size_t> reverse_set_bits;
82 for( auto rit = bs.set_bits_rbegin(); rit != bs.set_bits_rend(); ++rit )
83 {
84 reverse_set_bits.push_back( *rit );
85 }
86
87 BOOST_CHECK_EQUAL( reverse_set_bits.size(), 2 );
88 BOOST_CHECK_EQUAL( reverse_set_bits[0], 4 );
89 BOOST_CHECK_EQUAL( reverse_set_bits[1], 2 );
90}
91
92// Test equality operator
93BOOST_AUTO_TEST_CASE( BASE_SETEqualityOperator )
94{
95 BASE_SET set1( 10 );
96 BASE_SET set2( 10 );
97 BASE_SET set3( 15 );
98
99 set1.set( 2 );
100 set1.set( 4 );
101 set2.set( 2 );
102 set2.set( 4 );
103 set3.set( 2 );
104
105 BOOST_CHECK( set1 == set2 );
106 BOOST_CHECK( !( set1 == set3 ) );
107 BOOST_CHECK( !( set2 == set3 ) );
108}
109
110// Test less-than operator
111BOOST_AUTO_TEST_CASE(BASE_SETComparisonOperator)
112{
113 BASE_SET set1( 10 );
114 BASE_SET set2( 10 );
115 BASE_SET set3( 15 );
116
117 set1.set( 2 );
118 set1.set( 5 );
119 set2.set( 2 );
120 set3.set( 2 );
121
122 BOOST_CHECK( set3 < set1 ); // Although set3 is larger, set1 has a 1 at position 5, so set3 is less
123 BOOST_CHECK( set2 < set3 ); // set2 and set3 both have the same values set but set3 has more positions available
124 BOOST_CHECK( !( set1 < set3 ) );
125 BOOST_CHECK( !( set1 < set2 ) ); // Although sizes are equal, elements in set2 are subsets of set1
126}
127
128// Test boolean operator&=
129BOOST_AUTO_TEST_CASE(BASE_SETAndAssignment)
130{
131 BASE_SET bs1( 10 );
132 BASE_SET bs2( 10 );
133 bs1.set( 1 );
134 bs1.set( 3 );
135 bs2.set( 2 );
136 bs2.set( 3 );
137
138 bs1 &= bs2;
139 BOOST_CHECK_EQUAL( bs1.test( 1 ), false );
140 BOOST_CHECK_EQUAL( bs1.test( 2 ), false );
141 BOOST_CHECK_EQUAL( bs1.test( 3 ), true );
142}
143
144// Test boolean operator|=
145BOOST_AUTO_TEST_CASE(BASE_SETOrAssignment)
146{
147 BASE_SET bs1( 10 );
148 BASE_SET bs2( 10 );
149 bs1.set( 1 );
150 bs2.set( 2 );
151 bs2.set( 3 );
152
153 bs1 |= bs2;
154 BOOST_CHECK_EQUAL( bs1.test( 1 ), true );
155 BOOST_CHECK_EQUAL( bs1.test( 2 ), true );
156 BOOST_CHECK_EQUAL( bs1.test( 3 ), true );
157}
158
159// Test boolean operator^=
160BOOST_AUTO_TEST_CASE(BASE_SETXorAssignment)
161{
162 BASE_SET bs1( 10 );
163 BASE_SET bs2( 10 );
164 bs1.set( 1 );
165 bs1.set( 3 );
166 bs2.set( 2 );
167 bs2.set( 3 );
168
169 bs1 ^= bs2;
170 BOOST_CHECK_EQUAL( bs1.test( 1 ), true );
171 BOOST_CHECK_EQUAL( bs1.test( 2 ), true );
172 BOOST_CHECK_EQUAL( bs1.test( 3 ), false );
173}
174
175// Test boolean operator~
176BOOST_AUTO_TEST_CASE(BASE_SETNotOperator)
177{
178 BASE_SET bs1( 4 );
179 bs1.set( 1 );
180 bs1.set( 3 );
181 BASE_SET bs2 = ~bs1;
182
183 BOOST_CHECK_EQUAL( bs2.test( 0 ), true );
184 BOOST_CHECK_EQUAL( bs2.test( 1 ), false );
185 BOOST_CHECK_EQUAL( bs2.test( 2 ), true );
186 BOOST_CHECK_EQUAL( bs2.test( 3 ), false );
187}
188
189// Test non-member operator&
190BOOST_AUTO_TEST_CASE(BASE_SETAndOperator)
191{
192 BASE_SET bs1( 10 );
193 BASE_SET bs2( 10 );
194 bs1.set( 1 );
195 bs1.set( 3 );
196 bs2.set( 2 );
197 bs2.set( 3 );
198
199 BASE_SET result = bs1 & bs2;
200 BOOST_CHECK_EQUAL( result.test( 1 ), false );
201 BOOST_CHECK_EQUAL( result.test( 2 ), false );
202 BOOST_CHECK_EQUAL( result.test( 3 ), true );
203}
204
205// Test non-member operator|
206BOOST_AUTO_TEST_CASE(BASE_SETOrOperator)
207{
208 BASE_SET bs1( 10 );
209 BASE_SET bs2( 10 );
210 bs1.set( 1 );
211 bs2.set( 2 );
212 bs2.set( 3 );
213
214 BASE_SET result = bs1 | bs2;
215 BOOST_CHECK_EQUAL( result.test( 1 ), true );
216 BOOST_CHECK_EQUAL( result.test( 2 ), true );
217 BOOST_CHECK_EQUAL( result.test( 3 ), true );
218}
219
220// Test non-member operator^
221BOOST_AUTO_TEST_CASE(BASE_SETXorOperator)
222{
223 BASE_SET bs1( 10 );
224 BASE_SET bs2( 10 );
225 bs1.set( 1 );
226 bs1.set( 3 );
227 bs2.set( 2 );
228 bs2.set( 3 );
229
230 BASE_SET result = bs1 ^ bs2;
231 BOOST_CHECK_EQUAL( result.test( 1 ), true );
232 BOOST_CHECK_EQUAL( result.test( 2 ), true );
233 BOOST_CHECK_EQUAL( result.test( 3 ), false );
234}
235
236// Test std::hash specialization
237BOOST_AUTO_TEST_CASE( BASE_SETHash )
238{
239 BASE_SET bs1( 10 );
240 bs1.set( 1 );
241 bs1.set( 3 );
242
243 std::hash<BASE_SET> hashFn;
244 size_t hash = hashFn( bs1 );
245
246 BASE_SET bs2( 10 );
247 bs2.set( 1 );
248 bs2.set( 3 );
249
250 BOOST_CHECK_EQUAL( hash, hashFn( bs2 ) );
251
252 bs2.set( 2 );
253 BOOST_CHECK_NE( hash, hashFn( bs2 ) );
254}
255
256BOOST_AUTO_TEST_SUITE_END()
set_bits_reverse_iterator set_bits_rbegin() const
Definition: base_set.h:298
set_bits_iterator set_bits_end() const
Definition: base_set.h:296
BASE_SET & set(size_t pos=std::numeric_limits< size_t >::max(), bool value=true)
Definition: base_set.h:61
bool test(size_t pos) const
Definition: base_set.h:47
BASE_SET & reset(size_t pos=std::numeric_limits< size_t >::max())
Definition: base_set.h:76
set_bits_reverse_iterator set_bits_rend() const
Definition: base_set.h:302
size_t size() const
Definition: base_set.h:108
size_t count() const
Definition: base_set.h:106
set_bits_iterator set_bits_begin() const
Definition: base_set.h:295
void resize(size_t newSize)
Definition: base_set.h:110
BOOST_AUTO_TEST_CASE(ConstructionAndSize)
BOOST_CHECK(box.ClosestPointTo(VECTOR2D(0, 0))==VECTOR2D(1, 2))
Test suite for KiCad math code.
BOOST_AUTO_TEST_SUITE(CadstarPartParser)