diff --git a/src/bmpTest.c b/src/bmpTest.c new file mode 100644 index 0000000..6b29141 --- /dev/null +++ b/src/bmpTest.c @@ -0,0 +1,86 @@ +#include "ktest.h" +#include "bmp.h" + +KTEST(bmpSetClearTest) +{ + uint64 words[2]; + Bitmap b; + bmpInit(&b, words, 100); + + KT_FALSE(t, bmpTest(&b, 0)); + KT_FALSE(t, bmpTest(&b, 63)); + KT_FALSE(t, bmpTest(&b, 64)); /* crosses into the second word */ + KT_FALSE(t, bmpTest(&b, 99)); + + bmpSet(&b, 0); + bmpSet(&b, 63); + bmpSet(&b, 64); + bmpSet(&b, 99); + KT_TRUE(t, bmpTest(&b, 0)); + KT_TRUE(t, bmpTest(&b, 63)); + KT_TRUE(t, bmpTest(&b, 64)); + KT_TRUE(t, bmpTest(&b, 99)); + KT_FALSE(t, bmpTest(&b, 1)); + KT_EQ(t, bmpCountSet(&b), 4); + + bmpClear(&b, 63); + KT_FALSE(t, bmpTest(&b, 63)); + KT_EQ(t, bmpCountSet(&b), 3); +} + +KTEST(bmpOutOfRangeIsSafeNoop) +{ + uint64 words[1]; + Bitmap b; + bmpInit(&b, words, 10); + + bmpSet(&b, 500); /* must not touch memory past backing storage */ + KT_FALSE(t, bmpTest(&b, 500)); + bmpClear(&b, 500); + KT_EQ(t, bmpCountSet(&b), 0); +} + +KTEST(bmpRangeOps) +{ + uint64 words[1]; + Bitmap b; + bmpInit(&b, words, 20); + + bmpSetRange(&b, 5, 10); /* bits 5..14 */ + KT_EQ(t, bmpCountSet(&b), 10); + KT_FALSE(t, bmpTest(&b, 4)); + KT_TRUE(t, bmpTest(&b, 5)); + KT_TRUE(t, bmpTest(&b, 14)); + KT_FALSE(t, bmpTest(&b, 15)); + + bmpClearRange(&b, 5, 3); /* clears 5,6,7 */ + KT_FALSE(t, bmpTest(&b, 5)); + KT_FALSE(t, bmpTest(&b, 7)); + KT_TRUE(t, bmpTest(&b, 8)); + KT_EQ(t, bmpCountSet(&b), 7); +} + +KTEST(bmpSetAllClearAllAndFind) +{ + uint64 words[2]; + Bitmap b; + bmpInit(&b, words, 70); + + KT_EQ(t, bmpFindFirstSet(&b), -1); + KT_EQ(t, bmpFindFirstClear(&b), 0); + + bmpSet(&b, 5); + KT_EQ(t, bmpFindFirstSet(&b), 5); + + bmpSetAll(&b); + KT_EQ(t, bmpCountSet(&b), 70); + KT_EQ(t, bmpFindFirstClear(&b), -1); + KT_EQ(t, bmpFindFirstSet(&b), 0); + + bmpClear(&b, 30); + KT_EQ(t, bmpFindFirstClear(&b), 30); + + bmpClearAll(&b); + KT_EQ(t, bmpCountSet(&b), 0); + KT_EQ(t, bmpFindFirstSet(&b), -1); +}