1 #include "nrange.h"
2 
3 #include <cppunit/extensions/HelperMacros.h>
4 
5 class nrangeTest : public CppUnit::TestFixture {
6 	CPPUNIT_TEST_SUITE(nrangeTest);
7 		CPPUNIT_TEST(testCreate);
8 		CPPUNIT_TEST(testInsert);
9 		CPPUNIT_TEST(testInsertMiddle);
10 		CPPUNIT_TEST(testInsertNothing);
11 		CPPUNIT_TEST(testInsertMulti);
12 		CPPUNIT_TEST(testInsertMulti2);
13 		CPPUNIT_TEST(testInsertMulti3);
14 		CPPUNIT_TEST(testInsertMulti4);
15 		CPPUNIT_TEST(testRemove);
16 		CPPUNIT_TEST(testRemoveBeg);
17 		CPPUNIT_TEST(testRemoveEnd);
18 		CPPUNIT_TEST(testRemoveNothingBeg);
19 		CPPUNIT_TEST(testRemoveNothingEnd);
20 		CPPUNIT_TEST(testInvertEmpty);
21 		CPPUNIT_TEST(testInvertEnds);
22 		CPPUNIT_TEST(testInvertNoEnds);
23 	CPPUNIT_TEST_SUITE_END();
24 	protected:
25 		c_nrange *range;
26 	public:
setUp(void)27 		void setUp(void) {
28 			range = new c_nrange();
29 		}
tearDown(void)30 		void tearDown(void) {
31 			delete range;
32 		}
testCreate(void)33 		void testCreate(void) {
34 			CPPUNIT_ASSERT(range->empty());
35 			CPPUNIT_ASSERT(range->get_total() == 0);
36 			CPPUNIT_ASSERT(range->check(0) == 0);
37 			CPPUNIT_ASSERT(range->check(1) == 0);
38 			CPPUNIT_ASSERT(range->check(ULONG_MAX) == 0);
39 		}
testInsert(void)40 		void testInsert(void) {
41 			range->insert(1);
42 			CPPUNIT_ASSERT(!range->empty());
43 			CPPUNIT_ASSERT(range->get_total() == 1);
44 			CPPUNIT_ASSERT(range->low() == range->high() == 1);
45 			range->insert(2);
46 			CPPUNIT_ASSERT(!range->empty());
47 			CPPUNIT_ASSERT(range->num_ranges() == 1);
48 			CPPUNIT_ASSERT(range->get_total() == 2);
49 			CPPUNIT_ASSERT(range->low() == 1);
50 			CPPUNIT_ASSERT(range->high() == 2);
51 			CPPUNIT_ASSERT(!range->check(0));
52 			CPPUNIT_ASSERT(range->check(1));
53 			CPPUNIT_ASSERT(range->check(2));
54 			CPPUNIT_ASSERT(!range->check(3));
55 		}
testInsertNothing(void)56 		void testInsertNothing(void) {
57 			range->insert(1);
58 			range->insert(1);
59 			CPPUNIT_ASSERT(!range->empty());
60 			CPPUNIT_ASSERT(range->num_ranges() == 1);
61 			CPPUNIT_ASSERT(range->get_total() == 1);
62 			CPPUNIT_ASSERT(range->low() == range->high() == 1);
63 			CPPUNIT_ASSERT(!range->check(0));
64 			CPPUNIT_ASSERT(range->check(1));
65 			CPPUNIT_ASSERT(!range->check(2));
66 		}
testInsertMiddle(void)67 		void testInsertMiddle(void) {
68 			range->insert(1);
69 			range->insert(3);
70 			CPPUNIT_ASSERT(range->get_total() == 2);
71 			CPPUNIT_ASSERT(range->low() == 1);
72 			CPPUNIT_ASSERT(range->high() == 3);
73 			range->insert(2);
74 			CPPUNIT_ASSERT(range->get_total() == 3);
75 			CPPUNIT_ASSERT(range->num_ranges() == 1);
76 			CPPUNIT_ASSERT(range->low() == 1);
77 			CPPUNIT_ASSERT(range->high() == 3);
78 			CPPUNIT_ASSERT(!range->check(0));
79 			CPPUNIT_ASSERT(range->check(1));
80 			CPPUNIT_ASSERT(range->check(2));
81 			CPPUNIT_ASSERT(range->check(3));
82 			CPPUNIT_ASSERT(!range->check(4));
83 		}
testInsertMulti(void)84 		void testInsertMulti(void) {
85 			range->insert(1,2);
86 			CPPUNIT_ASSERT(!range->empty());
87 			CPPUNIT_ASSERT(range->get_total() == 2);
88 			CPPUNIT_ASSERT(range->low() == 1);
89 			CPPUNIT_ASSERT(range->high() == 2);
90 			range->insert(3,4);
91 			CPPUNIT_ASSERT(!range->empty());
92 			CPPUNIT_ASSERT(range->num_ranges() == 1);
93 			CPPUNIT_ASSERT(range->get_total() == 4);
94 			CPPUNIT_ASSERT(range->low() == 1);
95 			CPPUNIT_ASSERT(range->high() == 4);
96 			CPPUNIT_ASSERT(!range->check(0));
97 			CPPUNIT_ASSERT(range->check(1));
98 			CPPUNIT_ASSERT(range->check(2));
99 			CPPUNIT_ASSERT(range->check(3));
100 			CPPUNIT_ASSERT(range->check(4));
101 			CPPUNIT_ASSERT(!range->check(5));
102 		}
testInsertMulti2(void)103 		void testInsertMulti2(void) {
104 			range->insert(10,15);
105 			CPPUNIT_ASSERT(!range->empty());
106 			CPPUNIT_ASSERT(range->num_ranges() == 1);
107 			CPPUNIT_ASSERT(range->get_total() == 6);
108 			CPPUNIT_ASSERT(range->low() == 10);
109 			CPPUNIT_ASSERT(range->high() == 15);
110 			range->insert(3,7);
111 			CPPUNIT_ASSERT(!range->empty());
112 			CPPUNIT_ASSERT(range->num_ranges() == 2);
113 			CPPUNIT_ASSERT(range->get_total() == 11);
114 			CPPUNIT_ASSERT(range->low() == 3);
115 			CPPUNIT_ASSERT(range->high() == 15);
116 			for (int i=0;i<3;i++) CPPUNIT_ASSERT(!range->check(i));
117 			for (int i=8;i<10;i++) CPPUNIT_ASSERT(!range->check(i));
118 			for (int i=16;i<18;i++) CPPUNIT_ASSERT(!range->check(i));
119 			for (int i=3;i<=7;i++) CPPUNIT_ASSERT(range->check(i));
120 			for (int i=10;i<=15;i++) CPPUNIT_ASSERT(range->check(i));
121 		}
testInsertMulti3(void)122 		void testInsertMulti3(void) {
123 			range->insert(10,15);
124 			CPPUNIT_ASSERT(!range->empty());
125 			CPPUNIT_ASSERT(range->num_ranges() == 1);
126 			CPPUNIT_ASSERT(range->get_total() == 6);
127 			CPPUNIT_ASSERT(range->low() == 10);
128 			CPPUNIT_ASSERT(range->high() == 15);
129 			range->insert(3,12);
130 			CPPUNIT_ASSERT(!range->empty());
131 			CPPUNIT_ASSERT(range->num_ranges() == 1);
132 			CPPUNIT_ASSERT(range->get_total() == 13);
133 			CPPUNIT_ASSERT(range->low() == 3);
134 			CPPUNIT_ASSERT(range->high() == 15);
135 			for (int i=0;i<3;i++) CPPUNIT_ASSERT(!range->check(i));
136 			for (int i=16;i<18;i++) CPPUNIT_ASSERT(!range->check(i));
137 			for (int i=3;i<=15;i++) CPPUNIT_ASSERT(range->check(i));
138 		}
testInsertMulti4(void)139 		void testInsertMulti4(void) {
140 			range->insert(11,16);
141 			range->insert(8);
142 			range->insert(3);
143 			CPPUNIT_ASSERT(!range->empty());
144 			CPPUNIT_ASSERT(range->num_ranges() == 3);
145 			CPPUNIT_ASSERT(range->get_total() == 8);
146 			CPPUNIT_ASSERT(range->low() == 3);
147 			CPPUNIT_ASSERT(range->high() == 16);
148 			range->insert(4,12);
149 			CPPUNIT_ASSERT(!range->empty());
150 			CPPUNIT_ASSERT(range->num_ranges() == 1);
151 			CPPUNIT_ASSERT(range->get_total() == 14);
152 			CPPUNIT_ASSERT(range->low() == 3);
153 			CPPUNIT_ASSERT(range->high() == 16);
154 			for (int i=0;i<3;i++) CPPUNIT_ASSERT(!range->check(i));
155 			for (int i=17;i<19;i++) CPPUNIT_ASSERT(!range->check(i));
156 			for (int i=3;i<=16;i++) CPPUNIT_ASSERT(range->check(i));
157 		}
testRemove(void)158 		void testRemove(void) {
159 			range->insert(1,3);
160 			range->remove(2);
161 			CPPUNIT_ASSERT(range->num_ranges() == 2);
162 			CPPUNIT_ASSERT(range->get_total() == 2);
163 			CPPUNIT_ASSERT(range->low() == 1);
164 			CPPUNIT_ASSERT(range->high() == 3);
165 			CPPUNIT_ASSERT(!range->check(0));
166 			CPPUNIT_ASSERT(range->check(1));
167 			CPPUNIT_ASSERT(!range->check(2));
168 			CPPUNIT_ASSERT(range->check(3));
169 			CPPUNIT_ASSERT(!range->check(4));
170 		}
testRemoveBeg(void)171 		void testRemoveBeg(void) {
172 			range->insert(1,3);
173 			range->remove(1);
174 			CPPUNIT_ASSERT(range->num_ranges() == 1);
175 			CPPUNIT_ASSERT(range->get_total() == 2);
176 			CPPUNIT_ASSERT(range->low() == 2);
177 			CPPUNIT_ASSERT(range->high() == 3);
178 			CPPUNIT_ASSERT(!range->check(0));
179 			CPPUNIT_ASSERT(!range->check(1));
180 			CPPUNIT_ASSERT(range->check(2));
181 			CPPUNIT_ASSERT(range->check(3));
182 			CPPUNIT_ASSERT(!range->check(4));
183 		}
testRemoveEnd(void)184 		void testRemoveEnd(void) {
185 			range->insert(1,3);
186 			range->remove(3);
187 			CPPUNIT_ASSERT(range->num_ranges() == 1);
188 			CPPUNIT_ASSERT(range->get_total() == 2);
189 			CPPUNIT_ASSERT(range->low() == 1);
190 			CPPUNIT_ASSERT(range->high() == 2);
191 			CPPUNIT_ASSERT(!range->check(0));
192 			CPPUNIT_ASSERT(range->check(1));
193 			CPPUNIT_ASSERT(range->check(2));
194 			CPPUNIT_ASSERT(!range->check(3));
195 			CPPUNIT_ASSERT(!range->check(4));
196 		}
testRemoveNothingBeg(void)197 		void testRemoveNothingBeg(void) {
198 			range->insert(1,2);
199 			range->remove(0);
200 			CPPUNIT_ASSERT(range->num_ranges() == 1);
201 			CPPUNIT_ASSERT(range->get_total() == 2);
202 			CPPUNIT_ASSERT(range->low() == 1);
203 			CPPUNIT_ASSERT(range->high() == 2);
204 			CPPUNIT_ASSERT(!range->check(0));
205 			CPPUNIT_ASSERT(range->check(1));
206 			CPPUNIT_ASSERT(range->check(2));
207 			CPPUNIT_ASSERT(!range->check(3));
208 		}
testRemoveNothingEnd(void)209 		void testRemoveNothingEnd(void) {
210 			range->insert(1,2);
211 			range->remove(3);
212 			CPPUNIT_ASSERT(range->num_ranges() == 1);
213 			CPPUNIT_ASSERT(range->get_total() == 2);
214 			CPPUNIT_ASSERT(range->low() == 1);
215 			CPPUNIT_ASSERT(range->high() == 2);
216 			CPPUNIT_ASSERT(!range->check(0));
217 			CPPUNIT_ASSERT(range->check(1));
218 			CPPUNIT_ASSERT(range->check(2));
219 			CPPUNIT_ASSERT(!range->check(3));
220 		}
testInvertEmpty(void)221 		void testInvertEmpty(void) {
222 			c_nrange i;
223 			i.invert(*range);
224 			CPPUNIT_ASSERT(i.num_ranges() == 1);
225 			CPPUNIT_ASSERT(i.get_total() == ULONG_MAX+1);
226 			CPPUNIT_ASSERT(i.low() == 0);
227 			CPPUNIT_ASSERT(i.high() == ULONG_MAX);
228 			CPPUNIT_ASSERT(i.check(0));
229 			CPPUNIT_ASSERT(i.check(5));
230 			CPPUNIT_ASSERT(i.check(ULONG_MAX));
231 		}
testInvertEnds(void)232 		void testInvertEnds(void) {
233 			range->insert(0);
234 			range->insert(5);
235 			range->insert(ULONG_MAX);
236 			c_nrange i;
237 			i.invert(*range);
238 			CPPUNIT_ASSERT(i.num_ranges() == 2);
239 			CPPUNIT_ASSERT(i.get_total() == ULONG_MAX-2);
240 			CPPUNIT_ASSERT(i.low() == 1);
241 			CPPUNIT_ASSERT(i.high() == ULONG_MAX-1);
242 			CPPUNIT_ASSERT(!i.check(0));
243 			CPPUNIT_ASSERT(i.check(1));
244 			CPPUNIT_ASSERT(i.check(4));
245 			CPPUNIT_ASSERT(!i.check(5));
246 			CPPUNIT_ASSERT(i.check(6));
247 			CPPUNIT_ASSERT(i.check(ULONG_MAX)-1);
248 			CPPUNIT_ASSERT(!i.check(ULONG_MAX));
249 		}
testInvertNoEnds(void)250 		void testInvertNoEnds(void) {
251 			range->insert(1);
252 			range->insert(5);
253 			range->insert(9);
254 			c_nrange i;
255 			i.invert(*range);
256 			CPPUNIT_ASSERT(i.num_ranges() == 4);
257 			CPPUNIT_ASSERT(i.get_total() == ULONG_MAX-2);
258 			CPPUNIT_ASSERT(i.low() == 0);
259 			CPPUNIT_ASSERT(i.high() == ULONG_MAX);
260 			for (int j=0; j<15; ++j)
261 				CPPUNIT_ASSERT(i.check(j)!=range->check(j));
262 			CPPUNIT_ASSERT(i.check(ULONG_MAX));
263 		}
264 };
265 
266 class nrangeEqTest : public CppUnit::TestFixture {
267 	CPPUNIT_TEST_SUITE(nrangeEqTest);
268 		CPPUNIT_TEST(testEmpty);
269 		CPPUNIT_TEST(testOneEmpty);
270 		CPPUNIT_TEST(testUnEqual);
271 		CPPUNIT_TEST(testEqual);
272 	CPPUNIT_TEST_SUITE_END();
273 	protected:
274 		c_nrange *range;
275 		c_nrange *rangeb;
276 	public:
setUp(void)277 		void setUp(void) {
278 			range = new c_nrange();
279 			rangeb = new c_nrange();
280 		}
tearDown(void)281 		void tearDown(void) {
282 			delete range;
283 			delete rangeb;
284 		}
testEmpty(void)285 		void testEmpty(void) {
286 			CPPUNIT_ASSERT(*range == *rangeb);
287 			CPPUNIT_ASSERT(range != rangeb);
288 		}
testOneEmpty(void)289 		void testOneEmpty(void) {
290 			range->insert(1);
291 			CPPUNIT_ASSERT(*range != *rangeb);
292 		}
testUnEqual(void)293 		void testUnEqual(void) {
294 			range->insert(1);
295 			rangeb->insert(2);
296 			CPPUNIT_ASSERT(*range != *rangeb);
297 		}
testEqual(void)298 		void testEqual(void) {
299 			range->insert(1);
300 			range->insert(2);
301 			rangeb->insert(1,2);
302 			CPPUNIT_ASSERT(*range == *rangeb);
303 		}
304 };
305 
306 CPPUNIT_TEST_SUITE_REGISTRATION( nrangeTest );
307 CPPUNIT_TEST_SUITE_REGISTRATION( nrangeEqTest );
308 
309