blob: 71cc09d49040356edd0fe67e8ded7ed1ba1cb525 [file] [log] [blame]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package script
import (
"fmt"
"testing"
)
var lexTests = [...]struct {
in string
out string
}{
{"", ""},
{"x", "a"},
{"x.y", "a err: :1.2: invalid syntax at '.' (U+002e)"},
{"x_y", "a"},
{"αx", "err: :1.1: invalid syntax at 'α' (U+03b1)"},
{"x y", "a a"},
{"x!y", "a ! a"},
{"&&||!()xy yx ", "&& || ! ( ) a a"},
{"x~", "a ~"},
{"x ~", "a ~"},
{"x &", "a err: :1.3: invalid syntax at &"},
{"x &y", "a err: :1.3: invalid syntax at &"},
{"output !~ `content`", "a !~ `"},
}
func TestLex(t *testing.T) {
for i, tt := range lexTests {
t.Run(fmt.Sprint(i), func(t *testing.T) {
p := &parser{s: tt.in}
out := ""
for {
tok, err := lex(p)
if tok == "" && err == nil {
break
}
if out != "" {
out += " "
}
if err != nil {
out += "err: " + err.Error()
break
}
out += tok
}
if out != tt.out {
t.Errorf("lex(%q):\nhave %s\nwant %s", tt.in, out, tt.out)
}
})
}
}
func lex(p *parser) (tok string, err error) {
defer func() {
if e := recover(); e != nil {
if e, ok := e.(*SyntaxError); ok {
err = e
return
}
panic(e)
}
}()
p.lex()
return p.tok, nil
}