diff --git a/builtins_test.go b/builtins_test.go index ee72939..6e2aa60 100644 --- a/builtins_test.go +++ b/builtins_test.go @@ -2,6 +2,7 @@ package fejkdata import ( "encoding/base64" + "fmt" "regexp" "strconv" "strings" @@ -217,8 +218,8 @@ func TestArgGuardsPanic(t *testing.T) { func mustPanic(t *testing.T, name string, call func()) { t.Helper() defer func() { - if recover() == nil { - t.Errorf("%s: no panic, want the invariant reported", name) + if r := recover(); r == nil || !strings.HasPrefix(fmt.Sprint(r), "fejkdata: internal error: ") { + t.Errorf("%s: recovered %v, want the invariant reported as an internal error", name, r) } }() call() diff --git a/naming_test.go b/naming_test.go index f73e58b..b7c3e38 100644 --- a/naming_test.go +++ b/naming_test.go @@ -24,6 +24,27 @@ func TestNoFunctionSpellsAMethod(t *testing.T) { } } +func TestEveryPanicIsAnInternalError(t *testing.T) { + fset, files := sourceFiles(t) + for _, f := range files { + ast.Inspect(f, func(n ast.Node) bool { + call, isCall := n.(*ast.CallExpr) + if !isCall || !isIdent(call.Fun, "panic") { + return true + } + if arg, isArgCall := call.Args[0].(*ast.CallExpr); !isArgCall || !isIdent(arg.Fun, "internalError") { + t.Errorf("%s: panic with internalError(…), so every invariant break greps to one phrase", fset.Position(call.Pos())) + } + return true + }) + } +} + +func isIdent(e ast.Expr, name string) bool { + id, isID := e.(*ast.Ident) + return isID && id.Name == name +} + func namespaceFiles(t *testing.T) []*ast.File { t.Helper() pkg := packageDir(t)