Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve failures readability when testing exprs #426

Merged
merged 1 commit into from
Jul 30, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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{