bitz 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +5 -0
- data/LICENSE +201 -0
- data/README.md +214 -0
- data/Rakefile +10 -0
- data/bitz.gemspec +25 -0
- data/lib/bitz/set.rb +253 -0
- data/lib/bitz/version.rb +3 -0
- data/lib/bitz.rb +4 -0
- data/test/bitz_set_test.rb +722 -0
- data/test/test_helper.rb +2 -0
- metadata +80 -0
@@ -0,0 +1,722 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BitzSetTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@set = Bitz::Set.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_each_bit
|
9
|
+
@set.set 2
|
10
|
+
@set.set 3
|
11
|
+
@set.set 10
|
12
|
+
|
13
|
+
list = []
|
14
|
+
@set.each_bit { |b| list << b }
|
15
|
+
assert_equal [2, 3, 10], list
|
16
|
+
assert_equal [2, 3, 10], @set.each_bit.to_a
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_hash_eql
|
20
|
+
other = @set.dup
|
21
|
+
assert_equal @set.hash, other.hash
|
22
|
+
assert @set.eql?(other)
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_count
|
26
|
+
assert_equal 0, @set.count
|
27
|
+
|
28
|
+
@set.set(5)
|
29
|
+
assert_equal 1, @set.count
|
30
|
+
|
31
|
+
@set.set(16)
|
32
|
+
assert_equal 2, @set.count
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_capacity
|
36
|
+
assert_equal 64, @set.capacity
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_dup
|
40
|
+
@set.set(5)
|
41
|
+
assert @set.set?(5)
|
42
|
+
|
43
|
+
new = @set.dup
|
44
|
+
assert new.set?(5)
|
45
|
+
new.set(6)
|
46
|
+
assert new.set?(6)
|
47
|
+
refute @set.set?(6)
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_set_and_check_bit
|
51
|
+
@set.set(5)
|
52
|
+
assert @set.set?(5)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_unset_bit
|
56
|
+
@set.set(5)
|
57
|
+
@set.unset(5)
|
58
|
+
refute @set.set?(5)
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_unset_bit_returns_nil_for_uninitialized
|
62
|
+
assert_nil @set.set?(100)
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_dynamic_buffer_growth
|
66
|
+
@set.set(100)
|
67
|
+
assert @set.set?(100)
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_custom_initial_size
|
71
|
+
set = Bitz::Set.new(128)
|
72
|
+
set.set(50)
|
73
|
+
assert set.set?(50)
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_multiple_bits
|
77
|
+
[1, 5, 10, 63, 100].each { |bit| @set.set(bit) }
|
78
|
+
[1, 5, 10, 63, 100].each { |bit| assert @set.set?(bit) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_set_all
|
82
|
+
@set.set_all
|
83
|
+
(0..63).each { |bit| assert @set.set?(bit) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_unset_all
|
87
|
+
@set.set(5)
|
88
|
+
@set.set(10)
|
89
|
+
@set.set(50)
|
90
|
+
@set.unset_all
|
91
|
+
(0..63).each { |bit| refute @set.set?(bit) }
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_set_all_then_unset_all
|
95
|
+
@set.set_all
|
96
|
+
@set.unset_all
|
97
|
+
(0..63).each { |bit| refute @set.set?(bit) }
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_set_union_basic
|
101
|
+
other = Bitz::Set.new
|
102
|
+
@set.set(5)
|
103
|
+
other.set(10)
|
104
|
+
|
105
|
+
@set.set_union(other)
|
106
|
+
|
107
|
+
assert @set.set?(5)
|
108
|
+
assert @set.set?(10)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_set_union_overlapping
|
112
|
+
other = Bitz::Set.new
|
113
|
+
@set.set(5)
|
114
|
+
@set.set(10)
|
115
|
+
other.set(5)
|
116
|
+
other.set(15)
|
117
|
+
|
118
|
+
@set.set_union(other)
|
119
|
+
|
120
|
+
assert @set.set?(5)
|
121
|
+
assert @set.set?(10)
|
122
|
+
assert @set.set?(15)
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_set_union_different_sizes_raises_error
|
126
|
+
other = Bitz::Set.new(128)
|
127
|
+
@set.set(5)
|
128
|
+
other.set(100)
|
129
|
+
|
130
|
+
error = assert_raises(ArgumentError) do
|
131
|
+
@set.set_union(other)
|
132
|
+
end
|
133
|
+
|
134
|
+
assert_match(/Cannot union bitsets with different capacities/, error.message)
|
135
|
+
assert_match(/64 != 128/, error.message)
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_set_union_returns_self
|
139
|
+
other = Bitz::Set.new
|
140
|
+
result = @set.set_union(other)
|
141
|
+
assert_same @set, result
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_set_union_count
|
145
|
+
other = Bitz::Set.new
|
146
|
+
@set.set(1)
|
147
|
+
@set.set(3)
|
148
|
+
other.set(2)
|
149
|
+
other.set(3)
|
150
|
+
|
151
|
+
@set.set_union(other)
|
152
|
+
|
153
|
+
assert_equal 3, @set.count # bits 1, 2, 3 are set
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_set_intersection_basic
|
157
|
+
other = Bitz::Set.new
|
158
|
+
@set.set(5)
|
159
|
+
@set.set(10)
|
160
|
+
other.set(5)
|
161
|
+
other.set(15)
|
162
|
+
|
163
|
+
@set.set_intersection(other)
|
164
|
+
|
165
|
+
assert @set.set?(5)
|
166
|
+
refute @set.set?(10)
|
167
|
+
refute @set.set?(15)
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_set_intersection_no_overlap
|
171
|
+
other = Bitz::Set.new
|
172
|
+
@set.set(5)
|
173
|
+
@set.set(10)
|
174
|
+
other.set(15)
|
175
|
+
other.set(20)
|
176
|
+
|
177
|
+
@set.set_intersection(other)
|
178
|
+
|
179
|
+
refute @set.set?(5)
|
180
|
+
refute @set.set?(10)
|
181
|
+
refute @set.set?(15)
|
182
|
+
refute @set.set?(20)
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_set_intersection_all_overlap
|
186
|
+
other = Bitz::Set.new
|
187
|
+
@set.set(5)
|
188
|
+
@set.set(10)
|
189
|
+
other.set(5)
|
190
|
+
other.set(10)
|
191
|
+
|
192
|
+
@set.set_intersection(other)
|
193
|
+
|
194
|
+
assert @set.set?(5)
|
195
|
+
assert @set.set?(10)
|
196
|
+
end
|
197
|
+
|
198
|
+
def test_set_intersection_different_sizes_raises_error
|
199
|
+
other = Bitz::Set.new(128)
|
200
|
+
@set.set(5)
|
201
|
+
other.set(5)
|
202
|
+
|
203
|
+
error = assert_raises(ArgumentError) do
|
204
|
+
@set.set_intersection(other)
|
205
|
+
end
|
206
|
+
|
207
|
+
assert_match(/Cannot intersect bitsets with different capacities/, error.message)
|
208
|
+
assert_match(/64 != 128/, error.message)
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_set_intersection_returns_self
|
212
|
+
other = Bitz::Set.new
|
213
|
+
result = @set.set_intersection(other)
|
214
|
+
assert_same @set, result
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_set_intersection_count
|
218
|
+
other = Bitz::Set.new
|
219
|
+
@set.set(1)
|
220
|
+
@set.set(2)
|
221
|
+
@set.set(3)
|
222
|
+
other.set(2)
|
223
|
+
other.set(3)
|
224
|
+
other.set(4)
|
225
|
+
|
226
|
+
@set.set_intersection(other)
|
227
|
+
|
228
|
+
assert_equal 2, @set.count # bits 2, 3 are set
|
229
|
+
end
|
230
|
+
|
231
|
+
def test_ampersand_basic
|
232
|
+
other = Bitz::Set.new
|
233
|
+
@set.set(5)
|
234
|
+
@set.set(10)
|
235
|
+
other.set(5)
|
236
|
+
other.set(15)
|
237
|
+
|
238
|
+
result = @set & other
|
239
|
+
|
240
|
+
# Original bitsets unchanged
|
241
|
+
assert @set.set?(5)
|
242
|
+
assert @set.set?(10)
|
243
|
+
assert other.set?(5)
|
244
|
+
assert other.set?(15)
|
245
|
+
|
246
|
+
# Result has intersection
|
247
|
+
assert result.set?(5)
|
248
|
+
refute result.set?(10)
|
249
|
+
refute result.set?(15)
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_ampersand_no_overlap
|
253
|
+
other = Bitz::Set.new
|
254
|
+
@set.set(5)
|
255
|
+
@set.set(10)
|
256
|
+
other.set(15)
|
257
|
+
other.set(20)
|
258
|
+
|
259
|
+
result = @set & other
|
260
|
+
|
261
|
+
# Original bitsets unchanged
|
262
|
+
assert @set.set?(5)
|
263
|
+
assert @set.set?(10)
|
264
|
+
assert other.set?(15)
|
265
|
+
assert other.set?(20)
|
266
|
+
|
267
|
+
# Result is empty
|
268
|
+
refute result.set?(5)
|
269
|
+
refute result.set?(10)
|
270
|
+
refute result.set?(15)
|
271
|
+
refute result.set?(20)
|
272
|
+
assert_equal 0, result.count
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_ampersand_all_overlap
|
276
|
+
other = Bitz::Set.new
|
277
|
+
@set.set(5)
|
278
|
+
@set.set(10)
|
279
|
+
other.set(5)
|
280
|
+
other.set(10)
|
281
|
+
|
282
|
+
result = @set & other
|
283
|
+
|
284
|
+
# Original bitsets unchanged
|
285
|
+
assert @set.set?(5)
|
286
|
+
assert @set.set?(10)
|
287
|
+
assert other.set?(5)
|
288
|
+
assert other.set?(10)
|
289
|
+
|
290
|
+
# Result has all bits
|
291
|
+
assert result.set?(5)
|
292
|
+
assert result.set?(10)
|
293
|
+
assert_equal 2, result.count
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_ampersand_different_sizes_raises_error
|
297
|
+
other = Bitz::Set.new(128)
|
298
|
+
@set.set(5)
|
299
|
+
other.set(5)
|
300
|
+
|
301
|
+
error = assert_raises(ArgumentError) do
|
302
|
+
@set & other
|
303
|
+
end
|
304
|
+
|
305
|
+
assert_match(/Cannot intersect bitsets with different capacities/, error.message)
|
306
|
+
assert_match(/64 != 128/, error.message)
|
307
|
+
end
|
308
|
+
|
309
|
+
def test_ampersand_returns_new_instance
|
310
|
+
other = Bitz::Set.new
|
311
|
+
result = @set & other
|
312
|
+
|
313
|
+
refute_same @set, result
|
314
|
+
refute_same other, result
|
315
|
+
assert_instance_of Bitz::Set, result
|
316
|
+
assert_equal @set.capacity, result.capacity
|
317
|
+
end
|
318
|
+
|
319
|
+
def test_pipe_basic
|
320
|
+
other = Bitz::Set.new
|
321
|
+
@set.set(5)
|
322
|
+
other.set(10)
|
323
|
+
|
324
|
+
result = @set | other
|
325
|
+
|
326
|
+
# Original bitsets unchanged
|
327
|
+
assert @set.set?(5)
|
328
|
+
refute @set.set?(10)
|
329
|
+
refute other.set?(5)
|
330
|
+
assert other.set?(10)
|
331
|
+
|
332
|
+
# Result has union
|
333
|
+
assert result.set?(5)
|
334
|
+
assert result.set?(10)
|
335
|
+
end
|
336
|
+
|
337
|
+
def test_pipe_overlapping
|
338
|
+
other = Bitz::Set.new
|
339
|
+
@set.set(5)
|
340
|
+
@set.set(10)
|
341
|
+
other.set(5)
|
342
|
+
other.set(15)
|
343
|
+
|
344
|
+
result = @set | other
|
345
|
+
|
346
|
+
# Original bitsets unchanged
|
347
|
+
assert @set.set?(5)
|
348
|
+
assert @set.set?(10)
|
349
|
+
refute @set.set?(15)
|
350
|
+
assert other.set?(5)
|
351
|
+
refute other.set?(10)
|
352
|
+
assert other.set?(15)
|
353
|
+
|
354
|
+
# Result has union
|
355
|
+
assert result.set?(5)
|
356
|
+
assert result.set?(10)
|
357
|
+
assert result.set?(15)
|
358
|
+
assert_equal 3, result.count
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_pipe_no_bits_set
|
362
|
+
other = Bitz::Set.new
|
363
|
+
|
364
|
+
result = @set | other
|
365
|
+
|
366
|
+
# Original bitsets unchanged (both empty)
|
367
|
+
assert_equal 0, @set.count
|
368
|
+
assert_equal 0, other.count
|
369
|
+
|
370
|
+
# Result is empty
|
371
|
+
assert_equal 0, result.count
|
372
|
+
end
|
373
|
+
|
374
|
+
def test_pipe_different_sizes_raises_error
|
375
|
+
other = Bitz::Set.new(128)
|
376
|
+
@set.set(5)
|
377
|
+
other.set(100)
|
378
|
+
|
379
|
+
error = assert_raises(ArgumentError) do
|
380
|
+
@set | other
|
381
|
+
end
|
382
|
+
|
383
|
+
assert_match(/Cannot union bitsets with different capacities/, error.message)
|
384
|
+
assert_match(/64 != 128/, error.message)
|
385
|
+
end
|
386
|
+
|
387
|
+
def test_pipe_returns_new_instance
|
388
|
+
other = Bitz::Set.new
|
389
|
+
result = @set | other
|
390
|
+
|
391
|
+
refute_same @set, result
|
392
|
+
refute_same other, result
|
393
|
+
assert_instance_of Bitz::Set, result
|
394
|
+
assert_equal @set.capacity, result.capacity
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_pipe_count
|
398
|
+
other = Bitz::Set.new
|
399
|
+
@set.set(1)
|
400
|
+
@set.set(3)
|
401
|
+
other.set(2)
|
402
|
+
other.set(3)
|
403
|
+
|
404
|
+
result = @set | other
|
405
|
+
|
406
|
+
# Original bitsets unchanged
|
407
|
+
assert_equal 2, @set.count
|
408
|
+
assert_equal 2, other.count
|
409
|
+
|
410
|
+
# Result has union count
|
411
|
+
assert_equal 3, result.count # bits 1, 2, 3 are set
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_bang_basic
|
415
|
+
@set.set(5)
|
416
|
+
@set.set(10)
|
417
|
+
|
418
|
+
result = !@set
|
419
|
+
|
420
|
+
# Original bitset unchanged
|
421
|
+
assert @set.set?(5)
|
422
|
+
assert @set.set?(10)
|
423
|
+
assert_equal 2, @set.count
|
424
|
+
|
425
|
+
# Result has all bits flipped
|
426
|
+
refute result.set?(5)
|
427
|
+
refute result.set?(10)
|
428
|
+
assert result.set?(0)
|
429
|
+
assert result.set?(1)
|
430
|
+
assert result.set?(15)
|
431
|
+
assert result.set?(63)
|
432
|
+
assert_equal 62, result.count # 64 - 2 set bits
|
433
|
+
end
|
434
|
+
|
435
|
+
def test_bang_empty_set
|
436
|
+
result = !@set
|
437
|
+
|
438
|
+
# Original bitset unchanged (empty)
|
439
|
+
assert_equal 0, @set.count
|
440
|
+
|
441
|
+
# Result has all bits set
|
442
|
+
(0...64).each { |bit| assert result.set?(bit) }
|
443
|
+
assert_equal 64, result.count
|
444
|
+
end
|
445
|
+
|
446
|
+
def test_bang_full_set
|
447
|
+
@set.set_all
|
448
|
+
|
449
|
+
result = !@set
|
450
|
+
|
451
|
+
# Original bitset unchanged (full)
|
452
|
+
assert_equal 64, @set.count
|
453
|
+
|
454
|
+
# Result has no bits set
|
455
|
+
(0...64).each { |bit| refute result.set?(bit) }
|
456
|
+
assert_equal 0, result.count
|
457
|
+
end
|
458
|
+
|
459
|
+
def test_bang_returns_new_instance
|
460
|
+
result = !@set
|
461
|
+
|
462
|
+
refute_same @set, result
|
463
|
+
assert_instance_of Bitz::Set, result
|
464
|
+
assert_equal @set.capacity, result.capacity
|
465
|
+
end
|
466
|
+
|
467
|
+
def test_bang_double_negation
|
468
|
+
@set.set(5)
|
469
|
+
@set.set(10)
|
470
|
+
@set.set(20)
|
471
|
+
|
472
|
+
result = !!@set
|
473
|
+
|
474
|
+
# Double negation should restore original
|
475
|
+
assert result.set?(5)
|
476
|
+
assert result.set?(10)
|
477
|
+
assert result.set?(20)
|
478
|
+
assert_equal 3, result.count
|
479
|
+
|
480
|
+
# Original unchanged
|
481
|
+
assert @set.set?(5)
|
482
|
+
assert @set.set?(10)
|
483
|
+
assert @set.set?(20)
|
484
|
+
assert_equal 3, @set.count
|
485
|
+
end
|
486
|
+
|
487
|
+
def test_bang_specific_capacity
|
488
|
+
small_set = Bitz::Set.new(16)
|
489
|
+
small_set.set(3)
|
490
|
+
small_set.set(7)
|
491
|
+
|
492
|
+
result = !small_set
|
493
|
+
|
494
|
+
# Check capacity preserved
|
495
|
+
assert_equal 16, result.capacity
|
496
|
+
|
497
|
+
# Check specific bits flipped correctly
|
498
|
+
refute result.set?(3)
|
499
|
+
refute result.set?(7)
|
500
|
+
assert result.set?(0)
|
501
|
+
assert result.set?(15)
|
502
|
+
assert_equal 14, result.count # 16 - 2 set bits
|
503
|
+
end
|
504
|
+
|
505
|
+
def test_toggle_all_basic
|
506
|
+
@set.set(5)
|
507
|
+
@set.set(10)
|
508
|
+
@set.set(20)
|
509
|
+
initial_count = @set.count
|
510
|
+
|
511
|
+
result = @set.toggle_all
|
512
|
+
|
513
|
+
# Returns self for chaining
|
514
|
+
assert_same @set, result
|
515
|
+
|
516
|
+
# All previously set bits are now unset
|
517
|
+
refute @set.set?(5)
|
518
|
+
refute @set.set?(10)
|
519
|
+
refute @set.set?(20)
|
520
|
+
|
521
|
+
# All previously unset bits are now set
|
522
|
+
assert @set.set?(0)
|
523
|
+
assert @set.set?(1)
|
524
|
+
assert @set.set?(15)
|
525
|
+
assert @set.set?(63)
|
526
|
+
|
527
|
+
# Count is complement of original
|
528
|
+
assert_equal 64 - initial_count, @set.count
|
529
|
+
end
|
530
|
+
|
531
|
+
def test_toggle_all_empty_set
|
532
|
+
initial_count = @set.count
|
533
|
+
assert_equal 0, initial_count
|
534
|
+
|
535
|
+
@set.toggle_all
|
536
|
+
|
537
|
+
# All bits should now be set
|
538
|
+
(0...64).each { |bit| assert @set.set?(bit) }
|
539
|
+
assert_equal 64, @set.count
|
540
|
+
end
|
541
|
+
|
542
|
+
def test_toggle_all_full_set
|
543
|
+
@set.set_all
|
544
|
+
initial_count = @set.count
|
545
|
+
assert_equal 64, initial_count
|
546
|
+
|
547
|
+
@set.toggle_all
|
548
|
+
|
549
|
+
# All bits should now be unset
|
550
|
+
(0...64).each { |bit| refute @set.set?(bit) }
|
551
|
+
assert_equal 0, @set.count
|
552
|
+
end
|
553
|
+
|
554
|
+
def test_toggle_all_double_toggle
|
555
|
+
@set.set(5)
|
556
|
+
@set.set(10)
|
557
|
+
@set.set(20)
|
558
|
+
original_bits = [5, 10, 20]
|
559
|
+
original_count = @set.count
|
560
|
+
|
561
|
+
@set.toggle_all.toggle_all
|
562
|
+
|
563
|
+
# Should restore original state
|
564
|
+
original_bits.each { |bit| assert @set.set?(bit) }
|
565
|
+
assert_equal original_count, @set.count
|
566
|
+
|
567
|
+
# Check some bits that should still be unset
|
568
|
+
refute @set.set?(0)
|
569
|
+
refute @set.set?(1)
|
570
|
+
refute @set.set?(15)
|
571
|
+
end
|
572
|
+
|
573
|
+
def test_toggle_all_specific_capacity
|
574
|
+
small_set = Bitz::Set.new(16)
|
575
|
+
small_set.set(3)
|
576
|
+
small_set.set(7)
|
577
|
+
initial_count = small_set.count
|
578
|
+
|
579
|
+
small_set.toggle_all
|
580
|
+
|
581
|
+
# Check capacity unchanged
|
582
|
+
assert_equal 16, small_set.capacity
|
583
|
+
|
584
|
+
# Check specific bits flipped
|
585
|
+
refute small_set.set?(3)
|
586
|
+
refute small_set.set?(7)
|
587
|
+
assert small_set.set?(0)
|
588
|
+
assert small_set.set?(15)
|
589
|
+
|
590
|
+
# Check count
|
591
|
+
assert_equal 16 - initial_count, small_set.count
|
592
|
+
end
|
593
|
+
|
594
|
+
def test_toggle_all_method_chaining
|
595
|
+
other = Bitz::Set.new
|
596
|
+
other.set(1)
|
597
|
+
|
598
|
+
@set.set(5)
|
599
|
+
result = @set.toggle_all.set_union(other)
|
600
|
+
|
601
|
+
# Should be chainable and return self
|
602
|
+
assert_same @set, result
|
603
|
+
|
604
|
+
# Verify final state - bit 5 was set then toggled (now unset), bit 1 added via union
|
605
|
+
refute @set.set?(5) # was set then toggled
|
606
|
+
assert @set.set?(1) # added via union
|
607
|
+
assert @set.set?(0) # was unset then toggled
|
608
|
+
end
|
609
|
+
|
610
|
+
def test_equality_identical_empty_sets
|
611
|
+
other = Bitz::Set.new
|
612
|
+
|
613
|
+
assert_equal @set, other
|
614
|
+
assert_equal other, @set
|
615
|
+
end
|
616
|
+
|
617
|
+
def test_equality_identical_sets_with_bits
|
618
|
+
other = Bitz::Set.new
|
619
|
+
@set.set(5)
|
620
|
+
@set.set(10)
|
621
|
+
other.set(5)
|
622
|
+
other.set(10)
|
623
|
+
|
624
|
+
assert_equal @set, other
|
625
|
+
assert_equal other, @set
|
626
|
+
end
|
627
|
+
|
628
|
+
def test_equality_different_bits
|
629
|
+
other = Bitz::Set.new
|
630
|
+
@set.set(5)
|
631
|
+
other.set(10)
|
632
|
+
|
633
|
+
refute_equal @set, other
|
634
|
+
refute_equal other, @set
|
635
|
+
end
|
636
|
+
|
637
|
+
def test_equality_different_capacities
|
638
|
+
other = Bitz::Set.new(128)
|
639
|
+
|
640
|
+
refute_equal @set, other
|
641
|
+
refute_equal other, @set
|
642
|
+
end
|
643
|
+
|
644
|
+
def test_equality_different_capacities_same_bits
|
645
|
+
other = Bitz::Set.new(128)
|
646
|
+
@set.set(5)
|
647
|
+
other.set(5)
|
648
|
+
|
649
|
+
refute_equal @set, other
|
650
|
+
refute_equal other, @set
|
651
|
+
end
|
652
|
+
|
653
|
+
def test_equality_same_capacity_different_patterns
|
654
|
+
other = Bitz::Set.new(64)
|
655
|
+
@set.set(1)
|
656
|
+
@set.set(3)
|
657
|
+
@set.set(5)
|
658
|
+
other.set(2)
|
659
|
+
other.set(4)
|
660
|
+
other.set(6)
|
661
|
+
|
662
|
+
refute_equal @set, other
|
663
|
+
refute_equal other, @set
|
664
|
+
end
|
665
|
+
|
666
|
+
def test_equality_full_sets
|
667
|
+
other = Bitz::Set.new(64)
|
668
|
+
@set.set_all
|
669
|
+
other.set_all
|
670
|
+
|
671
|
+
assert_equal @set, other
|
672
|
+
assert_equal other, @set
|
673
|
+
end
|
674
|
+
|
675
|
+
def test_equality_one_full_one_partial
|
676
|
+
other = Bitz::Set.new(64)
|
677
|
+
@set.set_all
|
678
|
+
other.set(5)
|
679
|
+
|
680
|
+
refute_equal @set, other
|
681
|
+
refute_equal other, @set
|
682
|
+
end
|
683
|
+
|
684
|
+
def test_equality_with_non_bitset_object
|
685
|
+
refute_equal @set, "not a bitset"
|
686
|
+
refute_equal @set, 42
|
687
|
+
refute_equal @set, nil
|
688
|
+
refute_equal @set, []
|
689
|
+
end
|
690
|
+
|
691
|
+
def test_equality_after_operations
|
692
|
+
other = Bitz::Set.new
|
693
|
+
@set.set(5)
|
694
|
+
other.set(5)
|
695
|
+
|
696
|
+
# Initially equal
|
697
|
+
assert_equal @set, other
|
698
|
+
|
699
|
+
# After toggle_all, should be equal
|
700
|
+
@set.toggle_all
|
701
|
+
other.toggle_all
|
702
|
+
assert_equal @set, other
|
703
|
+
|
704
|
+
# After different operations, should not be equal
|
705
|
+
# Set bit 5 in @set only (bit 5 was originally set, so after toggle it's unset)
|
706
|
+
@set.set(5)
|
707
|
+
refute_equal @set, other
|
708
|
+
end
|
709
|
+
|
710
|
+
def test_equality_with_duplicated_sets
|
711
|
+
@set.set(1)
|
712
|
+
@set.set(15)
|
713
|
+
@set.set(63)
|
714
|
+
|
715
|
+
copy = @set.dup
|
716
|
+
assert_equal @set, copy
|
717
|
+
|
718
|
+
# Modify copy
|
719
|
+
copy.set(30)
|
720
|
+
refute_equal @set, copy
|
721
|
+
end
|
722
|
+
end
|
data/test/test_helper.rb
ADDED