]> Sergey Matveev's repositories - btrtrc.git/blob - internal/pieceordering/pieceordering_test.go
It's working and the tests are usually passing
[btrtrc.git] / internal / pieceordering / pieceordering_test.go
1 package pieceordering
2
3 import (
4         "sort"
5         "testing"
6
7         "github.com/bradfitz/iter"
8         "github.com/stretchr/testify/assert"
9 )
10
11 func instanceSlice(i *Instance) (sl []int) {
12         for e := i.First(); e != nil; e = e.Next() {
13                 sl = append(sl, e.Piece())
14         }
15         return
16 }
17
18 func sameContents(a, b []int) bool {
19         if len(a) != len(b) {
20                 panic("y u pass different length slices")
21         }
22         sort.IntSlice(a).Sort()
23         sort.IntSlice(b).Sort()
24         for i := range a {
25                 if a[i] != b[i] {
26                         return false
27                 }
28         }
29         return true
30 }
31
32 func checkOrder(t testing.TB, i *Instance, ppp ...[]int) {
33         fatal := func() {
34                 t.Fatalf("have %v, expected %v", instanceSlice(i), ppp)
35         }
36         e := i.First()
37         for _, pp := range ppp {
38                 var pp_ []int
39                 for len(pp_) != len(pp) {
40                         pp_ = append(pp_, e.Piece())
41                         e = e.Next()
42                 }
43                 if !sameContents(pp, pp_) {
44                         fatal()
45                 }
46         }
47         if e != nil {
48                 fatal()
49         }
50 }
51
52 func testPieceOrdering(t testing.TB) {
53         i := New()
54         assert.True(t, i.Empty())
55         i.SetPiece(0, 1)
56         assert.False(t, i.Empty())
57         i.SetPiece(1, 0)
58         checkOrder(t, i, []int{1, 0})
59         i.SetPiece(1, 2)
60         checkOrder(t, i, []int{0, 1})
61         i.DeletePiece(1)
62         checkOrder(t, i, []int{0})
63         i.DeletePiece(2)
64         i.DeletePiece(1)
65         checkOrder(t, i, []int{0})
66         i.DeletePiece(0)
67         assert.True(t, i.Empty())
68         checkOrder(t, i, nil)
69         i.SetPiece(2, 1)
70         assert.False(t, i.Empty())
71         i.SetPiece(1, 1)
72         i.SetPiece(3, 1)
73         checkOrder(t, i, []int{3, 1, 2})
74         // Move a piece that isn't the youngest in a key.
75         i.SetPiece(1, -1)
76         checkOrder(t, i, []int{1}, []int{3, 2})
77         i.DeletePiece(2)
78         i.DeletePiece(3)
79         i.DeletePiece(1)
80         assert.True(t, i.Empty())
81         checkOrder(t, i, nil)
82         // Deleting pieces that aren't present.
83         i.DeletePiece(2)
84         i.DeletePiece(3)
85         i.DeletePiece(1)
86         assert.True(t, i.Empty())
87         checkOrder(t, i, nil)
88 }
89
90 func TestPieceOrdering(t *testing.T) {
91         testPieceOrdering(t)
92 }
93
94 func BenchmarkPieceOrdering(b *testing.B) {
95         for range iter.N(b.N) {
96                 testPieceOrdering(b)
97         }
98 }
99
100 func BenchmarkIteration(b *testing.B) {
101         for range iter.N(b.N) {
102                 i := New()
103                 for p := range iter.N(500) {
104                         i.SetPiece(p, p)
105                 }
106                 for e := i.First(); e != nil; e = e.Next() {
107                 }
108         }
109 }