| | |
| | |
| | |
| |
|
| | package strings_test |
| |
|
| | |
| | |
| |
|
| | import ( |
| | "internal/testenv" |
| | . "strings" |
| | "testing" |
| | "unsafe" |
| | ) |
| |
|
| | var compareTests = []struct { |
| | a, b string |
| | i int |
| | }{ |
| | {"", "", 0}, |
| | {"a", "", 1}, |
| | {"", "a", -1}, |
| | {"abc", "abc", 0}, |
| | {"ab", "abc", -1}, |
| | {"abc", "ab", 1}, |
| | {"x", "ab", 1}, |
| | {"ab", "x", -1}, |
| | {"x", "a", 1}, |
| | {"b", "x", -1}, |
| | |
| | {"abcdefgh", "abcdefgh", 0}, |
| | {"abcdefghi", "abcdefghi", 0}, |
| | {"abcdefghi", "abcdefghj", -1}, |
| | } |
| |
|
| | func TestCompare(t *testing.T) { |
| | for _, tt := range compareTests { |
| | numShifts := 16 |
| | for offset := 0; offset <= numShifts; offset++ { |
| | shiftedB := (Repeat("*", offset) + tt.b)[offset:] |
| | cmp := Compare(tt.a, shiftedB) |
| | if cmp != tt.i { |
| | t.Errorf(`Compare(%q, %q), offset %d = %v; want %v`, tt.a, tt.b, offset, cmp, tt.i) |
| | } |
| | } |
| | } |
| | } |
| |
|
| | func TestCompareIdenticalString(t *testing.T) { |
| | var s = "Hello Gophers!" |
| | if Compare(s, s) != 0 { |
| | t.Error("s != s") |
| | } |
| | if Compare(s, s[:1]) != 1 { |
| | t.Error("s > s[:1] failed") |
| | } |
| | } |
| |
|
| | func TestCompareStrings(t *testing.T) { |
| | |
| | |
| | unsafeString := func(b []byte) string { |
| | return unsafe.String(unsafe.SliceData(b), len(b)) |
| | } |
| |
|
| | lengths := make([]int, 0) |
| | for i := 0; i <= 128; i++ { |
| | lengths = append(lengths, i) |
| | } |
| | lengths = append(lengths, 256, 512, 1024, 1333, 4095, 4096, 4097) |
| |
|
| | if !testing.Short() || testenv.Builder() != "" { |
| | lengths = append(lengths, 65535, 65536, 65537, 99999) |
| | } |
| |
|
| | n := lengths[len(lengths)-1] |
| | a := make([]byte, n+1) |
| | b := make([]byte, n+1) |
| | lastLen := 0 |
| | for _, len := range lengths { |
| | |
| | for i := 0; i < len; i++ { |
| | a[i] = byte(1 + 31*i%254) |
| | b[i] = byte(1 + 31*i%254) |
| | } |
| | |
| | for i := len; i <= n; i++ { |
| | a[i] = 8 |
| | b[i] = 9 |
| | } |
| |
|
| | sa, sb := unsafeString(a), unsafeString(b) |
| | cmp := Compare(sa[:len], sb[:len]) |
| | if cmp != 0 { |
| | t.Errorf(`CompareIdentical(%d) = %d`, len, cmp) |
| | } |
| | if len > 0 { |
| | cmp = Compare(sa[:len-1], sb[:len]) |
| | if cmp != -1 { |
| | t.Errorf(`CompareAshorter(%d) = %d`, len, cmp) |
| | } |
| | cmp = Compare(sa[:len], sb[:len-1]) |
| | if cmp != 1 { |
| | t.Errorf(`CompareBshorter(%d) = %d`, len, cmp) |
| | } |
| | } |
| | for k := lastLen; k < len; k++ { |
| | b[k] = a[k] - 1 |
| | cmp = Compare(unsafeString(a[:len]), unsafeString(b[:len])) |
| | if cmp != 1 { |
| | t.Errorf(`CompareAbigger(%d,%d) = %d`, len, k, cmp) |
| | } |
| | b[k] = a[k] + 1 |
| | cmp = Compare(unsafeString(a[:len]), unsafeString(b[:len])) |
| | if cmp != -1 { |
| | t.Errorf(`CompareBbigger(%d,%d) = %d`, len, k, cmp) |
| | } |
| | b[k] = a[k] |
| | } |
| | lastLen = len |
| | } |
| | } |
| |
|