utf8s.RuneScanner
parent
e0bbe43401
commit
df63c8bd2e
|
@ -596,3 +596,65 @@ func TestRuneScanners(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestRuneScannerUnread(t *testing.T) {
|
||||
|
||||
tests := []struct{
|
||||
Reader io.Reader
|
||||
Instructions []rune
|
||||
ExpectedRune []rune
|
||||
ExpectedSize []int
|
||||
}{
|
||||
{
|
||||
Reader: strings.NewReader("a ≡ b\r\n۰۱۲۳۴۵۶۷۸۹ \U00010001"),
|
||||
Instructions: []rune{'r', 'u', 'r', 'u', 'u', 'r', 'r', 'u', 'r', 'r', 'u', 'r', 'u', 'u', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'r', 'u', 'u', 'u', 'r', 'r', 'r', 'r', 'r', 'r', 'r'},
|
||||
ExpectedRune: []rune{'a', 'a', 'a', ' ', ' ', '≡', '≡', '≡', ' ', 'b', '\r', '\n', '۰', '۱', '۲', '۳', '۴', '۵', '۵', '۶', '۷', '۸', '۹', ' ', '\U00010001'},
|
||||
ExpectedSize: []int{ 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 4},
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
TestLoop: for testNumber, test := range tests {
|
||||
|
||||
runeScanner := NewRuneScanner(test.Reader)
|
||||
|
||||
var readCount int
|
||||
for instructionNumber, instruction := range test.Instructions {
|
||||
|
||||
switch instruction {
|
||||
case 'r': // = rea
|
||||
|
||||
actualRune, actualSize, err := runeScanner.ReadRune()
|
||||
if nil != err {
|
||||
t.Errorf("For test #%d and instruction #%d, did not expected an error, but actually got one: (%T) %q", testNumber, instructionNumber, err, err)
|
||||
continue TestLoop
|
||||
}
|
||||
|
||||
expectedRune := test.ExpectedRune[readCount]
|
||||
expectedSize := test.ExpectedSize[readCount]
|
||||
|
||||
if expected, actual := expectedRune, actualRune; expected != actual {
|
||||
t.Errorf("For test #%d and instruction #%d, expected rune %q / %d, but actually got %q / %d", testNumber, instructionNumber, expected, expected, actual, actual)
|
||||
continue TestLoop
|
||||
}
|
||||
|
||||
if expected, actual := expectedSize, actualSize; expected != actual {
|
||||
t.Errorf("For test #%d and instruction #%d, for rune %q / %d expected size %d, but actually got size %d", testNumber, instructionNumber, expectedRune, expectedRune, expected, actual)
|
||||
continue TestLoop
|
||||
}
|
||||
|
||||
readCount++
|
||||
case 'u': // = unread
|
||||
if err := runeScanner.UnreadRune(); nil != err {
|
||||
t.Errorf("For test #%d and instruction #%d, did not expected an error, but actually got one: (%T) %q", testNumber, instructionNumber, err, err)
|
||||
continue TestLoop
|
||||
}
|
||||
default:
|
||||
t.Errorf("For test #%d and instruction #%d, UNKNOWN INSTRUCTION!!!:... %q", testNumber, instructionNumber, instruction)
|
||||
continue TestLoop
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue