Standardize assertion error messages
This commit is contained in:
@@ -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", [
|
||||||
|
@@ -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) {
|
||||||
|
Reference in New Issue
Block a user