aboutsummaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorSergey Nastich <nastich@users.noreply.github.com>2018-04-03 10:57:14 -0700
committerGitHub <noreply@github.com>2018-04-03 10:57:14 -0700
commitbdf9ec57f213eb652ba5fb3b21973d028034d40e (patch)
tree2d267f0dc9be85e6bb9bc4286868b37d12315fa7 /src/test
parent322bbc9010e20195e5b0bb58e703961738ffb89d (diff)
downloaddriver-core-bdf9ec57f213eb652ba5fb3b21973d028034d40e.tar.gz
driver-core-bdf9ec57f213eb652ba5fb3b21973d028034d40e.tar.bz2
driver-core-bdf9ec57f213eb652ba5fb3b21973d028034d40e.zip
Add enumeratum support to JSON format and generators (#144)v1.8.12
* Add enumeratum support to JSON format and generators * Move enumeratum serializers into their own object. Add enumeratum unmarshaller. Add entities to derive JsonFormats instead of having to type them externally.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/scala/xyz/driver/core/GeneratorsTest.scala20
-rw-r--r--src/test/scala/xyz/driver/core/JsonTest.scala72
2 files changed, 91 insertions, 1 deletions
diff --git a/src/test/scala/xyz/driver/core/GeneratorsTest.scala b/src/test/scala/xyz/driver/core/GeneratorsTest.scala
index 62ba7ae..53a3aa9 100644
--- a/src/test/scala/xyz/driver/core/GeneratorsTest.scala
+++ b/src/test/scala/xyz/driver/core/GeneratorsTest.scala
@@ -2,6 +2,8 @@ package xyz.driver.core
import org.scalatest.{Assertions, FlatSpec, Matchers}
+import scala.collection.immutable.IndexedSeq
+
class GeneratorsTest extends FlatSpec with Matchers with Assertions {
import generators._
@@ -175,6 +177,24 @@ class GeneratorsTest extends FlatSpec with Matchers with Assertions {
Set(pick1, pick2, pick3, pick4, pick5, pick6).size should be >= 1
}
+ it should "be able to generate a specific value from an enumeratum enum" in {
+
+ import enumeratum._
+ sealed trait TestEnumValue extends EnumEntry
+ object TestEnum extends Enum[TestEnumValue] {
+ case object Value1 extends TestEnumValue
+ case object Value2 extends TestEnumValue
+ case object Value3 extends TestEnumValue
+ case object Value4 extends TestEnumValue
+ val values: IndexedSeq[TestEnumValue] = findValues
+ }
+
+ val picks = (1 to 100).map(_ => generators.oneOf(TestEnum))
+
+ TestEnum.values should contain allElementsOf picks
+ picks.toSet.size should be >= 1
+ }
+
it should "be able to generate array with values generated by generators" in {
val arrayOfTimes = arrayOf(nextTime(), 16)
diff --git a/src/test/scala/xyz/driver/core/JsonTest.scala b/src/test/scala/xyz/driver/core/JsonTest.scala
index 827624c..7e8dba2 100644
--- a/src/test/scala/xyz/driver/core/JsonTest.scala
+++ b/src/test/scala/xyz/driver/core/JsonTest.scala
@@ -2,6 +2,7 @@ package xyz.driver.core
import java.net.InetAddress
+import enumeratum._
import eu.timepit.refined.collection.NonEmpty
import eu.timepit.refined.numeric.Positive
import eu.timepit.refined.refineMV
@@ -11,8 +12,11 @@ import xyz.driver.core.time.provider.SystemTimeProvider
import spray.json._
import xyz.driver.core.TestTypes.CustomGADT
import xyz.driver.core.domain.{Email, PhoneNumber}
+import xyz.driver.core.json.enumeratum.HasJsonFormat
import xyz.driver.core.time.TimeOfDay
+import scala.collection.immutable.IndexedSeq
+
class JsonTest extends FlatSpec with Matchers {
import DefaultJsonProtocol._
@@ -116,7 +120,7 @@ class JsonTest extends FlatSpec with Matchers {
parsedPhoneNumber should be(referencePhoneNumber)
}
- "Json format for Enums" should "read and write correct JSON" in {
+ "Json format for ADT mappings" should "read and write correct JSON" in {
sealed trait EnumVal
case object Val1 extends EnumVal
@@ -141,6 +145,72 @@ class JsonTest extends FlatSpec with Matchers {
parsedEnumValue2 should be(referenceEnumValue2)
}
+ "Json format for Enums (external)" should "read and write correct JSON" in {
+
+ sealed trait MyEnum extends EnumEntry
+ object MyEnum extends Enum[MyEnum] {
+ case object Val1 extends MyEnum
+ case object `Val 2` extends MyEnum
+ case object `Val/3` extends MyEnum
+
+ val values: IndexedSeq[MyEnum] = findValues
+ }
+
+ val format = new enumeratum.EnumJsonFormat(MyEnum)
+
+ val referenceEnumValue1 = MyEnum.`Val 2`
+ val referenceEnumValue2 = MyEnum.`Val/3`
+
+ val writtenJson1 = format.write(referenceEnumValue1)
+ writtenJson1 shouldBe JsString("Val 2")
+
+ val writtenJson2 = format.write(referenceEnumValue2)
+ writtenJson2 shouldBe JsString("Val/3")
+
+ val parsedEnumValue1 = format.read(writtenJson1)
+ val parsedEnumValue2 = format.read(writtenJson2)
+
+ parsedEnumValue1 shouldBe referenceEnumValue1
+ parsedEnumValue2 shouldBe referenceEnumValue2
+
+ intercept[DeserializationException] {
+ format.read(JsString("Val4"))
+ }.getMessage shouldBe "Unexpected value Val4. Expected one of: [Val1, Val 2, Val/3]"
+ }
+
+ "Json format for Enums (automatic)" should "read and write correct JSON and not require import" in {
+
+ sealed trait MyEnum extends EnumEntry
+ object MyEnum extends Enum[MyEnum] with HasJsonFormat[MyEnum] {
+ case object Val1 extends MyEnum
+ case object `Val 2` extends MyEnum
+ case object `Val/3` extends MyEnum
+
+ val values: IndexedSeq[MyEnum] = findValues
+ }
+
+ val referenceEnumValue1: MyEnum = MyEnum.`Val 2`
+ val referenceEnumValue2: MyEnum = MyEnum.`Val/3`
+
+ val writtenJson1 = referenceEnumValue1.toJson
+ writtenJson1 shouldBe JsString("Val 2")
+
+ val writtenJson2 = referenceEnumValue2.toJson
+ writtenJson2 shouldBe JsString("Val/3")
+
+ import spray.json._
+
+ val parsedEnumValue1 = writtenJson1.prettyPrint.parseJson.convertTo[MyEnum]
+ val parsedEnumValue2 = writtenJson2.prettyPrint.parseJson.convertTo[MyEnum]
+
+ parsedEnumValue1 should be(referenceEnumValue1)
+ parsedEnumValue2 should be(referenceEnumValue2)
+
+ intercept[DeserializationException] {
+ JsString("Val4").convertTo[MyEnum]
+ }.getMessage shouldBe "Unexpected value Val4. Expected one of: [Val1, Val 2, Val/3]"
+ }
+
// Should be defined outside of case to have a TypeTag
case class CustomWrapperClass(value: Int)