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