Home | History | Annotate | Download | only in bytes
      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.
      4 
      5 package bytes_test
      6 
      7 import (
      8 	. "bytes"
      9 	"testing"
     10 )
     11 
     12 var compareTests = []struct {
     13 	a, b []byte
     14 	i    int
     15 }{
     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 runtimememeq'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},
     39 }
     40 
     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)
     46 		}
     47 	}
     48 }
     49 
     50 func TestCompareIdenticalSlice(t *testing.T) {
     51 	var b = []byte("Hello Gophers!")
     52 	if Compare(b, b) != 0 {
     53 		t.Error("b != b")
     54 	}
     55 	if Compare(b, b[:1]) != 1 {
     56 		t.Error("b > b[:1] failed")
     57 	}
     58 }
     59 
     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)
     69 		}
     70 		// data past the end is different
     71 		for i := len; i <= n; i++ {
     72 			a[i] = 8
     73 			b[i] = 9
     74 		}
     75 		cmp := Compare(a[:len], b[:len])
     76 		if cmp != 0 {
     77 			t.Errorf(`CompareIdentical(%d) = %d`, len, cmp)
     78 		}
     79 		if len > 0 {
     80 			cmp = Compare(a[:len-1], b[:len])
     81 			if cmp != -1 {
     82 				t.Errorf(`CompareAshorter(%d) = %d`, len, cmp)
     83 			}
     84 			cmp = Compare(a[:len], b[:len-1])
     85 			if cmp != 1 {
     86 				t.Errorf(`CompareBshorter(%d) = %d`, len, cmp)
     87 			}
     88 		}
     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)
     94 			}
     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)
     99 			}
    100 			b[k] = a[k]
    101 		}
    102 	}
    103 }
    104 
    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")
    111 		}
    112 	}
    113 }
    114 
    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")
    121 		}
    122 	}
    123 }
    124 
    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")
    131 		}
    132 	}
    133 }
    134 
    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")
    141 		}
    142 	}
    143 }
    144 
    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")
    151 		}
    152 	}
    153 }
    154 
    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")
    161 		}
    162 	}
    163 }
    164 
    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!"...)
    170 	}
    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")
    176 		}
    177 	}
    178 	b.SetBytes(int64(len(b1)))
    179 }
    180 
    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!"...)
    186 	}
    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")
    192 		}
    193 	}
    194 	b.SetBytes(int64(len(b1)))
    195 }
    196 
    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!"...)
    202 	}
    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")
    208 		}
    209 	}
    210 	b.SetBytes(int64(len(b1)))
    211 }
    212