func tokenize(s string) [][]lex.Token { res := [][]lex.Token{} if len(s) == 0 { return res } for _, o := range strings.Split(s, ",") { res = append(res, lex.Tokenize(o)) } return res }
func testOperandParser(t *testing.T, parser *Parser, tests []operandTest) { for _, test := range tests { parser.start(lex.Tokenize(test.input)) addr := obj.Addr{} parser.operand(&addr) result := obj.Dconv(&emptyProg, &addr) if result != test.output { t.Errorf("fail at %s: got %s; expected %s\n", test.input, result, test.output) } } }
func runBadTest(i int, test badExprTest, t *testing.T) (err error) { p := NewParser(nil, nil, nil) // Expression evaluation uses none of these fields of the parser. p.start(lex.Tokenize(test.input)) defer func() { e := recover() var ok bool if err, ok = e.(error); e != nil && !ok { t.Fatal(e) } }() p.expr() return nil }
func TestExpr(t *testing.T) { p := NewParser(nil, nil, nil) // Expression evaluation uses none of these fields of the parser. for i, test := range exprTests { p.start(lex.Tokenize(test.input)) result := int64(p.expr()) if result != test.output { t.Errorf("%d: %q evaluated to %d; expected %d", i, test.input, result, test.output) } tok := p.next() if test.atEOF && tok.ScanToken != scanner.EOF { t.Errorf("%d: %q: at EOF got %s", i, test.input, tok) } else if !test.atEOF && tok.ScanToken == scanner.EOF { t.Errorf("%d: %q: expected not EOF but at EOF", i, test.input) } } }