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