From 85f281e2ed2e39e5330f3eb0cfaf0a55b08a191a Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sun, 25 Sep 2022 20:15:18 +0000 Subject: [PATCH] Standardize assertion error messages --- kiss/src/kiss/Helpers.hx | 20 ++++++++++++++++++++ kiss/src/kiss/Macros.hx | 31 +++++++++---------------------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/kiss/src/kiss/Helpers.hx b/kiss/src/kiss/Helpers.hx index cbd2e8b5..ffebaedd 100644 --- a/kiss/src/kiss/Helpers.hx +++ b/kiss/src/kiss/Helpers.hx @@ -656,6 +656,26 @@ class Helpers { set: (v:ReaderExp, value:ReaderExp) -> callSymbol("set", [v, value]), let: let, 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) -> { callSymbol("throw", [ callSymbol("KissError.fromExpStr", [ diff --git a/kiss/src/kiss/Macros.hx b/kiss/src/kiss/Macros.hx index 17289809..1870bd3b 100644 --- a/kiss/src/kiss/Macros.hx +++ b/kiss/src/kiss/Macros.hx @@ -333,17 +333,11 @@ class Macros { arraySet(wholeExp, exps, k); }; - k.doc("assert", 1, 2, "(assert )"); + k.doc("assert", 1, 2, "(assert )"); macros["assert"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { var b = wholeExp.expBuilder(); 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(); b.callSymbol("let", [ b.list([ @@ -353,42 +347,35 @@ class Macros { b.callSymbol("if", [ letVal, letVal, - b.callSymbol("throw", [ - b.callSymbol("kiss.Prelude.runtimeInsertAssertionMessage", [messageExp, b.str(failureError), b.int(colonsInPrefix)]) - ]) + b.throwAssertionError() ]) ]); }; - k.doc("assertThrows", 1, 2, "(assertThrows )"); + k.doc("assertThrows", 1, 2, "(assertThrows )"); macros["assertThrows"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { var b = wholeExp.expBuilder(); var expression = exps[0]; var basicMessage = '${expression.def.toString()} should have thrown an error'; - var messageExp = if (exps.length > 1) { - b.callSymbol("+", [b.str(basicMessage + ": "), exps[1]]); - } else { - b.str(basicMessage); - }; + var messageExp = b.str(basicMessage); b.callSymbol("try", [ b.begin([expression, b.callSymbol("throw", [messageExp])]), b.callSymbol("catch", [b.list([b.typed("Dynamic", b.symbol("error"))]), b.callSymbol("if", [b.callSymbol("=", [b.symbol("error"), messageExp]), - b.callSymbol("throw", [messageExp]), + b.throwAssertionError(), b.symbol("true")])]) ]); }; - k.doc("assertThrowsAtCompileTime", 1, 2, "(assertThrowsAtCompileTime )"); + k.doc("assertThrowsAtCompileTime", 1, 2, "(assertThrowsAtCompileTime )"); macros["assertThrowsAtCompileTime"] = (wholeExp:ReaderExp, exps:Array, k:KissState) -> { var b = wholeExp.expBuilder(); try { k.convert(exps[0]); + b.throwAssertionError(); } 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) {