diff --git a/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala b/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala index 706d28fe2..fe59fc692 100644 --- a/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala +++ b/sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala @@ -80,6 +80,8 @@ object StdLibModule { ) rest.value } + + override def staticSafe = false } /** diff --git a/sjsonnet/test/resources/test_suite/trace.jsonnet.golden b/sjsonnet/test/resources/test_suite/trace.jsonnet.golden index 859ee3426..3a81736d7 100644 --- a/sjsonnet/test/resources/test_suite/trace.jsonnet.golden +++ b/sjsonnet/test/resources/test_suite/trace.jsonnet.golden @@ -7,6 +7,6 @@ TRACE: trace.jsonnet TRACE: trace.jsonnet TRACE: trace.jsonnet TRACE: trace.jsonnet -TRACE: trace.jsonnet Some Trace Message TRACE: trace.jsonnet +TRACE: trace.jsonnet Some Trace Message true diff --git a/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala b/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala index 57d613902..228a65d02 100644 --- a/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala +++ b/sjsonnet/test/src/sjsonnet/EvaluatorTests.scala @@ -4,6 +4,23 @@ import utest._ import TestUtils.{eval, evalErr} object EvaluatorTests extends TestSuite { + private def evalWithTraces(s: String): (ujson.Value, Vector[String]) = { + var traces = Vector.empty[String] + val interpreter = new Interpreter( + Map(), + Map(), + DummyPath(), + Importer.empty, + parseCache = new DefaultParseCache, + logger = (isTrace, msg) => if (isTrace) traces :+= msg + ) + val result = interpreter.interpret(s, DummyPath("(memory)")) match { + case Right(value) => value + case Left(err) => throw new Exception(err) + } + (result, traces) + } + def tests: Tests = Tests { test("arithmetic") { eval("1 + 2 + 3") ==> ujson.Num(6) @@ -569,6 +586,23 @@ object EvaluatorTests extends TestSuite { eval("\"%()s %()s!\" % [\"Hello\", \"World\"]") ==> ujson .Str("Hello World!") } + test("trace laziness") { + val (unusedObj, unusedObjTraces) = evalWithTraces( + """local x = {a: std.trace("unused object", "ok")}; 0""" + ) + unusedObj ==> ujson.Num(0) + unusedObjTraces ==> Vector.empty + + val (unusedFormat, unusedFormatTraces) = evalWithTraces( + """local x = "%% %(a)s %%" % {a: std.trace("unused format", "ok")}; 0""" + ) + unusedFormat ==> ujson.Num(0) + unusedFormatTraces ==> Vector.empty + + val (used, usedTraces) = evalWithTraces("""std.trace("used trace", 1)""") + used ==> ujson.Num(1) + usedTraces ==> Vector("TRACE: (memory) used trace") + } test("binaryOps") { val ex = assertThrows[Exception]( eval("1 && 2")