aboutsummaryrefslogtreecommitdiff
path: root/shared/src/test/scala/CoproductTypeFormatTests.scala
diff options
context:
space:
mode:
Diffstat (limited to 'shared/src/test/scala/CoproductTypeFormatTests.scala')
-rw-r--r--shared/src/test/scala/CoproductTypeFormatTests.scala79
1 files changed, 79 insertions, 0 deletions
diff --git a/shared/src/test/scala/CoproductTypeFormatTests.scala b/shared/src/test/scala/CoproductTypeFormatTests.scala
new file mode 100644
index 0000000..de73967
--- /dev/null
+++ b/shared/src/test/scala/CoproductTypeFormatTests.scala
@@ -0,0 +1,79 @@
+package spray.json
+
+import org.scalatest._
+
+class CoproductTypeFormatTests
+ extends FlatSpec
+ with FormatTests
+ with DefaultJsonProtocol
+ with DerivedFormats {
+
+ sealed trait Expr
+ case class Zero() extends Expr
+ case class Value(x: Int) extends Expr
+ case class Plus(lhs: Expr, rhs: Expr) extends Expr
+ case object One extends Expr
+
+ implicit val exprFormat: RootJsonFormat[Expr] = jsonFormat[Expr]
+
+ "No-parameter case class child" should behave like checkRoundtrip[Expr](
+ Zero(),
+ """{"type":"Zero"}"""
+ )
+
+ "Simple parameter case class child" should behave like checkRoundtrip[Expr](
+ Value(42),
+ """{"type":"Value","x":42}"""
+ )
+
+ "Nested parameter case class child" should behave like checkRoundtrip[Expr](
+ Plus(Value(42), One),
+ """{"type":"Plus","lhs":{"type":"Value","x":42},"rhs":{"type":"One"}}"""
+ )
+
+ "Case object child" should behave like checkRoundtrip[Expr](
+ One,
+ """{"type": "One"}"""
+ )
+
+ @gadt("kind")
+ sealed abstract class Keyword(`type`: String)
+ case class If(`type`: String) extends Keyword(`type`)
+
+ implicit val keywordFormat: RootJsonFormat[Keyword] = jsonFormat[Keyword]
+
+ "GADT with type field alias" should behave like checkRoundtrip[Keyword](
+ If("class"),
+ """{"kind":"If","type":"class"}"""
+ )
+
+ @gadt("""_`crazy type!`"""")
+ sealed abstract trait Crazy
+ case class CrazyType() extends Crazy
+
+ implicit val crazyFormat: RootJsonFormat[Crazy] = jsonFormat[Crazy]
+
+ "GADT with special characters in type field" should behave like checkRoundtrip[
+ Crazy](
+ CrazyType(),
+ """{"_`crazy type!`\"": "CrazyType"}"""
+ )
+
+ sealed trait Enum
+ case object A extends Enum
+ case object B extends Enum
+
+ implicit val enumFormat: RootJsonFormat[Enum] = jsonFormat[Enum]
+
+ "Enum" should behave like checkRoundtrip[List[Enum]](
+ A :: B :: Nil,
+ """[{"type":"A"}, {"type":"B"}]"""
+ )
+
+ "Serializing as sealed trait and deserializing as child" should "work" in {
+ implicit val plusFormat: RootJsonFormat[Plus] = jsonFormat[Plus]
+ val expr: Expr = Plus(Value(42), Plus(Zero(), One))
+ assert(expr.toJson.convertTo[Plus] == expr)
+ }
+
+}