aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/firrtlTests/options/OptionsViewSpec.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/scala/firrtlTests/options/OptionsViewSpec.scala')
-rw-r--r--src/test/scala/firrtlTests/options/OptionsViewSpec.scala75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/test/scala/firrtlTests/options/OptionsViewSpec.scala b/src/test/scala/firrtlTests/options/OptionsViewSpec.scala
new file mode 100644
index 00000000..dec6a99f
--- /dev/null
+++ b/src/test/scala/firrtlTests/options/OptionsViewSpec.scala
@@ -0,0 +1,75 @@
+// See LICENSE for license details
+
+package firrtlTests.options
+
+import org.scalatest.{FlatSpec, Matchers}
+
+import firrtl.options.OptionsView
+import firrtl.AnnotationSeq
+import firrtl.annotations.{Annotation,NoTargetAnnotation}
+
+class OptionsViewSpec extends FlatSpec with Matchers {
+
+ /* Annotations */
+ case class NameAnnotation(name: String) extends NoTargetAnnotation
+ case class ValueAnnotation(value: Int) extends NoTargetAnnotation
+
+ /* The type we want to view the annotations as */
+ case class Foo(name: Option[String] = None, value: Option[Int] = None)
+ case class Bar(name: String = "bar")
+
+ /* An OptionsView that converts an AnnotationSeq to Option[Foo] */
+ implicit object FooView extends OptionsView[Foo] {
+ private def append(foo: Foo, anno: Annotation): Foo = anno match {
+ case NameAnnotation(n) => foo.copy(name = Some(n))
+ case ValueAnnotation(v) => foo.copy(value = Some(v))
+ case _ => foo
+ }
+
+ def view(options: AnnotationSeq): Option[Foo] = {
+ val annoSeq = options.foldLeft(Foo())(append)
+ Some(annoSeq)
+ }
+ }
+
+ /* An OptionsView that converts an AnnotationSeq to Option[Bar] */
+ implicit object BarView extends OptionsView[Bar] {
+ private def append(bar: Bar, anno: Annotation): Bar = anno match {
+ case NameAnnotation(n) => bar.copy(name = n)
+ case _ => bar
+ }
+
+ def view(options: AnnotationSeq): Option[Bar] = {
+ val annoSeq = options.foldLeft(Bar())(append)
+ Some(annoSeq)
+ }
+ }
+
+ behavior of "OptionsView"
+
+ it should "convert annotations to one of two types" in {
+ /* Some default annotations */
+ val annos = Seq(NameAnnotation("foo"), ValueAnnotation(42))
+
+ info("Foo conversion okay")
+ FooView.view(annos) should be (Some(Foo(Some("foo"), Some(42))))
+
+ info("Bar conversion okay")
+ BarView.view(annos) should be (Some(Bar("foo")))
+ }
+
+ behavior of "Viewer"
+
+ it should "implicitly view annotations as the specified type" in {
+ import firrtl.options.Viewer._
+
+ /* Some empty annotations */
+ val annos = Seq[Annotation]()
+
+ info("Foo view okay")
+ view[Foo](annos) should be (Some(Foo(None, None)))
+
+ info("Bar view okay")
+ view[Bar](annos) should be (Some(Bar()))
+ }
+}