// See LICENSE for license details.

package firrtlTests.annotationTests

import firrtl.Parser
import firrtl.annotations.{Annotation, JsonProtocol, NoTargetAnnotation}
import firrtl.ir._
import org.scalatest.{FlatSpec, Matchers, PropSpec}

case class AnAnnotation(
    info: Info,
    cir: Circuit,
    mod: DefModule,
    port: Port,
    statement: Statement,
    expr: Expression,
    tpe: Type,
    groundType: GroundType
) extends NoTargetAnnotation

class JsonProtocolSpec extends FlatSpec with Matchers {
  "JsonProtocol" should "serialize and deserialize FIRRTL types" in {

    val circuit =
      """circuit Top: @[FPU.scala 509:25]
        |  module Top:
        |    input x: UInt
        |    output y: UInt
        |    y <= add(x, x)
        |""".stripMargin
    val cir = Parser.parse(circuit)
    val mod = cir.modules.head
    val port = mod.ports.head
    val stmt = mod.asInstanceOf[Module].body
    val expr = stmt.asInstanceOf[Block].stmts.head.asInstanceOf[Connect].expr
    val tpe = port.tpe
    val groundType = port.tpe.asInstanceOf[GroundType]
    val inputAnnos = Seq(AnAnnotation(cir.info, cir, mod, port, stmt, expr, tpe, groundType))
    val annosString = JsonProtocol.serialize(inputAnnos)
    val outputAnnos = JsonProtocol.deserialize(annosString)
    inputAnnos should be (outputAnnos)
  }
}
