Skip to content

Commit

Permalink
Improve failures readability when testing exprs (#426)
Browse files Browse the repository at this point in the history
  • Loading branch information
jhchabran authored Jul 30, 2021
1 parent 66b8723 commit 402b5a6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 16 deletions.
21 changes: 12 additions & 9 deletions internal/testutil/expr.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package testutil

import (
"os"
"path/filepath"
"regexp"
"strings"
"testing"
Expand Down Expand Up @@ -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, ".")
Expand All @@ -144,39 +143,43 @@ 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 {
require.Regexp(t, regexp.MustCompile(regexp.QuoteMeta(stmt.Res)), err.Error())
} 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)
}
})
}
Expand Down
20 changes: 13 additions & 7 deletions internal/testutil/genexprtests/genexprtests.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand All @@ -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:
Expand All @@ -65,6 +70,7 @@ func Parse(r io.Reader) (*testSuite, error) {
} else {
curStmt.Res = line
}
curStmt.ResLine = lineNum
}
}

Expand Down

0 comments on commit 402b5a6

Please sign in to comment.