1 package gval
2
3 import (
4 "testing"
5 "text/scanner"
6 "unicode"
7 )
8
9 func TestParser_Scan(t *testing.T) {
10 tests := []struct {
11 name string
12 input string
13 Language
14 do func(p *Parser)
15 wantScan rune
16 wantToken string
17 wantPanic bool
18 }{
19 {
20 name: "camouflage",
21 input: "$abc",
22 do: func(p *Parser) {
23 p.Scan()
24 p.Camouflage("test")
25 },
26 wantScan: '$',
27 wantToken: "$",
28 },
29 {
30 name: "camouflage with next",
31 input: "$abc",
32 do: func(p *Parser) {
33 p.Scan()
34 p.Camouflage("test")
35 p.Next()
36 },
37 wantPanic: true,
38 },
39 {
40 name: "camouflage scan camouflage",
41 input: "$abc",
42 do: func(p *Parser) {
43 p.Scan()
44 p.Camouflage("test")
45 p.Scan()
46 p.Camouflage("test2")
47 },
48 wantScan: '$',
49 wantToken: "$",
50 },
51 {
52 name: "camouflage with peek",
53 input: "$abc",
54 do: func(p *Parser) {
55 p.Scan()
56 p.Camouflage("test")
57 p.Peek()
58 },
59 wantPanic: true,
60 },
61 {
62 name: "next and peek",
63 input: "$#abc",
64 do: func(p *Parser) {
65 p.Scan()
66 p.Next()
67 p.Peek()
68 },
69 wantScan: scanner.Ident,
70 wantToken: "abc",
71 },
72 {
73 name: "scan token camouflage token",
74 input: "abc",
75 do: func(p *Parser) {
76 p.Scan()
77 p.TokenText()
78 p.Camouflage("test")
79 },
80 wantScan: scanner.Ident,
81 wantToken: "abc",
82 },
83 {
84 name: "scan token peek camouflage token",
85 input: "abc",
86 do: func(p *Parser) {
87 p.Scan()
88 p.TokenText()
89 p.Peek()
90 p.Camouflage("test")
91 },
92 wantScan: scanner.Ident,
93 wantToken: "abc",
94 },
95 {
96 name: "tokenize all whitespace",
97 input: "foo\tbar\nbaz",
98 do: func(p *Parser) {
99 p.SetWhitespace()
100 p.Scan()
101 },
102 wantScan: '\t',
103 wantToken: "\t",
104 },
105 {
106 name: "custom ident",
107 input: "$#foo",
108 do: func(p *Parser) {
109 p.SetIsIdentRuneFunc(func(ch rune, i int) bool { return unicode.IsLetter(ch) || ch == '#' })
110 p.Scan()
111 },
112 wantScan: scanner.Ident,
113 wantToken: "#foo",
114 },
115 {
116 name: "do not scan idents",
117 input: "abc",
118 do: func(p *Parser) {
119 p.SetMode(scanner.GoTokens ^ scanner.ScanIdents)
120 p.Scan()
121 },
122 wantScan: 'b',
123 wantToken: "b",
124 },
125 }
126 for _, tt := range tests {
127 t.Run(tt.name, func(t *testing.T) {
128 defer func() {
129 err := recover()
130 if err != nil && !tt.wantPanic {
131 t.Fatalf("unexpected panic: %v", err)
132 }
133 }()
134
135 p := newParser(tt.input, tt.Language)
136 tt.do(p)
137 if tt.wantPanic {
138 return
139 }
140 scan := p.Scan()
141 token := p.TokenText()
142
143 if scan != tt.wantScan || token != tt.wantToken {
144 t.Errorf("Parser.Scan() = %v (%v), want %v (%v)", scan, token, tt.wantScan, tt.wantToken)
145 }
146 })
147 }
148 }
149
View as plain text