| 1 | // Copyright 2014 The Go Authors. All rights reserved. |
|---|---|
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | // This file contains tests for some of the internal functions. |
| 6 | |
| 7 | package main |
| 8 | |
| 9 | import ( |
| 10 | "fmt" |
| 11 | "testing" |
| 12 | ) |
| 13 | |
| 14 | // Helpers to save typing in the test cases. |
| 15 | type u []uint64 |
| 16 | type uu [][]uint64 |
| 17 | |
| 18 | type SplitTest struct { |
| 19 | input u |
| 20 | output uu |
| 21 | signed bool |
| 22 | } |
| 23 | |
| 24 | var ( |
| 25 | m2 = uint64(2) |
| 26 | m1 = uint64(1) |
| 27 | m0 = uint64(0) |
| 28 | m_1 = ^uint64(0) // -1 when signed. |
| 29 | m_2 = ^uint64(0) - 1 // -2 when signed. |
| 30 | ) |
| 31 | |
| 32 | var splitTests = []SplitTest{ |
| 33 | // No need for a test for the empty case; that's picked off before splitIntoRuns. |
| 34 | // Single value. |
| 35 | {u{1}, uu{u{1}}, false}, |
| 36 | // Out of order. |
| 37 | {u{3, 2, 1}, uu{u{1, 2, 3}}, true}, |
| 38 | // Out of order. |
| 39 | {u{3, 2, 1}, uu{u{1, 2, 3}}, false}, |
| 40 | // A gap at the beginning. |
| 41 | {u{1, 33, 32, 31}, uu{u{1}, u{31, 32, 33}}, true}, |
| 42 | // A gap in the middle, in mixed order. |
| 43 | {u{33, 7, 32, 31, 9, 8}, uu{u{7, 8, 9}, u{31, 32, 33}}, true}, |
| 44 | // Gaps throughout |
| 45 | {u{33, 44, 1, 32, 45, 31}, uu{u{1}, u{31, 32, 33}, u{44, 45}}, true}, |
| 46 | // Unsigned values spanning 0. |
| 47 | {u{m1, m0, m_1, m2, m_2}, uu{u{m0, m1, m2}, u{m_2, m_1}}, false}, |
| 48 | // Signed values spanning 0 |
| 49 | {u{m1, m0, m_1, m2, m_2}, uu{u{m_2, m_1, m0, m1, m2}}, true}, |
| 50 | } |
| 51 | |
| 52 | func TestSplitIntoRuns(t *testing.T) { |
| 53 | Outer: |
| 54 | for n, test := range splitTests { |
| 55 | values := make([]Value, len(test.input)) |
| 56 | for i, v := range test.input { |
| 57 | values[i] = Value{"", "", v, test.signed, fmt.Sprint(v)} |
| 58 | } |
| 59 | runs := splitIntoRuns(values) |
| 60 | if len(runs) != len(test.output) { |
| 61 | t.Errorf("#%d: %v: got %d runs; expected %d", n, test.input, len(runs), len(test.output)) |
| 62 | continue |
| 63 | } |
| 64 | for i, run := range runs { |
| 65 | if len(run) != len(test.output[i]) { |
| 66 | t.Errorf("#%d: got %v; expected %v", n, runs, test.output) |
| 67 | continue Outer |
| 68 | } |
| 69 | for j, v := range run { |
| 70 | if v.value != test.output[i][j] { |
| 71 | t.Errorf("#%d: got %v; expected %v", n, runs, test.output) |
| 72 | continue Outer |
| 73 | } |
| 74 | } |
| 75 | } |
| 76 | } |
| 77 | } |
| 78 |
Members