blob: 7d04e9fcd3d4171201313bad402f5d211ba9ff18 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
// See LICENSE for license details.
package firrtlTests
import org.json4s._
import firrtl.annotations.{NoTargetAnnotation, JsonProtocol, InvalidAnnotationJSONException, HasSerializationHints, Annotation}
import org.scalatest.flatspec.AnyFlatSpec
object JsonProtocolTestClasses {
trait Parent
case class ChildA(foo: Int) extends Parent
case class ChildB(bar: String) extends Parent
case class PolymorphicParameterAnnotation(param: Parent) extends NoTargetAnnotation
case class PolymorphicParameterAnnotationWithTypeHints(param: Parent) extends NoTargetAnnotation with HasSerializationHints {
def typeHints = Seq(param.getClass)
}
case class TypeParameterizedAnnotation[T](param: T) extends NoTargetAnnotation
case class TypeParameterizedAnnotationWithTypeHints[T](param: T) extends NoTargetAnnotation with HasSerializationHints {
def typeHints = Seq(param.getClass)
}
}
import JsonProtocolTestClasses._
class JsonProtocolSpec extends AnyFlatSpec {
def serializeAndDeserialize(anno: Annotation): Annotation = {
val serializedAnno = JsonProtocol.serialize(Seq(anno))
JsonProtocol.deserialize(serializedAnno).head
}
"Annotations with polymorphic parameters" should "not serialize and deserialize without type hints" in {
val anno = PolymorphicParameterAnnotation(ChildA(1))
assertThrows[InvalidAnnotationJSONException] {
serializeAndDeserialize(anno)
}
}
it should "serialize and deserialize with type hints" in {
val anno = PolymorphicParameterAnnotationWithTypeHints(ChildA(1))
val deserAnno = serializeAndDeserialize(anno)
assert(anno == deserAnno)
val anno2 = PolymorphicParameterAnnotationWithTypeHints(ChildB("Test"))
val deserAnno2 = serializeAndDeserialize(anno2)
assert(anno2 == deserAnno2)
}
"Annotations with non-primitive type parameters" should "not serialize and deserialize without type hints" in {
val anno = TypeParameterizedAnnotation(ChildA(1))
val deserAnno = serializeAndDeserialize(anno)
assert (anno != deserAnno)
}
it should "serialize and deserialize with type hints" in {
val anno = TypeParameterizedAnnotationWithTypeHints(ChildA(1))
val deserAnno = serializeAndDeserialize(anno)
assert (anno == deserAnno)
}
}
|