From 0664452ab40906f8631eed5e55c43771d34bd443 Mon Sep 17 00:00:00 2001 From: Jean-Hadrien Chabran Date: Fri, 30 Jul 2021 15:25:04 +0200 Subject: [PATCH] Improve failures readability when testing exprs --- internal/testutil/expr.go | 21 +++++++++++-------- .../testutil/genexprtests/genexprtests.go | 20 +++++++++++------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/internal/testutil/expr.go b/internal/testutil/expr.go index 3a5e3949d..b52d22013 100644 --- a/internal/testutil/expr.go +++ b/internal/testutil/expr.go @@ -2,6 +2,7 @@ package testutil import ( "os" + "path/filepath" "regexp" "strings" "testing" @@ -117,8 +118,6 @@ func TestExpr(t testing.TB, exprStr string, env *environment.Environment, want t } } -var emptyEnv = environment.New(nil) - func FunctionExpr(t testing.TB, name string, args ...expr.Expr) expr.Expr { t.Helper() n := strings.Split(name, ".") @@ -144,30 +143,34 @@ func ExprRunner(t *testing.T, testfile string) { for _, test := range ts.Tests { t.Run(test.Name, func(t *testing.T) { + t.Helper() + testfile, _ := filepath.Abs(testfile) for _, stmt := range test.Statements { if !stmt.Fail { t.Run("OK "+stmt.Expr, func(t *testing.T) { + t.Helper() // parse the expected result e, err := parser.NewParser(strings.NewReader(stmt.Res)).ParseExpr() - require.NoError(t, err) + require.NoErrorf(t, err, "parse error at %s:%d\n`%s`", testfile, stmt.ResLine, stmt.Res) // eval it to get a proper Value want, err := e.Eval(environment.New(nil)) - require.NoError(t, err) + require.NoErrorf(t, err, "eval error at %s:%d\n`%s`", testfile, stmt.ResLine, stmt.Res) // parse the given expr e, err = parser.NewParser(strings.NewReader(stmt.Expr)).ParseExpr() - require.NoError(t, err) + require.NoErrorf(t, err, "parse error at %s:%d\n`%s`", testfile, stmt.ExprLine, stmt.Expr) // eval it to get a proper Value got, err := e.Eval(environment.New(nil)) - require.NoError(t, err) + require.NoErrorf(t, err, "eval error at %s:%d\n`%s`", testfile, stmt.ExprLine, stmt.Expr) // finally, compare those two - require.Equal(t, want, got) + require.Equalf(t, want, got, "assertion error at %s:%d", testfile, stmt.ResLine) }) } else { t.Run("NOK "+stmt.Expr, func(t *testing.T) { + t.Helper() // parse the given epxr e, err := parser.NewParser(strings.NewReader(stmt.Expr)).ParseExpr() if err != nil { @@ -175,8 +178,8 @@ func ExprRunner(t *testing.T, testfile string) { } else { // eval it, it should return an error _, err = e.Eval(environment.New(nil)) - require.NotNilf(t, err, "expected expr `%s` to return an error, got nil", stmt.Expr) - require.Regexp(t, regexp.MustCompile(regexp.QuoteMeta(stmt.Res)), err.Error()) + require.NotNilf(t, err, "expected expr to return an error at %s:%\n`%s`, got nil", testfile, stmt.ExprLine, stmt.Expr) + require.Regexpf(t, regexp.MustCompile(regexp.QuoteMeta(stmt.Res)), err.Error(), "expected error message to match at %s:%d", testfile, stmt.ResLine) } }) } diff --git a/internal/testutil/genexprtests/genexprtests.go b/internal/testutil/genexprtests/genexprtests.go index 10c71fc3b..1db277b0c 100644 --- a/internal/testutil/genexprtests/genexprtests.go +++ b/internal/testutil/genexprtests/genexprtests.go @@ -8,9 +8,11 @@ import ( ) type statement struct { - Expr string - Res string - Fail bool + Expr string + ExprLine int + Res string + ResLine int + Fail bool } type test struct { @@ -28,9 +30,10 @@ func Parse(r io.Reader) (*testSuite, error) { var curTest *test var curStmt *statement + lineNum := 0 for s.Scan() { line := strings.TrimSpace(s.Text()) - + lineNum++ switch { case line == "": continue @@ -45,14 +48,16 @@ func Parse(r io.Reader) (*testSuite, error) { case line[0] == '>': text := strings.TrimPrefix(line, "> ") curStmt = &statement{ - Expr: text, + Expr: text, + ExprLine: lineNum, } curTest.Statements = append(curTest.Statements, curStmt) case line[0] == '!': text := strings.TrimPrefix(line, "! ") curStmt = &statement{ - Expr: text, - Fail: true, + Expr: text, + ExprLine: lineNum, + Fail: true, } curTest.Statements = append(curTest.Statements, curStmt) default: @@ -65,6 +70,7 @@ func Parse(r io.Reader) (*testSuite, error) { } else { curStmt.Res = line } + curStmt.ResLine = lineNum } }