]> Sergey Matveev's repositories - btrtrc.git/blob - internal/pieceordering/pieceordering_test.go
b2b19e11497bf4f823beec332386aefbe25fdea1
[btrtrc.git] / internal / pieceordering / pieceordering_test.go
1 package pieceordering
2
3 import (
4         "sort"
5         "testing"
6 )
7
8 func instanceSlice(i *Instance) (sl []int) {
9         for e := i.First(); e != nil; e = e.Next() {
10                 sl = append(sl, e.Piece())
11         }
12         return
13 }
14
15 func sameContents(a, b []int) bool {
16         if len(a) != len(b) {
17                 panic("y u pass different length slices")
18         }
19         sort.IntSlice(a).Sort()
20         sort.IntSlice(b).Sort()
21         for i := range a {
22                 if a[i] != b[i] {
23                         return false
24                 }
25         }
26         return true
27 }
28
29 func checkOrder(t *testing.T, i *Instance, ppp ...[]int) {
30         fatal := func() {
31                 t.Fatalf("have %v, expected %v", instanceSlice(i), ppp)
32         }
33         e := i.First()
34         for _, pp := range ppp {
35                 var pp_ []int
36                 for len(pp_) != len(pp) {
37                         pp_ = append(pp_, e.Piece())
38                         e = e.Next()
39                 }
40                 if !sameContents(pp, pp_) {
41                         fatal()
42                 }
43         }
44         if e != nil {
45                 fatal()
46         }
47 }
48
49 func TestPieceOrdering(t *testing.T) {
50         i := New()
51         i.SetPiece(0, 1)
52         i.SetPiece(1, 0)
53         checkOrder(t, i, []int{1, 0})
54         i.SetPiece(1, 2)
55         checkOrder(t, i, []int{0, 1})
56         i.DeletePiece(1)
57         checkOrder(t, i, []int{0})
58         i.DeletePiece(2)
59         i.DeletePiece(1)
60         checkOrder(t, i, []int{0})
61         i.DeletePiece(0)
62         checkOrder(t, i, nil)
63         i.SetPiece(2, 1)
64         i.SetPiece(1, 1)
65         i.SetPiece(3, 1)
66         checkOrder(t, i, []int{3, 1, 2})
67         // Move a piece that isn't the youngest in a key.
68         i.SetPiece(1, -1)
69         checkOrder(t, i, []int{1}, []int{3, 2})
70         i.DeletePiece(2)
71         i.DeletePiece(3)
72         i.DeletePiece(1)
73         checkOrder(t, i, nil)
74         i.DeletePiece(2)
75         i.DeletePiece(3)
76         i.DeletePiece(1)
77         checkOrder(t, i, nil)
78 }