Skip to content

Commit cd91cc9

Browse files
committed
tests
1 parent 866993e commit cd91cc9

File tree

3 files changed

+94
-74
lines changed

3 files changed

+94
-74
lines changed

fuzz_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package interval_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/gaissmai/interval"
7+
)
8+
9+
func FuzzLCPandSCP(f *testing.F) {
10+
ivals := genUintIvals(100_000)
11+
tree := interval.NewTree(cmpUintInterval, ivals...)
12+
13+
for i := 0; i < 100; i++ {
14+
probe := genUintIvals(1)[0]
15+
a := probe[0]
16+
b := probe[1]
17+
f.Add(a, b)
18+
}
19+
20+
f.Fuzz(func(t *testing.T, a, b uint) {
21+
probe := makeUintIval(a, b)
22+
23+
_, okLCP := tree.CoverLCP(probe)
24+
_, okSCP := tree.CoverSCP(probe)
25+
26+
if okLCP != okSCP {
27+
// okLCP and okSCP must be both true or both false
28+
t.Fatalf("CoverLCP(%v) and CoverSCP(%v) mismatch", probe, probe)
29+
}
30+
})
31+
}
32+
33+
func FuzzIntersects(f *testing.F) {
34+
ivals := genUintIvals(10_000)
35+
tree := interval.NewTree(cmpUintInterval, ivals...)
36+
37+
for i := 0; i < 10; i++ {
38+
a := ivals[i][0]
39+
b := ivals[i][1]
40+
f.Add(a, b)
41+
}
42+
43+
f.Fuzz(func(t *testing.T, a, b uint) {
44+
probe := makeUintIval(a, b)
45+
46+
gotBool := tree.Intersects(probe)
47+
gotSlice := tree.Intersections(probe)
48+
49+
if gotBool && gotSlice == nil || !gotBool && gotSlice != nil {
50+
t.Fatalf("Intersects(%v) and Intersections(%v) mismatch", probe, probe)
51+
}
52+
})
53+
}

treap.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,8 +380,7 @@ func (t *Tree[T]) lcp(n *node[T], item T) (result T, ok bool) {
380380
}
381381

