Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / container / intsets / util_test.go
1 // Copyright 2014 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package intsets
6
7 import (
8         "math/rand"
9         "testing"
10 )
11
12 func TestNLZ(t *testing.T) {
13         // Test the platform-specific edge case.
14         // NB: v must be a var (not const) so that the word() conversion is dynamic.
15         // Otherwise the compiler will report an error.
16         v := uint64(0x0000801000000000)
17         n := nlz(word(v))
18         want := 32 // (on 32-bit)
19         if bitsPerWord == 64 {
20                 want = 16
21         }
22         if n != want {
23                 t.Errorf("%d-bit nlz(%d) = %d, want %d", bitsPerWord, v, n, want)
24         }
25 }
26
27 // Backdoor for testing.
28 func (s *Sparse) Check() error { return s.check() }
29
30 func dumbPopcount(x word) int {
31         var popcnt int
32         for i := uint(0); i < bitsPerWord; i++ {
33                 if x&(1<<i) != 0 {
34                         popcnt++
35                 }
36         }
37         return popcnt
38 }
39
40 func TestPopcount(t *testing.T) {
41         for i := 0; i < 1e5; i++ {
42                 x := word(rand.Uint32())
43                 if bitsPerWord == 64 {
44                         x = x | (word(rand.Uint32()) << 32)
45                 }
46                 want := dumbPopcount(x)
47                 got := popcount(x)
48                 if got != want {
49                         t.Errorf("popcount(%d) = %d, want %d", x, got, want)
50                 }
51         }
52 }
53
54 func BenchmarkPopcount(b *testing.B) {
55         for i := 0; i < b.N; i++ {
56                 popcount(word(i))
57         }
58 }