2
0
mirror of synced 2025-02-24 14:48:27 +00:00
torrent/internal/pieceordering/pieceordering_test.go

79 lines
1.4 KiB
Go

package pieceordering
import (
"sort"
"testing"
)
func instanceSlice(i *Instance) (sl []int) {
for e := i.First(); e != nil; e = e.Next() {
sl = append(sl, e.Piece())
}
return
}
func sameContents(a, b []int) bool {
if len(a) != len(b) {
panic("y u pass different length slices")
}
sort.IntSlice(a).Sort()
sort.IntSlice(b).Sort()
for i := range a {
if a[i] != b[i] {
return false
}
}
return true
}
func checkOrder(t *testing.T, i *Instance, ppp ...[]int) {
fatal := func() {
t.Fatalf("have %v, expected %v", instanceSlice(i), ppp)
}
e := i.First()
for _, pp := range ppp {
var pp_ []int
for len(pp_) != len(pp) {
pp_ = append(pp_, e.Piece())
e = e.Next()
}
if !sameContents(pp, pp_) {
fatal()
}
}
if e != nil {
fatal()
}
}
func TestPieceOrdering(t *testing.T) {
i := New()
i.SetPiece(0, 1)
i.SetPiece(1, 0)
checkOrder(t, i, []int{1, 0})
i.SetPiece(1, 2)
checkOrder(t, i, []int{0, 1})
i.DeletePiece(1)
checkOrder(t, i, []int{0})
i.DeletePiece(2)
i.DeletePiece(1)
checkOrder(t, i, []int{0})
i.DeletePiece(0)
checkOrder(t, i, nil)
i.SetPiece(2, 1)
i.SetPiece(1, 1)
i.SetPiece(3, 1)
checkOrder(t, i, []int{3, 1, 2})
// Move a piece that isn't the youngest in a key.
i.SetPiece(1, -1)
checkOrder(t, i, []int{1}, []int{3, 2})
i.DeletePiece(2)
i.DeletePiece(3)
i.DeletePiece(1)
checkOrder(t, i, nil)
i.DeletePiece(2)
i.DeletePiece(3)
i.DeletePiece(1)
checkOrder(t, i, nil)
}