267 lines
6.1 KiB
Go
267 lines
6.1 KiB
Go
package execute_test
|
|
|
|
//func TestCompileExpression(t *testing.T) {
|
|
// testCases := []struct {
|
|
// name string
|
|
// expr expression.Expression
|
|
// types map[string]execute.DataType
|
|
// wantErr bool
|
|
// }{
|
|
// {
|
|
// name: "integer literal",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.IntegerLiteralNode{
|
|
// Value: 42,
|
|
// },
|
|
// },
|
|
// wantErr: false,
|
|
// },
|
|
// {
|
|
// name: "negate string",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.UnaryNode{
|
|
// Operator: expression.SubtractionOperator,
|
|
// Node: &expression.StringLiteralNode{
|
|
// Value: "hello",
|
|
// },
|
|
// },
|
|
// },
|
|
// wantErr: true,
|
|
// },
|
|
// {
|
|
// name: "missing type info",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.ReferenceNode{
|
|
// Name: "a",
|
|
// },
|
|
// },
|
|
// wantErr: true,
|
|
// },
|
|
// }
|
|
// for _, tc := range testCases {
|
|
// tc := tc
|
|
// t.Run(tc.name, func(t *testing.T) {
|
|
// _, err := execute.CompileExpression(tc.expr, tc.types)
|
|
// if err != nil {
|
|
// if !tc.wantErr {
|
|
// t.Errorf("unexpected compliation error: %s", err)
|
|
// }
|
|
// } else if tc.wantErr {
|
|
// t.Error("expected compliation error")
|
|
// }
|
|
// })
|
|
// }
|
|
//}
|
|
//func TestEvaluateCompiledExpression(t *testing.T) {
|
|
// testCases := []struct {
|
|
// name string
|
|
// expr expression.Expression
|
|
// types map[string]execute.DataType
|
|
// scope execute.Scope
|
|
// want execute.Value
|
|
// wantErr bool
|
|
// }{
|
|
// {
|
|
// name: "integer literal",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.IntegerLiteralNode{
|
|
// Value: 42,
|
|
// },
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TInt,
|
|
// Value: int64(42),
|
|
// },
|
|
// },
|
|
// {
|
|
// name: "integer addition",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AdditionOperator,
|
|
// Left: &expression.IntegerLiteralNode{
|
|
// Value: 18,
|
|
// },
|
|
// Right: &expression.IntegerLiteralNode{
|
|
// Value: 24,
|
|
// },
|
|
// },
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TInt,
|
|
// Value: int64(42),
|
|
// },
|
|
// },
|
|
// {
|
|
// name: "integer addition using scope",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AdditionOperator,
|
|
// Left: &expression.ReferenceNode{
|
|
// Name: "a",
|
|
// },
|
|
// Right: &expression.ReferenceNode{
|
|
// Name: "b",
|
|
// },
|
|
// },
|
|
// },
|
|
// types: map[string]execute.DataType{
|
|
// "a": execute.TInt,
|
|
// "b": execute.TInt,
|
|
// },
|
|
// scope: map[string]execute.Value{
|
|
// "a": {Type: execute.TInt, Value: int64(18)},
|
|
// "b": {Type: execute.TInt, Value: int64(24)},
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TInt,
|
|
// Value: int64(42),
|
|
// },
|
|
// },
|
|
// {
|
|
// name: "integer addition missing scope",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AdditionOperator,
|
|
// Left: &expression.ReferenceNode{
|
|
// Name: "a",
|
|
// },
|
|
// Right: &expression.ReferenceNode{
|
|
// Name: "b",
|
|
// },
|
|
// },
|
|
// },
|
|
// types: map[string]execute.DataType{
|
|
// "a": execute.TInt,
|
|
// "b": execute.TInt,
|
|
// },
|
|
// scope: map[string]execute.Value{
|
|
// "a": {Type: execute.TInt, Value: int64(18)},
|
|
// },
|
|
// wantErr: true,
|
|
// },
|
|
// {
|
|
// name: "integer addition incorrect scope",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AdditionOperator,
|
|
// Left: &expression.ReferenceNode{
|
|
// Name: "a",
|
|
// },
|
|
// Right: &expression.ReferenceNode{
|
|
// Name: "b",
|
|
// },
|
|
// },
|
|
// },
|
|
// types: map[string]execute.DataType{
|
|
// "a": execute.TInt,
|
|
// "b": execute.TInt,
|
|
// },
|
|
// scope: map[string]execute.Value{
|
|
// "a": {Type: execute.TInt, Value: int64(18)},
|
|
// "b": {Type: execute.TFloat, Value: float64(18)},
|
|
// },
|
|
// wantErr: true,
|
|
// },
|
|
// {
|
|
// name: "unsigned integer addition",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AdditionOperator,
|
|
// Left: &expression.ReferenceNode{
|
|
// Name: "a",
|
|
// },
|
|
// Right: &expression.ReferenceNode{
|
|
// Name: "b",
|
|
// },
|
|
// },
|
|
// },
|
|
// types: map[string]execute.DataType{
|
|
// "a": execute.TUInt,
|
|
// "b": execute.TUInt,
|
|
// },
|
|
// scope: map[string]execute.Value{
|
|
// "a": {Type: execute.TUInt, Value: uint64(18)},
|
|
// "b": {Type: execute.TUInt, Value: uint64(24)},
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TUInt,
|
|
// Value: uint64(42),
|
|
// },
|
|
// },
|
|
// {
|
|
// name: "float addition",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AdditionOperator,
|
|
// Left: &expression.FloatLiteralNode{
|
|
// Value: 18,
|
|
// },
|
|
// Right: &expression.FloatLiteralNode{
|
|
// Value: 24,
|
|
// },
|
|
// },
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TFloat,
|
|
// Value: float64(42),
|
|
// },
|
|
// },
|
|
// {
|
|
// name: "boolean and",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.AndOperator,
|
|
// Left: &expression.BooleanLiteralNode{
|
|
// Value: true,
|
|
// },
|
|
// Right: &expression.BooleanLiteralNode{
|
|
// Value: true,
|
|
// },
|
|
// },
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TBool,
|
|
// Value: true,
|
|
// },
|
|
// },
|
|
// {
|
|
// name: "boolean or",
|
|
// expr: expression.Expression{
|
|
// Root: &expression.BinaryNode{
|
|
// Operator: expression.OrOperator,
|
|
// Left: &expression.BooleanLiteralNode{
|
|
// Value: false,
|
|
// },
|
|
// Right: &expression.BooleanLiteralNode{
|
|
// Value: true,
|
|
// },
|
|
// },
|
|
// },
|
|
// want: execute.Value{
|
|
// Type: execute.TBool,
|
|
// Value: true,
|
|
// },
|
|
// },
|
|
// }
|
|
// for _, tc := range testCases {
|
|
// tc := tc
|
|
// t.Run(tc.name, func(t *testing.T) {
|
|
// ce, err := execute.CompileExpression(tc.expr, tc.types)
|
|
// if err != nil {
|
|
// t.Fatal(err)
|
|
// }
|
|
// got, err := ce.Eval(tc.scope)
|
|
// if err != nil {
|
|
// if !tc.wantErr {
|
|
// t.Fatal(err)
|
|
// }
|
|
// } else if tc.wantErr {
|
|
// t.Fatal("expected evaluation error")
|
|
// }
|
|
// if !cmp.Equal(got, tc.want) {
|
|
// t.Errorf("unexpected value: -want/+got\n%s", cmp.Diff(tc.want, got))
|
|
// }
|
|
// })
|
|
// }
|
|
//}
|