aboutsummaryrefslogtreecommitdiff
path: root/src/test/scala/firrtlTests/options
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/scala/firrtlTests/options')
-rw-r--r--src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala61
1 files changed, 60 insertions, 1 deletions
diff --git a/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala b/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala
index e71eaedf..0a3cce67 100644
--- a/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala
+++ b/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala
@@ -7,7 +7,16 @@ import java.io.File
import firrtl.AnnotationSeq
import firrtl.annotations.{DeletedAnnotation, NoTargetAnnotation}
-import firrtl.options.{InputAnnotationFileAnnotation, OutputAnnotationFileAnnotation, Phase, WriteDeletedAnnotation}
+import firrtl.options.{
+ CustomFileEmission,
+ InputAnnotationFileAnnotation,
+ OutputAnnotationFileAnnotation,
+ Phase,
+ PhaseException,
+ StageOptions,
+ TargetDirAnnotation,
+ WriteDeletedAnnotation}
+import firrtl.options.Viewer.view
import firrtl.options.phases.{GetIncludes, WriteOutputAnnotations}
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
@@ -100,9 +109,59 @@ class WriteOutputAnnotationsSpec extends AnyFlatSpec with Matchers with firrtl.t
out.toSeq should be (annotations)
}
+ it should "write CustomFileEmission annotations" in new Fixture {
+ val file = new File("write-CustomFileEmission-annotations.anno.json")
+ val annotations = Seq( TargetDirAnnotation(dir),
+ OutputAnnotationFileAnnotation(file.toString),
+ WriteOutputAnnotationsSpec.Custom("hello!") )
+ val serializedFileName = view[StageOptions](annotations).getBuildFileName("Custom", Some(".Emission"))
+ val expected = annotations.map {
+ case _: WriteOutputAnnotationsSpec.Custom => WriteOutputAnnotationsSpec.Replacement(serializedFileName)
+ case a => a
+ }
+
+ val out = phase.transform(annotations)
+
+ info("annotations are unmodified")
+ out.toSeq should be (annotations)
+
+ fileContainsAnnotations(new File(dir, file.toString), expected)
+
+ info(s"file '$serializedFileName' exists")
+ new File(serializedFileName) should (exist)
+ }
+
+ it should "error if multiple annotations try to write to the same file" in new Fixture {
+ val file = new File("write-CustomFileEmission-annotations-error.anno.json")
+ val annotations = Seq( TargetDirAnnotation(dir),
+ OutputAnnotationFileAnnotation(file.toString),
+ WriteOutputAnnotationsSpec.Custom("foo"),
+ WriteOutputAnnotationsSpec.Custom("bar") )
+ intercept[PhaseException] {
+ phase.transform(annotations)
+ }.getMessage should startWith ("Multiple CustomFileEmission annotations")
+ }
+
}
private object WriteOutputAnnotationsSpec {
+
case object FooAnnotation extends NoTargetAnnotation
+
case class BarAnnotation(x: Int) extends NoTargetAnnotation
+
+ case class Custom(value: String) extends NoTargetAnnotation with CustomFileEmission {
+
+ override protected def baseFileName(a: AnnotationSeq): String = "Custom"
+
+ override protected def suffix: Option[String] = Some(".Emission")
+
+ override def getBytes: Iterable[Byte] = value.getBytes
+
+ override def replacements(file: File): AnnotationSeq = Seq(Replacement(file.toString))
+
+ }
+
+ case class Replacement(file: String) extends NoTargetAnnotation
+
}