From 576da79b3731474d6c258256b97e2e57b7ae52fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Kj=C3=B6lhede?= Date: Sat, 21 May 2016 16:01:35 +0200 Subject: [PATCH] Add test for generics --- .../gigurra/heisenberg/HeisenbergSpec.scala | 18 +++++++++++++++ .../se/gigurra/heisenberg/TestTypes.scala | 22 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/test/scala/se/gigurra/heisenberg/HeisenbergSpec.scala b/src/test/scala/se/gigurra/heisenberg/HeisenbergSpec.scala index 8a2a9fa..e4fd278 100644 --- a/src/test/scala/se/gigurra/heisenberg/HeisenbergSpec.scala +++ b/src/test/scala/se/gigurra/heisenberg/HeisenbergSpec.scala @@ -115,6 +115,24 @@ class HeisenbergSpec instance.flatten shouldBe MapData(req_str -> "Hello", req_str_w_def -> "mydefault").source } + "Handle generic types" in { + import GenericsTest._ + { + val schema = MyType.schema[Int] + import schema._ + val source = MapData(t -> 42).source + val o = MyType[Int](source) + o.t shouldBe 42 + } + { + val schema = MyType.schema[String] + import schema._ + val source = MapData(t -> "s").source + val o = MyType[String](source) + o.t shouldBe "s" + } + } + "flatten with default values recursively" in { import NestedTestType._ import SimpleTestType._ diff --git a/src/test/scala/se/gigurra/heisenberg/TestTypes.scala b/src/test/scala/se/gigurra/heisenberg/TestTypes.scala index 8b89571..89a33d0 100644 --- a/src/test/scala/se/gigurra/heisenberg/TestTypes.scala +++ b/src/test/scala/se/gigurra/heisenberg/TestTypes.scala @@ -3,6 +3,9 @@ package se.gigurra.heisenberg import se.gigurra.heisenberg.MapData._ import se.gigurra.heisenberg.Migration._ +import scala.collection.concurrent.TrieMap +import scala.reflect.runtime.universe.WeakTypeTag + /** * Created by kjolh on 12/27/2015. */ @@ -102,6 +105,25 @@ object TestTypes { } + object GenericsTest { + + case class MyType[T : WeakTypeTag : MapDataParser : MapDataProducer](source: SourceData = Map.empty) extends Parsed[MyTypeSchema[T]] { + val t = parse(schema.t) + } + + object MyType { + private val schemas = new TrieMap[WeakTypeTag[_], MyTypeSchema[_]]() + implicit def schema[T: WeakTypeTag : MapDataParser : MapDataProducer]: MyTypeSchema[T] = { + schemas.getOrElseUpdate(implicitly[WeakTypeTag[T]], MyTypeSchema()).asInstanceOf[MyTypeSchema[T]] + } + } + + case class MyTypeSchema[T : WeakTypeTag : MapDataParser : MapDataProducer]() extends Schema[MyType[T]] { + def apply(objectData: SourceData) = MyType.apply(objectData) + val t = required[T]("t") + } + } + object ParseFieldMoreThanOnceTest { object SomeTestType extends Schema[SomeTestType] {