Here you are:
import org.scalatest.FunSuite
import play.api.libs.json.{Format, Json}
class ImplicitOrderingTest extends FunSuite {
implicit val BarFormat: Format[Bar] = Json.format
implicit val FooFormat: Format[Foo] = Json.format
test("Writing Bar - right order: compile and crash at runtime") {
assert(BarFormat.writes(Bar(Foo(1))).toString() === """{"f":{"i":1}}""") //throws!!
}
}
case class Foo(i: Int)
case class Bar(f: Foo)
This compiles but throws NPE at runtime. Ideally it shouldn’t compile, just like this doesn’t compile :
import org.scalatest.FunSuite
import play.api.libs.json.{Format, Json}
class ImplicitOrderingTest extends FunSuite {
test("Writing Bar - right order: compile and crash at runtime") {
implicit val BarFormat: Format[Bar] = Json.format
implicit val FooFormat: Format[Foo] = Json.format
assert(BarFormat.writes(Bar(Foo(1))).toString() === """{"f":{"i":1}}""")
}
}
case class Foo(i: Int)
case class Bar(f: Foo)
The compiler error being “forward reference extends over definition of value BarFormat
[error] implicit val BarFormat: Format[Bar] = Json.format”