--- /dev/null
+// Copyright 2014 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains tests for some of the internal functions.
+
+package main
+
+import (
+ "fmt"
+ "testing"
+)
+
+// Helpers to save typing in the test cases.
+type u []uint64
+type uu [][]uint64
+
+type SplitTest struct {
+ input u
+ output uu
+ signed bool
+}
+
+var (
+ m2 = uint64(2)
+ m1 = uint64(1)
+ m0 = uint64(0)
+ m_1 = ^uint64(0) // -1 when signed.
+ m_2 = ^uint64(0) - 1 // -2 when signed.
+)
+
+var splitTests = []SplitTest{
+ // No need for a test for the empty case; that's picked off before splitIntoRuns.
+ // Single value.
+ {u{1}, uu{u{1}}, false},
+ // Out of order.
+ {u{3, 2, 1}, uu{u{1, 2, 3}}, true},
+ // Out of order.
+ {u{3, 2, 1}, uu{u{1, 2, 3}}, false},
+ // A gap at the beginning.
+ {u{1, 33, 32, 31}, uu{u{1}, u{31, 32, 33}}, true},
+ // A gap in the middle, in mixed order.
+ {u{33, 7, 32, 31, 9, 8}, uu{u{7, 8, 9}, u{31, 32, 33}}, true},
+ // Gaps throughout
+ {u{33, 44, 1, 32, 45, 31}, uu{u{1}, u{31, 32, 33}, u{44, 45}}, true},
+ // Unsigned values spanning 0.
+ {u{m1, m0, m_1, m2, m_2}, uu{u{m0, m1, m2}, u{m_2, m_1}}, false},
+ // Signed values spanning 0
+ {u{m1, m0, m_1, m2, m_2}, uu{u{m_2, m_1, m0, m1, m2}}, true},
+}
+
+func TestSplitIntoRuns(t *testing.T) {
+Outer:
+ for n, test := range splitTests {
+ values := make([]Value, len(test.input))
+ for i, v := range test.input {
+ values[i] = Value{"", "", v, test.signed, fmt.Sprint(v)}
+ }
+ runs := splitIntoRuns(values)
+ if len(runs) != len(test.output) {
+ t.Errorf("#%d: %v: got %d runs; expected %d", n, test.input, len(runs), len(test.output))
+ continue
+ }
+ for i, run := range runs {
+ if len(run) != len(test.output[i]) {
+ t.Errorf("#%d: got %v; expected %v", n, runs, test.output)
+ continue Outer
+ }
+ for j, v := range run {
+ if v.value != test.output[i][j] {
+ t.Errorf("#%d: got %v; expected %v", n, runs, test.output)
+ continue Outer
+ }
+ }
+ }
+ }
+}