1package junk
2
3import (
4 "fmt"
5 "testing"
6
7 "github.com/mjl-/mox/mlog"
8)
9
10func TestBloom(t *testing.T) {
11 if err := BloomValid(3, 10); err == nil {
12 t.Fatalf("missing error for invalid bloom filter size")
13 }
14
15 log := mlog.New("junk", nil)
16 _, err := NewBloom(log, make([]byte, 3), 10)
17 if err == nil {
18 t.Fatalf("missing error for invalid bloom filter size")
19 }
20
21 b, err := NewBloom(log, make([]byte, 256), 5)
22 if err != nil {
23 t.Fatalf("newbloom: %s", err)
24 }
25
26 absent := func(v string) {
27 t.Helper()
28 if b.Has(v) {
29 t.Fatalf("should be absent: %q", v)
30 }
31 }
32
33 present := func(v string) {
34 t.Helper()
35 if !b.Has(v) {
36 t.Fatalf("should be present: %q", v)
37 }
38 }
39
40 absent("test")
41 if b.Modified() {
42 t.Fatalf("bloom filter already modified?")
43 }
44 b.Add("test")
45 present("test")
46 present("test")
47 words := []string{}
48 for i := 'a'; i <= 'z'; i++ {
49 words = append(words, fmt.Sprintf("%c", i))
50 }
51 for _, w := range words {
52 absent(w)
53 b.Add(w)
54 present(w)
55 }
56 for _, w := range words {
57 present(w)
58 }
59 if !b.Modified() {
60 t.Fatalf("bloom filter was not modified?")
61 }
62
63 //log.Infof("ones: %d, m %d", b.Ones(), len(b.Bytes())*8)
64}
65
66func TestBits(t *testing.T) {
67 b := &bits{width: 1, buf: []byte{0xff, 0xff}}
68 for range 16 {
69 if b.nextPos() != 1 {
70 t.Fatalf("pos not 1")
71 }
72 }
73 b = &bits{width: 2, buf: []byte{0xff, 0xff}}
74 for range 8 {
75 if b.nextPos() != 0b11 {
76 t.Fatalf("pos not 0b11")
77 }
78 }
79
80 b = &bits{width: 1, buf: []byte{0b10101010, 0b10101010}}
81 for i := range 16 {
82 if b.nextPos() != ((i + 1) % 2) {
83 t.Fatalf("bad pos")
84 }
85 }
86 b = &bits{width: 2, buf: []byte{0b10101010, 0b10101010}}
87 for range 8 {
88 if b.nextPos() != 0b10 {
89 t.Fatalf("pos not 0b10")
90 }
91 }
92}
93
94func TestSet(t *testing.T) {
95 b := &Bloom{
96 data: []byte{
97 0b10101010,
98 0b00000000,
99 0b11111111,
100 0b01010101,
101 },
102 }
103 for i := range 8 {
104 v := b.has(i)
105 if v != (i%2 == 0) {
106 t.Fatalf("bad has")
107 }
108 }
109 for i := 8; i < 16; i++ {
110 if b.has(i) {
111 t.Fatalf("bad has")
112 }
113 }
114 for i := 16; i < 24; i++ {
115 if !b.has(i) {
116 t.Fatalf("bad has")
117 }
118 }
119 for i := 24; i < 32; i++ {
120 v := b.has(i)
121 if v != (i%2 != 0) {
122 t.Fatalf("bad has")
123 }
124 }
125}
126
127func TestOnes(t *testing.T) {
128 ones := func(b *Bloom, x int) {
129 t.Helper()
130 n := b.Ones()
131 if n != x {
132 t.Fatalf("ones: got %d, expected %d", n, x)
133 }
134 }
135 ones(&Bloom{data: []byte{0b10101010}}, 4)
136 ones(&Bloom{data: []byte{0b01010101}}, 4)
137 ones(&Bloom{data: []byte{0b11111111}}, 8)
138 ones(&Bloom{data: []byte{0b00000000}}, 0)
139}
140