From 02cba542e8cebdde0de2850b822cdfd01b2d9858 Mon Sep 17 00:00:00 2001 From: Todd Gruben Date: Fri, 16 Jun 2017 16:27:54 -0500 Subject: [PATCH] bug in CountRange --- roaring/roaring.go | 2 +- roaring/roaring_test.go | 43 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/roaring/roaring.go b/roaring/roaring.go index 80ac665f5..7aeab1e3f 100644 --- a/roaring/roaring.go +++ b/roaring/roaring.go @@ -196,7 +196,7 @@ func (b *Bitmap) CountRange(start, end uint64) (n uint64) { j := search64(b.keys, highbits(end)) // If range is entirely in one container then just count that range. - if i > 0 && i == j { + if i >= 0 && i == j { return uint64(b.containers[i].countRange(lowbits(start), lowbits(end))) } diff --git a/roaring/roaring_test.go b/roaring/roaring_test.go index 580829450..9ab63c748 100644 --- a/roaring/roaring_test.go +++ b/roaring/roaring_test.go @@ -127,6 +127,29 @@ func TestBitmap_Max(t *testing.T) { } } } +func TestBitmap_CountRange(t *testing.T) { + bm0 := roaring.NewBitmap(0, 2683177) + for i := uint64(628); i < 2683301; i++ { + bm0.Add(i) + } + bm0.Add(2683307) + if n := bm0.CountRange(1, 2683311); n != 2682674 { + t.Fatalf("unexpected n: %d", n) + } + + if n := bm0.CountRange(2683177, 2683310); n != 125 { + t.Fatalf("unexpected n: %d", n) + } + + if n := bm0.CountRange(2683301, 3000000); n != 1 { + t.Fatalf("unexpected n: %d", n) + } + + if n := bm0.CountRange(0, 1); n != 1 { + t.Fatalf("unexpected n: %d", n) + } + +} func TestBitmap_Intersection(t *testing.T) { bm0 := roaring.NewBitmap(0, 2683177) @@ -140,6 +163,16 @@ func TestBitmap_Intersection(t *testing.T) { t.Fatalf("unexpected n: %d", n) } +} +func TestBitmap_Intersection_Empty(t *testing.T) { + bm0 := roaring.NewBitmap(0, 2683177) + bm1 := roaring.NewBitmap() + + result := bm0.Intersect(bm1) + if n := result.Count(); n != 0 { + t.Fatalf("unexpected n: %d", n) + } + } func TestBitmap_Difference(t *testing.T) { @@ -149,11 +182,18 @@ func TestBitmap_Difference(t *testing.T) { bm1.Add(i) } result := bm0.Difference(bm1) - //expect to have just 0 if n := result.Count(); n != 1 { t.Fatalf("unexpected n: %d", n) } } +func TestBitmap_Difference_Empty(t *testing.T) { + bm0 := roaring.NewBitmap(0, 2683177) + bm1 := roaring.NewBitmap() + result := bm0.Difference(bm1) + if n := result.Count(); n != 2 { + t.Fatalf("unexpected n: %d", n) + } +} func TestBitmap_Union(t *testing.T) { bm0 := roaring.NewBitmap(0, 1000001, 1000002, 1000003) @@ -417,7 +457,6 @@ func testBitmapQuick(t *testing.T, n int, min, max uint64) { }) } - func TestBitmap_Marshal_Quick_Array1(t *testing.T) { testBitmapMarshalQuick(t, 1000, 1000, 2000, false) } func TestBitmap_Marshal_Quick_Array2(t *testing.T) { testBitmapMarshalQuick(t, 10000, 0, 1000, false) } func TestBitmap_Marshal_Quick_Bitmap1(t *testing.T) { testBitmapMarshalQuick(t, 10000, 0, 10000, false) }