1 | /* |
---|
2 | * This file Copyright (C) 2010-2014 Mnemosyne LLC |
---|
3 | * |
---|
4 | * It may be used under the GNU GPL versions 2 or 3 |
---|
5 | * or any future license endorsed by Mnemosyne LLC. |
---|
6 | * |
---|
7 | * $Id: bitfield-test.c 14669 2016-01-08 11:12:22Z mikedld $ |
---|
8 | */ |
---|
9 | |
---|
10 | #include <string.h> /* strlen () */ |
---|
11 | #include "transmission.h" |
---|
12 | #include "crypto-utils.h" |
---|
13 | #include "bitfield.h" |
---|
14 | #include "utils.h" /* tr_free */ |
---|
15 | |
---|
16 | #include "libtransmission-test.h" |
---|
17 | |
---|
18 | static int |
---|
19 | test_bitfield_count_range (void) |
---|
20 | { |
---|
21 | int i; |
---|
22 | int n; |
---|
23 | int begin; |
---|
24 | int end; |
---|
25 | int count1; |
---|
26 | int count2; |
---|
27 | const int bitCount = 100 + tr_rand_int_weak (1000); |
---|
28 | tr_bitfield bf; |
---|
29 | |
---|
30 | /* generate a random bitfield */ |
---|
31 | tr_bitfieldConstruct (&bf, bitCount); |
---|
32 | for (i=0, n=tr_rand_int_weak (bitCount); i<n; ++i) |
---|
33 | tr_bitfieldAdd (&bf, tr_rand_int_weak (bitCount)); |
---|
34 | begin = tr_rand_int_weak (bitCount); |
---|
35 | do |
---|
36 | end = tr_rand_int_weak (bitCount); |
---|
37 | while (end == begin); |
---|
38 | |
---|
39 | /* ensure end <= begin */ |
---|
40 | if (end < begin) |
---|
41 | { |
---|
42 | const int tmp = begin; |
---|
43 | begin = end; |
---|
44 | end = tmp; |
---|
45 | } |
---|
46 | |
---|
47 | /* test the bitfield */ |
---|
48 | count1 = 0; |
---|
49 | for (i=begin; i<end; ++i) |
---|
50 | if (tr_bitfieldHas (&bf, i)) |
---|
51 | ++count1; |
---|
52 | count2 = tr_bitfieldCountRange (&bf, begin, end); |
---|
53 | check (count1 == count2); |
---|
54 | |
---|
55 | /* cleanup */ |
---|
56 | tr_bitfieldDestruct (&bf); |
---|
57 | return 0; |
---|
58 | } |
---|
59 | |
---|
60 | static int |
---|
61 | test_bitfields (void) |
---|
62 | { |
---|
63 | unsigned int i; |
---|
64 | unsigned int bitcount = 500; |
---|
65 | tr_bitfield field; |
---|
66 | |
---|
67 | tr_bitfieldConstruct (&field, bitcount); |
---|
68 | |
---|
69 | /* test tr_bitfieldAdd */ |
---|
70 | for (i=0; i<bitcount; i++) |
---|
71 | if (! (i % 7)) |
---|
72 | tr_bitfieldAdd (&field, i); |
---|
73 | for (i=0; i<bitcount; i++) |
---|
74 | check (tr_bitfieldHas (&field, i) == (! (i % 7))); |
---|
75 | |
---|
76 | /* test tr_bitfieldAddRange */ |
---|
77 | tr_bitfieldAddRange (&field, 0, bitcount); |
---|
78 | for (i=0; i<bitcount; i++) |
---|
79 | check (tr_bitfieldHas (&field, i)); |
---|
80 | |
---|
81 | /* test tr_bitfieldRem */ |
---|
82 | for (i=0; i<bitcount; i++) |
---|
83 | if ((i % 7) != 0) |
---|
84 | tr_bitfieldRem (&field, i); |
---|
85 | for (i=0; i<bitcount; i++) |
---|
86 | check (tr_bitfieldHas (&field, i) == (! (i % 7))); |
---|
87 | |
---|
88 | /* test tr_bitfieldRemRange in the middle of a boundary */ |
---|
89 | tr_bitfieldAddRange (&field, 0, 64); |
---|
90 | tr_bitfieldRemRange (&field, 4, 21); |
---|
91 | for (i=0; i<64; i++) |
---|
92 | check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 21))); |
---|
93 | |
---|
94 | /* test tr_bitfieldRemRange on the boundaries */ |
---|
95 | tr_bitfieldAddRange (&field, 0, 64); |
---|
96 | tr_bitfieldRemRange (&field, 8, 24); |
---|
97 | for (i=0; i<64; i++) |
---|
98 | check (tr_bitfieldHas (&field, i) == ((i < 8) || (i >= 24))); |
---|
99 | |
---|
100 | /* test tr_bitfieldRemRange when begin & end is on the same word */ |
---|
101 | tr_bitfieldAddRange (&field, 0, 64); |
---|
102 | tr_bitfieldRemRange (&field, 4, 5); |
---|
103 | for (i=0; i<64; i++) |
---|
104 | check (tr_bitfieldHas (&field, i) == ((i < 4) || (i >= 5))); |
---|
105 | |
---|
106 | /* test tr_bitfieldAddRange */ |
---|
107 | tr_bitfieldRemRange (&field, 0, 64); |
---|
108 | tr_bitfieldAddRange (&field, 4, 21); |
---|
109 | for (i=0; i<64; i++) |
---|
110 | check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 21))); |
---|
111 | |
---|
112 | /* test tr_bitfieldAddRange on the boundaries */ |
---|
113 | tr_bitfieldRemRange (&field, 0, 64); |
---|
114 | tr_bitfieldAddRange (&field, 8, 24); |
---|
115 | for (i=0; i<64; i++) |
---|
116 | check (tr_bitfieldHas (&field, i) == ((8 <= i) && (i < 24))); |
---|
117 | |
---|
118 | /* test tr_bitfieldAddRange when begin & end is on the same word */ |
---|
119 | tr_bitfieldRemRange (&field, 0, 64); |
---|
120 | tr_bitfieldAddRange (&field, 4, 5); |
---|
121 | for (i=0; i<64; i++) |
---|
122 | check (tr_bitfieldHas (&field, i) == ((4 <= i) && (i < 5))); |
---|
123 | |
---|
124 | tr_bitfieldDestruct (&field); |
---|
125 | return 0; |
---|
126 | } |
---|
127 | |
---|
128 | static int |
---|
129 | test_bitfield_has_all_none (void) |
---|
130 | { |
---|
131 | tr_bitfield field; |
---|
132 | |
---|
133 | tr_bitfieldConstruct (&field, 3); |
---|
134 | |
---|
135 | check (!tr_bitfieldHasAll (&field)); |
---|
136 | check (tr_bitfieldHasNone (&field)); |
---|
137 | |
---|
138 | tr_bitfieldAdd (&field, 0); |
---|
139 | check (!tr_bitfieldHasAll (&field)); |
---|
140 | check (!tr_bitfieldHasNone (&field)); |
---|
141 | |
---|
142 | tr_bitfieldRem (&field, 0); |
---|
143 | tr_bitfieldAdd (&field, 1); |
---|
144 | check (!tr_bitfieldHasAll (&field)); |
---|
145 | check (!tr_bitfieldHasNone (&field)); |
---|
146 | |
---|
147 | tr_bitfieldRem (&field, 1); |
---|
148 | tr_bitfieldAdd (&field, 2); |
---|
149 | check (!tr_bitfieldHasAll (&field)); |
---|
150 | check (!tr_bitfieldHasNone (&field)); |
---|
151 | |
---|
152 | tr_bitfieldAdd (&field, 0); |
---|
153 | tr_bitfieldAdd (&field, 1); |
---|
154 | check (tr_bitfieldHasAll (&field)); |
---|
155 | check (!tr_bitfieldHasNone (&field)); |
---|
156 | |
---|
157 | tr_bitfieldSetHasNone (&field); |
---|
158 | check (!tr_bitfieldHasAll (&field)); |
---|
159 | check (tr_bitfieldHasNone (&field)); |
---|
160 | |
---|
161 | tr_bitfieldSetHasAll (&field); |
---|
162 | check (tr_bitfieldHasAll (&field)); |
---|
163 | check (!tr_bitfieldHasNone (&field)); |
---|
164 | |
---|
165 | tr_bitfieldDestruct (&field); |
---|
166 | tr_bitfieldConstruct (&field, 0); |
---|
167 | |
---|
168 | check (!tr_bitfieldHasAll (&field)); |
---|
169 | check (!tr_bitfieldHasNone (&field)); |
---|
170 | |
---|
171 | tr_bitfieldSetHasNone (&field); |
---|
172 | check (!tr_bitfieldHasAll (&field)); |
---|
173 | check (tr_bitfieldHasNone (&field)); |
---|
174 | |
---|
175 | tr_bitfieldSetHasAll (&field); |
---|
176 | check (tr_bitfieldHasAll (&field)); |
---|
177 | check (!tr_bitfieldHasNone (&field)); |
---|
178 | |
---|
179 | tr_bitfieldDestruct (&field); |
---|
180 | return 0; |
---|
181 | } |
---|
182 | |
---|
183 | int |
---|
184 | main (void) |
---|
185 | { |
---|
186 | int l; |
---|
187 | int ret; |
---|
188 | const testFunc tests[] = |
---|
189 | { |
---|
190 | test_bitfields, |
---|
191 | test_bitfield_has_all_none |
---|
192 | }; |
---|
193 | |
---|
194 | if ((ret = runTests (tests, NUM_TESTS (tests)))) |
---|
195 | return ret; |
---|
196 | |
---|
197 | /* bitfield count range */ |
---|
198 | for (l=0; l<10000; ++l) |
---|
199 | if ((ret = test_bitfield_count_range ())) |
---|
200 | return ret; |
---|
201 | |
---|
202 | return 0; |
---|
203 | } |
---|