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  }