Standardize assertion error messages

This commit is contained in:
2022-09-25 20:15:18 +00:00
parent 268e1f341e
commit 85f281e2ed
2 changed files with 29 additions and 22 deletions

View File

@@ -656,6 +656,26 @@ class Helpers {
set: (v:ReaderExp, value:ReaderExp) -> callSymbol("set", [v, value]), set: (v:ReaderExp, value:ReaderExp) -> callSymbol("set", [v, value]),
let: let, let: let,
objectWith: objectWith, objectWith: objectWith,
// Only use within assertion macros
throwAssertionError: () -> {
var failureError = KissError.fromExp(posRef, "").toString(AssertionFail);
var colonsInPrefix = if (Sys.systemName() == "Windows") 5 else 4;
var exps = switch (posRef.def) {
case CallExp(_, exps):
exps;
default:
throw KissError.fromExp(_symbol("throwAssertionError"), "throwAssertionError can only be used in a builder of an assertion macro");
}
var messageExp = if (exps.length > 1) {
exps[1];
} else {
str("");
};
callSymbol("throw", [
callSymbol("kiss.Prelude.runtimeInsertAssertionMessage", [messageExp, str(failureError), int(colonsInPrefix)])
]);
},
// Compile-time only!
throwKissError: (reason:String) -> { throwKissError: (reason:String) -> {
callSymbol("throw", [ callSymbol("throw", [
callSymbol("KissError.fromExpStr", [ callSymbol("KissError.fromExpStr", [

View File

@@ -333,17 +333,11 @@ class Macros {
arraySet(wholeExp, exps, k); arraySet(wholeExp, exps, k);
}; };
k.doc("assert", 1, 2, "(assert <expression> <message>)"); k.doc("assert", 1, 2, "(assert <expression> <?failure message>)");
macros["assert"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> { macros["assert"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
var b = wholeExp.expBuilder(); var b = wholeExp.expBuilder();
var expression = exps[0]; var expression = exps[0];
var failureError = KissError.fromExp(wholeExp, "").toString(AssertionFail);
var colonsInPrefix = if (Sys.systemName() == "Windows") 5 else 4;
var messageExp = if (exps.length > 1) {
exps[1];
} else {
b.str("");
};
var letVal = b.symbol(); var letVal = b.symbol();
b.callSymbol("let", [ b.callSymbol("let", [
b.list([ b.list([
@@ -353,42 +347,35 @@ class Macros {
b.callSymbol("if", [ b.callSymbol("if", [
letVal, letVal,
letVal, letVal,
b.callSymbol("throw", [ b.throwAssertionError()
b.callSymbol("kiss.Prelude.runtimeInsertAssertionMessage", [messageExp, b.str(failureError), b.int(colonsInPrefix)])
])
]) ])
]); ]);
}; };
k.doc("assertThrows", 1, 2, "(assertThrows <expression> <message>)"); k.doc("assertThrows", 1, 2, "(assertThrows <expression> <?failure message>)");
macros["assertThrows"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> { macros["assertThrows"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
var b = wholeExp.expBuilder(); var b = wholeExp.expBuilder();
var expression = exps[0]; var expression = exps[0];
var basicMessage = '${expression.def.toString()} should have thrown an error'; var basicMessage = '${expression.def.toString()} should have thrown an error';
var messageExp = if (exps.length > 1) { var messageExp = b.str(basicMessage);
b.callSymbol("+", [b.str(basicMessage + ": "), exps[1]]);
} else {
b.str(basicMessage);
};
b.callSymbol("try", [ b.callSymbol("try", [
b.begin([expression, b.callSymbol("throw", [messageExp])]), b.begin([expression, b.callSymbol("throw", [messageExp])]),
b.callSymbol("catch", [b.list([b.typed("Dynamic", b.symbol("error"))]), b.callSymbol("catch", [b.list([b.typed("Dynamic", b.symbol("error"))]),
b.callSymbol("if", [b.callSymbol("=", [b.symbol("error"), messageExp]), b.callSymbol("if", [b.callSymbol("=", [b.symbol("error"), messageExp]),
b.callSymbol("throw", [messageExp]), b.throwAssertionError(),
b.symbol("true")])]) b.symbol("true")])])
]); ]);
}; };
k.doc("assertThrowsAtCompileTime", 1, 2, "(assertThrowsAtCompileTime <expression> <message>)"); k.doc("assertThrowsAtCompileTime", 1, 2, "(assertThrowsAtCompileTime <expression> <?failure message>)");
macros["assertThrowsAtCompileTime"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> { macros["assertThrowsAtCompileTime"] = (wholeExp:ReaderExp, exps:Array<ReaderExp>, k:KissState) -> {
var b = wholeExp.expBuilder(); var b = wholeExp.expBuilder();
try { try {
k.convert(exps[0]); k.convert(exps[0]);
b.throwAssertionError();
} catch (e) { } catch (e) {
return b.none(); b.none();
} }
throw KissError.fromExp(wholeExp, "expression compiled successfully when it was supposed to throw a compiler error");
}; };
function stringsThatMatch(exp:ReaderExp, formName:String) { function stringsThatMatch(exp:ReaderExp, formName:String) {