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.
@@ -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
@@ -0,0 +1,2 @@
1
+ require "minitest/autorun"
2
+ require_relative "../lib/bitz"