github.com/yunabe/lgo@v0.0.0-20190709125917-42c42d410fdf/cmd/lgo-internal/utf8_reader_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "io" 6 "strings" 7 "testing" 8 "unicode/utf8" 9 ) 10 11 func TestUTF8Reader_valid(t *testing.T) { 12 content := "バラク・フセイン・オバマ2世(Barack Hussein Obama II[2] [bəˈrɑːk huːˈseɪn oʊˈbɑːmə] (聞く)、1961年8月4日 - )は、アメリカ合衆国の政治家。民主党所属。上院議員(1期)、イリノイ州上院議員(3期)、第44代アメリカ合衆国大統領を歴任した。" 13 for offset, r := range content { 14 if r == utf8.RuneError { 15 t.Errorf("Invalid UTF8 string right after: %q", content[:offset]) 16 return 17 } 18 } 19 outer: 20 for size := 8; size < 100; size++ { 21 r := newUTF8AwareReader(bytes.NewBufferString(content)) 22 buf := make([]byte, size) 23 var segments []string 24 for { 25 n, err := r.Read(buf) 26 if err == io.EOF { 27 break 28 } 29 for _, c := range string(buf[:n]) { 30 if c == utf8.RuneError { 31 t.Errorf("Invalid segment: %q", buf[:n]) 32 continue outer 33 } 34 } 35 segments = append(segments, string(buf[:n])) 36 } 37 data := strings.Join(segments, "") 38 if data != content { 39 t.Errorf("Unexpected data: %s", data) 40 } 41 } 42 } 43 44 func TestUTF8Reader_invalid(t *testing.T) { 45 // "日本語" in SJIS encoding. 46 r := newUTF8AwareReader(bytes.NewBufferString("\x93\xfa\x96{\x8c\xea")) 47 var buf [1024]byte 48 n, err := r.Read(buf[:]) 49 fail := false 50 if n != 4 { 51 t.Errorf("Unexpected n: %d", n) 52 fail = true 53 } 54 if buf[n-1] != '{' { 55 t.Errorf("Unexpected last char: '%c' (0x%x)", buf[n-1], buf[n-1]) 56 fail = true 57 } 58 if err != nil { 59 t.Errorf("Unexpected error: %v", err) 60 fail = true 61 } 62 if fail { 63 return 64 } 65 n, err = r.Read(buf[4:]) 66 if n != 2 { 67 t.Errorf("Unexpected n: %d", n) 68 fail = true 69 } 70 if err != nil { 71 t.Errorf("Unexpected error: %v", err) 72 fail = true 73 } 74 if fail { 75 return 76 } 77 n, err = r.Read(buf[:]) 78 if n != 0 || err != io.EOF { 79 t.Errorf("Unexpected (n, err): (%v, %v)", n, err) 80 } 81 }