Skip to content

Commit

Permalink
Initial implementation of Play-JSON conversion
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisjameswright committed Nov 5, 2019
1 parent 37a73ec commit 6ef6236
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 0 deletions.
12 changes: 12 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -39,3 +39,15 @@ lazy val playTest = (project in file("play-test"))
uglifyCompressOptions := Seq("unused=false", "dead_code=false"),
pipelineStages in Assets := Seq(concat,uglify)
)

lazy val playNunjucks = (project in file("play-nunjucks"))
.dependsOn(lib)
.settings(
name := "play-nunjucks",
version := "0.1.0",
scalaVersion := "2.11.12",
libraryDependencies ++= Seq(
"org.scalatest" %% "scalatest" % "3.0.8" % Test,
"com.typesafe.play" %% "play" % PlayVersion.current
)
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package wolfendale.playnunjucks

import play.api.libs.json.{JsArray, JsBoolean, JsNull, JsNumber, JsObject, JsString, JsValue}
import wolfendale.nunjucks.expression.runtime.Value
import wolfendale.nunjucks.expression.runtime.Value._

class PlayJsonConverter {

def convert(js: JsValue): Value = js match {
case JsNull => Null
case boolean: JsBoolean => Bool(boolean.value)
case JsNumber(value) => Number(value.doubleValue())
case JsString(value) => Str(value)
case JsArray(value) => Arr(value.map(convert))
case JsObject(underlying) =>
val map = underlying.map({case (key, value) => (key, convert(value))})
Obj(map.toArray:_*)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
package wolfendale.playnunjucks

import org.scalatest.{FreeSpec, MustMatchers}
import play.api.libs.json.{JsArray, JsBoolean, JsNull, JsNumber, JsObject, JsString}
import wolfendale.nunjucks.expression.runtime.Value
import wolfendale.nunjucks.expression.runtime.Value._

class PlayJsonConverterSpec extends FreeSpec with MustMatchers {

val converter: PlayJsonConverter = new PlayJsonConverter

"PlayJsonConverter" - {

"should convert null" in {
converter.convert(JsNull) mustEqual Null
}

"should convert boolean true" in {
converter.convert(JsBoolean(true)) mustEqual Bool(true)
}

"should convert boolean false" in {
converter.convert(JsBoolean(false)) mustEqual Bool(false)
}

"should convert zero" in {
converter.convert(JsNumber(0)) mustEqual Number(0)
}

"should convert positive integers" in {
converter.convert(JsNumber(1)) mustEqual Number(1)
}

"should convert negative integers" in {
converter.convert(JsNumber(-1)) mustEqual Number(-1)
}

"should convert positive doubles" in {
converter.convert(JsNumber(1.5)) mustEqual Number(1.5)
}

"should convert negative doubles" in {
converter.convert(JsNumber(-1.5)) mustEqual Number(-1.5)
}

"should convert empty strings" in {
converter.convert(JsString("")) mustEqual Str("")
}

"should convert non-empty strings" in {
converter.convert(JsString("hello")) mustEqual Str("hello")
}

"should convert empty arrays" in {
converter.convert(JsArray()) mustEqual Arr(Seq.empty)
}

"should convert non-empty arrays" in {
converter.convert(JsArray(Seq(JsString("hello"), JsString("world")))) mustEqual Arr(Seq(Str("hello"), Str("world")))
}

"should convert simple objects" in {
converter.convert(JsObject(Seq(
("string", JsString("string")),
("number", JsNumber(1)),
("null", JsNull)
)))
}

"should convert nested objects" in {
converter.convert(JsObject(Seq(
("string", JsString("string")),
("number", JsNumber(1)),
("null", JsNull),
("nested", JsObject(Seq(
("string", JsString("string")),
("number", JsNumber(1)),
("null", JsNull)
)))
)))
}

}

}

0 comments on commit 6ef6236

Please sign in to comment.