diff options
Diffstat (limited to 'src/pkg/strings/strings_test.go')
| -rw-r--r-- | src/pkg/strings/strings_test.go | 84 | 
1 files changed, 81 insertions, 3 deletions
| diff --git a/src/pkg/strings/strings_test.go b/src/pkg/strings/strings_test.go index 734fdd33d..c45b1485d 100644 --- a/src/pkg/strings/strings_test.go +++ b/src/pkg/strings/strings_test.go @@ -6,9 +6,12 @@ package strings_test  import (  	"os" +	"reflect" +	"strconv"  	. "strings"  	"testing"  	"unicode" +	"unsafe"  	"utf8"  ) @@ -116,6 +119,57 @@ func TestLastIndex(t *testing.T)    { runIndexTests(t, LastIndex, "LastIndex", l  func TestIndexAny(t *testing.T)     { runIndexTests(t, IndexAny, "IndexAny", indexAnyTests) }  func TestLastIndexAny(t *testing.T) { runIndexTests(t, LastIndexAny, "LastIndexAny", lastIndexAnyTests) } +type IndexRuneTest struct { +	s    string +	rune int +	out  int +} + +var indexRuneTests = []IndexRuneTest{ +	{"a A x", 'A', 2}, +	{"some_text=some_value", '=', 9}, +	{"☺a", 'a', 3}, +	{"a☻☺b", '☺', 4}, +} + +func TestIndexRune(t *testing.T) { +	for _, test := range indexRuneTests { +		if actual := IndexRune(test.s, test.rune); actual != test.out { +			t.Errorf("IndexRune(%q,%d)= %v; want %v", test.s, test.rune, actual, test.out) +		} +	} +} + +const benchmarkString = "some_text=some☺value" + +func BenchmarkIndexRune(b *testing.B) { +	if got := IndexRune(benchmarkString, '☺'); got != 14 { +		panic("wrong index: got=" + strconv.Itoa(got)) +	} +	for i := 0; i < b.N; i++ { +		IndexRune(benchmarkString, '☺') +	} +} + +func BenchmarkIndexRuneFastPath(b *testing.B) { +	if got := IndexRune(benchmarkString, 'v'); got != 17 { +		panic("wrong index: got=" + strconv.Itoa(got)) +	} +	for i := 0; i < b.N; i++ { +		IndexRune(benchmarkString, 'v') +	} +} + +func BenchmarkIndex(b *testing.B) { +	if got := Index(benchmarkString, "v"); got != 17 { +		panic("wrong index: got=" + strconv.Itoa(got)) +	} +	for i := 0; i < b.N; i++ { +		Index(benchmarkString, "v") +	} +} + +  type ExplodeTest struct {  	s string  	n int @@ -377,12 +431,32 @@ func TestMap(t *testing.T) {  	if m != expect {  		t.Errorf("drop: expected %q got %q", expect, m)  	} + +	// 6. Identity +	identity := func(rune int) int { +		return rune +	} +	orig := "Input string that we expect not to be copied." +	m = Map(identity, orig) +	if (*reflect.StringHeader)(unsafe.Pointer(&orig)).Data != +		(*reflect.StringHeader)(unsafe.Pointer(&m)).Data { +		t.Error("unexpected copy during identity map") +	}  }  func TestToUpper(t *testing.T) { runStringTests(t, ToUpper, "ToUpper", upperTests) }  func TestToLower(t *testing.T) { runStringTests(t, ToLower, "ToLower", lowerTests) } +func BenchmarkMapNoChanges(b *testing.B) { +	identity := func(rune int) int { +		return rune +	} +	for i := 0; i < b.N; i++ { +		Map(identity, "Some string that won't be modified.") +	} +} +  func TestSpecialCase(t *testing.T) {  	lower := "abcçdefgğhıijklmnoöprsştuüvyz"  	upper := "ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ" @@ -565,7 +639,11 @@ func equal(m string, s1, s2 string, t *testing.T) bool {  func TestCaseConsistency(t *testing.T) {  	// Make a string of all the runes. -	a := make([]int, unicode.MaxRune+1) +	numRunes := unicode.MaxRune + 1 +	if testing.Short() { +		numRunes = 1000 +	} +	a := make([]int, numRunes)  	for i := range a {  		a[i] = i  	} @@ -575,10 +653,10 @@ func TestCaseConsistency(t *testing.T) {  	lower := ToLower(s)  	// Consistency checks -	if n := utf8.RuneCountInString(upper); n != unicode.MaxRune+1 { +	if n := utf8.RuneCountInString(upper); n != numRunes {  		t.Error("rune count wrong in upper:", n)  	} -	if n := utf8.RuneCountInString(lower); n != unicode.MaxRune+1 { +	if n := utf8.RuneCountInString(lower); n != numRunes {  		t.Error("rune count wrong in lower:", n)  	}  	if !equal("ToUpper(upper)", ToUpper(upper), upper, t) { | 