382382
// LCP => right backtracking
383-
result, ok = t.lcp(n.right, item)
384-
if ok {
383+
if result, ok = t.lcp(n.right, item); ok {
385384
return result, ok
386385
}
387386

treap_test.go

Lines changed: 40 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func makeUintIval(a, b uint) uintInterval {
3333
return uintInterval{a, b}
3434
}
3535

36-
// random test data
36+
// random test data, end is random to start
3737
func genUintIvals(n int) []uintInterval {
3838
is := make([]uintInterval, n)
3939
for i := 0; i < n; i++ {
@@ -44,7 +44,7 @@ func genUintIvals(n int) []uintInterval {
4444
return is
4545
}
4646

47-
// random test data
47+
// random test data, end depends on start
4848
func gen2UintIvals(n int) []uintInterval {
4949
is := make([]uintInterval, n)
5050
for i := 0; i < n; i++ {
@@ -266,14 +266,18 @@ func TestFind(t *testing.T) {
266266
tree1 := interval.NewTree(cmpUintInterval, ivals...)
267267

268268
for _, ival := range ivals {
269-
item, ok := tree1.Find(ival)
270-
if ok != true {
271-
t.Errorf("Find(%v) = %v, want %v", item, ok, true)
272-
}
273-
ll, rr, _, _ := cmpUintInterval(item, ival)
274-
if ll != 0 || rr != 0 {
275-
t.Errorf("Find(%v) = %v, want %v", ival, item, ival)
276-
}
269+
ival := ival
270+
t.Run(ival.String(), func(t *testing.T) {
271+
t.Parallel()
272+
item, ok := tree1.Find(ival)
273+
if ok != true {
274+
t.Errorf("Find(%v) = %v, want %v", item, ok, true)
275+
}
276+
ll, rr, _, _ := cmpUintInterval(item, ival)
277+
if ll != 0 || rr != 0 {
278+
t.Errorf("Find(%v) = %v, want %v", ival, item, ival)
279+
}
280+
})
277281
}
278282
}
279283

@@ -293,7 +297,7 @@ func TestCoverLCP(t *testing.T) {
293297
// │ └─ 6...7
294298
// └─ 7...9
295299

296-
tcs := []struct {
300+
testcases := []struct {
297301
in uintInterval
298302
want uintInterval
299303
wantOK bool
@@ -325,10 +329,12 @@ func TestCoverLCP(t *testing.T) {
325329
// bring some variance into the Treap due to the prio randomness
326330
tree1 := interval.NewTree(cmpUintInterval, ps...)
327331

328-
for _, tt := range tcs {
332+
for _, tc := range testcases {
333+
tc := tc // capture range variable
329334
t.Run("", func(t *testing.T) {
330-
if got, ok := tree1.CoverLCP(tt.in); got != tt.want || ok != tt.wantOK {
331-
t.Errorf("CoverLCP(%v) = (%v, %v) want (%v, %v)", tt.in, got, ok, tt.want, tt.wantOK)
335+
t.Parallel()
336+
if got, ok := tree1.CoverLCP(tc.in); got != tc.want || ok != tc.wantOK {
337+
t.Errorf("CoverLCP(%v) = (%v, %v) want (%v, %v)", tc.in, got, ok, tc.want, tc.wantOK)
332338
}
333339
})
334340
}
@@ -351,7 +357,7 @@ func TestCoverSCP(t *testing.T) {
351357
// │ └─ 6...7
352358
// └─ 7...9
353359

354-
tcs := []struct {
360+
testcases := []struct {
355361
in uintInterval
356362
want uintInterval
357363
wantOK bool
@@ -418,10 +424,12 @@ func TestCoverSCP(t *testing.T) {
418424
// bring some variance into the Treap due to the prio randomness
419425
tree1 := interval.NewTree(cmpUintInterval, ps...)
420426

421-
for _, tt := range tcs {
427+
for _, tc := range testcases {
428+
tc := tc
422429
t.Run("", func(t *testing.T) {
423-
if got, ok := tree1.CoverSCP(tt.in); got != tt.want || ok != tt.wantOK {
424-
t.Errorf("CoverSCP(%v) = (%v, %v) want (%v, %v)", tt.in, got, ok, tt.want, tt.wantOK)
430+
t.Parallel()
431+
if got, ok := tree1.CoverSCP(tc.in); got != tc.want || ok != tc.wantOK {
432+
t.Errorf("CoverSCP(%v) = (%v, %v) want (%v, %v)", tc.in, got, ok, tc.want, tc.wantOK)
425433
}
426434
})
427435
}
@@ -538,7 +546,7 @@ func TestIntersects(t *testing.T) {
538546
// │ └─ 6...7
539547
// └─ 7...9
540548

541-
tcs := []struct {
549+
testcases := []struct {
542550
in uintInterval
543551
want bool
544552
}{
@@ -563,61 +571,17 @@ func TestIntersects(t *testing.T) {
563571
want: false,
564572
},
565573
}
566-
for _, tt := range tcs {
574+
for _, tc := range testcases {
575+
tc := tc
567576
t.Run("", func(t *testing.T) {
568-
if ok := tree1.Intersects(tt.in); ok != tt.want {
569-
t.Errorf("Intersects(%v) = %v, want: %v", tt.in, ok, tt.want)
577+
t.Parallel()
578+
if ok := tree1.Intersects(tc.in); ok != tc.want {
579+
t.Errorf("Intersects(%v) = %v, want: %v", tc.in, ok, tc.want)
570580
}
571581
})
572582
}
573583
}
574584

575-
func FuzzLCPandSCP(f *testing.F) {
576-
ivals := genUintIvals(100_000)
577-
tree := interval.NewTree(cmpUintInterval, ivals...)
578-
579-
for i := 0; i < 100; i++ {
580-
probe := genUintIvals(1)[0]
581-
a := probe[0]
582-
b := probe[1]
583-
f.Add(a, b)
584-
}
585-
586-
f.Fuzz(func(t *testing.T, a, b uint) {
587-
probe := makeUintIval(a, b)
588-
589-
_, okLCP := tree.CoverLCP(probe)
590-
_, okSCP := tree.CoverSCP(probe)
591-
592-
if okLCP != okSCP {
593-
// okLCP and okSCP must be both true or both false
594-
t.Fatalf("CoverLCP(%v) and CoverSCP(%v) mismatch", probe, probe)
595-
}
596-
})
597-
}
598-
599-
func FuzzIntersects(f *testing.F) {
600-
ivals := genUintIvals(10_000)
601-
tree := interval.NewTree(cmpUintInterval, ivals...)
602-
603-
for i := 0; i < 10; i++ {
604-
a := ivals[i][0]
605-
b := ivals[i][1]
606-
f.Add(a, b)
607-
}
608-
609-
f.Fuzz(func(t *testing.T, a, b uint) {
610-
probe := makeUintIval(a, b)
611-
612-
gotBool := tree.Intersects(probe)
613-
gotSlice := tree.Intersections(probe)
614-
615-
if gotBool && gotSlice == nil || !gotBool && gotSlice != nil {
616-
t.Fatalf("Intersects(%v) and Intersections(%v) mismatch", probe, probe)
617-
}
618-
})
619-
}
620-
621585
func TestIntersections(t *testing.T) {
622586
t.Parallel()
623587

@@ -888,8 +852,10 @@ func TestStatistics(t *testing.T) {
888852
t.Parallel()
889853

890854
for n := 10_000; n <= 1_000_000; n *= 10 {
855+
n := n
891856
count := strconv.Itoa(n)
892857
t.Run(count, func(t *testing.T) {
858+
t.Parallel()
893859
tree1 := interval.NewTree(cmpUintInterval, genUintIvals(n)...)
894860

895861
size, _, averageDepth, deviation := tree1.Statistics()
@@ -928,13 +894,14 @@ func TestPrintBST(t *testing.T) {
928894

929895
func TestMatch(t *testing.T) {
930896
t.Parallel()
931-
tree1 := interval.NewTree(cmpUintInterval, genUintIvals(100_000)...)
897+
tree1 := interval.NewTree(cmpUintInterval, genUintIvals(10_000)...)
932898

933899
n := 100
934900
for i := 0; i < n; i++ {
935-
probe := genUintIvals(100_000)[0]
901+
probe := genUintIvals(10_000)[0]
936902

937903
t.Run(probe.String(), func(t *testing.T) {
904+
t.Parallel()
938905
tree1 := tree1.Insert(probe)
939906

940907
if _, ok := tree1.Find(probe); !ok {
@@ -979,13 +946,14 @@ func TestMatch(t *testing.T) {
979946

980947
func TestMissing(t *testing.T) {
981948
t.Parallel()
982-
tree1 := interval.NewTree(cmpUintInterval, genUintIvals(100_000)...)
949+
tree1 := interval.NewTree(cmpUintInterval, genUintIvals(10_000)...)
983950

984951
n := 100
985952
for i := 0; i < n; i++ {
986-
probe := genUintIvals(100_000)[0]
953+
probe := genUintIvals(1)[0]
987954

988955
t.Run(probe.String(), func(t *testing.T) {
956+
t.Parallel()
989957
tree1 := tree1.Insert(probe)
990958
var ok bool
991959

0 commit comments

Comments
 (0)