-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrune_scanner_test.go
56 lines (52 loc) · 1.29 KB
/
rune_scanner_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package golisp2
import (
"io"
"strings"
"testing"
"github.com/stretchr/testify/require"
)
func Test_RuneScanner(t *testing.T) {
fName := "itsATestFile.l"
t.Run("basicScan", func(t *testing.T) {
rs := NewRuneScanner(fName, strings.NewReader("(\n+ 1 \t😊\n)"))
expected := []struct {
r rune
col, row int
}{
{'(', 1, 1},
{'\n', 2, 1},
{'+', 1, 2},
{' ', 2, 2},
{'1', 3, 2},
{' ', 4, 2},
{'\t', 5, 2},
{'😊', 6, 2},
{'\n', 7, 2},
{')', 1, 3},
}
for _, e := range expected {
rs.Advance()
require.False(t, rs.Done(), "unexpected end to scan")
require.Equal(t, e.r, rs.Rune())
require.Equal(t, fName, rs.Pos().SourceFile)
require.Equal(t, e.col, rs.Pos().Col)
require.Equal(t, e.row, rs.Pos().Row)
}
rs.Advance()
require.True(t, rs.Done(), "scanned should complete after everyting's read")
require.Equal(t, io.EOF, rs.Err())
})
t.Run("forbiddenChar", func(t *testing.T) {
rs := NewRuneScanner(fName, strings.NewReader("\x00abc"))
rs.Advance()
require.Error(t, rs.Err())
asForbidden, isForbidden := rs.Err().(*ForbiddenRuneError)
require.True(t, isForbidden)
require.Equal(t, '\x00', asForbidden.R)
require.Equal(t, ScannerPosition{
SourceFile: fName,
Col: 1,
Row: 1,
}, asForbidden.Pos)
})
}