package subex import ( "main/walk" "reflect" "strings" "testing" ) func buildTransducer(subex string) Transducer { lexer := NewStringRuneReader(subex) ast := Parse(lexer) transducer := CompileTransducer(ast) return transducer } func fmtValueList(values []walk.Value) string { var builder strings.Builder builder.WriteRune('[') for i, value := range values { if i != 0 { builder.WriteString(", ") } builder.WriteString(value.Debug()) } builder.WriteRune(']') return builder.String() } func TestSubexMain(t *testing.T) { type test struct { subex string input []walk.Value expected []walk.Value } tests := []test { { subex: `..+`, input: []walk.Value { walk.NumberValue(12), walk.NumberValue(34), }, expected: []walk.Value { walk.NumberValue(46), }, }, { subex: `.`, input: []walk.Value { walk.MapValue {{ Key: "a", Value: walk.StringValue("b"), }}, }, expected: []walk.Value { walk.MapValue {{ Key: "a", Value: walk.StringValue("b"), }}, }, }, { subex: `~(.$_(.{-0}))~`, input: []walk.Value { walk.StringValue("hello"), }, expected: []walk.Value { walk.StringValue("ello"), }, }, } for _, test := range tests { lexer := NewStringRuneReader(test.subex) ast := Parse(lexer) transducer := CompileTransducer(ast) output, err := RunTransducer(transducer, test.input) if err { t.Errorf("Subex %q rejected input %v", test.subex, fmtValueList(test.input)) t.Logf("AST: %v", ast) continue } if !reflect.DeepEqual(output, test.expected) { t.Errorf("Subex %q transformed input %s to output %s", test.subex, fmtValueList(test.input), fmtValueList(output)) } } }