-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscanner_test.go
76 lines (67 loc) · 2.39 KB
/
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package toaster
import (
"strings"
"testing"
)
// Ensure the scanner can scan tokens correctly.
func TestScanner_Scan(t *testing.T) {
var cases = []struct {
input string
kind Kind
lit string
}{
// Special tokens (EOF, ILLEGAL, WS)
{input: ``, kind: EOF},
{input: `#`, kind: ILLEGAL, lit: `#`},
{input: ` `, kind: WS, lit: " "},
{input: "\t", kind: WS, lit: "\t"},
{input: "\n", kind: WS, lit: "\n"},
{input: `,`, kind: COMMA, lit: ","},
{input: `)`, kind: RPAREN, lit: ")"},
{input: `(`, kind: LPAREN, lit: "("},
{input: `;`, kind: SEMICOLON, lit: ";"},
// Misc characters
{input: `*`, kind: ASTERISK, lit: "*"},
// Identifiers
{input: `foo`, kind: IDENT, lit: `foo`},
{input: `Zx12_3U_-`, kind: IDENT, lit: `Zx12_3U_`},
{input: `users`, kind: IDENT, lit: "users"},
{input: `(`, kind: LPAREN, lit: "("},
{input: `id`, kind: IDENT, lit: "id"},
// keywords
{input: `bool`, kind: BOOL, lit: "bool"},
{input: `CREATE`, kind: CREATE, lit: "create"},
{input: `DELETE`, kind: DELETE, lit: "delete"},
{input: `FROM`, kind: FROM, lit: "from"},
{input: `INSERT`, kind: INSERT, lit: "insert"},
{input: `INTO`, kind: INTO, lit: "into"},
{input: `SELECT`, kind: SELECT, lit: "select"},
{input: `TABLE`, kind: TABLE, lit: "table"},
{input: `TEXT`, kind: TEXT, lit: "text"},
{input: `VALUES`, kind: VALUES, lit: "values"},
{input: `WHERE`, kind: WHERE, lit: "where"},
{input: `INT`, kind: INT, lit: "int"},
{input: `FALSE`, kind: FALSE, lit: "false"},
{input: `TRUE`, kind: TRUE, lit: "true"},
// // values
{input: `'this is a string'`, kind: STRING, lit: "this is a string"},
// Strings
{input: `'testing 123!'`, kind: STRING, lit: `testing 123!`},
{input: `'foo\nbar'`, kind: STRING, lit: "foo\nbar"},
{input: `'foo\\bar'`, kind: STRING, lit: "foo\\bar"},
{input: `'test`, kind: BADSTRING, lit: `test`},
{input: "'test\nfoo", kind: BADSTRING, lit: `test`},
{input: `'test\g'`, kind: BADESCAPE, lit: `\g`},
{input: `1234`, kind: NUMBER, lit: "1234"},
{input: `123.4`, kind: NUMBER, lit: "123.4"},
}
for i, tc := range cases {
s := NewScanner(strings.NewReader(tc.input))
tok := s.Scan()
if tc.kind != tok.Kind {
t.Errorf("%d. %q token mismatch: exp=%q got=%q <%q>", i, tc.input, tc.kind, tok.Kind, tok.Literal)
} else if tc.lit != tok.Literal {
t.Errorf("%d. %q literal mismatch: exp=%q got=%q", i, tc.input, tc.lit, tok.Literal)
}
}
}