2018-05-07 Edward Smith-Rowland <3dw4rd@verizon.net>
[official-gcc.git] / libgo / go / bytes / compare_test.go
blob35088a1b2e9b26691a6f0a0bed6611e0bb6b563e
1 // Copyright 2013 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.
5 package bytes_test
7 import (
8 . "bytes"
9 "testing"
12 var compareTests = []struct {
13 a, b []byte
14 i int
16 {[]byte(""), []byte(""), 0},
17 {[]byte("a"), []byte(""), 1},
18 {[]byte(""), []byte("a"), -1},
19 {[]byte("abc"), []byte("abc"), 0},
20 {[]byte("abd"), []byte("abc"), 1},
21 {[]byte("abc"), []byte("abd"), -1},
22 {[]byte("ab"), []byte("abc"), -1},
23 {[]byte("abc"), []byte("ab"), 1},
24 {[]byte("x"), []byte("ab"), 1},
25 {[]byte("ab"), []byte("x"), -1},
26 {[]byte("x"), []byte("a"), 1},
27 {[]byte("b"), []byte("x"), -1},
28 // test runtime·memeq's chunked implementation
29 {[]byte("abcdefgh"), []byte("abcdefgh"), 0},
30 {[]byte("abcdefghi"), []byte("abcdefghi"), 0},
31 {[]byte("abcdefghi"), []byte("abcdefghj"), -1},
32 {[]byte("abcdefghj"), []byte("abcdefghi"), 1},
33 // nil tests
34 {nil, nil, 0},
35 {[]byte(""), nil, 0},
36 {nil, []byte(""), 0},
37 {[]byte("a"), nil, 1},
38 {nil, []byte("a"), -1},
41 func TestCompare(t *testing.T) {
42 for _, tt := range compareTests {
43 cmp := Compare(tt.a, tt.b)
44 if cmp != tt.i {
45 t.Errorf(`Compare(%q, %q) = %v`, tt.a, tt.b, cmp)
50 func TestCompareIdenticalSlice(t *testing.T) {
51 var b = []byte("Hello Gophers!")
52 if Compare(b, b) != 0 {
53 t.Error("b != b")
55 if Compare(b, b[:1]) != 1 {
56 t.Error("b > b[:1] failed")
60 func TestCompareBytes(t *testing.T) {
61 n := 128
62 a := make([]byte, n+1)
63 b := make([]byte, n+1)
64 for len := 0; len < 128; len++ {
65 // randomish but deterministic data. No 0 or 255.
66 for i := 0; i < len; i++ {
67 a[i] = byte(1 + 31*i%254)
68 b[i] = byte(1 + 31*i%254)
70 // data past the end is different
71 for i := len; i <= n; i++ {
72 a[i] = 8
73 b[i] = 9
75 cmp := Compare(a[:len], b[:len])
76 if cmp != 0 {
77 t.Errorf(`CompareIdentical(%d) = %d`, len, cmp)
79 if len > 0 {
80 cmp = Compare(a[:len-1], b[:len])
81 if cmp != -1 {
82 t.Errorf(`CompareAshorter(%d) = %d`, len, cmp)
84 cmp = Compare(a[:len], b[:len-1])
85 if cmp != 1 {
86 t.Errorf(`CompareBshorter(%d) = %d`, len, cmp)
89 for k := 0; k < len; k++ {
90 b[k] = a[k] - 1
91 cmp = Compare(a[:len], b[:len])
92 if cmp != 1 {
93 t.Errorf(`CompareAbigger(%d,%d) = %d`, len, k, cmp)
95 b[k] = a[k] + 1
96 cmp = Compare(a[:len], b[:len])
97 if cmp != -1 {
98 t.Errorf(`CompareBbigger(%d,%d) = %d`, len, k, cmp)
100 b[k] = a[k]
105 func BenchmarkCompareBytesEqual(b *testing.B) {
106 b1 := []byte("Hello Gophers!")
107 b2 := []byte("Hello Gophers!")
108 for i := 0; i < b.N; i++ {
109 if Compare(b1, b2) != 0 {
110 b.Fatal("b1 != b2")
115 func BenchmarkCompareBytesToNil(b *testing.B) {
116 b1 := []byte("Hello Gophers!")
117 var b2 []byte
118 for i := 0; i < b.N; i++ {
119 if Compare(b1, b2) != 1 {
120 b.Fatal("b1 > b2 failed")
125 func BenchmarkCompareBytesEmpty(b *testing.B) {
126 b1 := []byte("")
127 b2 := b1
128 for i := 0; i < b.N; i++ {
129 if Compare(b1, b2) != 0 {
130 b.Fatal("b1 != b2")
135 func BenchmarkCompareBytesIdentical(b *testing.B) {
136 b1 := []byte("Hello Gophers!")
137 b2 := b1
138 for i := 0; i < b.N; i++ {
139 if Compare(b1, b2) != 0 {
140 b.Fatal("b1 != b2")
145 func BenchmarkCompareBytesSameLength(b *testing.B) {
146 b1 := []byte("Hello Gophers!")
147 b2 := []byte("Hello, Gophers")
148 for i := 0; i < b.N; i++ {
149 if Compare(b1, b2) != -1 {
150 b.Fatal("b1 < b2 failed")
155 func BenchmarkCompareBytesDifferentLength(b *testing.B) {
156 b1 := []byte("Hello Gophers!")
157 b2 := []byte("Hello, Gophers!")
158 for i := 0; i < b.N; i++ {
159 if Compare(b1, b2) != -1 {
160 b.Fatal("b1 < b2 failed")
165 func BenchmarkCompareBytesBigUnaligned(b *testing.B) {
166 b.StopTimer()
167 b1 := make([]byte, 0, 1<<20)
168 for len(b1) < 1<<20 {
169 b1 = append(b1, "Hello Gophers!"...)
171 b2 := append([]byte("hello"), b1...)
172 b.StartTimer()
173 for i := 0; i < b.N; i++ {
174 if Compare(b1, b2[len("hello"):]) != 0 {
175 b.Fatal("b1 != b2")
178 b.SetBytes(int64(len(b1)))
181 func BenchmarkCompareBytesBig(b *testing.B) {
182 b.StopTimer()
183 b1 := make([]byte, 0, 1<<20)
184 for len(b1) < 1<<20 {
185 b1 = append(b1, "Hello Gophers!"...)
187 b2 := append([]byte{}, b1...)
188 b.StartTimer()
189 for i := 0; i < b.N; i++ {
190 if Compare(b1, b2) != 0 {
191 b.Fatal("b1 != b2")
194 b.SetBytes(int64(len(b1)))
197 func BenchmarkCompareBytesBigIdentical(b *testing.B) {
198 b.StopTimer()
199 b1 := make([]byte, 0, 1<<20)
200 for len(b1) < 1<<20 {
201 b1 = append(b1, "Hello Gophers!"...)
203 b2 := b1
204 b.StartTimer()
205 for i := 0; i < b.N; i++ {
206 if Compare(b1, b2) != 0 {
207 b.Fatal("b1 != b2")
210 b.SetBytes(int64(len(b1)))