Example #1
0
// some extra tests
func TestBitmapExtraCOW(t *testing.T) {
	for N := uint32(1); N <= 65536; N *= 2 {
		Convey("extra tests"+strconv.Itoa(int(N)), t, func() {
			for gap := uint32(1); gap <= 65536; gap *= 2 {
				bs1 := bitset.New(0)
				rb1 := NewBitmap()
				rb1.SetCopyOnWrite(true)
				rb1.SetCopyOnWrite(true)

				for x := uint32(0); x <= N; x += gap {
					bs1.Set(uint(x))
					rb1.Add(x)
				}
				So(bs1.Count(), ShouldEqual, rb1.GetCardinality())
				So(equalsBitSet(bs1, rb1), ShouldEqual, true)
				for offset := uint32(1); offset <= gap; offset *= 2 {
					bs2 := bitset.New(0)
					rb2 := NewBitmap()
					rb2.SetCopyOnWrite(true)

					for x := uint32(0); x <= N; x += gap {
						bs2.Set(uint(x + offset))
						rb2.Add(x + offset)
					}
					So(bs2.Count(), ShouldEqual, rb2.GetCardinality())
					So(equalsBitSet(bs2, rb2), ShouldEqual, true)

					clonebs1 := bs1.Clone()
					clonebs1.InPlaceIntersection(bs2)
					if !equalsBitSet(clonebs1, And(rb1, rb2)) {
						t := rb1.Clone()
						t.And(rb2)
						So(equalsBitSet(clonebs1, t), ShouldEqual, true)
					}

					// testing OR
					clonebs1 = bs1.Clone()
					clonebs1.InPlaceUnion(bs2)

					So(equalsBitSet(clonebs1, Or(rb1, rb2)), ShouldEqual, true)
					// testing XOR
					clonebs1 = bs1.Clone()
					clonebs1.InPlaceSymmetricDifference(bs2)
					So(equalsBitSet(clonebs1, Xor(rb1, rb2)), ShouldEqual, true)

					//testing NOTAND
					clonebs1 = bs1.Clone()
					clonebs1.InPlaceDifference(bs2)
					So(equalsBitSet(clonebs1, AndNot(rb1, rb2)), ShouldEqual, true)
				}
			}
		})
	}
}