bbcode - tokeniser_test.go
1 package bbcode
2
3 import (
4 "testing"
5
6 "vimagination.zapto.org/parser"
7 )
8
9 func TestTokeniser(t *testing.T) {
10 tks := getTokeniser(defaultConfig)
11 Loop:
12 for n, test := range [...]struct {
13 Input string
14 Output []parser.Phrase
15 }{
16 {}, // 1
17 { // 2
18 Input: "A",
19 Output: []parser.Phrase{
20 {
21 Type: phraseText,
22 Data: []parser.Token{
23 {
24 Type: tokenText,
25 Data: "A",
26 },
27 },
28 },
29 },
30 },
31 { // 3
32 Input: "AB",
33 Output: []parser.Phrase{
34 {
35 Type: phraseText,
36 Data: []parser.Token{
37 {
38 Type: tokenText,
39 Data: "AB",
40 },
41 },
42 },
43 },
44 },
45 { // 4
46 Input: "[tag][/tag]",
47 Output: []parser.Phrase{
48 {
49 Type: phraseOpen,
50 Data: []parser.Token{
51 {
52 Type: tokenOpenTag,
53 Data: "tag",
54 },
55 },
56 },
57 {
58 Type: phraseClose,
59 Data: []parser.Token{
60 {
61 Type: tokenCloseTag,
62 Data: "tag",
63 },
64 },
65 },
66 },
67 },
68 { // 5
69 Input: "[tag=attr][/tag]",
70 Output: []parser.Phrase{
71 {
72 Type: phraseOpen,
73 Data: []parser.Token{
74 {
75 Type: tokenOpenTag,
76 Data: "tag",
77 },
78 {
79 Type: tokenTagAttribute,
80 Data: "attr",
81 },
82 },
83 },
84 {
85 Type: phraseClose,
86 Data: []parser.Token{
87 {
88 Type: tokenCloseTag,
89 Data: "tag",
90 },
91 },
92 },
93 },
94 },
95 { // 6
96 Input: "ABC[img]urlHere[/img]123[url=http://www.google.com]Link Here[/url]",
97 Output: []parser.Phrase{
98 {
99 Type: phraseText,
100 Data: []parser.Token{
101 {
102 Type: tokenText,
103 Data: "ABC",
104 },
105 },
106 },
107 {
108 Type: phraseOpen,
109 Data: []parser.Token{
110 {
111 Type: tokenOpenTag,
112 Data: "img",
113 },
114 },
115 },
116 {
117 Type: phraseText,
118 Data: []parser.Token{
119 {
120 Type: tokenText,
121 Data: "urlHere",
122 },
123 },
124 },
125 {
126 Type: phraseClose,
127 Data: []parser.Token{
128 {
129 Type: tokenCloseTag,
130 Data: "img",
131 },
132 },
133 },
134 {
135 Type: phraseText,
136 Data: []parser.Token{
137 {
138 Type: tokenText,
139 Data: "123",
140 },
141 },
142 },
143 {
144 Type: phraseOpen,
145 Data: []parser.Token{
146 {
147 Type: tokenOpenTag,
148 Data: "url",
149 },
150 {
151 Type: tokenTagAttribute,
152 Data: "http://www.google.com",
153 },
154 },
155 },
156 {
157 Type: phraseText,
158 Data: []parser.Token{
159 {
160 Type: tokenText,
161 Data: "Link Here",
162 },
163 },
164 },
165 {
166 Type: phraseClose,
167 Data: []parser.Token{
168 {
169 Type: tokenCloseTag,
170 Data: "url",
171 },
172 },
173 },
174 },
175 },
176 { // 7
177 Input: "PreText[NotATag[NowATag]",
178 Output: []parser.Phrase{
179 {
180 Type: phraseText,
181 Data: []parser.Token{
182 {
183 Type: tokenText,
184 Data: "PreText",
185 },
186 {
187 Type: tokenText,
188 Data: "[NotATag",
189 },
190 },
191 },
192 {
193 Type: phraseOpen,
194 Data: []parser.Token{
195 {
196 Type: tokenOpenTag,
197 Data: "NowATag",
198 },
199 },
200 },
201 },
202 },
203 { // 8
204 Input: "PreText[NotATag=[NowATag]",
205 Output: []parser.Phrase{
206 {
207 Type: phraseText,
208 Data: []parser.Token{
209 {
210 Type: tokenText,
211 Data: "PreText",
212 },
213 },
214 },
215 {
216 Type: phraseOpen,
217 Data: []parser.Token{
218 {
219 Type: tokenOpenTag,
220 Data: "NotATag",
221 },
222 {
223 Type: tokenTagAttribute,
224 Data: "[NowATag",
225 },
226 },
227 },
228 },
229 },
230 { // 9
231 Input: "PreText[NotATag=[StillNotATag",
232 Output: []parser.Phrase{
233 {
234 Type: phraseText,
235 Data: []parser.Token{
236 {
237 Type: tokenText,
238 Data: "PreText",
239 },
240 {
241 Type: tokenText,
242 Data: "[NotATag",
243 },
244 {
245 Type: tokenText,
246 Data: "=[StillNotATag",
247 },
248 },
249 },
250 },
251 },
252 { // 10
253 Input: "[=123]",
254 Output: []parser.Phrase{
255 {
256 Type: phraseText,
257 Data: []parser.Token{
258 {
259 Type: tokenText,
260 Data: "[=123]",
261 },
262 },
263 },
264 },
265 },
266 { // 11
267 Input: "[]",
268 Output: []parser.Phrase{
269 {
270 Type: phraseText,
271 Data: []parser.Token{
272 {
273 Type: tokenText,
274 Data: "[]",
275 },
276 },
277 },
278 },
279 },
280 { // 12
281 Input: "[/]",
282 Output: []parser.Phrase{
283 {
284 Type: phraseText,
285 Data: []parser.Token{
286 {
287 Type: tokenText,
288 Data: "[/]",
289 },
290 },
291 },
292 },
293 },
294 { // 13
295 Input: "[tag=]",
296 Output: []parser.Phrase{
297 {
298 Type: phraseOpen,
299 Data: []parser.Token{
300 {
301 Type: tokenOpenTag,
302 Data: "tag",
303 },
304 {
305 Type: tokenTagAttribute,
306 Data: "",
307 },
308 },
309 },
310 },
311 },
312 } {
313 tk := tks.getParser(parser.NewStringTokeniser(test.Input))
314 for m, phrase := range test.Output {
315 p, err := tk.GetPhrase()
316 if err != nil {
317 t.Errorf("test %d.%d: unexpected error: %s", n+1, m+1, err)
318 }
319 if phrase.Type != p.Type {
320 t.Errorf("test %d.%d: expecting phrase type %d, got %d", n+1, m+1, phrase.Type, p.Type)
321 break Loop
322 }
323 if len(phrase.Data) != len(p.Data) {
324 t.Errorf("test %d.%d: expecting %d tokens, got %d", n+1, m+1, len(phrase.Data), len(p.Data))
325 break Loop
326 }
327 for l, token := range phrase.Data {
328 if token.Type != p.Data[l].Type {
329 t.Errorf("test %d.%d.%d: expecting token type %d, got %d", n+1, m+1, l+1, token.Type, p.Data[l].Type)
330 break Loop
331 }
332 if token.Data != p.Data[l].Data {
333 t.Errorf("test %d.%d.%d: expecting token data %q, got %q", n+1, m+1, l+1, token.Data, p.Data[l].Data)
334 break Loop
335 }
336 }
337 }
338 if p, _ := tk.GetPhrase(); p.Type != parser.PhraseDone {
339 t.Errorf("test %d: more tokens to check", n+1)
340 }
341 }
342 }
343