@@ -25,9 +25,13 @@ type tokenResult struct {
2525 pos int
2626 token token
2727 text string
28+ err string
2829}
2930
3031func (tr tokenResult ) String () string {
32+ if tr .err != "" {
33+ return fmt .Sprintf ("{pos: %v, token: %v, text: %q, err: %q}" , tr .pos , tr .token , tr .text , tr .err )
34+ }
3135 return fmt .Sprintf ("{pos: %v, token: %v, text: %q}" , tr .pos , tr .token , tr .text )
3236}
3337
@@ -171,7 +175,7 @@ func TestScanner(t *testing.T) {
171175 input : "foo\x00 bar" ,
172176 expected : []tokenResult {
173177 {pos : 0 , token : tokenField , text : "foo" },
174- {pos : 3 , token : tokenIllegal },
178+ {pos : 3 , token : tokenIllegal , err : "unexpected null" },
175179 {pos : 4 , token : tokenField , text : "bar" },
176180 {pos : 7 , token : tokenEOF },
177181 },
@@ -271,6 +275,51 @@ func TestScanner(t *testing.T) {
271275 {pos : 23 , token : tokenEOF },
272276 },
273277 },
278+ {
279+ name : "IllegalQuoted" ,
280+ input : "labels.containerd.io/key==value" ,
281+ expected : []tokenResult {
282+ {pos : 0 , token : tokenField , text : "labels" },
283+ {pos : 6 , token : tokenSeparator , text : "." },
284+ {pos : 7 , token : tokenField , text : "containerd" },
285+ {pos : 17 , token : tokenSeparator , text : "." },
286+ {pos : 18 , token : tokenField , text : "io" },
287+ {pos : 20 , token : tokenIllegal , text : "/key==value" , err : "quoted literal not terminated" },
288+ {pos : 31 , token : tokenEOF },
289+ },
290+ },
291+ {
292+ name : "IllegalQuotedWithNewLine" ,
293+ input : "labels.\" containerd.io\n key\" ==value" ,
294+ expected : []tokenResult {
295+ {pos : 0 , token : tokenField , text : "labels" },
296+ {pos : 6 , token : tokenSeparator , text : "." },
297+ {pos : 7 , token : tokenIllegal , text : "\" containerd.io\n " , err : "quoted literal not terminated" },
298+ {pos : 22 , token : tokenField , text : "key" },
299+ {pos : 25 , token : tokenIllegal , text : "\" ==value" , err : "quoted literal not terminated" },
300+ {pos : 33 , token : tokenEOF },
301+ },
302+ },
303+ {
304+ name : "IllegalEscapeSequence" ,
305+ input : `labels."\g"` ,
306+ expected : []tokenResult {
307+ {pos : 0 , token : tokenField , text : "labels" },
308+ {pos : 6 , token : tokenSeparator , text : "." },
309+ {pos : 7 , token : tokenIllegal , text : `"\g"` , err : "illegal escape sequence" },
310+ {pos : 11 , token : tokenEOF },
311+ },
312+ },
313+ {
314+ name : "IllegalNumericEscapeSequence" ,
315+ input : `labels."\xaz"` ,
316+ expected : []tokenResult {
317+ {pos : 0 , token : tokenField , text : "labels" },
318+ {pos : 6 , token : tokenSeparator , text : "." },
319+ {pos : 7 , token : tokenIllegal , text : `"\xaz"` , err : "illegal numeric escape sequence" },
320+ {pos : 13 , token : tokenEOF },
321+ },
322+ },
274323 } {
275324 t .Run (testcase .name , func (t * testing.T ) {
276325 var sc scanner
@@ -296,6 +345,9 @@ func TestScanner(t *testing.T) {
296345 if i >= len (testcase .expected ) {
297346 t .Fatalf ("too many tokens parsed" )
298347 }
348+ if tok == tokenIllegal {
349+ tokv .err = sc .err
350+ }
299351
300352 if tokv != testcase .expected [i ] {
301353 t .Fatalf ("token unexpected: %v != %v" , tokv , testcase .expected [i ])
@@ -305,6 +357,7 @@ func TestScanner(t *testing.T) {
305357 if tok == tokenEOF {
306358 break
307359 }
360+
308361 }
309362
310363 // make sure we've eof'd
0 commit comments