// Copyright 2009 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. package sort import ( "fmt"; "rand"; "strconv"; "testing"; ) var ints = [...]int{74, 59, 238, -784, 9845, 959, 905, 0, 0, 42, 7586, -5467984, 7586} var floats = [...]float{74.3, 59.0, 238.2, -784.0, 2.3, 9845.768, -959.7485, 905, 7.8, 7.8} var strings = [...]string{"", "Hello", "foo", "bar", "foo", "f00", "%*&^*&^&", "***"} func TestSortIntArray(t *testing.T) { data := ints; a := IntArray(&data); Sort(a); if !IsSorted(a) { t.Errorf("sorted %v", ints); t.Errorf(" got %v", data); } } func TestSortFloatArray(t *testing.T) { data := floats; a := FloatArray(&data); Sort(a); if !IsSorted(a) { t.Errorf("sorted %v", floats); t.Errorf(" got %v", data); } } func TestSortStringArray(t *testing.T) { data := strings; a := StringArray(&data); Sort(a); if !IsSorted(a) { t.Errorf("sorted %v", strings); t.Errorf(" got %v", data); } } func TestSortInts(t *testing.T) { data := ints; SortInts(&data); if !IntsAreSorted(&data) { t.Errorf("sorted %v", ints); t.Errorf(" got %v", data); } } func TestSortFloats(t *testing.T) { data := floats; SortFloats(&data); if !FloatsAreSorted(&data) { t.Errorf("sorted %v", floats); t.Errorf(" got %v", data); } } func TestSortStrings(t *testing.T) { data := strings; SortStrings(&data); if !StringsAreSorted(&data) { t.Errorf("sorted %v", strings); t.Errorf(" got %v", data); } } func TestSortLarge_Random(t *testing.T) { data := make([]int, 1000000); for i := 0; i < len(data); i++ { data[i] = rand.Intn(100) } if IntsAreSorted(data) { t.Fatalf("terrible rand.rand") } SortInts(data); if !IntsAreSorted(data) { t.Errorf("sort didn't sort - 1M ints") } } func BenchmarkSortString1K(b *testing.B) { b.StopTimer(); for i := 0; i < b.N; i++ { data := make([]string, 1<<10); for i := 0; i < len(data); i++ { data[i] = strconv.Itoa(i ^ 0x2cc) } b.StartTimer(); SortStrings(data); b.StopTimer(); } } func BenchmarkSortInt1K(b *testing.B) { b.StopTimer(); for i := 0; i < b.N; i++ { data := make([]int, 1<<10); for i := 0; i < len(data); i++ { data[i] = i ^ 0x2cc } b.StartTimer(); SortInts(data); b.StopTimer(); } } func BenchmarkSortInt64K(b *testing.B) { b.StopTimer(); for i := 0; i < b.N; i++ { data := make([]int, 1<<16); for i := 0; i < len(data); i++ { data[i] = i ^ 0xcccc } b.StartTimer(); SortInts(data); b.StopTimer(); } } const ( _Sawtooth = iota; _Rand; _Stagger; _Plateau; _Shuffle; _NDist; ) const ( _Copy = iota; _Reverse; _ReverseFirstHalf; _ReverseSecondHalf; _Sorted; _Dither; _NMode; ) type testingData struct { desc string; t *testing.T; data []int; maxswap int; // number of swaps allowed nswap int; } func (d *testingData) Len() int { return len(d.data) } func (d *testingData) Less(i, j int) bool { return d.data[i] < d.data[j] } func (d *testingData) Swap(i, j int) { if d.nswap >= d.maxswap { d.t.Errorf("%s: used %d swaps sorting array of %d", d.desc, d.nswap, len(d.data)); d.t.FailNow(); } d.nswap++; d.data[i], d.data[j] = d.data[j], d.data[i]; } func lg(n int) int { i := 0; for 1<