From f4d86da7b4108a0c1215299ea7ea6ffd4d072b0d Mon Sep 17 00:00:00 2001 From: He-Pin Date: Tue, 23 Jun 2026 02:28:00 +0800 Subject: [PATCH] fix: unify and improve error-message quality across sjsonnet Remove redundant "STATIC ERROR:" prefix folding in error messages, unify error formatting across codepaths, and improve clarity of runtime and static error reporting. --- sjsonnet/src/sjsonnet/Error.scala | 14 ++- sjsonnet/src/sjsonnet/Evaluator.scala | 116 +++++++++--------- sjsonnet/src/sjsonnet/Format.scala | 63 +++++----- sjsonnet/src/sjsonnet/Util.scala | 6 +- sjsonnet/src/sjsonnet/Val.scala | 24 ++-- .../src/sjsonnet/stdlib/ArrayModule.scala | 68 ++++++---- .../src/sjsonnet/stdlib/ManifestModule.scala | 48 ++++++-- sjsonnet/src/sjsonnet/stdlib/MathModule.scala | 32 ++--- sjsonnet/src/sjsonnet/stdlib/SetModule.scala | 100 +++++++++------ .../src/sjsonnet/stdlib/StringModule.scala | 51 ++++---- sjsonnet/src/sjsonnet/stdlib/TypeModule.scala | 2 +- .../array_out_of_bounds.jsonnet.golden | 2 +- .../array_out_of_bounds2.jsonnet.golden | 2 +- .../array_out_of_bounds3.jsonnet.golden | 2 +- .../array_out_of_bounds4.jsonnet.golden | 2 +- .../assert_equal4.jsonnet.golden | 3 +- .../assert_equal5.jsonnet.golden | 3 +- .../assert_equal6.jsonnet.golden | 3 +- .../bad_function_call.jsonnet.golden | 2 +- .../bad_index_array.jsonnet.golden | 2 +- .../bad_index_object.jsonnet.golden | 2 +- .../bad_index_string.jsonnet.golden | 2 +- .../go_test_suite/bitwise_and3.jsonnet.golden | 2 +- .../go_test_suite/bitwise_and7.jsonnet.golden | 2 +- .../go_test_suite/bitwise_or9.jsonnet.golden | 2 +- .../bitwise_shift4.jsonnet.golden | 2 +- .../bitwise_shift6.jsonnet.golden | 2 +- .../builtinSplitLimitR5.jsonnet.golden | 2 +- .../builtinSplitLimitR6.jsonnet.golden | 2 +- ...econd_parameter_not_integer.jsonnet.golden | 2 +- ...rd_parameter_less_then_zero.jsonnet.golden | 2 +- ...third_parameter_not_integer.jsonnet.golden | 2 +- .../go_test_suite/builtin_exp3.jsonnet.golden | 2 +- .../go_test_suite/builtin_exp5.jsonnet.golden | 2 +- .../go_test_suite/builtin_log5.jsonnet.golden | 2 +- .../go_test_suite/builtin_log7.jsonnet.golden | 3 +- .../go_test_suite/builtin_log8.jsonnet.golden | 3 +- ...iltin_member_object_invalid.jsonnet.golden | 3 +- .../go_test_suite/div4.jsonnet.golden | 2 +- .../function_too_many_params.jsonnet.golden | 2 +- .../inf_min_number.jsonnet.golden | 2 +- .../inf_mul_number.jsonnet.golden | 2 +- .../inf_sum_number.jsonnet.golden | 2 +- .../go_test_suite/native7.jsonnet.golden | 2 +- .../optional_args11.jsonnet.golden | 2 +- .../optional_args13.jsonnet.golden | 2 +- .../optional_args8.jsonnet.golden | 2 +- .../optional_args9.jsonnet.golden | 2 +- .../go_test_suite/or5.jsonnet.golden | 2 +- .../go_test_suite/or6.jsonnet.golden | 2 +- .../go_test_suite/percent_bad2.jsonnet.golden | 2 +- .../percent_format_str4.jsonnet.golden | 2 +- .../percent_format_str5.jsonnet.golden | 2 +- .../percent_format_str6.jsonnet.golden | 2 +- .../percent_format_str7.jsonnet.golden | 2 +- .../go_test_suite/pow7.jsonnet.golden | 2 +- .../std.codepoint3.jsonnet.golden | 2 +- .../std.codepoint6.jsonnet.golden | 3 +- .../std.codepoint7.jsonnet.golden | 2 +- .../go_test_suite/std.join7.jsonnet.golden | 2 +- .../go_test_suite/std.join8.jsonnet.golden | 2 +- .../std.makeArrayNamed3.jsonnet.golden | 2 +- .../std.makeArray_noninteger.jsonnet.golden | 2 +- ...td.makeArray_noninteger_big.jsonnet.golden | 2 +- .../std.maxArrayOnEmpty.jsonnet.golden | 2 +- .../std.minArrayOnEmpty.jsonnet.golden | 2 +- .../string_index_negative.jsonnet.golden | 2 +- .../string_index_out_of_bounds.jsonnet.golden | 2 +- ...rithmetic_overflow_addition.jsonnet.golden | 2 +- ...tic_overflow_multiplication.jsonnet.golden | 2 +- ...hmetic_overflow_subtraction.jsonnet.golden | 2 +- ...y_function_element_equality.jsonnet.golden | 2 +- ...tco_and_tailcall_bool_check.jsonnet.golden | 4 +- .../error.auto_tco_bool_check.jsonnet.golden | 2 +- ..._precedes_outer_error_value.jsonnet.golden | 4 +- ...tco_nested_bool_check_order.jsonnet.golden | 4 +- ..._tco_or_tailcall_bool_check.jsonnet.golden | 4 +- ....equality_function_in_array.jsonnet.golden | 2 +- ...equality_function_in_object.jsonnet.golden | 2 +- .../error.format_c_boolean.jsonnet.golden | 2 +- ....format_c_invalid_codepoint.jsonnet.golden | 2 +- ...format_c_negative_codepoint.jsonnet.golden | 2 +- ...format_object_asterisk_prec.jsonnet.golden | 2 +- ...ormat_object_asterisk_width.jsonnet.golden | 2 +- ...shift_large_amount_overflow.jsonnet.golden | 2 +- .../error.math_acos_nan.jsonnet.golden | 1 + .../error.math_asin_nan.jsonnet.golden | 1 + .../error.math_pow_nan.jsonnet.golden | 1 + ...rror.range_non_integer_from.jsonnet.golden | 2 +- .../error.range_non_integer_to.jsonnet.golden | 2 +- ...ror.removeAt_negative_index.jsonnet.golden | 2 +- ...rror.removeAt_out_of_bounds.jsonnet.golden | 2 +- ...or.repeat_non_integer_count.jsonnet.golden | 2 +- ...litlimit_negative_maxsplits.jsonnet.golden | 2 +- ...limit_non_integer_maxsplits.jsonnet.golden | 2 +- ...itlimitr_negative_maxsplits.jsonnet.golden | 2 +- ...ror.std.flatmap_string_null.jsonnet.golden | 3 +- ...rror.array_fractional_index.jsonnet.golden | 2 +- .../error.array_index_string.jsonnet.golden | 2 +- .../error.array_large_index.jsonnet.golden | 2 +- .../error.assert_equal_obj.jsonnet.golden | 3 +- .../error.assert_equal_str.jsonnet.golden | 3 +- .../error.decodeUTF8_float.jsonnet.golden | 3 +- .../error.decodeUTF8_nan.jsonnet.golden | 3 +- .../error.equality_function.jsonnet.golden | 2 +- ...ror.flatMap_array_typecheck.jsonnet.golden | 2 +- ...error.flatMap_seq_typecheck.jsonnet.golden | 2 +- ...or.flatMap_string_typecheck.jsonnet.golden | 2 +- ...error.format.too_few_values.jsonnet.golden | 2 +- ...rror.function_duplicate_arg.jsonnet.golden | 2 +- ...ror.function_no_default_arg.jsonnet.golden | 2 +- .../error.integer_conversion.jsonnet.golden | 2 +- .../error.integer_left_shift.jsonnet.golden | 2 +- ....integer_left_shift_runtime.jsonnet.golden | 2 +- .../error.negative_shfit.jsonnet.golden | 2 +- .../test_suite/error.overflow2.jsonnet.golden | 2 +- .../test_suite/error.sanity.jsonnet.golden | 3 +- .../error.std_join_types1.jsonnet.golden | 2 +- .../error.std_join_types2.jsonnet.golden | 2 +- ...rror.std_makeArray_negative.jsonnet.golden | 2 +- .../error.std_maxArray.jsonnet.golden | 2 +- .../error.std_minArray.jsonnet.golden | 2 +- .../error.top_level_func.jsonnet.golden | 2 +- .../error.trace_one_param.jsonnet.golden | 2 +- .../error.trace_zero_param.jsonnet.golden | 2 +- .../AggressiveStaticOptimizationTests.scala | 4 +- .../test/src/sjsonnet/EvaluatorTests.scala | 40 +++--- .../test/src/sjsonnet/StdFlatMapTests.scala | 4 +- .../StdLibOfficialCompatibilityTests.scala | 9 +- sjsonnet/test/src/sjsonnet/StdMathTests.scala | 18 +-- .../sjsonnet/TailCallOptimizationTests.scala | 2 +- .../src/sjsonnet/UnicodeHandlingTests.scala | 2 +- 132 files changed, 469 insertions(+), 380 deletions(-) diff --git a/sjsonnet/src/sjsonnet/Error.scala b/sjsonnet/src/sjsonnet/Error.scala index 8dc2b9480..d13fb5381 100644 --- a/sjsonnet/src/sjsonnet/Error.scala +++ b/sjsonnet/src/sjsonnet/Error.scala @@ -145,7 +145,8 @@ object Error { var frameStart = 0 // Collapse innermost frame name into message when flagged, hiding it from "at" lines if (frames.size > 0 && rawFrames(0).collapseIntoMessage) { - msg = "[" + frames.get(0)._2 + "] " + msg + val name = frames.get(0)._2 + msg = "[" + name + "] " + stripDuplicateMessagePrefix(msg, name) frameStart = 1 } @@ -186,6 +187,17 @@ object Error { name.startsWith("std.") || name == "default" || name == "object comprehension" || name == "array comprehension" + private def stripDuplicateMessagePrefix(msg: String, name: String): String = { + if (name == null || !msg.startsWith(name) || msg.length <= name.length) msg + else { + msg.charAt(name.length) match { + case ':' => msg.substring(name.length + 1).stripPrefix(" ") + case ' ' => msg.substring(name.length + 1) + case _ => msg + } + } + } + private def appendFrame(sb: StringBuilder, f: Frame, name: String): Unit = { sb.append("\n at [").append(name).append("]") if (f.pos != null) { diff --git a/sjsonnet/src/sjsonnet/Evaluator.scala b/sjsonnet/src/sjsonnet/Evaluator.scala index 046274f5c..43bca3ee8 100644 --- a/sjsonnet/src/sjsonnet/Evaluator.scala +++ b/sjsonnet/src/sjsonnet/Evaluator.scala @@ -309,7 +309,7 @@ class Evaluator( def visitSelect(e: Select)(implicit scope: ValScope): Val = visitExpr(e.value) match { case obj: Val.Obj => obj.value(e.name, e.pos) - case r => Error.fail(s"attempted to index a ${r.prettyName} with string ${e.name}", e.pos) + case r => Error.fail(s"Attempted to index a ${r.prettyName} with string ${e.name}", e.pos) } def visitLocalExpr(e: LocalExpr)(implicit scope: ValScope): Val = { @@ -712,29 +712,29 @@ class Evaluator( (op: @switch) match { case Expr.BinaryOp.OP_+ => val r = ld + rd - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos) + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, r) case Expr.BinaryOp.OP_- => val r = ld - rd - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos) + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, r) case Expr.BinaryOp.OP_* => val r = ld * rd - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos) + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, r) case Expr.BinaryOp.OP_/ => if (rd == 0) Error.fail("Division by zero.", pos) val r = ld / rd - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos) + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, r) case Expr.BinaryOp.OP_% => if (rd == 0) Error.fail("Division by zero.", pos) val r = ld % rd - if (r.isNaN) Error.fail("not a number", pos) + if (r.isNaN) Error.fail("Not a number", pos) Val.cachedNum(pos, r) // Use position-free static singletons for boolean results — this method is only called // from comprehension fast paths where position info on boolean results is unnecessary. @@ -747,13 +747,13 @@ class Evaluator( case Expr.BinaryOp.OP_!= => Val.bool(ld != rd) case Expr.BinaryOp.OP_<< => val ll = ld.toSafeLong(pos); val rr = rd.toSafeLong(pos) - if (rr < 0) Error.fail("shift by negative exponent", pos) + if (rr < 0) Error.fail("Shift by negative exponent", pos) if (rr >= 1 && math.abs(ll) >= (1L << (63 - rr))) - Error.fail("numeric value outside safe integer range for bitwise operation", pos) + Error.fail("Numeric value outside safe integer range for bitwise operation", pos) Val.cachedNum(pos, (ll << rr).toDouble) case Expr.BinaryOp.OP_>> => val ll = ld.toSafeLong(pos); val rr = rd.toSafeLong(pos) - if (rr < 0) Error.fail("shift by negative exponent", pos) + if (rr < 0) Error.fail("Shift by negative exponent", pos) Val.cachedNum(pos, (ll >> rr).toDouble) case Expr.BinaryOp.OP_& => Val.cachedNum(pos, (ld.toSafeLong(pos) & rd.toSafeLong(pos)).toDouble) @@ -871,40 +871,40 @@ class Evaluator( (e.op: @switch) match { case Expr.BinaryOp.OP_* => val r = visitExprAsDouble(e.lhs) * visitExprAsDouble(e.rhs) - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos); r + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos); r case Expr.BinaryOp.OP_/ => val l = visitExprAsDouble(e.lhs) val r = visitExprAsDouble(e.rhs) if (r == 0) Error.fail("Division by zero.", pos) val result = l / r - if (result.isNaN) Error.fail("not a number", pos) - if (result.isInfinite) Error.fail("overflow", pos); result + if (result.isNaN) Error.fail("Not a number", pos) + if (result.isInfinite) Error.fail("Overflow", pos); result case Expr.BinaryOp.OP_% => val l = visitExprAsDouble(e.lhs) val r = visitExprAsDouble(e.rhs) if (r == 0) Error.fail("Division by zero.", pos) val result = l % r - if (result.isNaN) Error.fail("not a number", pos); result + if (result.isNaN) Error.fail("Not a number", pos); result case Expr.BinaryOp.OP_+ => val r = visitExprAsDouble(e.lhs) + visitExprAsDouble(e.rhs) - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos); r + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos); r case Expr.BinaryOp.OP_- => val r = visitExprAsDouble(e.lhs) - visitExprAsDouble(e.rhs) - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos); r + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos); r case Expr.BinaryOp.OP_<< => val ll = visitExprAsDouble(e.lhs).toSafeLong(pos) val rr = visitExprAsDouble(e.rhs).toSafeLong(pos) - if (rr < 0) Error.fail("shift by negative exponent", pos) + if (rr < 0) Error.fail("Shift by negative exponent", pos) if (rr >= 1 && math.abs(ll) >= (1L << (63 - rr))) - Error.fail("numeric value outside safe integer range for bitwise operation", pos) + Error.fail("Numeric value outside safe integer range for bitwise operation", pos) (ll << rr).toDouble case Expr.BinaryOp.OP_>> => val ll = visitExprAsDouble(e.lhs).toSafeLong(pos) val rr = visitExprAsDouble(e.rhs).toSafeLong(pos) - if (rr < 0) Error.fail("shift by negative exponent", pos) + if (rr < 0) Error.fail("Shift by negative exponent", pos) (ll >> rr).toDouble case Expr.BinaryOp.OP_& => (visitExprAsDouble(e.lhs).toSafeLong(pos) & visitExprAsDouble(e.rhs).toSafeLong( @@ -1220,36 +1220,36 @@ class Evaluator( rhs match { case i: Val.Num => val int = i.asPositiveInt - if (v.length == 0) Error.fail("array bounds error: array is empty", pos) + if (v.length == 0) Error.fail("Array bounds error: array is empty", pos) if (int >= v.length) - Error.fail(s"array bounds error: $int not within [0, ${v.length})", pos) + Error.fail(s"Array bounds error: $int not within [0, ${v.length})", pos) v.value(int) case _ => - Error.fail(s"attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) + Error.fail(s"Attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) } case v: Val.Str => rhs match { case i: Val.Num => val int = i.asPositiveInt val str = v.str - if (str.isEmpty) Error.fail("string bounds error: string is empty", pos) + if (str.isEmpty) Error.fail("String bounds error: string is empty", pos) val unicodeLength = str.codePointCount(0, str.length) if (int >= unicodeLength) - Error.fail(s"string bounds error: $int not within [0, $unicodeLength)", pos) + Error.fail(s"String bounds error: $int not within [0, $unicodeLength)", pos) val startUtf16 = if (int == 0) 0 else str.offsetByCodePoints(0, int) val endUtf16 = str.offsetByCodePoints(startUtf16, 1) Val.Str(pos, str.substring(startUtf16, endUtf16)) case _ => - Error.fail(s"attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) + Error.fail(s"Attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) } case v: Val.Obj => rhs match { case i: Val.Str => v.value(i.str, pos) case _ => - Error.fail(s"attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) + Error.fail(s"Attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) } case _ => - Error.fail(s"attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) + Error.fail(s"Attempted to index a ${lhs.prettyName} with ${rhs.prettyName}", pos) } } @@ -1315,12 +1315,12 @@ class Evaluator( case b: Val.Bool => b case unknown => - Error.fail(s"binary operator && does not operate on ${unknown.prettyName}s.", e.pos) + Error.fail(s"Binary operator && does not operate on ${unknown.prettyName}s.", e.pos) } case _: Val.False => Val.staticFalse case unknown => - Error.fail(s"binary operator && does not operate on ${unknown.prettyName}s.", e.pos) + Error.fail(s"Binary operator && does not operate on ${unknown.prettyName}s.", e.pos) } } @@ -1331,10 +1331,10 @@ class Evaluator( visitExpr(e.rhs) match { case b: Val.Bool => b case unknown => - Error.fail(s"binary operator || does not operate on ${unknown.prettyName}s.", e.pos) + Error.fail(s"Binary operator || does not operate on ${unknown.prettyName}s.", e.pos) } case unknown => - Error.fail(s"binary operator || does not operate on ${unknown.prettyName}s.", e.pos) + Error.fail(s"Binary operator || does not operate on ${unknown.prettyName}s.", e.pos) } } @@ -1353,21 +1353,21 @@ class Evaluator( // Pure numeric fast path: avoid intermediate Val.Num allocation case Expr.BinaryOp.OP_* => val r = visitExprAsDouble(e.lhs) * visitExprAsDouble(e.rhs) - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos) + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, r) case Expr.BinaryOp.OP_- => val r = visitExprAsDouble(e.lhs) - visitExprAsDouble(e.rhs) - if (r.isNaN) Error.fail("not a number", pos) - if (r.isInfinite) Error.fail("overflow", pos) + if (r.isNaN) Error.fail("Not a number", pos) + if (r.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, r) case Expr.BinaryOp.OP_/ => val l = visitExprAsDouble(e.lhs) val r = visitExprAsDouble(e.rhs) if (r == 0) Error.fail("Division by zero.", pos) val result = l / r - if (result.isNaN) Error.fail("not a number", pos) - if (result.isInfinite) Error.fail("overflow", pos) + if (result.isNaN) Error.fail("Not a number", pos) + if (result.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, result) // Polymorphic ops: nested match avoids Tuple2 allocation; Num checked first (most common) case Expr.BinaryOp.OP_% => @@ -1379,7 +1379,7 @@ class Evaluator( case Val.Num(_, rd) => if (rd == 0) Error.fail("Division by zero.", pos) val result = ld % rd - if (result.isNaN) Error.fail("not a number", pos) + if (result.isNaN) Error.fail("Not a number", pos) Val.cachedNum(pos, result) case _ => failBinOp(l, e.op, r, pos) } @@ -1393,8 +1393,8 @@ class Evaluator( (l, r) match { case (Val.Num(_, l), Val.Num(_, r)) => val result = l + r - if (result.isNaN) Error.fail("not a number", pos) - if (result.isInfinite) Error.fail("overflow", pos) + if (result.isNaN) Error.fail("Not a number", pos) + if (result.isInfinite) Error.fail("Overflow", pos) Val.cachedNum(pos, result) case (l: Val.Str, r: Val.Str) => Val.Str.concat(pos, l, r) case (n: Val.Num, r: Val.Str) => @@ -1414,17 +1414,17 @@ class Evaluator( case Expr.BinaryOp.OP_<< => val ll = visitExprAsDouble(e.lhs).toSafeLong(pos) val rr = visitExprAsDouble(e.rhs).toSafeLong(pos) - if (rr < 0) Error.fail("shift by negative exponent", pos) + if (rr < 0) Error.fail("Shift by negative exponent", pos) val masked = (rr % 64).toInt if (masked >= 1 && math.abs(ll) >= (1L << (63 - masked))) - Error.fail("numeric value outside safe integer range for bitwise operation", pos) + Error.fail("Numeric value outside safe integer range for bitwise operation", pos) else Val.cachedNum(pos, (ll << masked).toDouble) case Expr.BinaryOp.OP_>> => val ll = visitExprAsDouble(e.lhs).toSafeLong(pos) val rr = visitExprAsDouble(e.rhs).toSafeLong(pos) - if (rr < 0) Error.fail("shift by negative exponent", pos) + if (rr < 0) Error.fail("Shift by negative exponent", pos) Val.cachedNum(pos, (ll >> rr).toDouble) // Comparison ops: polymorphic (Num/Str/Arr) @@ -1489,14 +1489,14 @@ class Evaluator( val l = visitExpr(e.lhs) val r = visitExpr(e.rhs) if (l.isInstanceOf[Val.Func] && r.isInstanceOf[Val.Func]) - Error.fail("cannot test equality of functions", pos) + Error.fail("Cannot test equality of functions", pos) Val.bool(equal(l, r)) case Expr.BinaryOp.OP_!= => val l = visitExpr(e.lhs) val r = visitExpr(e.rhs) if (l.isInstanceOf[Val.Func] && r.isInstanceOf[Val.Func]) - Error.fail("cannot test equality of functions", pos) + Error.fail("Cannot test equality of functions", pos) Val.bool(!equal(l, r)) // Bitwise ops: pure numeric with safe-integer range check @@ -1578,7 +1578,7 @@ class Evaluator( case b: Val.Bool => b case tc: TailCall => tc.withBooleanCheck(isAnd = true, andPos) case unknown => - Error.fail(s"binary operator && does not operate on ${unknown.prettyName}s.", andPos) + Error.fail(s"Binary operator && does not operate on ${unknown.prettyName}s.", andPos) } } @@ -1587,7 +1587,7 @@ class Evaluator( case b: Val.Bool => b case tc: TailCall => tc.withBooleanCheck(isAnd = false, orPos) case unknown => - Error.fail(s"binary operator || does not operate on ${unknown.prettyName}s.", orPos) + Error.fail(s"Binary operator || does not operate on ${unknown.prettyName}s.", orPos) } } @@ -1660,7 +1660,7 @@ class Evaluator( case _: Val.True => visitAndRhsTailPos(e.rhs, e.pos) case _: Val.False => Val.staticFalse case unknown => - Error.fail(s"binary operator && does not operate on ${unknown.prettyName}s.", e.pos) + Error.fail(s"Binary operator && does not operate on ${unknown.prettyName}s.", e.pos) } case e: Or => // rhs of || is in tail position: when lhs is false, rhs is returned directly. @@ -1669,7 +1669,7 @@ class Evaluator( case _: Val.True => Val.staticTrue case _: Val.False => visitOrRhsTailPos(e.rhs, e.pos) case unknown => - Error.fail(s"binary operator || does not operate on ${unknown.prettyName}s.", e.pos) + Error.fail(s"Binary operator || does not operate on ${unknown.prettyName}s.", e.pos) } case e: Expr.Error => visitErrorValueTailPos(e.value, e.pos) @@ -2128,7 +2128,7 @@ class Evaluator( def equal(x: Val, y: Val): Boolean = ((x eq y) && !x.isInstanceOf[Val.Func]) || (x match { case _: Val.Func => - if (y.isInstanceOf[Val.Func]) Error.fail("cannot test equality of functions") + if (y.isInstanceOf[Val.Func]) Error.fail("Cannot test equality of functions") false case _: Val.True => y.isInstanceOf[Val.True] case _: Val.False => y.isInstanceOf[Val.False] @@ -2160,7 +2160,7 @@ class Evaluator( if (!equal(xe.value, ye.value)) return false } else { val v = xe.value - if (v.isInstanceOf[Val.Func]) Error.fail("cannot test equality of functions") + if (v.isInstanceOf[Val.Func]) Error.fail("Cannot test equality of functions") // else: shared non-Func value, elements are equal } i += 1 @@ -2198,7 +2198,7 @@ object Evaluator { implicit class SafeDoubleOps(private val d: Double) extends AnyVal { @inline def toSafeLong(pos: Position)(implicit ev: EvalErrorScope): Long = { if (d < Val.DOUBLE_MIN_SAFE_INTEGER || d > Val.DOUBLE_MAX_SAFE_INTEGER) - Error.fail("numeric value outside safe integer range for bitwise operation", pos) + Error.fail("Numeric value outside safe integer range for bitwise operation", pos) d.toLong } } diff --git a/sjsonnet/src/sjsonnet/Format.scala b/sjsonnet/src/sjsonnet/Format.scala index 837b642d7..46063e248 100644 --- a/sjsonnet/src/sjsonnet/Format.scala +++ b/sjsonnet/src/sjsonnet/Format.scala @@ -620,7 +620,7 @@ object Format { case _ => if (valuesArr != null && i >= valuesArr.length) { Error.fail( - "Too few values to format: %d, expected at least %d".format( + "too few values to format: %d, expected at least %d".format( valuesArr.length, i + 1 ) @@ -629,7 +629,8 @@ object Format { val key = if (labels == null) null else labels(idx) val raw = if (key == null) { - if (valuesArr == null) Error.fail("Invalid format values") + if (valuesArr == null) + Error.fail("format values must be an array or object") // Fast path: skip star checks when format has no * specifiers if (!parsed.hasAnyStar) valuesArr.value(i) else @@ -639,10 +640,7 @@ object Format { val width = valuesArr.value(i) if (!width.isInstanceOf[Val.Num]) { Error.fail( - "A * was specified at position %d. An integer is expected for a width" - .format( - idx - ) + "* width at position %d requires an integer".format(idx) ) } i += 1 @@ -652,8 +650,7 @@ object Format { val precision = valuesArr.value(i) if (!precision.isInstanceOf[Val.Num]) { Error.fail( - "A * was specified at position %d. An integer is expected for a precision" - .format(idx) + "* precision at position %d requires an integer".format(idx) ) } i += 1 @@ -663,18 +660,14 @@ object Format { val width = valuesArr.value(i) if (!width.isInstanceOf[Val.Num]) { Error.fail( - "A * was specified at position %d. An integer is expected for a width" - .format( - idx - ) + "* width at position %d requires an integer".format(idx) ) } i += 1 val precision = valuesArr.value(i) if (!precision.isInstanceOf[Val.Num]) { Error.fail( - "A * was specified at position %d. An integer is expected for a precision" - .format(idx) + "* precision at position %d requires an integer".format(idx) ) } i += 1 @@ -683,12 +676,12 @@ object Format { } } else { if (formatted.widthStar) - Error.fail("Cannot use * width with object.", pos) + Error.fail("cannot use * width with named format", pos) if (formatted.precisionStar) - Error.fail("Cannot use * precision with object.", pos) + Error.fail("cannot use * precision with named format", pos) if (valuesArr != null) valuesArr.value(i) else if (valuesObj != null) valuesObj.value(key, pos) - else Error.fail("Invalid format values") + else Error.fail("format values must be an array or object") } // Direct Val dispatch: skip Materializer for common types (Str, Num, Bool, Null). // This avoids the overhead of materializing to ujson.Value and then matching on it, @@ -697,10 +690,12 @@ object Format { if (resultAsciiSafe && !specOutputAsciiSafe(rawVal, formatted.conversion)) resultAsciiSafe = false val formattedValue = rawVal match { - case f: Val.Func => Error.fail("Cannot format function value", f) + case f: Val.Func => Error.fail("cannot format function value", f) case vs: Val.Str => if (formatted.conversion != 's' && formatted.conversion != 'c') - Error.fail("Format required a number at %d, got string".format(i)) + Error.fail( + "expected number at position %d, got string".format(i) + ) widenRaw(formatted, vs.str) case vn: Val.Num => val s = vn.asDouble @@ -717,15 +712,17 @@ object Format { case 'c' => val codePoint = s.toInt if (codePoint < 0) - Error.fail("Codepoints must be >= 0, got " + codePoint) + Error.fail("codepoints must be >= 0, got " + codePoint) if (codePoint > 0x10ffff) - Error.fail("Invalid unicode codepoint, got " + codePoint) + Error.fail("invalid unicode codepoint, got " + codePoint) val c = if (codePoint >= 0xd800 && codePoint <= 0xdfff) 0xfffd else codePoint widenRaw(formatted, Character.toString(c)) case 's' => widenRaw(formatted, RenderUtils.renderDouble(s)) case _ => - Error.fail("Format required a %s at %d, got number".format(rawVal.prettyName, i)) + Error.fail( + "unsupported format conversion at position %d, got number".format(i) + ) } case _: Val.True => val b = 1 @@ -740,10 +737,12 @@ object Format { case 'g' => formatGeneric(formatted, b).toLowerCase case 'G' => formatGeneric(formatted, b) case 'c' => - Error.fail("%c expected number / string, got: boolean") + Error.fail("%c expected number or string, got boolean") case 's' => widenRaw(formatted, "true") case _ => - Error.fail("Format required a %s at %d, got boolean".format(rawVal.prettyName, i)) + Error.fail( + "expected number or string at position %d, got boolean".format(i) + ) } case _: Val.False => val b = 0 @@ -758,17 +757,21 @@ object Format { case 'g' => formatGeneric(formatted, b).toLowerCase case 'G' => formatGeneric(formatted, b) case 'c' => - Error.fail("%c expected number / string, got: boolean") + Error.fail("%c expected number or string, got boolean") case 's' => widenRaw(formatted, "false") case _ => - Error.fail("Format required a %s at %d, got boolean".format(rawVal.prettyName, i)) + Error.fail( + "expected number or string at position %d, got boolean".format(i) + ) } case _: Val.Null => formatted.conversion match { case 's' => widenRaw(formatted, "null") - case 'c' => Error.fail("%c expected number / string, got: null") + case 'c' => Error.fail("%c expected number or string, got null") case _ => - Error.fail("Format required number at %d, got null".format(i)) + Error.fail( + "expected number or string at position %d, got null".format(i) + ) } case _ => // Complex types (Arr, Obj): materialize via Renderer @@ -792,7 +795,7 @@ object Format { if (valuesArr != null && i < valuesArr.length) { Error.fail( - "Too many values to format: %d, expected %d".format(valuesArr.length, i) + "too many values to format: %d, expected %d".format(valuesArr.length, i) ) } val resultStr = if (singleSpecNoStatic) singleFormatted else output.toString() @@ -910,7 +913,7 @@ object Format { case _: Val.True => "true" case _: Val.False => "false" case _: Val.Null => "null" - case f: Val.Func => Error.fail("Cannot format function value", f) + case f: Val.Func => Error.fail("cannot format function value", f) case other => // Complex types: materialize via Renderer val value = other match { diff --git a/sjsonnet/src/sjsonnet/Util.scala b/sjsonnet/src/sjsonnet/Util.scala index dbf353570..70926d089 100644 --- a/sjsonnet/src/sjsonnet/Util.scala +++ b/sjsonnet/src/sjsonnet/Util.scala @@ -69,9 +69,9 @@ object Util { case Some(d) => val s = asSliceInt(d, "step") if (s < 0) { - Error.fail(s"got [$start:$end:$s] but negative steps are not supported", pos)(ev) + Error.fail(s"Got [$start:$end:$s] but negative steps are not supported", pos)(ev) } else if (s == 0) { - Error.fail(s"got $s but step must be greater than 0", pos)(ev) + Error.fail(s"Got $s but step must be greater than 0", pos)(ev) } s } @@ -199,7 +199,7 @@ object Util { case _: Val.Func | _: Val.Obj | _: Val.Bool => Error.fail("Values of type " + t1 + " are not comparable.") case _: Val.Null => - Error.fail("binary operator < does not operate on null.") + Error.fail("Binary operator < does not operate on null.") case _ => val cmp = ev.compare(v1, v2) if (cmp < 0) -1 else if (cmp > 0) 1 else 0 diff --git a/sjsonnet/src/sjsonnet/Val.scala b/sjsonnet/src/sjsonnet/Val.scala index 65fbc557f..b5d1ae627 100644 --- a/sjsonnet/src/sjsonnet/Val.scala +++ b/sjsonnet/src/sjsonnet/Val.scala @@ -469,7 +469,7 @@ object Val { } final case class Num(var pos: Position, private val num: Double) extends Literal { if (num.isInfinite) { - Error.fail("overflow") + Error.fail("Overflow") } def prettyName = "number" @@ -486,11 +486,11 @@ object Val { def asPositiveInt: Int = { if (!num.isWhole || !num.isValidInt) { - Error.fail("index value is not a valid integer") + Error.fail("Index value is not a valid integer") } if (num.toInt < 0) { - Error.fail("index value is not a positive integer, got: " + num.toInt) + Error.fail("Index value is not a positive integer, got: " + num.toInt) } num.toInt } @@ -499,18 +499,18 @@ object Val { def asSafeLong: Long = { if (num.isInfinite || num.isNaN) { - Error.fail("numeric value is not finite") + Error.fail("Numeric value is not finite") } if (num < DOUBLE_MIN_SAFE_INTEGER || num > DOUBLE_MAX_SAFE_INTEGER) { - Error.fail("numeric value outside safe integer range for bitwise operation") + Error.fail("Numeric value outside safe integer range for bitwise operation") } num.toLong } override def asDouble: Double = { if (num.isNaN) { - Error.fail("not a number") + Error.fail("Not a number") } num } @@ -719,7 +719,7 @@ object Val { val leftLen = this.length val rhsLen = rhs.length val totalLenLong = leftLen.toLong + rhsLen.toLong - if (totalLenLong > Int.MaxValue) Error.fail("array too large") + if (totalLenLong > Int.MaxValue) Error.fail("Array too large") val totalLen = totalLenLong.toInt // Use lazy concat when the result is large enough that avoiding the // arraycopy is worthwhile. Limit to depth-1 (neither side is a concat view) @@ -935,7 +935,7 @@ object Val { // materialize later anyway; eagerly copying here multiplies thunks and stresses young-gen GC. private val sourceLen = source.length private val totalLen = sourceLen.toLong * count.toLong - if (totalLen > Int.MaxValue) throw new IllegalArgumentException("array too large") + if (totalLen > Int.MaxValue) throw new IllegalArgumentException("Array too large") _length = totalLen.toInt override def value(i: Int): Val = @@ -2633,13 +2633,13 @@ object Val { val idx = params.paramMap.getOrElse( namedNames(i), Error.fail( - s"has no parameter ${namedNames(i)}", + s"Has no parameter ${namedNames(i)}", outerPos ) ) if (argVals(base + idx) != null) Error.fail( - s"binding parameter a second time: ${namedNames(i)}$functionNameSuffix", + s"Binding parameter a second time: ${namedNames(i)}$functionNameSuffix", outerPos ) argVals(base + idx) = argsL(j) @@ -2672,7 +2672,7 @@ object Val { if (missing != null) { val plural = if (missing.size > 1) "s" else "" Error.fail( - s"parameter$plural ${missing.mkString(", ")} not bound in call", + s"Parameter$plural ${missing.mkString(", ")} not bound in call", outerPos ) } @@ -3055,7 +3055,7 @@ object TailCall { case unknown => val op = if (booleanIsAnd) "&&" else "||" Error.fail( - s"binary operator $op does not operate on ${unknown.prettyName}s.", + s"Binary operator $op does not operate on ${unknown.prettyName}s.", booleanPos ) } diff --git a/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala b/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala index bc4939c89..a64aaae31 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ArrayModule.scala @@ -47,9 +47,11 @@ object ArrayModule extends AbstractFunctionModule { @inline private def isDefaultOnEmpty(v: Val): Boolean = v.asInstanceOf[AnyRef] eq DefaultOnEmpty - private def validateKeyF(keyF: Val, pos: Position)(implicit ev: EvalErrorScope): Unit = { + private def validateKeyF(callerName: String, keyF: Val, pos: Position)(implicit + ev: EvalErrorScope + ): Unit = { if (!isDefaultKeyF(keyF) && !keyF.isInstanceOf[Val.Func]) - Error.fail("keyF must be a function, got " + keyF.prettyName, pos) + Error.fail(s"keyF must be a function, got ${keyF.prettyName}", pos) } private def applyArrayKey(keyF: Val, elem: Val, pos: Position, ev: EvalScope): Val = @@ -180,11 +182,11 @@ object ArrayModule extends AbstractFunctionModule { override def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = { val arr = args(0).value.asArr val keyF = args(1).value - validateKeyF(keyF, pos)(ev) + validateKeyF("minArray", keyF, pos)(ev) if (arr.length == 0) { val onEmpty = args(2).value if (isDefaultOnEmpty(onEmpty)) { - Error.fail("Expected at least one element in array. Got none") + Error.fail("expected at least one element in array, got none") } else { onEmpty } @@ -227,11 +229,11 @@ object ArrayModule extends AbstractFunctionModule { override def evalRhs(args: Array[? <: Eval], ev: EvalScope, pos: Position): Val = { val arr = args(0).value.asArr val keyF = args(1).value - validateKeyF(keyF, pos)(ev) + validateKeyF("maxArray", keyF, pos)(ev) if (arr.length == 0) { val onEmpty = args(2).value if (isDefaultOnEmpty(onEmpty)) { - Error.fail("Expected at least one element in array. Got none") + Error.fail("expected at least one element in array, got none") } else { onEmpty } @@ -475,7 +477,9 @@ object ArrayModule extends AbstractFunctionModule { case v: Val.Arr => v.copyEvalTo(out) case x => - Error.fail("binary operator + requires matching types, got array and " + x.prettyName) + Error.fail( + "cannot concatenate — arrays contain incompatible types (got array and " + x.prettyName + ")" + ) } i += 1 } @@ -490,9 +494,12 @@ object ArrayModule extends AbstractFunctionModule { case v: Val.Arr => parts(i) = v totalLen += v.length - if (totalLen > Int.MaxValue) Error.fail("array too large", pos)(ev) + if (totalLen > Int.MaxValue) + Error.fail("array too large (" + totalLen + " elements)", pos)(ev) case x => - Error.fail("binary operator + requires matching types, got array and " + x.prettyName) + Error.fail( + "cannot concatenate — arrays contain incompatible types (got array and " + x.prettyName + ")" + ) } i += 1 } @@ -574,7 +581,7 @@ object ArrayModule extends AbstractFunctionModule { val secondArg = x.value match { case Val.Str(_, value) => value case n => - Error.fail("std.member second argument must be a string, got " + n.prettyName) + Error.fail("second argument must be a string, got " + n.prettyName) } str.str.contains(secondArg) case a: Val.Arr => @@ -587,7 +594,7 @@ object ArrayModule extends AbstractFunctionModule { found case arr => Error.fail( - "std.member first argument must be an array or a string, got " + arr.prettyName + "first argument must be an array or a string, got " + arr.prettyName ) } ) @@ -604,7 +611,7 @@ object ArrayModule extends AbstractFunctionModule { private def requireInt(v: Val, name: String, pos: Position)(implicit ev: EvalErrorScope): Int = { val d = v.asDouble if (d.isNaN || d.isInfinite || Math.floor(d) != d) - Error.fail(s"std.range $name must be an integer, got $d", pos) + Error.fail(s"$name must be an integer, got $d", pos) d.toInt } @@ -617,7 +624,7 @@ object ArrayModule extends AbstractFunctionModule { val size = if (sizeLong <= 0) 0 else if (sizeLong > Int.MaxValue) - Error.fail("std.range result too large: " + sizeLong + " elements") + Error.fail("result too large: " + sizeLong + " elements") else sizeLong.toInt // Lazy range: O(1) creation, elements computed on demand. // Particularly beneficial for patterns like `std.range(1, 1000000) + [x]` @@ -814,7 +821,7 @@ object ArrayModule extends AbstractFunctionModule { } current - case arr => Error.fail("Cannot call foldl on " + arr.prettyName) + case arr => Error.fail("cannot fold " + arr.prettyName) } } @@ -860,7 +867,7 @@ object ArrayModule extends AbstractFunctionModule { ) } current - case arr => Error.fail("Cannot call foldr on " + arr.prettyName) + case arr => Error.fail("cannot fold " + arr.prettyName) } } } @@ -924,7 +931,7 @@ object ArrayModule extends AbstractFunctionModule { totalLen += va.length case unknown => Error.fail( - "std.flatMap on arrays, provided function must return an array, got " + unknown.prettyName + "on arrays, provided function must return an array, got " + unknown.prettyName ) } i += 1 @@ -955,7 +962,7 @@ object ArrayModule extends AbstractFunctionModule { case fstr: Val.Str => fstr.str case x => Error.fail( - "std.flatMap on strings, provided function must return a string, got " + fres + "on strings, provided function must return a string, got " + fres .asInstanceOf[Val] .value .prettyName @@ -966,7 +973,7 @@ object ArrayModule extends AbstractFunctionModule { } Val.Str(pos, builder.toString) case unknown => - Error.fail("std.flatMap second param must be array / string, got " + unknown.prettyName) + Error.fail("second param must be array / string, got " + unknown.prettyName) } res }, @@ -1002,10 +1009,10 @@ object ArrayModule extends AbstractFunctionModule { */ builtin("repeat", "what", "count") { (pos, ev, what: Val, count: Double) => if (count.isNaN || count.isInfinite || Math.floor(count) != count) - Error.fail("std.repeat count must be an integer, got " + count, pos)(ev) + Error.fail("count must be an integer, got " + count, pos)(ev) val countInt = count.toInt if (countInt < 0) { - Error.fail("repeat requires count >= 0, got " + countInt) + Error.fail("count must be >= 0, got " + countInt) } val res: Val = what match { case Val.Str(_, str) => @@ -1014,9 +1021,15 @@ object ArrayModule extends AbstractFunctionModule { else Val.Str(pos, repeated) case a: Val.Arr => if (a.length.toLong * countInt.toLong > Int.MaxValue) - Error.fail("array too large", pos)(ev) + Error.fail( + "array too large (" + a.length.toLong * countInt.toLong + " elements)", + pos + )(ev) Val.Arr.repeated(pos, a, countInt) - case x => Error.fail("std.repeat first argument must be an array or a string") + case x => + Error.fail( + "first argument must be an array or a string, got " + x.prettyName + ) } res }, @@ -1100,7 +1113,10 @@ object ArrayModule extends AbstractFunctionModule { if (!d.isWhole) Error.fail("idx must be an integer, got " + d, pos)(ev) if (d < 0 || d >= arr.length) - Error.fail("idx out of bounds", pos)(ev) + Error.fail( + "idx " + d.toInt + " out of bounds, array length " + arr.length, + pos + )(ev) d.toInt case _ => Error.fail("idx must be a number, got " + idx.value.prettyName, pos)(ev) @@ -1124,7 +1140,7 @@ object ArrayModule extends AbstractFunctionModule { while (i < arr.length) { arr.value(i) match { case n: Val.Num => sum += n.asDouble - case x => Error.fail("std.sum expected number, got " + x.prettyName) + case x => Error.fail("expected number, got " + x.prettyName) } i += 1 } @@ -1140,7 +1156,7 @@ object ArrayModule extends AbstractFunctionModule { */ builtin("avg", "arr") { (_, _, arr: Val.Arr) => if (arr.length == 0) { - Error.fail("Cannot calculate average of an empty array") + Error.fail("cannot calculate average of an empty array") } arr match { case r: Val.RangeArr => @@ -1153,7 +1169,7 @@ object ArrayModule extends AbstractFunctionModule { while (i < arr.length) { arr.value(i) match { case n: Val.Num => sum += n.asDouble - case x => Error.fail("std.avg expected number, got " + x.prettyName) + case x => Error.fail("expected number, got " + x.prettyName) } i += 1 } diff --git a/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala b/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala index bc999da34..8bf0b191e 100644 --- a/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/ManifestModule.scala @@ -28,6 +28,15 @@ import scala.collection.mutable object ManifestModule extends AbstractFunctionModule { def name = "manifest" + private def ujsonTypeName(v: ujson.Value): String = v match { + case _: ujson.Str => "string" + case _: ujson.Num => "number" + case _: ujson.Arr => "array" + case _: ujson.Obj => "object" + case _: ujson.Bool => "boolean" + case ujson.Null => "null" + } + /** * [[https://jsonnet.org/ref/stdlib.html#std-manifestJson std.manifestJson(value)]]. * @@ -338,7 +347,8 @@ object ManifestModule extends AbstractFunctionModule { def evalRhs(v1: Eval, ev: EvalScope, pos: Position): Val = { v1.value.asArr.foreach { case _: Val.Str | _: Val.Null => // donothing - case x => Error.fail("Cannot call .lines on " + x.value.prettyName) + case x => + Error.fail("std.lines: expected string or null element, got " + x.value.prettyName) } Val.Str( pos, @@ -380,7 +390,7 @@ object ManifestModule extends AbstractFunctionModule { var i = v.length - 1 while (i >= 0) { q.push(v.eval(i)); i -= 1 } case s: Val.Str => out.write(s.str) - case s => Error.fail("Cannot call deepJoin on " + s.prettyName) + case s => Error.fail("std.deepJoin: expected string or array, got " + s.prettyName) } } Val.Str(pos, out.toString) @@ -426,7 +436,9 @@ object ManifestModule extends AbstractFunctionModule { case Val.True(_) => true case _ => Error.fail( - "indent_array_in_object has to be a boolean, got " + args(1).value.prettyName, + "std.manifestYamlDoc: indent_array_in_object has to be a boolean, got " + args( + 1 + ).value.prettyName, pos )(ev) } @@ -434,7 +446,10 @@ object ManifestModule extends AbstractFunctionModule { case Val.False(_) => false case Val.True(_) => true case _ => - Error.fail("quote_keys has to be a boolean, got " + args(2).value.prettyName, pos)(ev) + Error.fail( + "std.manifestYamlDoc: quote_keys has to be a boolean, got " + args(2).value.prettyName, + pos + )(ev) } Materializer .apply0( @@ -468,7 +483,9 @@ object ManifestModule extends AbstractFunctionModule { case Val.True(_) => true case _ => Error.fail( - "indent_array_in_object has to be a boolean, got " + args(1).value.prettyName, + "std.manifestYamlStream: indent_array_in_object has to be a boolean, got " + args( + 1 + ).value.prettyName, pos )(ev) } @@ -477,7 +494,9 @@ object ManifestModule extends AbstractFunctionModule { case Val.True(_) => true case _ => Error.fail( - "c_document_end has to be a boolean, got " + args(2).value.prettyName, + "std.manifestYamlStream: c_document_end has to be a boolean, got " + args( + 2 + ).value.prettyName, pos )(ev) } @@ -485,7 +504,12 @@ object ManifestModule extends AbstractFunctionModule { case Val.False(_) => false case Val.True(_) => true case _ => - Error.fail("quote_keys has to be a boolean, got " + args(3).value.prettyName, pos)(ev) + Error.fail( + "std.manifestYamlStream: quote_keys has to be a boolean, got " + args( + 3 + ).value.prettyName, + pos + )(ev) } v match { case arr: Val.Arr => @@ -508,7 +532,8 @@ object ManifestModule extends AbstractFunctionModule { if (arr.length == 0) sb.append("---\n\n") if (cDocumentEnd) sb.append("...\n") sb.toString - case _ => Error.fail("manifestYamlStream only takes arrays, got " + v.getClass) + case _ => + Error.fail("std.manifestYamlStream: only takes arrays, got " + v.prettyName) } }, /** @@ -612,14 +637,17 @@ object ManifestModule extends AbstractFunctionModule { case (k, ujson.False) => attr(k) := "false" case (k, ujson.Null) => attr(k) := "null" - case (k, v) => Error.fail("Cannot call manifestXmlJsonml on " + v.getClass) + case (k, v) => + Error.fail( + "std.manifestXmlJsonml: unsupported attribute type " + ujsonTypeName(v) + ) }.toSeq, children.map(rec) ) case ujson.Arr(mutable.Seq(ujson.Str(t), children @ _*)) => tag(t)(children.map(rec).toSeq) case x => - Error.fail("Cannot call manifestXmlJsonml on " + x.getClass) + Error.fail("std.manifestXmlJsonml: unsupported type " + ujsonTypeName(x)) } } rec(Materializer(value)(ev)).render diff --git a/sjsonnet/src/sjsonnet/stdlib/MathModule.scala b/sjsonnet/src/sjsonnet/stdlib/MathModule.scala index a021074d2..f943fddc3 100644 --- a/sjsonnet/src/sjsonnet/stdlib/MathModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/MathModule.scala @@ -101,11 +101,11 @@ object MathModule extends AbstractFunctionModule { case "x" => 0 case "minVal" => 1 case "maxVal" => 2 - case name => Error.fail(s"has no parameter $name", outerPos) + case name => Error.fail(s"std.clamp: has no parameter $name", outerPos) } if (args(paramIndex) != null) { Error.fail( - s"binding parameter a second time: ${namedNames(namedIndex)} in function clamp", + s"Binding parameter a second time: ${namedNames(namedIndex)} in function clamp", outerPos ) } @@ -127,7 +127,7 @@ object MathModule extends AbstractFunctionModule { } if (missingCount > 0) { val plural = if (missingCount > 1) "s" else "" - Error.fail(s"parameter$plural $missing not bound in call", outerPos) + Error.fail(s"Parameter$plural $missing not bound in call", outerPos) } if (tailstrictMode == TailstrictModeEnabled) args.foreach(_.value) @@ -142,16 +142,16 @@ object MathModule extends AbstractFunctionModule { case (l: Val.Str, r: Val.Str) => Util.compareStringsByCodepoint(l.str, r.str) case (l: Val.Arr, r: Val.Arr) => compareArraysForClamp(l, r, pos) case (_: Val.Bool, _: Val.Bool) => - Error.fail(s"binary operator $op does not operate on booleans.", pos) + Error.fail(s"Binary operator $op does not operate on booleans.", pos) case (_: Val.Null, _: Val.Null) => - Error.fail(s"binary operator $op does not operate on null.", pos) + Error.fail(s"Binary operator $op does not operate on null.", pos) case (_: Val.Obj, _: Val.Obj) => - Error.fail(s"binary operator $op does not operate on objects.", pos) + Error.fail(s"Binary operator $op does not operate on objects.", pos) case (_: Val.Func, _: Val.Func) => - Error.fail(s"binary operator $op does not operate on functions.", pos) + Error.fail(s"Binary operator $op does not operate on functions.", pos) case _ => Error.fail( - s"binary operator $op requires matching types, got ${left.prettyName} and ${right.prettyName}.", + s"Binary operator $op requires matching types, got ${left.prettyName} and ${right.prettyName}.", pos ) } @@ -164,7 +164,7 @@ object MathModule extends AbstractFunctionModule { case (l: Val.Str, r: Val.Str) => Util.compareStringsByCodepoint(l.str, r.str) case (l: Val.Arr, r: Val.Arr) => compareArraysForClamp(l, r, pos) case (_: Val.Null, _: Val.Null) => - Error.fail("binary operator < does not operate on null.", pos) + Error.fail("Binary operator < does not operate on null.", pos) case (_: Val.Bool, _: Val.Bool) => Error.fail("Values of type boolean are not comparable.", pos) case (_: Val.Obj, _: Val.Obj) => @@ -220,7 +220,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("sqrt", "x") { (pos, ev, x: Double) => val r = math.sqrt(x) - if (java.lang.Double.isNaN(r)) Error.fail("Not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.sqrt: not a number", pos)(ev) r }, /** @@ -293,7 +293,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("pow", "x", "n") { (pos, ev, x: Double, n: Double) => val r = math.pow(x, n) - if (java.lang.Double.isNaN(r)) Error.fail("not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.pow: not a number", pos)(ev) r }, /** @@ -427,7 +427,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("asin", "x") { (pos, ev, x: Double) => val r = math.asin(x) - if (java.lang.Double.isNaN(r)) Error.fail("not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.asin: not a number", pos)(ev) r }, /** @@ -439,7 +439,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("acos", "x") { (pos, ev, x: Double) => val r = math.acos(x) - if (java.lang.Double.isNaN(r)) Error.fail("not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.acos: not a number", pos)(ev) r }, /** @@ -501,7 +501,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("log", "x") { (pos, ev, x: Double) => val r = math.log(x) - if (java.lang.Double.isNaN(r)) Error.fail("Not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.log: not a number", pos)(ev) r }, /** @@ -513,7 +513,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("log2", "x") { (pos, ev, x: Double) => val r = math.log(x) / math.log(2.0) - if (java.lang.Double.isNaN(r)) Error.fail("Not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.log2: not a number", pos)(ev) r }, /** @@ -525,7 +525,7 @@ object MathModule extends AbstractFunctionModule { */ builtin("log10", "x") { (pos, ev, x: Double) => val r = math.log10(x) - if (java.lang.Double.isNaN(r)) Error.fail("Not a number", pos)(ev) + if (java.lang.Double.isNaN(r)) Error.fail("std.log10: not a number", pos)(ev) r }, /** diff --git a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala index 7d686eb9c..b449151e8 100644 --- a/sjsonnet/src/sjsonnet/stdlib/SetModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/SetModule.scala @@ -58,9 +58,11 @@ object SetModule extends AbstractFunctionModule { @inline private def isIdentityKeyF(v: Val): Boolean = v == null || isDefaultKeyF(v) || (v.isInstanceOf[Val.Func] && v.asFunc.isIdentityFunction) - private def validateKeyF(keyF: Val, pos: Position)(implicit ev: EvalErrorScope): Unit = { + private def validateKeyF(callerName: String, keyF: Val, pos: Position)(implicit + ev: EvalErrorScope + ): Unit = { if (!isDefaultKeyF(keyF) && !keyF.isInstanceOf[Val.Func]) - Error.fail("keyF must be a function, got " + keyF.prettyName, pos) + Error.fail(s"keyF must be a function, got ${keyF.prettyName}", pos) } /** @@ -73,8 +75,8 @@ object SetModule extends AbstractFunctionModule { private object Set_ extends Val.Builtin2("set", "arr", "keyF", Array(null, DefaultKeyF)) { def evalRhs(arr: Eval, keyF: Eval, ev: EvalScope, pos: Position): Val = { val kf = keyF.value - validateKeyF(kf, pos)(ev) - uniqArr(pos, ev, sortArr(pos, ev, arr.value, kf), kf) + validateKeyF("set", kf, pos)(ev) + uniqArr("set", pos, ev, sortArr("set", pos, ev, arr.value, kf), kf) } } @@ -83,11 +85,12 @@ object SetModule extends AbstractFunctionModule { else keyF.asFunc.apply1(elem, pos.noOffset)(ev, TailstrictModeDisabled).value } - private def toArrOrString(arg: Val, pos: Position, ev: EvalScope) = { + private def toArrOrString(callerName: String, arg: Val, pos: Position, ev: EvalScope) = { arg match { case arr: Val.Arr => arr.asLazyArray case str: Val.Str => stringChars(pos, str.str).asLazyArray - case _ => Error.fail(f"Argument must be either arrays or strings") + case _ => + Error.fail(s"expected an array or string, got ${arg.prettyName}") } } @@ -250,9 +253,20 @@ object SetModule extends AbstractFunctionModule { Val.Arr(pos, trimSetOutput(out, outLen)) } - private def validateSet(ev: EvalScope, pos: Position, keyF: Val, arr: Val): Unit = { + private def validateSet( + callerName: String, + ev: EvalScope, + pos: Position, + keyF: Val, + arr: Val): Unit = { if (ev.settings.throwErrorForInvalidSets) { - val sorted = uniqArr(pos.noOffset, ev, sortArr(pos.noOffset, ev, arr, keyF), keyF) + val sorted = uniqArr( + callerName, + pos.noOffset, + ev, + sortArr(callerName, pos.noOffset, ev, arr, keyF), + keyF + ) val isSet = arr match { case Val.Str(_, str) => sorted match { @@ -271,7 +285,9 @@ object SetModule extends AbstractFunctionModule { ev.equal(arr, sorted) } if (!isSet) { - Error.fail("Set operation on " + arr.value.prettyName + " was called with a non-set") + Error.fail( + s"argument must be a sorted array or string without duplicates, got ${arr.value.prettyName}" + ) } } } @@ -292,8 +308,13 @@ object SetModule extends AbstractFunctionModule { .isInstanceOf[Found] } - private def uniqArr(pos: Position, ev: EvalScope, arr: Val, keyF: Val): Val = { - val arrValue = toArrOrString(arr, pos, ev) + private def uniqArr( + callerName: String, + pos: Position, + ev: EvalScope, + arr: Val, + keyF: Val): Val = { + val arrValue = toArrOrString(callerName, arr, pos, ev) if (arrValue.length <= 1) { return arr } @@ -319,7 +340,12 @@ object SetModule extends AbstractFunctionModule { Val.Arr(pos, out.result()) } - private def sortArr(pos: Position, ev: EvalScope, arr: Val, keyF: Val): Val = { + private def sortArr( + callerName: String, + pos: Position, + ev: EvalScope, + arr: Val, + keyF: Val): Val = { // Fast path: range arrays are already sorted ascending by construction. // Avoids O(n) materialization + O(n log n) sort for already-sorted data. if (isIdentityKeyF(keyF) || keyF.isInstanceOf[Val.False]) { @@ -338,11 +364,11 @@ object SetModule extends AbstractFunctionModule { case _ => } } - sortArrSlow(pos, ev, arr, keyF) + sortArrSlow(callerName, pos, ev, arr, keyF) } - private def sortArrSlow(pos: Position, ev: EvalScope, arr: Val, keyF: Val) = { - val vs = toArrOrString(arr, pos, ev) + private def sortArrSlow(callerName: String, pos: Position, ev: EvalScope, arr: Val, keyF: Val) = { + val vs = toArrOrString(callerName, arr, pos, ev) if (vs.length <= 1) { arr } else { @@ -498,8 +524,8 @@ object SetModule extends AbstractFunctionModule { * array element. Default value is identity function keyF=function(x) x. */ builtinWithDefaults("uniq", "arr" -> null, "keyF" -> DefaultKeyF) { (args, pos, ev) => - validateKeyF(args(1), pos)(ev) - uniqArr(pos, ev, args(0), args(1)) + validateKeyF("uniq", args(1), pos)(ev) + uniqArr("uniq", pos, ev, args(0), args(1)) }, /** * [[https://jsonnet.org/ref/stdlib.html#std-sort std.sort(arr, keyF=id)]]. @@ -512,8 +538,8 @@ object SetModule extends AbstractFunctionModule { * array element. Default value is identity function keyF=function(x) x. */ builtinWithDefaults("sort", "arr" -> null, "keyF" -> DefaultKeyF) { (args, pos, ev) => - validateKeyF(args(1), pos)(ev) - sortArr(pos, ev, args(0), args(1)) + validateKeyF("sort", args(1), pos)(ev) + sortArr("sort", pos, ev, args(0), args(1)) }, /** * [[https://jsonnet.org/ref/stdlib.html#std-setUnion std.setUnion(a, b, keyF=id)]]. @@ -527,12 +553,12 @@ object SetModule extends AbstractFunctionModule { builtinWithDefaults("setUnion", "a" -> null, "b" -> null, "keyF" -> DefaultKeyF) { (args, pos, ev) => val keyF = args(2) - validateKeyF(keyF, pos)(ev) - validateSet(ev, pos, keyF, args(0)) - validateSet(ev, pos, keyF, args(1)) + validateKeyF("setUnion", keyF, pos)(ev) + validateSet("setUnion", ev, pos, keyF, args(0)) + validateSet("setUnion", ev, pos, keyF, args(1)) - val a = toArrOrString(args(0), pos, ev) - val b = toArrOrString(args(1), pos, ev) + val a = toArrOrString("setUnion", args(0), pos, ev) + val b = toArrOrString("setUnion", args(1), pos, ev) if (a.isEmpty) { args(1) @@ -594,12 +620,12 @@ object SetModule extends AbstractFunctionModule { builtinWithDefaults("setInter", "a" -> null, "b" -> null, "keyF" -> DefaultKeyF) { (args, pos, ev) => val keyF = args(2) - validateKeyF(keyF, pos)(ev) - validateSet(ev, pos, keyF, args(0)) - validateSet(ev, pos, keyF, args(1)) + validateKeyF("setInter", keyF, pos)(ev) + validateSet("setInter", ev, pos, keyF, args(0)) + validateSet("setInter", ev, pos, keyF, args(1)) - val a = toArrOrString(args(0), pos, ev) - val b = toArrOrString(args(1), pos, ev) + val a = toArrOrString("setInter", args(0), pos, ev) + val b = toArrOrString("setInter", args(1), pos, ev) if (isDefaultKeyF(keyF)) { setInterDefaultKeyF(pos, ev, a, b) @@ -646,12 +672,12 @@ object SetModule extends AbstractFunctionModule { builtinWithDefaults("setDiff", "a" -> null, "b" -> null, "keyF" -> DefaultKeyF) { (args, pos, ev) => val keyF = args(2) - validateKeyF(keyF, pos)(ev) - validateSet(ev, pos, keyF, args(0)) - validateSet(ev, pos, keyF, args(1)) + validateKeyF("setDiff", keyF, pos)(ev) + validateSet("setDiff", ev, pos, keyF, args(0)) + validateSet("setDiff", ev, pos, keyF, args(1)) - val a = toArrOrString(args(0), pos, ev) - val b = toArrOrString(args(1), pos, ev) + val a = toArrOrString("setDiff", args(0), pos, ev) + val b = toArrOrString("setDiff", args(1), pos, ev) if (isDefaultKeyF(keyF)) { setDiffDefaultKeyF(pos, ev, a, b) } else { @@ -706,9 +732,9 @@ object SetModule extends AbstractFunctionModule { builtinWithDefaults("setMember", "x" -> null, "arr" -> null, "keyF" -> DefaultKeyF) { (args, pos, ev) => val keyF = args(2) - validateKeyF(keyF, pos)(ev) - validateSet(ev, pos, keyF, args(1)) - val arr = toArrOrString(args(1), pos, ev) + validateKeyF("setMember", keyF, pos)(ev) + validateSet("setMember", ev, pos, keyF, args(1)) + val arr = toArrOrString("setMember", args(1), pos, ev) existsInSet(ev, pos, keyF, arr, args(0)) } ) diff --git a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala index a90a0b284..18dfda13d 100644 --- a/sjsonnet/src/sjsonnet/stdlib/StringModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/StringModule.scala @@ -107,7 +107,10 @@ object StringModule extends AbstractFunctionModule { val s = str.value.asString val codePointCount = s.codePointCount(0, s.length) if (codePointCount != 1) { - Error.fail("expected a single character string, got " + s) + val shown = if (s.isEmpty) "" else s + Error.fail( + "expected a single character string (length " + codePointCount + "), got: " + shown + ) } else { Val.cachedNum(pos, s.codePointAt(0).toDouble) } @@ -427,7 +430,7 @@ object StringModule extends AbstractFunctionModule { * * Removes characters chars from the beginning and from the end of str. */ - private def charsToString(charsVal: Val): String = charsVal match { + private def charsToString(callerName: String, charsVal: Val): String = charsVal match { case s: Val.Str => s.str case a: Val.Arr => val sb = new java.lang.StringBuilder @@ -449,7 +452,7 @@ object StringModule extends AbstractFunctionModule { val v = str.value val out = StripUtils.strip( v.asString, - charsToString(chars.value), + charsToString("stripChars", chars.value), left = true, right = true ) @@ -472,7 +475,7 @@ object StringModule extends AbstractFunctionModule { val v = str.value val out = StripUtils.strip( v.asString, - charsToString(chars.value), + charsToString("lstripChars", chars.value), left = true, right = false ) @@ -495,7 +498,7 @@ object StringModule extends AbstractFunctionModule { val v = str.value val out = StripUtils.strip( v.asString, - charsToString(chars.value), + charsToString("rstripChars", chars.value), left = false, right = true ) @@ -526,7 +529,7 @@ object StringModule extends AbstractFunctionModule { val s = str.str val sepStr = sep.str val resultLen = s.length.toLong * count + sepStr.length.toLong * (count - 1) - if (resultLen > Int.MaxValue) Error.fail("String is too large to join") + if (resultLen > Int.MaxValue) Error.fail("string is too large to join") if (count == 1) str else { val asciiSafe = str.isInstanceOf[Val.AsciiSafeStr] && sep.isInstanceOf[Val.AsciiSafeStr] @@ -605,10 +608,10 @@ object StringModule extends AbstractFunctionModule { } val str = x.str totalLen += str.length - if (totalLen > Int.MaxValue) Error.fail("String is too large to join") + if (totalLen > Int.MaxValue) Error.fail("string is too large to join") asciiSafe &&= x.isInstanceOf[Val.AsciiSafeStr] added = true - case x => Error.fail("Cannot join " + x.prettyName) + case x => Error.fail("cannot join " + x.prettyName) } i += 1 } @@ -650,7 +653,7 @@ object StringModule extends AbstractFunctionModule { case _: Val.Null => case x: Val.Str => totalLen += x.str.length - if (totalLen > Int.MaxValue) Error.fail("String is too large to join") + if (totalLen > Int.MaxValue) Error.fail("string is too large to join") asciiSafe &&= x.isInstanceOf[Val.AsciiSafeStr] elemCount += 1 case _ => return null @@ -660,7 +663,7 @@ object StringModule extends AbstractFunctionModule { if (elemCount == 0) return Val.Str.asciiSafe(pos, "") if (elemCount > 1) { totalLen += sepLen.toLong * (elemCount - 1) - if (totalLen > Int.MaxValue) Error.fail("String is too large to join") + if (totalLen > Int.MaxValue) Error.fail("string is too large to join") asciiSafe &&= sep.isInstanceOf[Val.AsciiSafeStr] } @@ -721,7 +724,7 @@ object StringModule extends AbstractFunctionModule { added = true b.append(x.str) asciiSafe &&= x.isInstanceOf[Val.AsciiSafeStr] - case x => Error.fail("Cannot join " + x.prettyName) + case x => Error.fail("cannot join " + x.prettyName) } i += 1 } @@ -741,7 +744,7 @@ object StringModule extends AbstractFunctionModule { if (added) sep.copyEvalTo(out) added = true v.copyEvalTo(out) - case x => Error.fail("Cannot join " + x.prettyName) + case x => Error.fail("cannot join " + x.prettyName) } i += 1 } @@ -759,10 +762,11 @@ object StringModule extends AbstractFunctionModule { case v: Val.Arr => if (partCount > 0) totalLen += sepLen totalLen += v.length - if (totalLen > Int.MaxValue) Error.fail("array too large", pos)(ev) + if (totalLen > Int.MaxValue) + Error.fail("array too large", pos)(ev) parts(partCount) = v partCount += 1 - case x => Error.fail("Cannot join " + x.prettyName) + case x => Error.fail("cannot join " + x.prettyName) } i += 1 } @@ -776,7 +780,7 @@ object StringModule extends AbstractFunctionModule { i += 1 } Val.Arr(pos, result) - case x => Error.fail("Cannot join " + x.prettyName) + case x => Error.fail("separator must be a string or array, got " + x.prettyName) } } } @@ -788,7 +792,7 @@ object StringModule extends AbstractFunctionModule { maxSplits: Int, asciiSafe: Boolean): Array[Eval] = { if (cStr.isEmpty) { - Error.fail("Cannot split by an empty string") + Error.fail("cannot split by an empty string") } val b = new mutable.ArrayBuilder.ofRef[Eval] @@ -852,7 +856,7 @@ object StringModule extends AbstractFunctionModule { } if (cStr.isEmpty) { - Error.fail("Cannot split by an empty string") + Error.fail("cannot split by an empty string") } if (maxSplits >= 0 && maxSplits <= SplitLimitRPreallocMaxSplits) { @@ -947,13 +951,12 @@ object StringModule extends AbstractFunctionModule { * * Note: Versions up to and including 0.18.0 require c to be a single character. */ - private def validateMaxSplits(d: Double, pos: Position, name: String)(implicit - ev: EvalErrorScope): Int = { + private def validateMaxSplits(d: Double, pos: Position)(implicit ev: EvalErrorScope): Int = { if (d.isNaN || d.isInfinite || Math.floor(d) != d) - Error.fail(s"$name third parameter must be an integer, got $d", pos) + Error.fail(s"third parameter must be an integer, got $d", pos) val i = d.toInt if (i < -1) - Error.fail(s"$name third parameter should be -1 or non-negative, got $i", pos) + Error.fail(s"third parameter should be -1 or non-negative, got $i", pos) i } @@ -961,7 +964,7 @@ object StringModule extends AbstractFunctionModule { def evalRhs(str: Eval, c: Eval, maxSplits: Eval, ev: EvalScope, pos: Position): Val = { val v = str.value val safe = v.isInstanceOf[Val.AsciiSafeStr] - val ms = validateMaxSplits(maxSplits.value.asDouble, pos, "std.splitLimit")(ev) + val ms = validateMaxSplits(maxSplits.value.asDouble, pos)(ev) Val.Arr( pos, splitLimit(pos, v.asString, c.value.asString, ms, safe) @@ -980,7 +983,7 @@ object StringModule extends AbstractFunctionModule { def evalRhs(str: Eval, c: Eval, maxSplits: Eval, ev: EvalScope, pos: Position): Val = { val v = str.value val safe = v.isInstanceOf[Val.AsciiSafeStr] - val ms = validateMaxSplits(maxSplits.value.asDouble, pos, "std.splitLimitR")(ev) + val ms = validateMaxSplits(maxSplits.value.asDouble, pos)(ev) Val.Arr( pos, splitLimitR(pos, v.asString, c.value.asString, ms, safe) @@ -1223,7 +1226,7 @@ object StringModule extends AbstractFunctionModule { for ((v, idx) <- arr.value.asArr.iterator.zipWithIndex) { if (!v.isInstanceOf[Val.Num] || !v.asDouble.isWhole || v.asInt < 0 || v.asInt > 255) { throw Error.fail( - f"Element $idx of the provided array was not an integer in range [0,255]" + "std.decodeUTF8: element " + idx + " is not an integer in range [0,255], got " + v.value.prettyName ) } } diff --git a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala index 8750849e7..e2220d471 100644 --- a/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/TypeModule.scala @@ -143,7 +143,7 @@ object TypeModule extends AbstractFunctionModule { // Only materialize on failure for the error message val x1 = Materializer(a)(ev) val x2 = Materializer(b)(ev) - Error.fail("assertEqual failed: " + x1 + " != " + x2) + Error.fail("std.assertEqual: " + x1 + " != " + x2) } } } diff --git a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds.jsonnet.golden index 8aa7a0d7d..1e16a96e4 100644 --- a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: array bounds error: array is empty +sjsonnet.Error: Array bounds error: array is empty at [].(array_out_of_bounds.jsonnet:1:3) diff --git a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds2.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds2.jsonnet.golden index 2cec06be3..466f76298 100644 --- a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds2.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds2.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: array bounds error: 3 not within [0, 3) +sjsonnet.Error: Array bounds error: 3 not within [0, 3) at [].(array_out_of_bounds2.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds3.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds3.jsonnet.golden index cfe122c34..de0c0a559 100644 --- a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds3.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds3.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: index value is not a positive integer, got: -1 +sjsonnet.Error: Index value is not a positive integer, got: -1 at [].(array_out_of_bounds3.jsonnet:1:3) diff --git a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds4.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds4.jsonnet.golden index 0c6fcb99b..00d018449 100644 --- a/sjsonnet/test/resources/go_test_suite/array_out_of_bounds4.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/array_out_of_bounds4.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: array bounds error: 42 not within [0, 3) +sjsonnet.Error: Array bounds error: 42 not within [0, 3) at [].(array_out_of_bounds4.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/assert_equal4.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/assert_equal4.jsonnet.golden index 6067014af..b3209c143 100644 --- a/sjsonnet/test/resources/go_test_suite/assert_equal4.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/assert_equal4.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.assertEqual] assertEqual failed: {"x":1} != {"x":2} +sjsonnet.Error: [std.assertEqual] {"x":1} != {"x":2} at [].(assert_equal4.jsonnet:1:16) - diff --git a/sjsonnet/test/resources/go_test_suite/assert_equal5.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/assert_equal5.jsonnet.golden index a3a724bf6..276f13600 100644 --- a/sjsonnet/test/resources/go_test_suite/assert_equal5.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/assert_equal5.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.assertEqual] assertEqual failed: "\n " != "\n" +sjsonnet.Error: [std.assertEqual] "\n " != "\n" at [].(assert_equal5.jsonnet:1:16) - diff --git a/sjsonnet/test/resources/go_test_suite/assert_equal6.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/assert_equal6.jsonnet.golden index 23953d8da..c945e8eaf 100644 --- a/sjsonnet/test/resources/go_test_suite/assert_equal6.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/assert_equal6.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.assertEqual] assertEqual failed: "\u001b[31m" != "" +sjsonnet.Error: [std.assertEqual] "\u001b[31m" != "" at [].(assert_equal6.jsonnet:1:16) - diff --git a/sjsonnet/test/resources/go_test_suite/bad_function_call.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bad_function_call.jsonnet.golden index bf806eaf2..066b0ae9e 100644 --- a/sjsonnet/test/resources/go_test_suite/bad_function_call.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bad_function_call.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] parameter x not bound in call +sjsonnet.Error: [anonymous] Parameter x not bound in call at [].(bad_function_call.jsonnet:1:16) diff --git a/sjsonnet/test/resources/go_test_suite/bad_index_array.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bad_index_array.jsonnet.golden index 9e2b8b446..655e7a417 100644 --- a/sjsonnet/test/resources/go_test_suite/bad_index_array.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bad_index_array.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: attempted to index a array with string +sjsonnet.Error: Attempted to index a array with string at [].(bad_index_array.jsonnet:1:3) diff --git a/sjsonnet/test/resources/go_test_suite/bad_index_object.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bad_index_object.jsonnet.golden index b1f7fe9eb..db6a73af8 100644 --- a/sjsonnet/test/resources/go_test_suite/bad_index_object.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bad_index_object.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: attempted to index a object with number +sjsonnet.Error: Attempted to index a object with number at [].(bad_index_object.jsonnet:1:3) diff --git a/sjsonnet/test/resources/go_test_suite/bad_index_string.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bad_index_string.jsonnet.golden index ec1172ea9..47d2a89fc 100644 --- a/sjsonnet/test/resources/go_test_suite/bad_index_string.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bad_index_string.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: attempted to index a string with string +sjsonnet.Error: Attempted to index a string with string at [].(bad_index_string.jsonnet:1:6) diff --git a/sjsonnet/test/resources/go_test_suite/bitwise_and3.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bitwise_and3.jsonnet.golden index 9146b1e12..0f5c95458 100644 --- a/sjsonnet/test/resources/go_test_suite/bitwise_and3.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bitwise_and3.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(bitwise_and3.jsonnet:1:6) diff --git a/sjsonnet/test/resources/go_test_suite/bitwise_and7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bitwise_and7.jsonnet.golden index 117fa35fe..9dbd2066c 100644 --- a/sjsonnet/test/resources/go_test_suite/bitwise_and7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bitwise_and7.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(bitwise_and7.jsonnet:1:4) diff --git a/sjsonnet/test/resources/go_test_suite/bitwise_or9.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bitwise_or9.jsonnet.golden index aa0d4984d..87ac09fe8 100644 --- a/sjsonnet/test/resources/go_test_suite/bitwise_or9.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bitwise_or9.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(bitwise_or9.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/bitwise_shift4.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bitwise_shift4.jsonnet.golden index 7e5278f09..684e79775 100644 --- a/sjsonnet/test/resources/go_test_suite/bitwise_shift4.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bitwise_shift4.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: shift by negative exponent +sjsonnet.Error: Shift by negative exponent at [].(bitwise_shift4.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/bitwise_shift6.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/bitwise_shift6.jsonnet.golden index d132919b8..c7932cafa 100644 --- a/sjsonnet/test/resources/go_test_suite/bitwise_shift6.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/bitwise_shift6.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: shift by negative exponent +sjsonnet.Error: Shift by negative exponent at [].(bitwise_shift6.jsonnet:1:3) diff --git a/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR5.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR5.jsonnet.golden index 3941c06ac..7254a8266 100644 --- a/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR5.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR5.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: [std.splitLimitR] std.splitLimitR third parameter should be -1 or non-negative, got -2 +sjsonnet.Error: [std.splitLimitR] third parameter should be -1 or non-negative, got -2 at [].(builtinSplitLimitR5.jsonnet:1:16) diff --git a/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR6.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR6.jsonnet.golden index 36070fb68..a331a4c68 100644 --- a/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR6.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtinSplitLimitR6.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.splitLimitR] Cannot split by an empty string +sjsonnet.Error: [std.splitLimitR] cannot split by an empty string at [].(builtinSplitLimitR6.jsonnet:1:16) diff --git a/sjsonnet/test/resources/go_test_suite/builtinSubStr_second_parameter_not_integer.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtinSubStr_second_parameter_not_integer.jsonnet.golden index 97b4117b6..1c0ff049f 100644 --- a/sjsonnet/test/resources/go_test_suite/builtinSubStr_second_parameter_not_integer.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtinSubStr_second_parameter_not_integer.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.substr] index value is not a valid integer +sjsonnet.Error: [std.substr] Index value is not a valid integer at [].(builtinSubStr_second_parameter_not_integer.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_less_then_zero.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_less_then_zero.jsonnet.golden index 32cdf8ee6..c9744a550 100644 --- a/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_less_then_zero.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_less_then_zero.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.substr] index value is not a positive integer, got: -1 +sjsonnet.Error: [std.substr] Index value is not a positive integer, got: -1 at [].(builtinSubStr_third_parameter_less_then_zero.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_not_integer.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_not_integer.jsonnet.golden index 3728d735f..f0c5e9ae8 100644 --- a/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_not_integer.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtinSubStr_third_parameter_not_integer.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.substr] index value is not a valid integer +sjsonnet.Error: [std.substr] Index value is not a valid integer at [].(builtinSubStr_third_parameter_not_integer.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/builtin_exp3.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtin_exp3.jsonnet.golden index 5e22515e6..c29be84f6 100644 --- a/sjsonnet/test/resources/go_test_suite/builtin_exp3.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtin_exp3.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.exp] overflow +sjsonnet.Error: [std.exp] Overflow at [].(builtin_exp3.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/builtin_exp5.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtin_exp5.jsonnet.golden index d09fb8919..41797de71 100644 --- a/sjsonnet/test/resources/go_test_suite/builtin_exp5.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtin_exp5.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.exp] overflow +sjsonnet.Error: [std.exp] Overflow at [].(builtin_exp5.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/builtin_log5.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtin_log5.jsonnet.golden index 2757daea5..938e6f099 100644 --- a/sjsonnet/test/resources/go_test_suite/builtin_log5.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtin_log5.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.log] overflow +sjsonnet.Error: [std.log] Overflow at [].(builtin_log5.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/builtin_log7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtin_log7.jsonnet.golden index c23168160..4ca4ef874 100644 --- a/sjsonnet/test/resources/go_test_suite/builtin_log7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtin_log7.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.log] Not a number +sjsonnet.Error: [std.log] not a number at [].(builtin_log7.jsonnet:1:8) - diff --git a/sjsonnet/test/resources/go_test_suite/builtin_log8.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtin_log8.jsonnet.golden index b2321a2d4..74b5d557b 100644 --- a/sjsonnet/test/resources/go_test_suite/builtin_log8.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtin_log8.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.log] Not a number +sjsonnet.Error: [std.log] not a number at [].(builtin_log8.jsonnet:1:8) - diff --git a/sjsonnet/test/resources/go_test_suite/builtin_member_object_invalid.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/builtin_member_object_invalid.jsonnet.golden index 10baa1d90..23b022a18 100644 --- a/sjsonnet/test/resources/go_test_suite/builtin_member_object_invalid.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/builtin_member_object_invalid.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.member] std.member first argument must be an array or a string, got object +sjsonnet.Error: [std.member] first argument must be an array or a string, got object at [].(builtin_member_object_invalid.jsonnet:1:11) - diff --git a/sjsonnet/test/resources/go_test_suite/div4.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/div4.jsonnet.golden index 3c27737c2..2d96625b0 100644 --- a/sjsonnet/test/resources/go_test_suite/div4.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/div4.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(div4.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/function_too_many_params.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/function_too_many_params.jsonnet.golden index fe5e1930b..d0604d7c8 100644 --- a/sjsonnet/test/resources/go_test_suite/function_too_many_params.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/function_too_many_params.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] parameter x not bound in call +sjsonnet.Error: [anonymous] Parameter x not bound in call at [].(function_too_many_params.jsonnet:1:1) diff --git a/sjsonnet/test/resources/go_test_suite/inf_min_number.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/inf_min_number.jsonnet.golden index 98b85281f..72a38bc24 100644 --- a/sjsonnet/test/resources/go_test_suite/inf_min_number.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/inf_min_number.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(inf_min_number.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/inf_mul_number.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/inf_mul_number.jsonnet.golden index 6d10791fa..3293c15d9 100644 --- a/sjsonnet/test/resources/go_test_suite/inf_mul_number.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/inf_mul_number.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(inf_mul_number.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/inf_sum_number.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/inf_sum_number.jsonnet.golden index 4db391503..a3d08d16b 100644 --- a/sjsonnet/test/resources/go_test_suite/inf_sum_number.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/inf_sum_number.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(inf_sum_number.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/native7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/native7.jsonnet.golden index c0455f65f..b4b01d9f6 100644 --- a/sjsonnet/test/resources/go_test_suite/native7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/native7.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: [std.jsonToString] has no parameter y +sjsonnet.Error: [std.jsonToString] Has no parameter y at [].(native7.jsonnet:1:27) diff --git a/sjsonnet/test/resources/go_test_suite/optional_args11.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/optional_args11.jsonnet.golden index 04c8f2548..d9cfa1e30 100644 --- a/sjsonnet/test/resources/go_test_suite/optional_args11.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/optional_args11.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] binding parameter a second time: x +sjsonnet.Error: [anonymous] Binding parameter a second time: x at [].(optional_args11.jsonnet:1:20) diff --git a/sjsonnet/test/resources/go_test_suite/optional_args13.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/optional_args13.jsonnet.golden index 5ee7da59c..b3f68de83 100644 --- a/sjsonnet/test/resources/go_test_suite/optional_args13.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/optional_args13.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] parameter y not bound in call +sjsonnet.Error: [anonymous] Parameter y not bound in call at [].(optional_args13.jsonnet:1:20) diff --git a/sjsonnet/test/resources/go_test_suite/optional_args8.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/optional_args8.jsonnet.golden index 36bf6ecb1..dede991a7 100644 --- a/sjsonnet/test/resources/go_test_suite/optional_args8.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/optional_args8.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [foo] has no parameter y +sjsonnet.Error: [foo] Has no parameter y at [].(optional_args8.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/optional_args9.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/optional_args9.jsonnet.golden index 3c14cb720..184fff68e 100644 --- a/sjsonnet/test/resources/go_test_suite/optional_args9.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/optional_args9.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] binding parameter a second time: x +sjsonnet.Error: [anonymous] Binding parameter a second time: x at [].(optional_args9.jsonnet:1:16) diff --git a/sjsonnet/test/resources/go_test_suite/or5.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/or5.jsonnet.golden index 44d0cc0f2..29588d8a4 100644 --- a/sjsonnet/test/resources/go_test_suite/or5.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/or5.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: binary operator || does not operate on strings. +sjsonnet.Error: Binary operator || does not operate on strings. at [].(or5.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/or6.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/or6.jsonnet.golden index f59f9ed59..0583d546a 100644 --- a/sjsonnet/test/resources/go_test_suite/or6.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/or6.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: binary operator || does not operate on strings. +sjsonnet.Error: Binary operator || does not operate on strings. at [].(or6.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/percent_bad2.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/percent_bad2.jsonnet.golden index 7da7a0b8b..90acdec99 100644 --- a/sjsonnet/test/resources/go_test_suite/percent_bad2.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/percent_bad2.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Too many values to format: 1, expected 0 +sjsonnet.Error: [std.format] too many values to format: 1, expected 0 at [].(percent_bad2.jsonnet:1:5) diff --git a/sjsonnet/test/resources/go_test_suite/percent_format_str4.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/percent_format_str4.jsonnet.golden index 5ed41341e..80278a3cf 100644 --- a/sjsonnet/test/resources/go_test_suite/percent_format_str4.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/percent_format_str4.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Too many values to format: 2, expected 1 +sjsonnet.Error: [std.format] too many values to format: 2, expected 1 at [].(percent_format_str4.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/percent_format_str5.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/percent_format_str5.jsonnet.golden index 0184ebc06..ddd3ddcd1 100644 --- a/sjsonnet/test/resources/go_test_suite/percent_format_str5.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/percent_format_str5.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Too few values to format: 1, expected at least 2 +sjsonnet.Error: [std.format] too few values to format: 1, expected at least 2 at [].(percent_format_str5.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/percent_format_str6.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/percent_format_str6.jsonnet.golden index 63e40b605..e6c52e84e 100644 --- a/sjsonnet/test/resources/go_test_suite/percent_format_str6.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/percent_format_str6.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Too few values to format: 1, expected at least 2 +sjsonnet.Error: [std.format] too few values to format: 1, expected at least 2 at [].(percent_format_str6.jsonnet:1:11) diff --git a/sjsonnet/test/resources/go_test_suite/percent_format_str7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/percent_format_str7.jsonnet.golden index 9e050715d..bc52fac98 100644 --- a/sjsonnet/test/resources/go_test_suite/percent_format_str7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/percent_format_str7.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Format required a number at 0, got string +sjsonnet.Error: [std.format] expected number at position 0, got string at [].(percent_format_str7.jsonnet:1:8) diff --git a/sjsonnet/test/resources/go_test_suite/pow7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/pow7.jsonnet.golden index 1773d54f7..61a6e6d45 100644 --- a/sjsonnet/test/resources/go_test_suite/pow7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/pow7.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.pow] overflow +sjsonnet.Error: [std.pow] Overflow at [].(pow7.jsonnet:2:8) diff --git a/sjsonnet/test/resources/go_test_suite/std.codepoint3.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.codepoint3.jsonnet.golden index ab9ac909e..c2cbe1d11 100644 --- a/sjsonnet/test/resources/go_test_suite/std.codepoint3.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.codepoint3.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.codepoint] expected a single character string, got aa +sjsonnet.Error: [std.codepoint] expected a single character string (length 2), got: aa at [].(std.codepoint3.jsonnet:1:14) diff --git a/sjsonnet/test/resources/go_test_suite/std.codepoint6.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.codepoint6.jsonnet.golden index 816747fb9..264fbd03b 100644 --- a/sjsonnet/test/resources/go_test_suite/std.codepoint6.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.codepoint6.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.codepoint] expected a single character string, got +sjsonnet.Error: [std.codepoint] expected a single character string (length 0), got: at [].(std.codepoint6.jsonnet:1:14) - diff --git a/sjsonnet/test/resources/go_test_suite/std.codepoint7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.codepoint7.jsonnet.golden index 119095b8c..ae93460ac 100644 --- a/sjsonnet/test/resources/go_test_suite/std.codepoint7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.codepoint7.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.codepoint] expected a single character string, got ą +sjsonnet.Error: [std.codepoint] expected a single character string (length 2), got: ą at [].(std.codepoint7.jsonnet:2:14) diff --git a/sjsonnet/test/resources/go_test_suite/std.join7.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.join7.jsonnet.golden index 23f5aca3d..3564930ce 100644 --- a/sjsonnet/test/resources/go_test_suite/std.join7.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.join7.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.join] Cannot join array +sjsonnet.Error: [std.join] cannot join array at [].(std.join7.jsonnet:1:9) diff --git a/sjsonnet/test/resources/go_test_suite/std.join8.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.join8.jsonnet.golden index 61298c723..34c9bdad7 100644 --- a/sjsonnet/test/resources/go_test_suite/std.join8.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.join8.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.join] Cannot join string +sjsonnet.Error: [std.join] cannot join string at [].(std.join8.jsonnet:1:9) diff --git a/sjsonnet/test/resources/go_test_suite/std.makeArrayNamed3.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.makeArrayNamed3.jsonnet.golden index 3b9ca3a48..88518f4af 100644 --- a/sjsonnet/test/resources/go_test_suite/std.makeArrayNamed3.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.makeArrayNamed3.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.makeArray] has no parameter blahblah +sjsonnet.Error: [std.makeArray] Has no parameter blahblah at [].(std.makeArrayNamed3.jsonnet:1:14) diff --git a/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger.jsonnet.golden index 8ecc53d5f..a20145b8f 100644 --- a/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.makeArray] index value is not a valid integer +sjsonnet.Error: [std.makeArray] Index value is not a valid integer at [].(std.makeArray_noninteger.jsonnet:1:14) diff --git a/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger_big.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger_big.jsonnet.golden index caa52dec3..170bafd55 100644 --- a/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger_big.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.makeArray_noninteger_big.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.makeArray] index value is not a valid integer +sjsonnet.Error: [std.makeArray] Index value is not a valid integer at [].(std.makeArray_noninteger_big.jsonnet:1:14) diff --git a/sjsonnet/test/resources/go_test_suite/std.maxArrayOnEmpty.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.maxArrayOnEmpty.jsonnet.golden index 471d932bd..8943899b8 100644 --- a/sjsonnet/test/resources/go_test_suite/std.maxArrayOnEmpty.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.maxArrayOnEmpty.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.maxArray] Expected at least one element in array. Got none +sjsonnet.Error: [std.maxArray] expected at least one element in array, got none at [].(std.maxArrayOnEmpty.jsonnet:1:13) diff --git a/sjsonnet/test/resources/go_test_suite/std.minArrayOnEmpty.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/std.minArrayOnEmpty.jsonnet.golden index 76fb6efa9..f27612a45 100644 --- a/sjsonnet/test/resources/go_test_suite/std.minArrayOnEmpty.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/std.minArrayOnEmpty.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.minArray] Expected at least one element in array. Got none +sjsonnet.Error: [std.minArray] expected at least one element in array, got none at [].(std.minArrayOnEmpty.jsonnet:1:13) diff --git a/sjsonnet/test/resources/go_test_suite/string_index_negative.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/string_index_negative.jsonnet.golden index 92cd565d9..c5c1edbc4 100644 --- a/sjsonnet/test/resources/go_test_suite/string_index_negative.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/string_index_negative.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: index value is not a positive integer, got: -1 +sjsonnet.Error: Index value is not a positive integer, got: -1 at [].(string_index_negative.jsonnet:1:7) diff --git a/sjsonnet/test/resources/go_test_suite/string_index_out_of_bounds.jsonnet.golden b/sjsonnet/test/resources/go_test_suite/string_index_out_of_bounds.jsonnet.golden index 9426db8fe..80ae4ba56 100644 --- a/sjsonnet/test/resources/go_test_suite/string_index_out_of_bounds.jsonnet.golden +++ b/sjsonnet/test/resources/go_test_suite/string_index_out_of_bounds.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: string bounds error: 4 not within [0, 4) +sjsonnet.Error: String bounds error: 4 not within [0, 4) at [].(string_index_out_of_bounds.jsonnet:1:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_addition.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_addition.jsonnet.golden index d6cfd6265..998f143ca 100644 --- a/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_addition.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_addition.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(error.arithmetic_overflow_addition.jsonnet:2:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_multiplication.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_multiplication.jsonnet.golden index 474000746..f1c4a392e 100644 --- a/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_multiplication.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_multiplication.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(error.arithmetic_overflow_multiplication.jsonnet:2:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_subtraction.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_subtraction.jsonnet.golden index 43eeae58e..52a9547a5 100644 --- a/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_subtraction.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.arithmetic_overflow_subtraction.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(error.arithmetic_overflow_subtraction.jsonnet:2:8) diff --git a/sjsonnet/test/resources/new_test_suite/error.array_function_element_equality.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.array_function_element_equality.jsonnet.golden index 46a3fa69b..a9c6bc504 100644 --- a/sjsonnet/test/resources/new_test_suite/error.array_function_element_equality.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.array_function_element_equality.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: cannot test equality of functions +sjsonnet.Error: Cannot test equality of functions at [].(error.array_function_element_equality.jsonnet:3:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.auto_tco_and_tailcall_bool_check.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.auto_tco_and_tailcall_bool_check.jsonnet.golden index 9e0cd92f8..81dde6d9f 100644 --- a/sjsonnet/test/resources/new_test_suite/error.auto_tco_and_tailcall_bool_check.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.auto_tco_and_tailcall_bool_check.jsonnet.golden @@ -1 +1,3 @@ -sjsonnet.Error: binary operator && does not operate on numbers. +sjsonnet.Error: Binary operator && does not operate on numbers. + at [f].(error.auto_tco_and_tailcall_bool_check.jsonnet:5:13) + at [].(error.auto_tco_and_tailcall_bool_check.jsonnet:3:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check.jsonnet.golden index a73f6a615..8aa5a115c 100644 --- a/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: binary operator && does not operate on strings. +sjsonnet.Error: Binary operator && does not operate on strings. at [f].(error.auto_tco_bool_check.jsonnet:4:18) diff --git a/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check_precedes_outer_error_value.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check_precedes_outer_error_value.jsonnet.golden index 9e0cd92f8..1d0926821 100644 --- a/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check_precedes_outer_error_value.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.auto_tco_bool_check_precedes_outer_error_value.jsonnet.golden @@ -1 +1,3 @@ -sjsonnet.Error: binary operator && does not operate on numbers. +sjsonnet.Error: Binary operator && does not operate on numbers. + at [f].(error.auto_tco_bool_check_precedes_outer_error_value.jsonnet:5:13) + at [].(error.auto_tco_bool_check_precedes_outer_error_value.jsonnet:3:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.auto_tco_nested_bool_check_order.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.auto_tco_nested_bool_check_order.jsonnet.golden index 85d5e1ba2..7ed50b3ab 100644 --- a/sjsonnet/test/resources/new_test_suite/error.auto_tco_nested_bool_check_order.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.auto_tco_nested_bool_check_order.jsonnet.golden @@ -1 +1,3 @@ -sjsonnet.Error: binary operator || does not operate on numbers. +sjsonnet.Error: Binary operator || does not operate on numbers. + at [f].(error.auto_tco_nested_bool_check_order.jsonnet:5:23) + at [].(error.auto_tco_nested_bool_check_order.jsonnet:3:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.auto_tco_or_tailcall_bool_check.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.auto_tco_or_tailcall_bool_check.jsonnet.golden index 85d5e1ba2..1cf348807 100644 --- a/sjsonnet/test/resources/new_test_suite/error.auto_tco_or_tailcall_bool_check.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.auto_tco_or_tailcall_bool_check.jsonnet.golden @@ -1 +1,3 @@ -sjsonnet.Error: binary operator || does not operate on numbers. +sjsonnet.Error: Binary operator || does not operate on numbers. + at [f].(error.auto_tco_or_tailcall_bool_check.jsonnet:5:14) + at [].(error.auto_tco_or_tailcall_bool_check.jsonnet:3:7) diff --git a/sjsonnet/test/resources/new_test_suite/error.equality_function_in_array.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.equality_function_in_array.jsonnet.golden index d625e6407..b82dd74b0 100644 --- a/sjsonnet/test/resources/new_test_suite/error.equality_function_in_array.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.equality_function_in_array.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: cannot test equality of functions +sjsonnet.Error: Cannot test equality of functions diff --git a/sjsonnet/test/resources/new_test_suite/error.equality_function_in_object.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.equality_function_in_object.jsonnet.golden index d625e6407..b82dd74b0 100644 --- a/sjsonnet/test/resources/new_test_suite/error.equality_function_in_object.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.equality_function_in_object.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: cannot test equality of functions +sjsonnet.Error: Cannot test equality of functions diff --git a/sjsonnet/test/resources/new_test_suite/error.format_c_boolean.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.format_c_boolean.jsonnet.golden index e2fe5b5f2..e70bb4c76 100644 --- a/sjsonnet/test/resources/new_test_suite/error.format_c_boolean.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.format_c_boolean.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] %c expected number / string, got: boolean +sjsonnet.Error: [std.format] %c expected number or string, got boolean at [].(error.format_c_boolean.jsonnet:4:6) diff --git a/sjsonnet/test/resources/new_test_suite/error.format_c_invalid_codepoint.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.format_c_invalid_codepoint.jsonnet.golden index 15f27dc9b..5de39ea0f 100644 --- a/sjsonnet/test/resources/new_test_suite/error.format_c_invalid_codepoint.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.format_c_invalid_codepoint.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Invalid unicode codepoint, got 1114112 +sjsonnet.Error: [std.format] invalid unicode codepoint, got 1114112 at [].(error.format_c_invalid_codepoint.jsonnet:4:6) diff --git a/sjsonnet/test/resources/new_test_suite/error.format_c_negative_codepoint.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.format_c_negative_codepoint.jsonnet.golden index 534fcca0c..7f47a9379 100644 --- a/sjsonnet/test/resources/new_test_suite/error.format_c_negative_codepoint.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.format_c_negative_codepoint.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Codepoints must be >= 0, got -1 +sjsonnet.Error: [std.format] codepoints must be >= 0, got -1 at [].(error.format_c_negative_codepoint.jsonnet:4:6) diff --git a/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_prec.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_prec.jsonnet.golden index 22474e749..f39c3e5a2 100644 --- a/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_prec.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_prec.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.format] Cannot use * precision with object. +sjsonnet.Error: [std.format] cannot use * precision with named format diff --git a/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_width.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_width.jsonnet.golden index 0a34ae547..c520f8fa7 100644 --- a/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_width.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.format_object_asterisk_width.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.format] Cannot use * width with object. +sjsonnet.Error: [std.format] cannot use * width with named format diff --git a/sjsonnet/test/resources/new_test_suite/error.leftshift_large_amount_overflow.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.leftshift_large_amount_overflow.jsonnet.golden index 9d38e3ad6..78d83442e 100644 --- a/sjsonnet/test/resources/new_test_suite/error.leftshift_large_amount_overflow.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.leftshift_large_amount_overflow.jsonnet.golden @@ -1,2 +1,2 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(error.leftshift_large_amount_overflow.jsonnet:1:3) diff --git a/sjsonnet/test/resources/new_test_suite/error.math_acos_nan.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.math_acos_nan.jsonnet.golden index 08f406e01..91bdc8eae 100644 --- a/sjsonnet/test/resources/new_test_suite/error.math_acos_nan.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.math_acos_nan.jsonnet.golden @@ -1 +1,2 @@ sjsonnet.Error: [std.acos] not a number + at [].(error.math_acos_nan.jsonnet:2:9) diff --git a/sjsonnet/test/resources/new_test_suite/error.math_asin_nan.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.math_asin_nan.jsonnet.golden index 91f57ec78..6c75b2361 100644 --- a/sjsonnet/test/resources/new_test_suite/error.math_asin_nan.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.math_asin_nan.jsonnet.golden @@ -1 +1,2 @@ sjsonnet.Error: [std.asin] not a number + at [].(error.math_asin_nan.jsonnet:2:9) diff --git a/sjsonnet/test/resources/new_test_suite/error.math_pow_nan.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.math_pow_nan.jsonnet.golden index 6de87c33c..348923167 100644 --- a/sjsonnet/test/resources/new_test_suite/error.math_pow_nan.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.math_pow_nan.jsonnet.golden @@ -1 +1,2 @@ sjsonnet.Error: [std.pow] not a number + at [].(error.math_pow_nan.jsonnet:2:8) diff --git a/sjsonnet/test/resources/new_test_suite/error.range_non_integer_from.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.range_non_integer_from.jsonnet.golden index 655a0fdad..16346776c 100644 --- a/sjsonnet/test/resources/new_test_suite/error.range_non_integer_from.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.range_non_integer_from.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.range] std.range from must be an integer, got 1.25 \ No newline at end of file +sjsonnet.Error: [std.range] from must be an integer, got 1.25 diff --git a/sjsonnet/test/resources/new_test_suite/error.range_non_integer_to.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.range_non_integer_to.jsonnet.golden index 61a63f228..5b4f0e89d 100644 --- a/sjsonnet/test/resources/new_test_suite/error.range_non_integer_to.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.range_non_integer_to.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.range] std.range to must be an integer, got 2.5 \ No newline at end of file +sjsonnet.Error: [std.range] to must be an integer, got 2.5 diff --git a/sjsonnet/test/resources/new_test_suite/error.removeAt_negative_index.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.removeAt_negative_index.jsonnet.golden index 80343aea6..60e73c9e8 100644 --- a/sjsonnet/test/resources/new_test_suite/error.removeAt_negative_index.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.removeAt_negative_index.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.removeAt] idx out of bounds +sjsonnet.Error: [std.removeAt] idx -1 out of bounds, array length 3 diff --git a/sjsonnet/test/resources/new_test_suite/error.removeAt_out_of_bounds.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.removeAt_out_of_bounds.jsonnet.golden index 80343aea6..6b617c32d 100644 --- a/sjsonnet/test/resources/new_test_suite/error.removeAt_out_of_bounds.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.removeAt_out_of_bounds.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.removeAt] idx out of bounds +sjsonnet.Error: [std.removeAt] idx 10 out of bounds, array length 3 diff --git a/sjsonnet/test/resources/new_test_suite/error.repeat_non_integer_count.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.repeat_non_integer_count.jsonnet.golden index 5ca5c6dfb..92475138b 100644 --- a/sjsonnet/test/resources/new_test_suite/error.repeat_non_integer_count.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.repeat_non_integer_count.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.repeat] std.repeat count must be an integer, got 1.5 +sjsonnet.Error: [std.repeat] count must be an integer, got 1.5 diff --git a/sjsonnet/test/resources/new_test_suite/error.splitlimit_negative_maxsplits.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.splitlimit_negative_maxsplits.jsonnet.golden index c887536be..64a301d74 100644 --- a/sjsonnet/test/resources/new_test_suite/error.splitlimit_negative_maxsplits.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.splitlimit_negative_maxsplits.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.splitLimit] std.splitLimit third parameter should be -1 or non-negative, got -2 +sjsonnet.Error: [std.splitLimit] third parameter should be -1 or non-negative, got -2 diff --git a/sjsonnet/test/resources/new_test_suite/error.splitlimit_non_integer_maxsplits.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.splitlimit_non_integer_maxsplits.jsonnet.golden index c4286ca18..71466f1f2 100644 --- a/sjsonnet/test/resources/new_test_suite/error.splitlimit_non_integer_maxsplits.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.splitlimit_non_integer_maxsplits.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.splitLimit] std.splitLimit third parameter must be an integer, got 1.5 +sjsonnet.Error: [std.splitLimit] third parameter must be an integer, got 1.5 diff --git a/sjsonnet/test/resources/new_test_suite/error.splitlimitr_negative_maxsplits.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.splitlimitr_negative_maxsplits.jsonnet.golden index 43420e75b..cb74bd27d 100644 --- a/sjsonnet/test/resources/new_test_suite/error.splitlimitr_negative_maxsplits.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.splitlimitr_negative_maxsplits.jsonnet.golden @@ -1 +1 @@ -sjsonnet.Error: [std.splitLimitR] std.splitLimitR third parameter should be -1 or non-negative, got -2 +sjsonnet.Error: [std.splitLimitR] third parameter should be -1 or non-negative, got -2 diff --git a/sjsonnet/test/resources/new_test_suite/error.std.flatmap_string_null.jsonnet.golden b/sjsonnet/test/resources/new_test_suite/error.std.flatmap_string_null.jsonnet.golden index c7428300b..2f8c05483 100644 --- a/sjsonnet/test/resources/new_test_suite/error.std.flatmap_string_null.jsonnet.golden +++ b/sjsonnet/test/resources/new_test_suite/error.std.flatmap_string_null.jsonnet.golden @@ -1,2 +1 @@ -sjsonnet.Error: [std.flatMap] std.flatMap on strings, provided function must return a string, got null - at [].(error.std.flatmap_string_null.jsonnet:1:12) +sjsonnet.Error: [std.flatMap] on strings, provided function must return a string, got null diff --git a/sjsonnet/test/resources/test_suite/error.array_fractional_index.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.array_fractional_index.jsonnet.golden index b8ab154b3..06daafa4b 100644 --- a/sjsonnet/test/resources/test_suite/error.array_fractional_index.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.array_fractional_index.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: index value is not a valid integer +sjsonnet.Error: Index value is not a valid integer at [].(error.array_fractional_index.jsonnet:17:10) diff --git a/sjsonnet/test/resources/test_suite/error.array_index_string.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.array_index_string.jsonnet.golden index b46071298..3adcad478 100644 --- a/sjsonnet/test/resources/test_suite/error.array_index_string.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.array_index_string.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: attempted to index a array with string foo +sjsonnet.Error: Attempted to index a array with string foo at [].(error.array_index_string.jsonnet:17:10) diff --git a/sjsonnet/test/resources/test_suite/error.array_large_index.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.array_large_index.jsonnet.golden index c2fbf932a..a4342cfc7 100644 --- a/sjsonnet/test/resources/test_suite/error.array_large_index.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.array_large_index.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: index value is not a valid integer +sjsonnet.Error: Index value is not a valid integer at [].(error.array_large_index.jsonnet:17:10) diff --git a/sjsonnet/test/resources/test_suite/error.assert_equal_obj.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.assert_equal_obj.jsonnet.golden index 5efa3737a..c3d5147b0 100644 --- a/sjsonnet/test/resources/test_suite/error.assert_equal_obj.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.assert_equal_obj.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.assertEqual] assertEqual failed: {"a":1} != {"b":1} +sjsonnet.Error: [std.assertEqual] {"a":1} != {"b":1} at [].(error.assert_equal_obj.jsonnet:17:16) - diff --git a/sjsonnet/test/resources/test_suite/error.assert_equal_str.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.assert_equal_str.jsonnet.golden index e62384658..afad2b958 100644 --- a/sjsonnet/test/resources/test_suite/error.assert_equal_str.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.assert_equal_str.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.assertEqual] assertEqual failed: "one\ntwo" != "three\nfour\n" +sjsonnet.Error: [std.assertEqual] "one\ntwo" != "three\nfour\n" at [].(error.assert_equal_str.jsonnet:17:16) - diff --git a/sjsonnet/test/resources/test_suite/error.decodeUTF8_float.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.decodeUTF8_float.jsonnet.golden index 7424b87fa..082d2fb57 100644 --- a/sjsonnet/test/resources/test_suite/error.decodeUTF8_float.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.decodeUTF8_float.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.decodeUTF8] Element 0 of the provided array was not an integer in range [0,255] +sjsonnet.Error: [std.decodeUTF8] element 0 is not an integer in range [0,255], got number at [].(error.decodeUTF8_float.jsonnet:1:15) - diff --git a/sjsonnet/test/resources/test_suite/error.decodeUTF8_nan.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.decodeUTF8_nan.jsonnet.golden index 9573513dd..03fdbfeb9 100644 --- a/sjsonnet/test/resources/test_suite/error.decodeUTF8_nan.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.decodeUTF8_nan.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.decodeUTF8] Element 0 of the provided array was not an integer in range [0,255] +sjsonnet.Error: [std.decodeUTF8] element 0 is not an integer in range [0,255], got string at [].(error.decodeUTF8_nan.jsonnet:1:15) - diff --git a/sjsonnet/test/resources/test_suite/error.equality_function.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.equality_function.jsonnet.golden index 144162bcc..d85673051 100644 --- a/sjsonnet/test/resources/test_suite/error.equality_function.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.equality_function.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: cannot test equality of functions +sjsonnet.Error: Cannot test equality of functions at [].(error.equality_function.jsonnet:17:16) diff --git a/sjsonnet/test/resources/test_suite/error.flatMap_array_typecheck.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.flatMap_array_typecheck.jsonnet.golden index 0766467f6..77ecffc8b 100644 --- a/sjsonnet/test/resources/test_suite/error.flatMap_array_typecheck.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.flatMap_array_typecheck.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.flatMap] std.flatMap on arrays, provided function must return an array, got string +sjsonnet.Error: [std.flatMap] on arrays, provided function must return an array, got string at [].(error.flatMap_array_typecheck.jsonnet:1:12) diff --git a/sjsonnet/test/resources/test_suite/error.flatMap_seq_typecheck.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.flatMap_seq_typecheck.jsonnet.golden index 7574bbfa6..aae27042b 100644 --- a/sjsonnet/test/resources/test_suite/error.flatMap_seq_typecheck.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.flatMap_seq_typecheck.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.flatMap] std.flatMap second param must be array / string, got object +sjsonnet.Error: [std.flatMap] second param must be array / string, got object at [].(error.flatMap_seq_typecheck.jsonnet:1:12) diff --git a/sjsonnet/test/resources/test_suite/error.flatMap_string_typecheck.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.flatMap_string_typecheck.jsonnet.golden index 789f3401c..a9a02d482 100644 --- a/sjsonnet/test/resources/test_suite/error.flatMap_string_typecheck.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.flatMap_string_typecheck.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.flatMap] std.flatMap on strings, provided function must return a string, got number +sjsonnet.Error: [std.flatMap] on strings, provided function must return a string, got number at [].(error.flatMap_string_typecheck.jsonnet:1:12) diff --git a/sjsonnet/test/resources/test_suite/error.format.too_few_values.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.format.too_few_values.jsonnet.golden index 5a3f2f7d9..2b5177f3e 100644 --- a/sjsonnet/test/resources/test_suite/error.format.too_few_values.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.format.too_few_values.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.format] Too few values to format: 1, expected at least 2 +sjsonnet.Error: [std.format] too few values to format: 1, expected at least 2 at [].(error.format.too_few_values.jsonnet:1:12) diff --git a/sjsonnet/test/resources/test_suite/error.function_duplicate_arg.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.function_duplicate_arg.jsonnet.golden index ad45704fe..ba30aedf4 100644 --- a/sjsonnet/test/resources/test_suite/error.function_duplicate_arg.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.function_duplicate_arg.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] binding parameter a second time: x +sjsonnet.Error: [anonymous] Binding parameter a second time: x at [].(error.function_duplicate_arg.jsonnet:17:21) diff --git a/sjsonnet/test/resources/test_suite/error.function_no_default_arg.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.function_no_default_arg.jsonnet.golden index 054a1a496..5452793c3 100644 --- a/sjsonnet/test/resources/test_suite/error.function_no_default_arg.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.function_no_default_arg.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] parameter b not bound in call +sjsonnet.Error: [anonymous] Parameter b not bound in call at [].(error.function_no_default_arg.jsonnet:17:1) diff --git a/sjsonnet/test/resources/test_suite/error.integer_conversion.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.integer_conversion.jsonnet.golden index 65e88949b..a9468eb3d 100644 --- a/sjsonnet/test/resources/test_suite/error.integer_conversion.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.integer_conversion.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(error.integer_conversion.jsonnet:2:7) diff --git a/sjsonnet/test/resources/test_suite/error.integer_left_shift.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.integer_left_shift.jsonnet.golden index eed1dfe2b..0242bf10b 100644 --- a/sjsonnet/test/resources/test_suite/error.integer_left_shift.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.integer_left_shift.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(error.integer_left_shift.jsonnet:2:7) diff --git a/sjsonnet/test/resources/test_suite/error.integer_left_shift_runtime.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.integer_left_shift_runtime.jsonnet.golden index a719facec..6f3fcc002 100644 --- a/sjsonnet/test/resources/test_suite/error.integer_left_shift_runtime.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.integer_left_shift_runtime.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: numeric value outside safe integer range for bitwise operation +sjsonnet.Error: Numeric value outside safe integer range for bitwise operation at [].(error.integer_left_shift_runtime.jsonnet:1:7) diff --git a/sjsonnet/test/resources/test_suite/error.negative_shfit.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.negative_shfit.jsonnet.golden index 77683f25b..5add00fb1 100644 --- a/sjsonnet/test/resources/test_suite/error.negative_shfit.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.negative_shfit.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: shift by negative exponent +sjsonnet.Error: Shift by negative exponent at [].(error.negative_shfit.jsonnet:1:8) diff --git a/sjsonnet/test/resources/test_suite/error.overflow2.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.overflow2.jsonnet.golden index 98af58dc4..e532b9cbe 100644 --- a/sjsonnet/test/resources/test_suite/error.overflow2.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.overflow2.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: overflow +sjsonnet.Error: Overflow at [].(error.overflow2.jsonnet:17:7) diff --git a/sjsonnet/test/resources/test_suite/error.sanity.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.sanity.jsonnet.golden index 6a82c3294..496a6f3c8 100644 --- a/sjsonnet/test/resources/test_suite/error.sanity.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.sanity.jsonnet.golden @@ -1,3 +1,2 @@ -sjsonnet.Error: [std.assertEqual] assertEqual failed: 1 != 2 +sjsonnet.Error: [std.assertEqual] 1 != 2 at [].(error.sanity.jsonnet:17:16) - diff --git a/sjsonnet/test/resources/test_suite/error.std_join_types1.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.std_join_types1.jsonnet.golden index 7336d0f32..6340ebbf9 100644 --- a/sjsonnet/test/resources/test_suite/error.std_join_types1.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.std_join_types1.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.join] Cannot join array +sjsonnet.Error: [std.join] cannot join array at [].(error.std_join_types1.jsonnet:17:9) diff --git a/sjsonnet/test/resources/test_suite/error.std_join_types2.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.std_join_types2.jsonnet.golden index 201ea734e..9866cf846 100644 --- a/sjsonnet/test/resources/test_suite/error.std_join_types2.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.std_join_types2.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.join] Cannot join string +sjsonnet.Error: [std.join] cannot join string at [].(error.std_join_types2.jsonnet:17:9) diff --git a/sjsonnet/test/resources/test_suite/error.std_makeArray_negative.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.std_makeArray_negative.jsonnet.golden index 3defc9bf2..a42199bfe 100644 --- a/sjsonnet/test/resources/test_suite/error.std_makeArray_negative.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.std_makeArray_negative.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.makeArray] index value is not a positive integer, got: -10 +sjsonnet.Error: [std.makeArray] Index value is not a positive integer, got: -10 at [].(error.std_makeArray_negative.jsonnet:17:14) diff --git a/sjsonnet/test/resources/test_suite/error.std_maxArray.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.std_maxArray.jsonnet.golden index dbbff2a17..7792edbe6 100644 --- a/sjsonnet/test/resources/test_suite/error.std_maxArray.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.std_maxArray.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.maxArray] Expected at least one element in array. Got none +sjsonnet.Error: [std.maxArray] expected at least one element in array, got none at [].(error.std_maxArray.jsonnet:1:13) diff --git a/sjsonnet/test/resources/test_suite/error.std_minArray.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.std_minArray.jsonnet.golden index f208a6a73..b76bf03c4 100644 --- a/sjsonnet/test/resources/test_suite/error.std_minArray.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.std_minArray.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.minArray] Expected at least one element in array. Got none +sjsonnet.Error: [std.minArray] expected at least one element in array, got none at [].(error.std_minArray.jsonnet:1:13) diff --git a/sjsonnet/test/resources/test_suite/error.top_level_func.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.top_level_func.jsonnet.golden index 165311dc0..1bb5e9273 100644 --- a/sjsonnet/test/resources/test_suite/error.top_level_func.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.top_level_func.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [anonymous] parameter name not bound in call +sjsonnet.Error: [anonymous] Parameter name not bound in call at [].(error.top_level_func.jsonnet:17:1) diff --git a/sjsonnet/test/resources/test_suite/error.trace_one_param.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.trace_one_param.jsonnet.golden index 008c538c4..b8f786bd0 100644 --- a/sjsonnet/test/resources/test_suite/error.trace_one_param.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.trace_one_param.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.trace] parameter rest not bound in call +sjsonnet.Error: [std.trace] Parameter rest not bound in call at [].(error.trace_one_param.jsonnet:17:7) diff --git a/sjsonnet/test/resources/test_suite/error.trace_zero_param.jsonnet.golden b/sjsonnet/test/resources/test_suite/error.trace_zero_param.jsonnet.golden index c3563bfe8..034831065 100644 --- a/sjsonnet/test/resources/test_suite/error.trace_zero_param.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/error.trace_zero_param.jsonnet.golden @@ -1,3 +1,3 @@ -sjsonnet.Error: [std.trace] parameters str, rest not bound in call +sjsonnet.Error: [std.trace] Parameters str, rest not bound in call at [].(error.trace_zero_param.jsonnet:17:7) diff --git a/sjsonnet/test/src/sjsonnet/AggressiveStaticOptimizationTests.scala b/sjsonnet/test/src/sjsonnet/AggressiveStaticOptimizationTests.scala index 7f3f0a832..170916e59 100644 --- a/sjsonnet/test/src/sjsonnet/AggressiveStaticOptimizationTests.scala +++ b/sjsonnet/test/src/sjsonnet/AggressiveStaticOptimizationTests.scala @@ -233,11 +233,11 @@ object AggressiveStaticOptimizationTests extends TestSuite { // rhs is a Val.Bool. If rhs is not a Bool, the BinaryOp is left intact and // the runtime type-check fires. val err = evalErr(""" true && "hello" """) - assert(err.contains("binary operator &&")) + assert(err.contains("Binary operator &&")) } test("orWithNonBoolRhsStillErrors") { val err = evalErr(""" false || "hello" """) - assert(err.contains("binary operator ||")) + assert(err.contains("Binary operator ||")) } } diff --git a/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala b/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala index d44a3b9c3..9aaef2318 100644 --- a/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala +++ b/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala @@ -46,7 +46,7 @@ object EvaluatorTests extends TestSuite { eval("[1, [2, 3], 4][1][0]") ==> ujson.Num(2) eval("([1, 2, 3] + [4, 5, 6])[3]") ==> ujson.Num(4) evalErr("[][0]") ==> - """sjsonnet.Error: array bounds error: array is empty + """sjsonnet.Error: Array bounds error: array is empty |at [].(:1:3)""".stripMargin eval("std.slice(std.range(1,4), 0, null, 2)") ==> ujson .Arr(1, 3) @@ -526,7 +526,7 @@ object EvaluatorTests extends TestSuite { ) } - assert(ex.getMessage.contains("parameter y not bound in call")) + assert(ex.getMessage.contains("Parameter y not bound in call")) } test("invalidParam") { @@ -543,7 +543,7 @@ object EvaluatorTests extends TestSuite { ) } - assert(ex.getMessage.contains("has no parameter hello")) + assert(ex.getMessage.contains("Has no parameter hello")) } test("unknownVariable") { @@ -651,12 +651,12 @@ object EvaluatorTests extends TestSuite { val ex = assertThrows[Exception]( eval("1 && 2") ) - assert(ex.getMessage.contains("binary operator && does not operate on numbers.")) + assert(ex.getMessage.contains("Binary operator && does not operate on numbers.")) val ex2 = assertThrows[Exception]( eval("1 || 2") ) - assert(ex2.getMessage.contains("binary operator || does not operate on numbers.")) + assert(ex2.getMessage.contains("Binary operator || does not operate on numbers.")) } test("stdToString") { eval("""std.toString({k: "v"})""") ==> ujson.Str( @@ -701,37 +701,37 @@ object EvaluatorTests extends TestSuite { test("formatNullErrors") { evalErr( "'%d' % null" - ) ==> "sjsonnet.Error: [std.format] Format required number at 0, got null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got null\nat [].(:1:6)" evalErr( "'%f' % null" - ) ==> "sjsonnet.Error: [std.format] Format required number at 0, got null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got null\nat [].(:1:6)" evalErr( "'%e' % null" - ) ==> "sjsonnet.Error: [std.format] Format required number at 0, got null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got null\nat [].(:1:6)" evalErr( "'%g' % null" - ) ==> "sjsonnet.Error: [std.format] Format required number at 0, got null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got null\nat [].(:1:6)" evalErr( "'%o' % null" - ) ==> "sjsonnet.Error: [std.format] Format required number at 0, got null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got null\nat [].(:1:6)" evalErr( "'%x' % null" - ) ==> "sjsonnet.Error: [std.format] Format required number at 0, got null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got null\nat [].(:1:6)" evalErr( "'%c' % null" - ) ==> "sjsonnet.Error: [std.format] %c expected number / string, got: null\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] %c expected number or string, got null\nat [].(:1:6)" eval("'%s' % null") ==> ujson.Str("null") } test("formatTypeErrorMessages") { evalErr( "'%a' % 42" - ) ==> "sjsonnet.Error: [std.format] Format required a number at 0, got number\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] unsupported format conversion at position 0, got number\nat [].(:1:6)" evalErr( "'%a' % true" - ) ==> "sjsonnet.Error: [std.format] Format required a boolean at 0, got boolean\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got boolean\nat [].(:1:6)" evalErr( "'%a' % false" - ) ==> "sjsonnet.Error: [std.format] Format required a boolean at 0, got boolean\nat [].(:1:6)" + ) ==> "sjsonnet.Error: [std.format] expected number or string at position 0, got boolean\nat [].(:1:6)" } test("strict") { eval("({ a: 1 } { b: 2 }).a", strict = false) ==> ujson @@ -1002,7 +1002,7 @@ object EvaluatorTests extends TestSuite { val ex = assertThrows[Exception] { eval("std.substr('hello')") } - assert(ex.getMessage.contains("parameter")) + assert(ex.getMessage.contains("Parameter")) assert(ex.getMessage.contains("not bound in call")) } @@ -1011,7 +1011,7 @@ object EvaluatorTests extends TestSuite { val ex = assertThrows[Exception] { eval("std.length(x=[1], noSuchParam=2)") } - assert(ex.getMessage.contains("has no parameter noSuchParam")) + assert(ex.getMessage.contains("Has no parameter noSuchParam")) } // Binding parameter a second time @@ -1019,7 +1019,7 @@ object EvaluatorTests extends TestSuite { val ex = assertThrows[Exception] { eval("std.pow(2, x=3)") } - assert(ex.getMessage.contains("binding parameter a second time: x in function pow")) + assert(ex.getMessage.contains("Binding parameter a second time: x in function pow")) } // User-defined function should include function name from local binding @@ -1031,7 +1031,7 @@ object EvaluatorTests extends TestSuite { """.stripMargin ) } - assert(ex.getMessage.contains("parameter y not bound in call")) + assert(ex.getMessage.contains("Parameter y not bound in call")) } // User-defined function: too many args should include function name @@ -1051,7 +1051,7 @@ object EvaluatorTests extends TestSuite { val ex = assertThrows[Exception] { eval("(function(x, y) x + y)('a')") } - assert(ex.getMessage.contains("parameter y not bound in call")) + assert(ex.getMessage.contains("Parameter y not bound in call")) } // Anonymous function: too many args should NOT include function name diff --git a/sjsonnet/test/src/sjsonnet/StdFlatMapTests.scala b/sjsonnet/test/src/sjsonnet/StdFlatMapTests.scala index 0a1bf8a50..e02e8762a 100644 --- a/sjsonnet/test/src/sjsonnet/StdFlatMapTests.scala +++ b/sjsonnet/test/src/sjsonnet/StdFlatMapTests.scala @@ -16,14 +16,14 @@ object StdFlatMapTests extends TestSuite { assert( evalErr("""std.flatMap(function(x) null, "Hello")""") .startsWith( - "sjsonnet.Error: [std.flatMap] std.flatMap on strings, provided function must return a string, got null" + "sjsonnet.Error: [std.flatMap] on strings, provided function must return a string, got null" ) ) assert( evalErr("std.flatMap(function(x) 123, 'Hello')") .startsWith( - "sjsonnet.Error: [std.flatMap] std.flatMap on strings, provided function must return a string, got number" + "sjsonnet.Error: [std.flatMap] on strings, provided function must return a string, got number" ) ) diff --git a/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala b/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala index 773eb9fe8..6c51814a7 100644 --- a/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala +++ b/sjsonnet/test/src/sjsonnet/StdLibOfficialCompatibilityTests.scala @@ -22,14 +22,14 @@ object StdLibOfficialCompatibilityTests extends TestSuite { } test("repeat reports official negative count error") { - assert(evalErr("""std.repeat("a", -1)""").contains("repeat requires count >= 0, got -1")) + assert(evalErr("""std.repeat("a", -1)""").contains("count must be >= 0, got -1")) } test("removeAt filters by exact index equality") { eval("""std.removeAt([1, 2, 3], 1)""") ==> ujson.Arr(1, 3) assert(evalErr("""std.removeAt([1, 2, 3], 1.5)""").contains("idx must be an integer")) - assert(evalErr("""std.removeAt([1, 2, 3], -1)""").contains("idx out of bounds")) - assert(evalErr("""std.removeAt([1, 2, 3], 9)""").contains("idx out of bounds")) + assert(evalErr("""std.removeAt([1, 2, 3], -1)""").contains("out of bounds")) + assert(evalErr("""std.removeAt([1, 2, 3], 9)""").contains("out of bounds")) assert(evalErr("""std.removeAt([1, 2, 3], "1")""").contains("idx must be a number")) } @@ -91,6 +91,9 @@ object StdLibOfficialCompatibilityTests extends TestSuite { assert(evalErr("""std.uniq([1, 1], keyF=false)""").contains("boolean")) assert(evalErr("""std.setUnion([1], [2], keyF=false)""").contains("boolean")) assert(evalErr("""std.setMember(1, [1], keyF=false)""").contains("boolean")) + val badFirstSetArg = evalErr("""std.setUnion([2, 1], [])""") + assert(badFirstSetArg.contains("sorted array or string without duplicates")) + assert(!badFirstSetArg.contains("second argument")) } } } diff --git a/sjsonnet/test/src/sjsonnet/StdMathTests.scala b/sjsonnet/test/src/sjsonnet/StdMathTests.scala index 816a7d768..f80b5ba88 100644 --- a/sjsonnet/test/src/sjsonnet/StdMathTests.scala +++ b/sjsonnet/test/src/sjsonnet/StdMathTests.scala @@ -39,27 +39,27 @@ object StdMathTests extends TestSuite { evalErr("std.exponent(std.pow(2, 1024))") } test("sqrt rejects negative input") { - // go-jsonnet: makeDoubleCheck returns "Not a number" for NaN results + // go-jsonnet: makeDoubleCheck returns "not a number" for NaN results val err = evalErr("std.sqrt(-1)") - assert(err.contains("Not a number")) + assert(err.contains("not a number")) val err2 = evalErr("std.sqrt(-0.001)") - assert(err2.contains("Not a number")) + assert(err2.contains("not a number")) // sqrt(0) and sqrt(positive) must still work eval("std.sqrt(0)") ==> ujson.Num(0.0) eval("std.sqrt(4)") ==> ujson.Num(2.0) } test("log and log2 reject negative and zero input") { - // go-jsonnet: makeDoubleCheck returns "Not a number" for NaN, Val.Num catches Infinity as "overflow" + // go-jsonnet: makeDoubleCheck returns "not a number" for NaN, Val.Num catches Infinity as "overflow" val errLog = evalErr("std.log(-1)") - assert(errLog.contains("Not a number")) + assert(errLog.contains("not a number")) val errLog2 = evalErr("std.log2(-1)") - assert(errLog2.contains("Not a number")) + assert(errLog2.contains("not a number")) val errLog10 = evalErr("std.log10(-1)") - assert(errLog10.contains("Not a number")) + assert(errLog10.contains("not a number")) val errLog0 = evalErr("std.log(0)") - assert(errLog0.contains("overflow")) + assert(errLog0.contains("Overflow")) val errLog2Zero = evalErr("std.log2(0)") - assert(errLog2Zero.contains("overflow")) + assert(errLog2Zero.contains("Overflow")) // log(positive) must still work eval("std.log(1)") ==> ujson.Num(0.0) eval("std.log2(1)") ==> ujson.Num(0.0) diff --git a/sjsonnet/test/src/sjsonnet/TailCallOptimizationTests.scala b/sjsonnet/test/src/sjsonnet/TailCallOptimizationTests.scala index addb94975..3d39f2fe8 100644 --- a/sjsonnet/test/src/sjsonnet/TailCallOptimizationTests.scala +++ b/sjsonnet/test/src/sjsonnet/TailCallOptimizationTests.scala @@ -28,7 +28,7 @@ object TailCallOptimizationTests extends TestSuite { |factorial(1000) |""".stripMargin ) - assert(err.contains("overflow")) + assert(err.contains("Overflow")) } test("tailstrictDeepRecursionSum") { diff --git a/sjsonnet/test/src/sjsonnet/UnicodeHandlingTests.scala b/sjsonnet/test/src/sjsonnet/UnicodeHandlingTests.scala index f7ec27a2c..a47814cca 100644 --- a/sjsonnet/test/src/sjsonnet/UnicodeHandlingTests.scala +++ b/sjsonnet/test/src/sjsonnet/UnicodeHandlingTests.scala @@ -22,7 +22,7 @@ object UnicodeHandlingTests extends TestSuite { test("stringIndex") { eval("'Hello 🌍 World'[6]") ==> ujson.Str("🌍") eval("'A🌍B'[1]") ==> ujson.Str("🌍") - assert(evalErr("'A🌍B'[3]").contains("string bounds error")) + assert(evalErr("'A🌍B'[3]").contains("String bounds error")) } test("codepoint") {