| // 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") |
| } |
| } |
| } |