summaryrefslogtreecommitdiff
path: root/satp/sequence-window_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'satp/sequence-window_test.go')
-rw-r--r--satp/sequence-window_test.go100
1 files changed, 92 insertions, 8 deletions
diff --git a/satp/sequence-window_test.go b/satp/sequence-window_test.go
index 2f38a23..097cacd 100644
--- a/satp/sequence-window_test.go
+++ b/satp/sequence-window_test.go
@@ -34,6 +34,47 @@ import (
"testing"
)
+func TestSequenceWindowDistance(t *testing.T) {
+ testvectors := []struct {
+ top uint32
+ seq uint32
+ less bool
+ distance uint32
+ }{
+ {0, 0, false, 0},
+ {1, 0, true, 1},
+ {1, 1, false, 0},
+ {10, 0, true, 10},
+ {0, 1, false, 1},
+ {0, 10, false, 10},
+ {10, 10, false, 0},
+ {10, 11, false, 1},
+ {10, 12, false, 2},
+ {0, ^uint32(0), true, 1},
+ {10, ^uint32(0), true, 11},
+ {^uint32(0), ^uint32(0), false, 0},
+ {^uint32(0), 0, false, 1},
+ {((^uint32(0)) / 2) - 1, 0, true, 2147483646},
+ {((^uint32(0)) / 2), 0, true, 2147483647},
+ {((^uint32(0)) / 2) + 1, 0, true, 2147483648},
+ {((^uint32(0)) / 2) + 1, 1, true, 2147483647},
+ {((^uint32(0)) / 2) + 1, 18, true, 2147483630},
+ {((^uint32(0)) / 2) + 1, ^uint32(0), false, 2147483647},
+ {((^uint32(0)) / 2) + 2, 0, false, 2147483647},
+ }
+
+ for _, vector := range testvectors {
+ less, distance := seqDistance(vector.top, vector.seq)
+ if less != vector.less {
+ t.Fatalf("top=%d > seq=%d is %v but should be %v", vector.top, vector.seq, less, vector.less)
+ }
+
+ if distance != vector.distance {
+ t.Fatalf("distance between top=%d and seq=%d is %d but should be %d", vector.top, vector.seq, distance, vector.distance)
+ }
+ }
+}
+
func TestSequenceWindowNew(t *testing.T) {
testvectors := []struct {
size int
@@ -56,14 +97,16 @@ func TestSequenceWindowNew(t *testing.T) {
{63, 0, 0, 2, true},
{64, 0, 0, 2, true},
{65, 0, 0, 3, true},
- {100, 0, 0, 4, true},
- {100, 0xFFFF0000, 0xFFFF000000000000, 4, true},
- {100, 0xFFFF0001, 0xFFFF000100000001, 4, true},
- {100, 0xFFFF0002, 0xFFFF000200000003, 4, true},
- {100, 0xFFFF0003, 0xFFFF000300000007, 4, true},
- {100, 0xFFFF0004, 0xFFFF00040000000F, 4, true},
- {100, 0xFFFF0005, 0xFFFF00050000001F, 4, true},
- {100, 0xAAAA5555, 0xAAAA5555001FFFFF, 4, true},
+ {80, 0, 0, 3, true},
+ {80, 0xFFFF0000, 0xFFFF000000000000, 3, true},
+ {80, 0xFFFF0001, 0xFFFF000100000001, 3, true},
+ {80, 0xFFFF0002, 0xFFFF000200000003, 3, true},
+ {80, 0xFFFF0003, 0xFFFF000300000007, 3, true},
+ {80, 0xFFFF0004, 0xFFFF00040000000F, 3, true},
+ {80, 0xFFFF0005, 0xFFFF00050000001F, 3, true},
+ {80, 0xAAAA5555, 0xAAAA5555001FFFFF, 3, true},
+ {96, 0, 0, 3, true},
+ {97, 0, 0, 4, true},
}
for _, vector := range testvectors {
@@ -100,5 +143,46 @@ func TestSequenceWindowNew(t *testing.T) {
}
}
}
+}
+
+func TestSequenceWindowCheck(t *testing.T) {
+ testvectors := []struct {
+ size int
+ top uint32
+ seq uint32
+ result bool
+ }{
+ {0, 0, 0, true},
+ {0, 0, ^uint32(0), true},
+ {0, 17, 12, true},
+ {10, 17, 12, false},
+ {10, 17, 17, true},
+ {10, 17, 18, true},
+ {10, 0, ^uint32(0), false},
+ {32, 0, 0, true},
+ {32, 0, 12, true},
+ {32, 13, 12, false},
+ {32, 100, 12, false},
+ {32, 33, 12, false},
+ {32, 33, 32, false},
+ {64, 36, 0, false},
+ {64, 36, 12, false},
+ {64, 36, ^uint32(0), false},
+ {64, 100, ^uint32(0), false},
+ {64, 100, 96, false},
+ {64, 100, 95, false},
+ {64, 100, 63, false},
+ {64, 100, 110, true},
+ }
+ for _, vector := range testvectors {
+ w, err := NewSequenceWindow(vector.size, vector.top)
+ if err != nil {
+ t.Fatal("unexpected error:", err)
+ }
+ result := w.Check(vector.seq)
+ if result != vector.result {
+ t.Fatalf("checking %d against %s returned %v but should be %v", vector.seq, w, result, vector.result)
+ }
+ }
}