| // 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 utf8string | |
| import ( | |
| "math/rand" | |
| "testing" | |
| "unicode/utf8" | |
| ) | |
| var testStrings = []string{ | |
| "", | |
| "abcd", | |
| "☺☻☹", | |
| "日a本b語ç日ð本Ê語þ日¥本¼語i日©", | |
| "日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©日a本b語ç日ð本Ê語þ日¥本¼語i日©", | |
| "\x80\x80\x80\x80", | |
| } | |
| func TestScanForwards(t *testing.T) { | |
| for _, s := range testStrings { | |
| runes := []rune(s) | |
| str := NewString(s) | |
| if str.RuneCount() != len(runes) { | |
| t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) | |
| break | |
| } | |
| for i, expect := range runes { | |
| got := str.At(i) | |
| if got != expect { | |
| t.Errorf("%s[%d]: expected %c (%U); got %c (%U)", s, i, expect, expect, got, got) | |
| } | |
| } | |
| } | |
| } | |
| func TestScanBackwards(t *testing.T) { | |
| for _, s := range testStrings { | |
| runes := []rune(s) | |
| str := NewString(s) | |
| if str.RuneCount() != len(runes) { | |
| t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) | |
| break | |
| } | |
| for i := len(runes) - 1; i >= 0; i-- { | |
| expect := runes[i] | |
| got := str.At(i) | |
| if got != expect { | |
| t.Errorf("%s[%d]: expected %c (%U); got %c (%U)", s, i, expect, expect, got, got) | |
| } | |
| } | |
| } | |
| } | |
| func randCount() int { | |
| if testing.Short() { | |
| return 100 | |
| } | |
| return 100000 | |
| } | |
| func TestRandomAccess(t *testing.T) { | |
| for _, s := range testStrings { | |
| if len(s) == 0 { | |
| continue | |
| } | |
| runes := []rune(s) | |
| str := NewString(s) | |
| if str.RuneCount() != len(runes) { | |
| t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) | |
| break | |
| } | |
| for j := 0; j < randCount(); j++ { | |
| i := rand.Intn(len(runes)) | |
| expect := runes[i] | |
| got := str.At(i) | |
| if got != expect { | |
| t.Errorf("%s[%d]: expected %c (%U); got %c (%U)", s, i, expect, expect, got, got) | |
| } | |
| } | |
| } | |
| } | |
| func TestRandomSliceAccess(t *testing.T) { | |
| for _, s := range testStrings { | |
| if len(s) == 0 || s[0] == '\x80' { // the bad-UTF-8 string fools this simple test | |
| continue | |
| } | |
| runes := []rune(s) | |
| str := NewString(s) | |
| if str.RuneCount() != len(runes) { | |
| t.Errorf("%s: expected %d runes; got %d", s, len(runes), str.RuneCount()) | |
| break | |
| } | |
| for k := 0; k < randCount(); k++ { | |
| i := rand.Intn(len(runes)) | |
| j := rand.Intn(len(runes) + 1) | |
| if i > j { // include empty strings | |
| continue | |
| } | |
| expect := string(runes[i:j]) | |
| got := str.Slice(i, j) | |
| if got != expect { | |
| t.Errorf("%s[%d:%d]: expected %q got %q", s, i, j, expect, got) | |
| } | |
| } | |
| } | |
| } | |
| func TestLimitSliceAccess(t *testing.T) { | |
| for _, s := range testStrings { | |
| str := NewString(s) | |
| if str.Slice(0, 0) != "" { | |
| t.Error("failure with empty slice at beginning") | |
| } | |
| nr := utf8.RuneCountInString(s) | |
| if str.Slice(nr, nr) != "" { | |
| t.Error("failure with empty slice at end") | |
| } | |
| } | |
| } |