Skip to content

Commit 2b4e563

Browse files
committed
Add tests for all public methods
* Fix a few bugs as well.
1 parent bfd3ed9 commit 2b4e563

File tree

3 files changed

+243
-10
lines changed

3 files changed

+243
-10
lines changed

spec/sparsebitset_spec.cr

Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,23 @@ describe SparseBitSet do
1919
s.none?.should eq(true)
2020
end
2121

22+
it "should answer `false` for a non-empty set" do
23+
s = BitSet.new()
24+
s.set(1_u64)
25+
s.none?.should eq(false)
26+
end
27+
28+
it "should have no bits set upon creation" do
29+
s = BitSet.new()
30+
s.any?.should eq(false)
31+
end
32+
33+
it "should answer `true` for a non-empty set" do
34+
s = BitSet.new()
35+
s.set(1_u64)
36+
s.any?.should eq(true)
37+
end
38+
2239
it "should set the given bit and test it" do
2340
s = BitSet.new()
2441
s.set(1_u64)
@@ -690,5 +707,212 @@ describe SparseBitSet do
690707
t = s.complement()
691708
t.length.should eq(997)
692709
end
710+
711+
it "should have a length that is prior length - 3" do
712+
s = BitSet.new()
713+
s.set(64_u64)
714+
s.set(100_u64)
715+
s.set(1000_u64)
716+
t = s.complement()
717+
t.length.should eq(997)
718+
end
719+
end
720+
721+
describe "set-wide predicates" do
722+
it "should answer `false`" do
723+
s = BitSet.new()
724+
s.all?.should eq(false)
725+
end
726+
727+
it "should answer `true`" do
728+
s = BitSet.new()
729+
s.set(1_u64)
730+
s.all?.should eq(true)
731+
end
732+
733+
it "should answer `false`" do
734+
s = BitSet.new()
735+
s.set(10_u64)
736+
s.all?.should eq(false)
737+
end
738+
739+
it "should answer `false`" do
740+
s = BitSet.new()
741+
s.set(100_u64)
742+
s.all?.should eq(false)
743+
end
744+
745+
it "should answer `true`" do
746+
s = BitSet.new()
747+
s.set(1_u64)
748+
s.set(2_u64)
749+
s.all?.should eq(true)
750+
end
751+
752+
it "should answer `true`" do
753+
s = BitSet.new()
754+
s.set(1_u64)
755+
s.set(2_u64)
756+
s.set(3_u64)
757+
s.set(4_u64)
758+
s.set(5_u64)
759+
s.set(6_u64)
760+
s.set(7_u64)
761+
s.set(8_u64)
762+
s.set(9_u64)
763+
s.set(11_u64)
764+
s.set(12_u64)
765+
s.set(13_u64)
766+
s.set(14_u64)
767+
s.set(15_u64)
768+
s.set(16_u64)
769+
s.set(17_u64)
770+
s.set(18_u64)
771+
s.set(19_u64)
772+
s.set(21_u64)
773+
s.set(22_u64)
774+
s.set(23_u64)
775+
s.set(24_u64)
776+
s.set(25_u64)
777+
s.set(26_u64)
778+
s.set(27_u64)
779+
s.set(28_u64)
780+
s.set(29_u64)
781+
s.set(31_u64)
782+
s.set(32_u64)
783+
s.set(33_u64)
784+
s.set(34_u64)
785+
s.set(35_u64)
786+
s.set(36_u64)
787+
s.set(37_u64)
788+
s.set(38_u64)
789+
s.set(39_u64)
790+
s.set(41_u64)
791+
s.set(42_u64)
792+
s.set(43_u64)
793+
s.set(44_u64)
794+
s.set(45_u64)
795+
s.set(46_u64)
796+
s.set(47_u64)
797+
s.set(48_u64)
798+
s.set(49_u64)
799+
s.set(51_u64)
800+
s.set(52_u64)
801+
s.set(53_u64)
802+
s.set(54_u64)
803+
s.set(55_u64)
804+
s.set(56_u64)
805+
s.set(57_u64)
806+
s.set(58_u64)
807+
s.set(59_u64)
808+
s.set(61_u64)
809+
s.set(62_u64)
810+
s.set(63_u64)
811+
s.set(64_u64)
812+
s.set(65_u64)
813+
s.set(66_u64)
814+
s.set(67_u64)
815+
s.set(68_u64)
816+
s.set(69_u64)
817+
s.all?.should eq(true)
818+
end
819+
820+
it "should answer `true`" do
821+
s = BitSet.new()
822+
s.set(64_u64)
823+
s.set(65_u64)
824+
s.set(66_u64)
825+
s.set(67_u64)
826+
s.set(68_u64)
827+
s.set(69_u64)
828+
s.all?.should eq(false)
829+
end
830+
end
831+
832+
describe "superset" do
833+
it "should check two empty sets" do
834+
s = BitSet.new()
835+
t = BitSet.new()
836+
s.superset?(t).should eq(true)
837+
end
838+
839+
it "should check a non-empty and an empty set" do
840+
s = BitSet.new()
841+
s.set(64_u64)
842+
t = BitSet.new()
843+
s.superset?(t).should eq(true)
844+
end
845+
846+
it "should check a non-empty and an empty set" do
847+
s = BitSet.new()
848+
s.set(64_u64)
849+
t = BitSet.new()
850+
t.superset?(s).should eq(false)
851+
end
852+
853+
it "should check two equal sets" do
854+
s = BitSet.new()
855+
s.set(64_u64)
856+
t = BitSet.new()
857+
t.set(64_u64)
858+
s.superset?(t).should eq(true)
859+
end
860+
861+
it "should check two unequal sets" do
862+
s = BitSet.new()
863+
s.set(1_u64)
864+
s.set(64_u64)
865+
t = BitSet.new()
866+
t.set(64_u64)
867+
s.superset?(t).should eq(true)
868+
end
869+
870+
it "should check two unequal sets" do
871+
s = BitSet.new()
872+
s.set(64_u64)
873+
t = BitSet.new()
874+
t.set(1_u64)
875+
t.set(64_u64)
876+
s.superset?(t).should eq(false)
877+
end
878+
879+
it "should check two empty sets" do
880+
s = BitSet.new()
881+
t = BitSet.new()
882+
s.strict_superset?(t).should eq(false)
883+
end
884+
885+
it "should check a non-empty and an empty set" do
886+
s = BitSet.new()
887+
s.set(64_u64)
888+
t = BitSet.new()
889+
t.strict_superset?(s).should eq(false)
890+
end
891+
892+
it "should check two equal sets" do
893+
s = BitSet.new()
894+
s.set(64_u64)
895+
t = BitSet.new()
896+
t.set(64_u64)
897+
s.strict_superset?(t).should eq(false)
898+
end
899+
900+
it "should check two unequal sets" do
901+
s = BitSet.new()
902+
s.set(64_u64)
903+
t = BitSet.new()
904+
t.set(1_u64)
905+
t.set(64_u64)
906+
s.strict_superset?(t).should eq(false)
907+
end
908+
909+
it "should check two unequal sets" do
910+
s = BitSet.new()
911+
s.set(64_u64)
912+
t = BitSet.new()
913+
t.set(1_u64)
914+
t.set(64_u64)
915+
t.strict_superset?(s).should eq(true)
916+
end
693917
end
694918
end

