Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sjsonnet/src/sjsonnet/stdlib/StdLibModule.scala
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ object StdLibModule {
)
rest.value
}

override def staticSafe = false
}

/**
Expand Down
2 changes: 1 addition & 1 deletion sjsonnet/test/resources/test_suite/trace.jsonnet.golden
Original file line number Diff line number Diff line change
Expand Up @@ -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
34 changes: 34 additions & 0 deletions sjsonnet/test/src/sjsonnet/EvaluatorTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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")
Expand Down
Loading