| // 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 | |
| } | |
| } | |
| } | |
| } | |
| } |