summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Odersky <jakob@odersky.com>2018-03-08 13:22:07 -0800
committerJakob Odersky <jakob@odersky.com>2018-03-08 14:31:28 -0800
commit7cb41b026772855545705a6404c255fdeb8fb64a (patch)
treebde69016125a53c52881f065ea3840ba93214cd3
parent12a761f67da239065a2f305c0e61773eab0f5465 (diff)
downloadspray-json-7cb41b026772855545705a6404c255fdeb8fb64a.tar.gz
spray-json-7cb41b026772855545705a6404c255fdeb8fb64a.tar.bz2
spray-json-7cb41b026772855545705a6404c255fdeb8fb64a.zip
Cross-compile for Scala- JVM, JS and Native
-rw-r--r--build.sbt43
-rw-r--r--js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template39
-rw-r--r--js/src/main/scala/spray/json/ProductFormats.scala80
-rw-r--r--jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala33
l---------native/src1
-rw-r--r--shared/src/main/scala/spray/json/AdditionalFormats.scala (renamed from jvm/src/main/scala/spray/json/AdditionalFormats.scala)0
-rw-r--r--shared/src/main/scala/spray/json/BasicFormats.scala (renamed from jvm/src/main/scala/spray/json/BasicFormats.scala)0
-rw-r--r--shared/src/main/scala/spray/json/CollectionFormats.scala (renamed from jvm/src/main/scala/spray/json/CollectionFormats.scala)0
-rw-r--r--shared/src/main/scala/spray/json/CompactPrinter.scala (renamed from jvm/src/main/scala/spray/json/CompactPrinter.scala)0
-rw-r--r--shared/src/main/scala/spray/json/DefaultJsonProtocol.scala (renamed from jvm/src/main/scala/spray/json/DefaultJsonProtocol.scala)0
-rw-r--r--shared/src/main/scala/spray/json/JsValue.scala (renamed from jvm/src/main/scala/spray/json/JsValue.scala)0
-rw-r--r--shared/src/main/scala/spray/json/JsonFormat.scala (renamed from jvm/src/main/scala/spray/json/JsonFormat.scala)0
-rw-r--r--shared/src/main/scala/spray/json/JsonParser.scala (renamed from jvm/src/main/scala/spray/json/JsonParser.scala)0
-rw-r--r--shared/src/main/scala/spray/json/JsonPrinter.scala (renamed from jvm/src/main/scala/spray/json/JsonPrinter.scala)0
-rw-r--r--shared/src/main/scala/spray/json/PrettyPrinter.scala (renamed from jvm/src/main/scala/spray/json/PrettyPrinter.scala)0
-rw-r--r--shared/src/main/scala/spray/json/SortedPrinter.scala (renamed from jvm/src/main/scala/spray/json/SortedPrinter.scala)0
-rw-r--r--shared/src/main/scala/spray/json/StandardFormats.scala (renamed from jvm/src/main/scala/spray/json/StandardFormats.scala)0
-rw-r--r--shared/src/main/scala/spray/json/package.scala (renamed from jvm/src/main/scala/spray/json/package.scala)0
-rw-r--r--shared/src/test/resources/test.json (renamed from jvm/src/test/resources/test.json)0
-rw-r--r--shared/src/test/scala/spray/json/AdditionalFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/AdditionalFormatsSpec.scala)0
-rw-r--r--shared/src/test/scala/spray/json/BasicFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/BasicFormatsSpec.scala)0
-rw-r--r--shared/src/test/scala/spray/json/CollectionFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/CollectionFormatsSpec.scala)0
-rw-r--r--shared/src/test/scala/spray/json/CompactPrinterSpec.scala (renamed from jvm/src/test/scala/spray/json/CompactPrinterSpec.scala)3
-rw-r--r--shared/src/test/scala/spray/json/CustomFormatSpec.scala (renamed from jvm/src/test/scala/spray/json/CustomFormatSpec.scala)0
-rw-r--r--shared/src/test/scala/spray/json/JsonParserSpec.scala (renamed from jvm/src/test/scala/spray/json/JsonParserSpec.scala)8
-rw-r--r--shared/src/test/scala/spray/json/PrettyPrinterSpec.scala (renamed from jvm/src/test/scala/spray/json/PrettyPrinterSpec.scala)0
-rw-r--r--shared/src/test/scala/spray/json/RoundTripSpecs.scala (renamed from jvm/src/test/scala/spray/json/RoundTripSpecs.scala)0
-rw-r--r--shared/src/test/scala/spray/json/SortedPrinterSpec.scala (renamed from jvm/src/test/scala/spray/json/SortedPrinterSpec.scala)1
-rw-r--r--shared/src/test/scala/spray/json/StandardFormatsSpec.scala (renamed from jvm/src/test/scala/spray/json/StandardFormatsSpec.scala)0
29 files changed, 179 insertions, 29 deletions
diff --git a/build.sbt b/build.sbt
index 2e0e5b5..a7b9cf1 100644
--- a/build.sbt
+++ b/build.sbt
@@ -9,8 +9,7 @@ lazy val sprayJson =
.settings(
name := "spray-json",
version := "1.3.4",
- crossScalaVersions := Seq("2.10.7", "2.11.12", "2.12.4", "2.13.0-M3"),
- scalaVersion := "2.11.12",
+ scalaVersion := crossScalaVersions.value.head,
scalacOptions ++= Seq("-feature", "-language:_", "-unchecked", "-deprecation", "-Xlint", "-encoding", "utf8"),
(scalacOptions in doc) ++= Seq("-doc-title", name.value + " " + version.value),
libraryDependencies ++=
@@ -26,26 +25,30 @@ lazy val sprayJson =
CrossVersion.binaryScalaVersion(sV)
else
sV
- }
+ },
+ // Workaround for "Shared resource directory is ignored"
+ // https://github.com/portable-scala/sbt-crossproject/issues/74
+ unmanagedResourceDirectories in Test += (baseDirectory in ThisBuild).value / "shared/src/test/resources"
)
- .configurePlatforms(JVMPlatform)( _
- .enablePlugins(spray.boilerplate.BoilerplatePlugin)
- .enablePlugins(SbtOsgi)
- )
- .jvmSettings(
+ .enablePlugins(spray.boilerplate.BoilerplatePlugin)
+ .platformsSettings(JVMPlatform, JSPlatform)(
libraryDependencies ++= (CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, 10)) => Seq(
- "org.specs2" %% "specs2-core" % "3.8.9" % "test",
- "org.specs2" %% "specs2-scalacheck" % "3.8.9" % "test",
- "org.scalacheck" %% "scalacheck" % "1.13.4" % "test"
+ "org.specs2" %%% "specs2-core" % "3.8.9" % "test",
+ "org.specs2" %%% "specs2-scalacheck" % "3.8.9" % "test",
+ "org.scalacheck" %%% "scalacheck" % "1.13.4" % "test"
)
case Some((2, n)) if n >= 11 => Seq(
- "org.specs2" %% "specs2-core" % "4.0.2" % "test",
- "org.specs2" %% "specs2-scalacheck" % "4.0.2" % "test",
- "org.scalacheck" %% "scalacheck" % "1.13.5" % "test"
+ "org.specs2" %%% "specs2-core" % "4.0.2" % "test",
+ "org.specs2" %%% "specs2-scalacheck" % "4.0.2" % "test",
+ "org.scalacheck" %%% "scalacheck" % "1.13.5" % "test"
)
case _ => Nil
- }),
+ })
+ )
+ .configurePlatforms(JVMPlatform)(_.enablePlugins(SbtOsgi))
+ .jvmSettings(
+ crossScalaVersions := Seq("2.13.0-M3", "2.12.4", "2.11.12", "2.10.7"),
OsgiKeys.exportPackage := Seq("""spray.json.*;version="${Bundle-Version}""""),
OsgiKeys.importPackage := Seq("""scala.*;version="$<range;[==,=+);%s>"""".format(scalaVersion.value)),
OsgiKeys.importPackage ++= Seq("""spray.json;version="${Bundle-Version}"""", "*"),
@@ -58,8 +61,14 @@ lazy val sprayJson =
ProblemFilters.exclude[ReversedMissingMethodProblem]("spray.json.PrettyPrinter.organiseMembers")
)
)
- .jsSettings()
- .nativeSettings() // defined in sbt-scala-native
+ .jsSettings(
+ crossScalaVersions := Seq("2.12.4", "2.11.12")
+ )
+ .nativeSettings(
+ crossScalaVersions := Seq("2.11.12"),
+ // Disable tests in Scala Native until testing frameworks for it become available
+ unmanagedSourceDirectories in Test := Seq.empty
+ )
lazy val sprayJsonJVM = sprayJson.jvm
lazy val sprayJsonJS = sprayJson.js
diff --git a/js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template b/js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template
new file mode 100644
index 0000000..d6f83f7
--- /dev/null
+++ b/js/src/main/boilerplate/spray/json/ProductFormatsInstances.scala.template
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2011,2012 Mathias Doenitz, Johannes Rudolph
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package spray.json
+
+trait ProductFormatsInstances { self: ProductFormats with StandardFormats =>
+[# // Case classes with 1 parameters
+
+ def jsonFormat[[#P1 :JF#], T <: Product](construct: ([#P1#]) => T, [#fieldName1: String#]): RootJsonFormat[T] = new RootJsonFormat[T]{
+ def write(p: T) = {
+ val fields = new collection.mutable.ListBuffer[(String, JsValue)]
+ fields.sizeHint(1 * 2)
+ [#fields ++= productElement##2Field[P1](fieldName1, p, 0)#
+ ]
+ JsObject(fields: _*)
+ }
+ def read(value: JsValue) = {
+ [#val p1V = fromField[P1](value, fieldName1)#
+ ]
+ construct([#p1V#])
+ }
+ }#
+
+
+]
+}
diff --git a/js/src/main/scala/spray/json/ProductFormats.scala b/js/src/main/scala/spray/json/ProductFormats.scala
new file mode 100644
index 0000000..bc06eac
--- /dev/null
+++ b/js/src/main/scala/spray/json/ProductFormats.scala
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2011 Mathias Doenitz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package spray.json
+
+/**
+ * Provides the helpers for constructing custom JsonFormat implementations for types implementing the Product trait
+ * (especially case classes)
+ */
+trait ProductFormats extends ProductFormatsInstances {
+ this: StandardFormats =>
+
+ def jsonFormat0[T](construct: () => T): RootJsonFormat[T] =
+ new RootJsonFormat[T] {
+ def write(p: T) = JsObject()
+ def read(value: JsValue) = value match {
+ case JsObject(_) => construct()
+ case _ => throw new DeserializationException("Object expected")
+ }
+ }
+
+ // helpers
+
+ protected def productElement2Field[T](fieldName: String, p: Product, ix: Int, rest: List[JsField] = Nil)
+ (implicit writer: JsonWriter[T]): List[JsField] = {
+ val value = p.productElement(ix).asInstanceOf[T]
+ writer match {
+ case _: OptionFormat[_] if (value == None) => rest
+ case _ => (fieldName, writer.write(value)) :: rest
+ }
+ }
+
+ protected def fromField[T](value: JsValue, fieldName: String)
+ (implicit reader: JsonReader[T]) = value match {
+ case x: JsObject if
+ (reader.isInstanceOf[OptionFormat[_]] &
+ !x.fields.contains(fieldName)) =>
+ None.asInstanceOf[T]
+ case x: JsObject =>
+ try reader.read(x.fields(fieldName))
+ catch {
+ case e: NoSuchElementException =>
+ deserializationError("Object is missing required member '" + fieldName + "'", e, fieldName :: Nil)
+ case DeserializationException(msg, cause, fieldNames) =>
+ deserializationError(msg, cause, fieldName :: fieldNames)
+ }
+ case _ => deserializationError("Object expected in field '" + fieldName + "'", fieldNames = fieldName :: Nil)
+ }
+
+}
+
+/**
+ * This trait supplies an alternative rendering mode for optional case class members.
+ * Normally optional members that are undefined (`None`) are not rendered at all.
+ * By mixing in this trait into your custom JsonProtocol you can enforce the rendering of undefined members as `null`.
+ * (Note that this only affect JSON writing, spray-json will always read missing optional members as well as `null`
+ * optional members as `None`.)
+ */
+trait NullOptions extends ProductFormats {
+ this: StandardFormats =>
+
+ override protected def productElement2Field[T](fieldName: String, p: Product, ix: Int, rest: List[JsField])
+ (implicit writer: JsonWriter[T]) = {
+ val value = p.productElement(ix).asInstanceOf[T]
+ (fieldName, writer.write(value)) :: rest
+ }
+}
diff --git a/jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala b/jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala
new file mode 100644
index 0000000..cf163b3
--- /dev/null
+++ b/jvm/src/test/scala/spray/json/JsonParserSpecJvm.scala
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2011 Mathias Doenitz
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package spray.json
+
+import org.specs2.mutable._
+
+class JsonParserSpecJvm extends Specification {
+
+ "The JsonParser (on the JVM)" should {
+ "be reentrant" in {
+ val largeJsonSource = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/test.json")).mkString
+ import scala.collection.parallel.immutable.ParSeq
+ ParSeq.fill(20)(largeJsonSource).map(JsonParser(_)).toList.map {
+ _.asInstanceOf[JsObject].fields("questions").asInstanceOf[JsArray].elements.size
+ } === List.fill(20)(100)
+ }
+ }
+
+}
diff --git a/native/src b/native/src
new file mode 120000
index 0000000..f2bb155
--- /dev/null
+++ b/native/src
@@ -0,0 +1 @@
+../js/src/ \ No newline at end of file
diff --git a/jvm/src/main/scala/spray/json/AdditionalFormats.scala b/shared/src/main/scala/spray/json/AdditionalFormats.scala
index fbabb0b..fbabb0b 100644
--- a/jvm/src/main/scala/spray/json/AdditionalFormats.scala
+++ b/shared/src/main/scala/spray/json/AdditionalFormats.scala
diff --git a/jvm/src/main/scala/spray/json/BasicFormats.scala b/shared/src/main/scala/spray/json/BasicFormats.scala
index 65b9ecb..65b9ecb 100644
--- a/jvm/src/main/scala/spray/json/BasicFormats.scala
+++ b/shared/src/main/scala/spray/json/BasicFormats.scala
diff --git a/jvm/src/main/scala/spray/json/CollectionFormats.scala b/shared/src/main/scala/spray/json/CollectionFormats.scala
index 24ab1dd..24ab1dd 100644
--- a/jvm/src/main/scala/spray/json/CollectionFormats.scala
+++ b/shared/src/main/scala/spray/json/CollectionFormats.scala
diff --git a/jvm/src/main/scala/spray/json/CompactPrinter.scala b/shared/src/main/scala/spray/json/CompactPrinter.scala
index a51583d..a51583d 100644
--- a/jvm/src/main/scala/spray/json/CompactPrinter.scala
+++ b/shared/src/main/scala/spray/json/CompactPrinter.scala
diff --git a/jvm/src/main/scala/spray/json/DefaultJsonProtocol.scala b/shared/src/main/scala/spray/json/DefaultJsonProtocol.scala
index 4c93184..4c93184 100644
--- a/jvm/src/main/scala/spray/json/DefaultJsonProtocol.scala
+++ b/shared/src/main/scala/spray/json/DefaultJsonProtocol.scala
diff --git a/jvm/src/main/scala/spray/json/JsValue.scala b/shared/src/main/scala/spray/json/JsValue.scala
index 08a673b..08a673b 100644
--- a/jvm/src/main/scala/spray/json/JsValue.scala
+++ b/shared/src/main/scala/spray/json/JsValue.scala
diff --git a/jvm/src/main/scala/spray/json/JsonFormat.scala b/shared/src/main/scala/spray/json/JsonFormat.scala
index c4915cc..c4915cc 100644
--- a/jvm/src/main/scala/spray/json/JsonFormat.scala
+++ b/shared/src/main/scala/spray/json/JsonFormat.scala
diff --git a/jvm/src/main/scala/spray/json/JsonParser.scala b/shared/src/main/scala/spray/json/JsonParser.scala
index 71c4c11..71c4c11 100644
--- a/jvm/src/main/scala/spray/json/JsonParser.scala
+++ b/shared/src/main/scala/spray/json/JsonParser.scala
diff --git a/jvm/src/main/scala/spray/json/JsonPrinter.scala b/shared/src/main/scala/spray/json/JsonPrinter.scala
index 258fc5a..258fc5a 100644
--- a/jvm/src/main/scala/spray/json/JsonPrinter.scala
+++ b/shared/src/main/scala/spray/json/JsonPrinter.scala
diff --git a/jvm/src/main/scala/spray/json/PrettyPrinter.scala b/shared/src/main/scala/spray/json/PrettyPrinter.scala
index 6af5443..6af5443 100644
--- a/jvm/src/main/scala/spray/json/PrettyPrinter.scala
+++ b/shared/src/main/scala/spray/json/PrettyPrinter.scala
diff --git a/jvm/src/main/scala/spray/json/SortedPrinter.scala b/shared/src/main/scala/spray/json/SortedPrinter.scala
index 28db225..28db225 100644
--- a/jvm/src/main/scala/spray/json/SortedPrinter.scala
+++ b/shared/src/main/scala/spray/json/SortedPrinter.scala
diff --git a/jvm/src/main/scala/spray/json/StandardFormats.scala b/shared/src/main/scala/spray/json/StandardFormats.scala
index e59de64..e59de64 100644
--- a/jvm/src/main/scala/spray/json/StandardFormats.scala
+++ b/shared/src/main/scala/spray/json/StandardFormats.scala
diff --git a/jvm/src/main/scala/spray/json/package.scala b/shared/src/main/scala/spray/json/package.scala
index 37d63c2..37d63c2 100644
--- a/jvm/src/main/scala/spray/json/package.scala
+++ b/shared/src/main/scala/spray/json/package.scala
diff --git a/jvm/src/test/resources/test.json b/shared/src/test/resources/test.json
index 8308d37..8308d37 100644
--- a/jvm/src/test/resources/test.json
+++ b/shared/src/test/resources/test.json
diff --git a/jvm/src/test/scala/spray/json/AdditionalFormatsSpec.scala b/shared/src/test/scala/spray/json/AdditionalFormatsSpec.scala
index eafceb2..eafceb2 100644
--- a/jvm/src/test/scala/spray/json/AdditionalFormatsSpec.scala
+++ b/shared/src/test/scala/spray/json/AdditionalFormatsSpec.scala
diff --git a/jvm/src/test/scala/spray/json/BasicFormatsSpec.scala b/shared/src/test/scala/spray/json/BasicFormatsSpec.scala
index 8417df2..8417df2 100644
--- a/jvm/src/test/scala/spray/json/BasicFormatsSpec.scala
+++ b/shared/src/test/scala/spray/json/BasicFormatsSpec.scala
diff --git a/jvm/src/test/scala/spray/json/CollectionFormatsSpec.scala b/shared/src/test/scala/spray/json/CollectionFormatsSpec.scala
index 3d953bb..3d953bb 100644
--- a/jvm/src/test/scala/spray/json/CollectionFormatsSpec.scala
+++ b/shared/src/test/scala/spray/json/CollectionFormatsSpec.scala
diff --git a/jvm/src/test/scala/spray/json/CompactPrinterSpec.scala b/shared/src/test/scala/spray/json/CompactPrinterSpec.scala
index 6a9560b..691daa9 100644
--- a/jvm/src/test/scala/spray/json/CompactPrinterSpec.scala
+++ b/shared/src/test/scala/spray/json/CompactPrinterSpec.scala
@@ -39,9 +39,6 @@ class CompactPrinterSpec extends Specification {
"print JsNumber(1.23) to '1.23'" in {
CompactPrinter(JsNumber(1.23)) mustEqual "1.23"
}
- "print JsNumber(-1E10) to '-1E10'" in {
- CompactPrinter(JsNumber(-1E10)) mustEqual "-1.0E+10"
- }
"print JsNumber(12.34e-10) to '12.34e-10'" in {
CompactPrinter(JsNumber(12.34e-10)) mustEqual "1.234E-9"
}
diff --git a/jvm/src/test/scala/spray/json/CustomFormatSpec.scala b/shared/src/test/scala/spray/json/CustomFormatSpec.scala
index 2397abc..2397abc 100644
--- a/jvm/src/test/scala/spray/json/CustomFormatSpec.scala
+++ b/shared/src/test/scala/spray/json/CustomFormatSpec.scala
diff --git a/jvm/src/test/scala/spray/json/JsonParserSpec.scala b/shared/src/test/scala/spray/json/JsonParserSpec.scala
index a97f021..ddb53d3 100644
--- a/jvm/src/test/scala/spray/json/JsonParserSpec.scala
+++ b/shared/src/test/scala/spray/json/JsonParserSpec.scala
@@ -72,14 +72,6 @@ class JsonParserSpec extends Specification {
val json = JsString("£0.99")
JsonParser(json.prettyPrint.getBytes("UTF-8")) === json
}
- "be reentrant" in {
- val largeJsonSource = scala.io.Source.fromInputStream(getClass.getResourceAsStream("/test.json")).mkString
- import scala.collection.parallel.immutable.ParSeq
- ParSeq.fill(20)(largeJsonSource).map(JsonParser(_)).toList.map {
- _.asInstanceOf[JsObject].fields("questions").asInstanceOf[JsArray].elements.size
- } === List.fill(20)(100)
- }
-
"produce proper error messages" in {
def errorMessage(input: String) =
try JsonParser(input) catch { case e: JsonParser.ParsingException => e.getMessage }
diff --git a/jvm/src/test/scala/spray/json/PrettyPrinterSpec.scala b/shared/src/test/scala/spray/json/PrettyPrinterSpec.scala
index 6354ef0..6354ef0 100644
--- a/jvm/src/test/scala/spray/json/PrettyPrinterSpec.scala
+++ b/shared/src/test/scala/spray/json/PrettyPrinterSpec.scala
diff --git a/jvm/src/test/scala/spray/json/RoundTripSpecs.scala b/shared/src/test/scala/spray/json/RoundTripSpecs.scala
index 6bee7b4..6bee7b4 100644
--- a/jvm/src/test/scala/spray/json/RoundTripSpecs.scala
+++ b/shared/src/test/scala/spray/json/RoundTripSpecs.scala
diff --git a/jvm/src/test/scala/spray/json/SortedPrinterSpec.scala b/shared/src/test/scala/spray/json/SortedPrinterSpec.scala
index 3a5e3ed..f91640e 100644
--- a/jvm/src/test/scala/spray/json/SortedPrinterSpec.scala
+++ b/shared/src/test/scala/spray/json/SortedPrinterSpec.scala
@@ -16,7 +16,6 @@
package spray.json
-import scala.collection.immutable.ListMap
import org.specs2.mutable._
class SortedPrinterSpec extends Specification {
diff --git a/jvm/src/test/scala/spray/json/StandardFormatsSpec.scala b/shared/src/test/scala/spray/json/StandardFormatsSpec.scala
index 833f06a..833f06a 100644
--- a/jvm/src/test/scala/spray/json/StandardFormatsSpec.scala
+++ b/shared/src/test/scala/spray/json/StandardFormatsSpec.scala