src/sparsebitset.cr

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -597,8 +597,8 @@ module SparseBitSet
597597
blk.bits = ~blk.bits >> (63-j)
598598
res.raw_set[-1] = blk
599599

600-
blk = res.raw_set[0]
601600
# '0'th bit should be ignored.
601+
blk = res.raw_set[0]
602602
blk.bits = blk.bits >> 1
603603
blk.bits = blk.bits << 1
604604
res.raw_set[0] = blk
@@ -614,18 +614,27 @@ module SparseBitSet
614614
return false if @set.length == 0
615615

616616
off = 0_u64
617-
@set[0..-2].each do |el|
617+
@set.each_with_index do |el, i|
618618
return false if el.offset != off
619-
return false if el.bits != ALL_ONES
620619

621-
off += WORD_SIZE
620+
if el.offset > 0 && i < @set.length-1
621+
return false if el.bits != ALL_ONES
622+
end
623+
624+
off += 1
625+
end
626+
627+
el = @set[-1]
628+
cp = popcount(el.bits)
629+
if el.offset == 0 # Handle '0'th bit.
630+
cp += 1
631+
w = (el.bits | 1) ^ ALL_ONES
632+
else
633+
w = el.bits ^ ALL_ONES
622634
end
635+
tz = trailing_zeroes_count(w)
636+
return false if cp != tz
623637

624-
# Check the last block.
625-
w = @set[-1].bits
626-
c = popcount(w)
627-
w = w >> c
628-
return false if w > 0
629638
true
630639
end
631640

src/sparsebitset/version.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module SparseBitSet
2-
VERSION = "0.0.2"
2+
VERSION = "0.0.3"
33
end

0 commit comments

Comments
 (0)