github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/cmd/stringer/util_test.go (about) 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 }