ast_expr_test.go 2.8 KB
package astexpr

import (
	"fmt"
	"testing"

	"github.com/linmadan/egglib-go/utils/json"
	"github.com/stretchr/testify/assert"
	"gitlab.fjmaimaimai.com/allied-creation/character-library-metadata-bastion/pkg/domain"
)

func TestAstExprUnmarshalJSON(t *testing.T) {
	inputs := []struct {
		data ExprAST
	}{
		{
			data: &FunCallerExprAST{
				Name:     "if",
				ExprType: TypeFunCallerExprAST,
				Args: []ExprAST{
					&BinaryExprAST{
						ExprType: TypeBinaryExprAST,
						Op:       "<",
						Lhs: &FieldExprAST{
							ExprType: TypeFieldExprAST,
							Str:      "table.count",
						},
						Rhs: &FieldExprAST{
							ExprType: TypeFieldExprAST,
							Str:      "100",
						},
					},
					&FieldExprAST{
						ExprType: TypeFieldExprAST,
						Str:      "200",
					},
					&FieldExprAST{
						ExprType: TypeFieldExprAST,
						Str:      "300",
					},
				},
			},
		},
		{
			data: &FunCallerExprAST{
				Name:     "sum",
				ExprType: TypeFunCallerExprAST,
				Args: []ExprAST{
					&BinaryExprAST{
						ExprType: TypeBinaryExprAST,
						Op:       "/",
						Lhs: &ValueExprAST{
							ExprType: TypeValueExprAST,
							Str:      "1",
						},
						Rhs: &FunCallerExprAST{
							ExprType: TypeFunCallerExprAST,
							Name:     "countifs",
							Args: []ExprAST{
								&FieldExprAST{
									ExprType: TypeFieldExprAST,
									Str:      "业绩1",
									Field: &domain.TableField{
										TableId:      1,
										TableName:    "测试ABC",
										TableSqlName: "table_abc_test",
										FieldName:    "业绩",
										FieldSqlName: "ye_ji_1",
										FieldSQLType: "Float",
									},
								},
								&ValueExprAST{
									ExprType: TypeValueExprAST,
									Str:      "业绩2",
								},
							},
						},
					},
				},
			},
		},
	}

	for _, input := range inputs {
		data, err := json.Marshal(input.data)
		if err != nil {
			t.Fatal(err)
		}
		v, err := ExprUnmarshal(data)
		if err != nil {
			t.Fatal(err)
		}
		if v != nil {

		}
		assert.Equal(t, input.data, v)
	}
}

func TestAstExprParse(t *testing.T) {
	funs := []struct {
		Name  string
		Exp   []string
		Debug bool
	}{
		{
			"COUNTIF 多级嵌套",
			[]string{
				`COUNTIF(销售明细.业绩,"<=1000")-COUNTIF(销售明细.业绩,"<=100")`,
				`SUM(1/(COUNTIF(销售明细.业绩,"<=1000")-COUNTIF(销售明细.业绩,"<=100")))`,
			},
			true,
		},
		{
			"COUNTIF 多级嵌套",
			[]string{
				`COUNTIF(销售明细.业绩,"<=1000")-COUNTIF(销售明细.业绩,"<=100")`,
				`SUM(COUNTIF(销售明细.业绩,"<=1000")-COUNTIF(销售明细.业绩,"<=100"))`,
			},
			false,
		},
	}
	for _, f := range funs {
		if !f.Debug {
			continue
		}
		fmt.Println("测试项目", f.Name)
		fmt.Println()
		for _, exp := range f.Exp {
			fmt.Println("表达式:", exp)
			r, err := Parse(exp)
			if err != nil {
				t.Error(err)
			}
			if r != 0 {

			}
		}
	}
}