diff options
Diffstat (limited to 'src/pkg/bytes/bytes_test.go')
| -rw-r--r-- | src/pkg/bytes/bytes_test.go | 860 | 
1 files changed, 0 insertions, 860 deletions
| diff --git a/src/pkg/bytes/bytes_test.go b/src/pkg/bytes/bytes_test.go deleted file mode 100644 index 753935309..000000000 --- a/src/pkg/bytes/bytes_test.go +++ /dev/null @@ -1,860 +0,0 @@ -// 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 bytes_test - -import ( -	. "bytes" -	"reflect" -	"testing" -	"unicode" -	"utf8" -) - -func eq(a, b []string) bool { -	if len(a) != len(b) { -		return false -	} -	for i := 0; i < len(a); i++ { -		if a[i] != b[i] { -			return false -		} -	} -	return true -} - -func arrayOfString(a [][]byte) []string { -	result := make([]string, len(a)) -	for j := 0; j < len(a); j++ { -		result[j] = string(a[j]) -	} -	return result -} - -// For ease of reading, the test cases use strings that are converted to byte -// arrays before invoking the functions. - -var abcd = "abcd" -var faces = "☺☻☹" -var commas = "1,2,3,4" -var dots = "1....2....3....4" - -type BinOpTest struct { -	a string -	b string -	i int -} - -var comparetests = []BinOpTest{ -	{"", "", 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}, -} - -func TestCompare(t *testing.T) { -	for _, tt := range comparetests { -		a := []byte(tt.a) -		b := []byte(tt.b) -		cmp := Compare(a, b) -		eql := Equal(a, b) -		if cmp != tt.i { -			t.Errorf(`Compare(%q, %q) = %v`, tt.a, tt.b, cmp) -		} -		if eql != (tt.i == 0) { -			t.Errorf(`Equal(%q, %q) = %v`, tt.a, tt.b, eql) -		} -	} -} - -var indexTests = []BinOpTest{ -	{"", "", 0}, -	{"", "a", -1}, -	{"", "foo", -1}, -	{"fo", "foo", -1}, -	{"foo", "foo", 0}, -	{"oofofoofooo", "f", 2}, -	{"oofofoofooo", "foo", 4}, -	{"barfoobarfoo", "foo", 3}, -	{"foo", "", 0}, -	{"foo", "o", 1}, -	{"abcABCabc", "A", 3}, -	// cases with one byte strings - test IndexByte and special case in Index() -	{"", "a", -1}, -	{"x", "a", -1}, -	{"x", "x", 0}, -	{"abc", "a", 0}, -	{"abc", "b", 1}, -	{"abc", "c", 2}, -	{"abc", "x", -1}, -	{"barfoobarfooyyyzzzyyyzzzyyyzzzyyyxxxzzzyyy", "x", 33}, -	{"foofyfoobarfoobar", "y", 4}, -	{"oooooooooooooooooooooo", "r", -1}, -} - -var lastIndexTests = []BinOpTest{ -	{"", "", 0}, -	{"", "a", -1}, -	{"", "foo", -1}, -	{"fo", "foo", -1}, -	{"foo", "foo", 0}, -	{"foo", "f", 0}, -	{"oofofoofooo", "f", 7}, -	{"oofofoofooo", "foo", 7}, -	{"barfoobarfoo", "foo", 9}, -	{"foo", "", 3}, -	{"foo", "o", 2}, -	{"abcABCabc", "A", 3}, -	{"abcABCabc", "a", 6}, -} - -var indexAnyTests = []BinOpTest{ -	{"", "", -1}, -	{"", "a", -1}, -	{"", "abc", -1}, -	{"a", "", -1}, -	{"a", "a", 0}, -	{"aaa", "a", 0}, -	{"abc", "xyz", -1}, -	{"abc", "xcz", 2}, -	{"ab☺c", "x☺yz", 2}, -	{"aRegExp*", ".(|)*+?^$[]", 7}, -	{dots + dots + dots, " ", -1}, -} - -var lastIndexAnyTests = []BinOpTest{ -	{"", "", -1}, -	{"", "a", -1}, -	{"", "abc", -1}, -	{"a", "", -1}, -	{"a", "a", 0}, -	{"aaa", "a", 2}, -	{"abc", "xyz", -1}, -	{"abc", "ab", 1}, -	{"a☺b☻c☹d", "uvw☻xyz", 2 + len("☺")}, -	{"a.RegExp*", ".(|)*+?^$[]", 8}, -	{dots + dots + dots, " ", -1}, -} - -var indexRuneTests = []BinOpTest{ -	{"", "a", -1}, -	{"", "☺", -1}, -	{"foo", "☹", -1}, -	{"foo", "o", 1}, -	{"foo☺bar", "☺", 3}, -	{"foo☺☻☹bar", "☹", 9}, -} - -// Execute f on each test case.  funcName should be the name of f; it's used -// in failure reports. -func runIndexTests(t *testing.T, f func(s, sep []byte) int, funcName string, testCases []BinOpTest) { -	for _, test := range testCases { -		a := []byte(test.a) -		b := []byte(test.b) -		actual := f(a, b) -		if actual != test.i { -			t.Errorf("%s(%q,%q) = %v; want %v", funcName, a, b, actual, test.i) -		} -	} -} - -func runIndexAnyTests(t *testing.T, f func(s []byte, chars string) int, funcName string, testCases []BinOpTest) { -	for _, test := range testCases { -		a := []byte(test.a) -		actual := f(a, test.b) -		if actual != test.i { -			t.Errorf("%s(%q,%q) = %v; want %v", funcName, a, test.b, actual, test.i) -		} -	} -} - -func TestIndex(t *testing.T)     { runIndexTests(t, Index, "Index", indexTests) } -func TestLastIndex(t *testing.T) { runIndexTests(t, LastIndex, "LastIndex", lastIndexTests) } -func TestIndexAny(t *testing.T)  { runIndexAnyTests(t, IndexAny, "IndexAny", indexAnyTests) } -func TestLastIndexAny(t *testing.T) { -	runIndexAnyTests(t, LastIndexAny, "LastIndexAny", lastIndexAnyTests) -} - -func TestIndexByte(t *testing.T) { -	for _, tt := range indexTests { -		if len(tt.b) != 1 { -			continue -		} -		a := []byte(tt.a) -		b := tt.b[0] -		pos := IndexByte(a, b) -		if pos != tt.i { -			t.Errorf(`IndexByte(%q, '%c') = %v`, tt.a, b, pos) -		} -		posp := IndexBytePortable(a, b) -		if posp != tt.i { -			t.Errorf(`indexBytePortable(%q, '%c') = %v`, tt.a, b, posp) -		} -	} -} - -// test a larger buffer with different sizes and alignments -func TestIndexByteBig(t *testing.T) { -	var n = 1024 -	if testing.Short() { -		n = 128 -	} -	b := make([]byte, n) -	for i := 0; i < n; i++ { -		// different start alignments -		b1 := b[i:] -		for j := 0; j < len(b1); j++ { -			b1[j] = 'x' -			pos := IndexByte(b1, 'x') -			if pos != j { -				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos) -			} -			b1[j] = 0 -			pos = IndexByte(b1, 'x') -			if pos != -1 { -				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos) -			} -		} -		// different end alignments -		b1 = b[:i] -		for j := 0; j < len(b1); j++ { -			b1[j] = 'x' -			pos := IndexByte(b1, 'x') -			if pos != j { -				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos) -			} -			b1[j] = 0 -			pos = IndexByte(b1, 'x') -			if pos != -1 { -				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos) -			} -		} -		// different start and end alignments -		b1 = b[i/2 : n-(i+1)/2] -		for j := 0; j < len(b1); j++ { -			b1[j] = 'x' -			pos := IndexByte(b1, 'x') -			if pos != j { -				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos) -			} -			b1[j] = 0 -			pos = IndexByte(b1, 'x') -			if pos != -1 { -				t.Errorf("IndexByte(%q, 'x') = %v", b1, pos) -			} -		} -	} -} - -func TestIndexRune(t *testing.T) { -	for _, tt := range indexRuneTests { -		a := []byte(tt.a) -		r, _ := utf8.DecodeRuneInString(tt.b) -		pos := IndexRune(a, r) -		if pos != tt.i { -			t.Errorf(`IndexRune(%q, '%c') = %v`, tt.a, r, pos) -		} -	} -} - -func BenchmarkIndexByte4K(b *testing.B) { bmIndex(b, IndexByte, 4<<10) } - -func BenchmarkIndexByte4M(b *testing.B) { bmIndex(b, IndexByte, 4<<20) } - -func BenchmarkIndexByte64M(b *testing.B) { bmIndex(b, IndexByte, 64<<20) } - -func BenchmarkIndexBytePortable4K(b *testing.B) { -	bmIndex(b, IndexBytePortable, 4<<10) -} - -func BenchmarkIndexBytePortable4M(b *testing.B) { -	bmIndex(b, IndexBytePortable, 4<<20) -} - -func BenchmarkIndexBytePortable64M(b *testing.B) { -	bmIndex(b, IndexBytePortable, 64<<20) -} - -var bmbuf []byte - -func bmIndex(b *testing.B, index func([]byte, byte) int, n int) { -	if len(bmbuf) < n { -		bmbuf = make([]byte, n) -	} -	b.SetBytes(int64(n)) -	buf := bmbuf[0:n] -	buf[n-1] = 'x' -	for i := 0; i < b.N; i++ { -		j := index(buf, 'x') -		if j != n-1 { -			println("bad index", j) -			panic("bad index") -		} -	} -	buf[n-1] = '0' -} - -type ExplodeTest struct { -	s string -	n int -	a []string -} - -var explodetests = []ExplodeTest{ -	{"", -1, []string{}}, -	{abcd, -1, []string{"a", "b", "c", "d"}}, -	{faces, -1, []string{"☺", "☻", "☹"}}, -	{abcd, 2, []string{"a", "bcd"}}, -} - -func TestExplode(t *testing.T) { -	for _, tt := range explodetests { -		a := SplitN([]byte(tt.s), nil, tt.n) -		result := arrayOfString(a) -		if !eq(result, tt.a) { -			t.Errorf(`Explode("%s", %d) = %v; want %v`, tt.s, tt.n, result, tt.a) -			continue -		} -		s := Join(a, []byte{}) -		if string(s) != tt.s { -			t.Errorf(`Join(Explode("%s", %d), "") = "%s"`, tt.s, tt.n, s) -		} -	} -} - - -type SplitTest struct { -	s   string -	sep string -	n   int -	a   []string -} - -var splittests = []SplitTest{ -	{abcd, "a", 0, nil}, -	{abcd, "a", -1, []string{"", "bcd"}}, -	{abcd, "z", -1, []string{"abcd"}}, -	{abcd, "", -1, []string{"a", "b", "c", "d"}}, -	{commas, ",", -1, []string{"1", "2", "3", "4"}}, -	{dots, "...", -1, []string{"1", ".2", ".3", ".4"}}, -	{faces, "☹", -1, []string{"☺☻", ""}}, -	{faces, "~", -1, []string{faces}}, -	{faces, "", -1, []string{"☺", "☻", "☹"}}, -	{"1 2 3 4", " ", 3, []string{"1", "2", "3 4"}}, -	{"1 2", " ", 3, []string{"1", "2"}}, -	{"123", "", 2, []string{"1", "23"}}, -	{"123", "", 17, []string{"1", "2", "3"}}, -} - -func TestSplit(t *testing.T) { -	for _, tt := range splittests { -		a := SplitN([]byte(tt.s), []byte(tt.sep), tt.n) -		result := arrayOfString(a) -		if !eq(result, tt.a) { -			t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, result, tt.a) -			continue -		} -		if tt.n == 0 { -			continue -		} -		s := Join(a, []byte(tt.sep)) -		if string(s) != tt.s { -			t.Errorf(`Join(Split(%q, %q, %d), %q) = %q`, tt.s, tt.sep, tt.n, tt.sep, s) -		} -		if tt.n < 0 { -			b := Split([]byte(tt.s), []byte(tt.sep)) -			if !reflect.DeepEqual(a, b) { -				t.Errorf("Split disagrees withSplitN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a) -			} -		} -	} -} - -var splitaftertests = []SplitTest{ -	{abcd, "a", -1, []string{"a", "bcd"}}, -	{abcd, "z", -1, []string{"abcd"}}, -	{abcd, "", -1, []string{"a", "b", "c", "d"}}, -	{commas, ",", -1, []string{"1,", "2,", "3,", "4"}}, -	{dots, "...", -1, []string{"1...", ".2...", ".3...", ".4"}}, -	{faces, "☹", -1, []string{"☺☻☹", ""}}, -	{faces, "~", -1, []string{faces}}, -	{faces, "", -1, []string{"☺", "☻", "☹"}}, -	{"1 2 3 4", " ", 3, []string{"1 ", "2 ", "3 4"}}, -	{"1 2 3", " ", 3, []string{"1 ", "2 ", "3"}}, -	{"1 2", " ", 3, []string{"1 ", "2"}}, -	{"123", "", 2, []string{"1", "23"}}, -	{"123", "", 17, []string{"1", "2", "3"}}, -} - -func TestSplitAfter(t *testing.T) { -	for _, tt := range splitaftertests { -		a := SplitAfterN([]byte(tt.s), []byte(tt.sep), tt.n) -		result := arrayOfString(a) -		if !eq(result, tt.a) { -			t.Errorf(`Split(%q, %q, %d) = %v; want %v`, tt.s, tt.sep, tt.n, result, tt.a) -			continue -		} -		s := Join(a, nil) -		if string(s) != tt.s { -			t.Errorf(`Join(Split(%q, %q, %d), %q) = %q`, tt.s, tt.sep, tt.n, tt.sep, s) -		} -		if tt.n < 0 { -			b := SplitAfter([]byte(tt.s), []byte(tt.sep)) -			if !reflect.DeepEqual(a, b) { -				t.Errorf("SplitAfter disagrees withSplitAfterN(%q, %q, %d) = %v; want %v", tt.s, tt.sep, tt.n, b, a) -			} -		} -	} -} - -type FieldsTest struct { -	s string -	a []string -} - -var fieldstests = []FieldsTest{ -	{"", []string{}}, -	{" ", []string{}}, -	{" \t ", []string{}}, -	{"  abc  ", []string{"abc"}}, -	{"1 2 3 4", []string{"1", "2", "3", "4"}}, -	{"1  2  3  4", []string{"1", "2", "3", "4"}}, -	{"1\t\t2\t\t3\t4", []string{"1", "2", "3", "4"}}, -	{"1\u20002\u20013\u20024", []string{"1", "2", "3", "4"}}, -	{"\u2000\u2001\u2002", []string{}}, -	{"\n™\t™\n", []string{"™", "™"}}, -	{faces, []string{faces}}, -} - -func TestFields(t *testing.T) { -	for _, tt := range fieldstests { -		a := Fields([]byte(tt.s)) -		result := arrayOfString(a) -		if !eq(result, tt.a) { -			t.Errorf("Fields(%q) = %v; want %v", tt.s, a, tt.a) -			continue -		} -	} -} - -func TestFieldsFunc(t *testing.T) { -	pred := func(c int) bool { return c == 'X' } -	var fieldsFuncTests = []FieldsTest{ -		{"", []string{}}, -		{"XX", []string{}}, -		{"XXhiXXX", []string{"hi"}}, -		{"aXXbXXXcX", []string{"a", "b", "c"}}, -	} -	for _, tt := range fieldsFuncTests { -		a := FieldsFunc([]byte(tt.s), pred) -		result := arrayOfString(a) -		if !eq(result, tt.a) { -			t.Errorf("FieldsFunc(%q) = %v, want %v", tt.s, a, tt.a) -		} -	} -} - -// Test case for any function which accepts and returns a byte array. -// For ease of creation, we write the byte arrays as strings. -type StringTest struct { -	in, out string -} - -var upperTests = []StringTest{ -	{"", ""}, -	{"abc", "ABC"}, -	{"AbC123", "ABC123"}, -	{"azAZ09_", "AZAZ09_"}, -	{"\u0250\u0250\u0250\u0250\u0250", "\u2C6F\u2C6F\u2C6F\u2C6F\u2C6F"}, // grows one byte per char -} - -var lowerTests = []StringTest{ -	{"", ""}, -	{"abc", "abc"}, -	{"AbC123", "abc123"}, -	{"azAZ09_", "azaz09_"}, -	{"\u2C6D\u2C6D\u2C6D\u2C6D\u2C6D", "\u0251\u0251\u0251\u0251\u0251"}, // shrinks one byte per char -} - -const space = "\t\v\r\f\n\u0085\u00a0\u2000\u3000" - -var trimSpaceTests = []StringTest{ -	{"", ""}, -	{"abc", "abc"}, -	{space + "abc" + space, "abc"}, -	{" ", ""}, -	{" \t\r\n \t\t\r\r\n\n ", ""}, -	{" \t\r\n x\t\t\r\r\n\n ", "x"}, -	{" \u2000\t\r\n x\t\t\r\r\ny\n \u3000", "x\t\t\r\r\ny"}, -	{"1 \t\r\n2", "1 \t\r\n2"}, -	{" x\x80", "x\x80"}, -	{" x\xc0", "x\xc0"}, -	{"x \xc0\xc0 ", "x \xc0\xc0"}, -	{"x \xc0", "x \xc0"}, -	{"x \xc0 ", "x \xc0"}, -	{"x \xc0\xc0 ", "x \xc0\xc0"}, -	{"x ☺\xc0\xc0 ", "x ☺\xc0\xc0"}, -	{"x ☺ ", "x ☺"}, -} - -// Execute f on each test case.  funcName should be the name of f; it's used -// in failure reports. -func runStringTests(t *testing.T, f func([]byte) []byte, funcName string, testCases []StringTest) { -	for _, tc := range testCases { -		actual := string(f([]byte(tc.in))) -		if actual != tc.out { -			t.Errorf("%s(%q) = %q; want %q", funcName, tc.in, actual, tc.out) -		} -	} -} - -func tenRunes(rune int) string { -	r := make([]int, 10) -	for i := range r { -		r[i] = rune -	} -	return string(r) -} - -// User-defined self-inverse mapping function -func rot13(rune int) int { -	step := 13 -	if rune >= 'a' && rune <= 'z' { -		return ((rune - 'a' + step) % 26) + 'a' -	} -	if rune >= 'A' && rune <= 'Z' { -		return ((rune - 'A' + step) % 26) + 'A' -	} -	return rune -} - -func TestMap(t *testing.T) { -	// Run a couple of awful growth/shrinkage tests -	a := tenRunes('a') - -	// 1.  Grow.  This triggers two reallocations in Map. -	maxRune := func(rune int) int { return unicode.MaxRune } -	m := Map(maxRune, []byte(a)) -	expect := tenRunes(unicode.MaxRune) -	if string(m) != expect { -		t.Errorf("growing: expected %q got %q", expect, m) -	} - -	// 2. Shrink -	minRune := func(rune int) int { return 'a' } -	m = Map(minRune, []byte(tenRunes(unicode.MaxRune))) -	expect = a -	if string(m) != expect { -		t.Errorf("shrinking: expected %q got %q", expect, m) -	} - -	// 3. Rot13 -	m = Map(rot13, []byte("a to zed")) -	expect = "n gb mrq" -	if string(m) != expect { -		t.Errorf("rot13: expected %q got %q", expect, m) -	} - -	// 4. Rot13^2 -	m = Map(rot13, Map(rot13, []byte("a to zed"))) -	expect = "a to zed" -	if string(m) != expect { -		t.Errorf("rot13: expected %q got %q", expect, m) -	} - -	// 5. Drop -	dropNotLatin := func(rune int) int { -		if unicode.Is(unicode.Latin, rune) { -			return rune -		} -		return -1 -	} -	m = Map(dropNotLatin, []byte("Hello, 세계")) -	expect = "Hello" -	if string(m) != expect { -		t.Errorf("drop: expected %q got %q", expect, m) -	} -} - -func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTests) } - -func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) } - -func TestTrimSpace(t *testing.T) { runStringTests(t, TrimSpace, "TrimSpace", trimSpaceTests) } - -type RepeatTest struct { -	in, out string -	count   int -} - -var RepeatTests = []RepeatTest{ -	{"", "", 0}, -	{"", "", 1}, -	{"", "", 2}, -	{"-", "", 0}, -	{"-", "-", 1}, -	{"-", "----------", 10}, -	{"abc ", "abc abc abc ", 3}, -} - -func TestRepeat(t *testing.T) { -	for _, tt := range RepeatTests { -		tin := []byte(tt.in) -		tout := []byte(tt.out) -		a := Repeat(tin, tt.count) -		if !Equal(a, tout) { -			t.Errorf("Repeat(%q, %d) = %q; want %q", tin, tt.count, a, tout) -			continue -		} -	} -} - -func runesEqual(a, b []int) bool { -	if len(a) != len(b) { -		return false -	} -	for i, r := range a { -		if r != b[i] { -			return false -		} -	} -	return true -} - -type RunesTest struct { -	in    string -	out   []int -	lossy bool -} - -var RunesTests = []RunesTest{ -	{"", []int{}, false}, -	{" ", []int{32}, false}, -	{"ABC", []int{65, 66, 67}, false}, -	{"abc", []int{97, 98, 99}, false}, -	{"\u65e5\u672c\u8a9e", []int{26085, 26412, 35486}, false}, -	{"ab\x80c", []int{97, 98, 0xFFFD, 99}, true}, -	{"ab\xc0c", []int{97, 98, 0xFFFD, 99}, true}, -} - -func TestRunes(t *testing.T) { -	for _, tt := range RunesTests { -		tin := []byte(tt.in) -		a := Runes(tin) -		if !runesEqual(a, tt.out) { -			t.Errorf("Runes(%q) = %v; want %v", tin, a, tt.out) -			continue -		} -		if !tt.lossy { -			// can only test reassembly if we didn't lose information -			s := string(a) -			if s != tt.in { -				t.Errorf("string(Runes(%q)) = %x; want %x", tin, s, tin) -			} -		} -	} -} - - -type TrimTest struct { -	f               func([]byte, string) []byte -	in, cutset, out string -} - -var trimTests = []TrimTest{ -	{Trim, "abba", "a", "bb"}, -	{Trim, "abba", "ab", ""}, -	{TrimLeft, "abba", "ab", ""}, -	{TrimRight, "abba", "ab", ""}, -	{TrimLeft, "abba", "a", "bba"}, -	{TrimRight, "abba", "a", "abb"}, -	{Trim, "<tag>", "<>", "tag"}, -	{Trim, "* listitem", " *", "listitem"}, -	{Trim, `"quote"`, `"`, "quote"}, -	{Trim, "\u2C6F\u2C6F\u0250\u0250\u2C6F\u2C6F", "\u2C6F", "\u0250\u0250"}, -	//empty string tests -	{Trim, "abba", "", "abba"}, -	{Trim, "", "123", ""}, -	{Trim, "", "", ""}, -	{TrimLeft, "abba", "", "abba"}, -	{TrimLeft, "", "123", ""}, -	{TrimLeft, "", "", ""}, -	{TrimRight, "abba", "", "abba"}, -	{TrimRight, "", "123", ""}, -	{TrimRight, "", "", ""}, -	{TrimRight, "☺\xc0", "☺", "☺\xc0"}, -} - -func TestTrim(t *testing.T) { -	for _, tc := range trimTests { -		actual := string(tc.f([]byte(tc.in), tc.cutset)) -		var name string -		switch tc.f { -		case Trim: -			name = "Trim" -		case TrimLeft: -			name = "TrimLeft" -		case TrimRight: -			name = "TrimRight" -		default: -			t.Error("Undefined trim function") -		} -		if actual != tc.out { -			t.Errorf("%s(%q, %q) = %q; want %q", name, tc.in, tc.cutset, actual, tc.out) -		} -	} -} - -type predicate struct { -	f    func(r int) bool -	name string -} - -var isSpace = predicate{unicode.IsSpace, "IsSpace"} -var isDigit = predicate{unicode.IsDigit, "IsDigit"} -var isUpper = predicate{unicode.IsUpper, "IsUpper"} -var isValidRune = predicate{ -	func(r int) bool { -		return r != utf8.RuneError -	}, -	"IsValidRune", -} - -type TrimFuncTest struct { -	f       predicate -	in, out string -} - -func not(p predicate) predicate { -	return predicate{ -		func(r int) bool { -			return !p.f(r) -		}, -		"not " + p.name, -	} -} - -var trimFuncTests = []TrimFuncTest{ -	{isSpace, space + " hello " + space, "hello"}, -	{isDigit, "\u0e50\u0e5212hello34\u0e50\u0e51", "hello"}, -	{isUpper, "\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", "hello"}, -	{not(isSpace), "hello" + space + "hello", space}, -	{not(isDigit), "hello\u0e50\u0e521234\u0e50\u0e51helo", "\u0e50\u0e521234\u0e50\u0e51"}, -	{isValidRune, "ab\xc0a\xc0cd", "\xc0a\xc0"}, -	{not(isValidRune), "\xc0a\xc0", "a"}, -} - -func TestTrimFunc(t *testing.T) { -	for _, tc := range trimFuncTests { -		actual := string(TrimFunc([]byte(tc.in), tc.f.f)) -		if actual != tc.out { -			t.Errorf("TrimFunc(%q, %q) = %q; want %q", tc.in, tc.f.name, actual, tc.out) -		} -	} -} - -type IndexFuncTest struct { -	in          string -	f           predicate -	first, last int -} - -var indexFuncTests = []IndexFuncTest{ -	{"", isValidRune, -1, -1}, -	{"abc", isDigit, -1, -1}, -	{"0123", isDigit, 0, 3}, -	{"a1b", isDigit, 1, 1}, -	{space, isSpace, 0, len(space) - 3}, // last rune in space is 3 bytes -	{"\u0e50\u0e5212hello34\u0e50\u0e51", isDigit, 0, 18}, -	{"\u2C6F\u2C6F\u2C6F\u2C6FABCDhelloEF\u2C6F\u2C6FGH\u2C6F\u2C6F", isUpper, 0, 34}, -	{"12\u0e50\u0e52hello34\u0e50\u0e51", not(isDigit), 8, 12}, - -	// tests of invalid UTF-8 -	{"\x801", isDigit, 1, 1}, -	{"\x80abc", isDigit, -1, -1}, -	{"\xc0a\xc0", isValidRune, 1, 1}, -	{"\xc0a\xc0", not(isValidRune), 0, 2}, -	{"\xc0☺\xc0", not(isValidRune), 0, 4}, -	{"\xc0☺\xc0\xc0", not(isValidRune), 0, 5}, -	{"ab\xc0a\xc0cd", not(isValidRune), 2, 4}, -	{"a\xe0\x80cd", not(isValidRune), 1, 2}, -} - -func TestIndexFunc(t *testing.T) { -	for _, tc := range indexFuncTests { -		first := IndexFunc([]byte(tc.in), tc.f.f) -		if first != tc.first { -			t.Errorf("IndexFunc(%q, %s) = %d; want %d", tc.in, tc.f.name, first, tc.first) -		} -		last := LastIndexFunc([]byte(tc.in), tc.f.f) -		if last != tc.last { -			t.Errorf("LastIndexFunc(%q, %s) = %d; want %d", tc.in, tc.f.name, last, tc.last) -		} -	} -} - -type ReplaceTest struct { -	in       string -	old, new string -	n        int -	out      string -} - -var ReplaceTests = []ReplaceTest{ -	{"hello", "l", "L", 0, "hello"}, -	{"hello", "l", "L", -1, "heLLo"}, -	{"hello", "x", "X", -1, "hello"}, -	{"", "x", "X", -1, ""}, -	{"radar", "r", "<r>", -1, "<r>ada<r>"}, -	{"", "", "<>", -1, "<>"}, -	{"banana", "a", "<>", -1, "b<>n<>n<>"}, -	{"banana", "a", "<>", 1, "b<>nana"}, -	{"banana", "a", "<>", 1000, "b<>n<>n<>"}, -	{"banana", "an", "<>", -1, "b<><>a"}, -	{"banana", "ana", "<>", -1, "b<>na"}, -	{"banana", "", "<>", -1, "<>b<>a<>n<>a<>n<>a<>"}, -	{"banana", "", "<>", 10, "<>b<>a<>n<>a<>n<>a<>"}, -	{"banana", "", "<>", 6, "<>b<>a<>n<>a<>n<>a"}, -	{"banana", "", "<>", 5, "<>b<>a<>n<>a<>na"}, -	{"banana", "", "<>", 1, "<>banana"}, -	{"banana", "a", "a", -1, "banana"}, -	{"banana", "a", "a", 1, "banana"}, -	{"☺☻☹", "", "<>", -1, "<>☺<>☻<>☹<>"}, -} - -func TestReplace(t *testing.T) { -	for _, tt := range ReplaceTests { -		if s := string(Replace([]byte(tt.in), []byte(tt.old), []byte(tt.new), tt.n)); s != tt.out { -			t.Errorf("Replace(%q, %q, %q, %d) = %q, want %q", tt.in, tt.old, tt.new, tt.n, s, tt.out) -		} -	} -} - -type TitleTest struct { -	in, out string -} - -var TitleTests = []TitleTest{ -	{"", ""}, -	{"a", "A"}, -	{" aaa aaa aaa ", " Aaa Aaa Aaa "}, -	{" Aaa Aaa Aaa ", " Aaa Aaa Aaa "}, -	{"123a456", "123a456"}, -	{"double-blind", "Double-Blind"}, -	{"ÿøû", "Ÿøû"}, -} - -func TestTitle(t *testing.T) { -	for _, tt := range TitleTests { -		if s := string(Title([]byte(tt.in))); s != tt.out { -			t.Errorf("Title(%q) = %q, want %q", tt.in, s, tt.out) -		} -	} -} | 
