--- /dev/null
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package intsets
+
+import (
+ "math/rand"
+ "testing"
+)
+
+func TestNLZ(t *testing.T) {
+ // Test the platform-specific edge case.
+ // NB: v must be a var (not const) so that the word() conversion is dynamic.
+ // Otherwise the compiler will report an error.
+ v := uint64(0x0000801000000000)
+ n := nlz(word(v))
+ want := 32 // (on 32-bit)
+ if bitsPerWord == 64 {
+ want = 16
+ }
+ if n != want {
+ t.Errorf("%d-bit nlz(%d) = %d, want %d", bitsPerWord, v, n, want)
+ }
+}
+
+// Backdoor for testing.
+func (s *Sparse) Check() error { return s.check() }
+
+func dumbPopcount(x word) int {
+ var popcnt int
+ for i := uint(0); i < bitsPerWord; i++ {
+ if x&(1<<i) != 0 {
+ popcnt++
+ }
+ }
+ return popcnt
+}
+
+func TestPopcount(t *testing.T) {
+ for i := 0; i < 1e5; i++ {
+ x := word(rand.Uint32())
+ if bitsPerWord == 64 {
+ x = x | (word(rand.Uint32()) << 32)
+ }
+ want := dumbPopcount(x)
+ got := popcount(x)
+ if got != want {
+ t.Errorf("popcount(%d) = %d, want %d", x, got, want)
+ }
+ }
+}
+
+func BenchmarkPopcount(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ popcount(word(i))
+ }
+}