1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
package main
import (
"testing"
require "github.com/alecthomas/assert/v2"
)
func TestExpressionParser(t *testing.T) {
type testCase struct {
src string
expected ExprPrecAll
}
for _, c := range []testCase{
{`1`, ExprNumber{1}},
{`1.5`, ExprNumber{1.5}},
{`"a"`, ExprString{`"a"`}},
{`(1)`, ExprParens{ExprNumber{1}}},
{`1 + 1`, ExprAddSub{ExprNumber{1}, []ExprAddSubExt{{"+", ExprNumber{1}}}}},
{`1 - 1`, ExprAddSub{ExprNumber{1}, []ExprAddSubExt{{"-", ExprNumber{1}}}}},
{`1 * 1`, ExprMulDiv{ExprNumber{1}, []ExprMulDivExt{{"*", ExprNumber{1}}}}},
{`1 / 1`, ExprMulDiv{ExprNumber{1}, []ExprMulDivExt{{"/", ExprNumber{1}}}}},
{`1 % 1`, ExprRem{ExprNumber{1}, []ExprRemExt{{"%", ExprNumber{1}}}}},
{
`a + b - c * d / e % f`,
ExprAddSub{
ExprIdent{"a"},
[]ExprAddSubExt{
{"+", ExprIdent{"b"}},
{"-", ExprMulDiv{
ExprIdent{"c"},
[]ExprMulDivExt{
{"*", ExprIdent{Name: "d"}},
{"/", ExprRem{
ExprIdent{"e"},
[]ExprRemExt{{"%", ExprIdent{"f"}}},
}},
},
}},
},
},
},
} {
actual, err := parser.ParseString("<test>", c.src)
require.NoError(t, err)
require.Equal(t, c.expected, actual.X)
}
}
|