diff --git a/build.sbt b/build.sbt index 19b2c5d..9a10873 100644 --- a/build.sbt +++ b/build.sbt @@ -139,6 +139,7 @@ lazy val root = project "org.twc" % "t2" % "1.0" from file( "lib/terminator-compiler-1.0.jar", ).toURI.toString, + "io.spray" %% "spray-json" % "1.3.6", ), // set the main class for 'sbt run' Compile / mainClass := Some("fhetest.FHETest"), diff --git a/src/main/scala/fhetest/Checker/CheckResult.scala b/src/main/scala/fhetest/Checker/CheckResult.scala new file mode 100644 index 0000000..5656839 --- /dev/null +++ b/src/main/scala/fhetest/Checker/CheckResult.scala @@ -0,0 +1,16 @@ +package fhetest.Checker + +trait CheckResult { + val results: List[BackendResultPair] + override def toString: String = { + val className = this.getClass.getSimpleName.replace("$", "") + val resultStrings = results.map { + case BackendResultPair(backendName, executeResult) => + s"\n- $backendName:\n ${executeResult.toString}" + } + s"[$className] ${resultStrings.mkString("")}" + } +} +case class Same(results: List[BackendResultPair]) extends CheckResult +case class Diff(results: List[BackendResultPair]) extends CheckResult +case class ParserError(results: List[BackendResultPair]) extends CheckResult diff --git a/src/main/scala/fhetest/Checker/ExecuteResult.scala b/src/main/scala/fhetest/Checker/ExecuteResult.scala new file mode 100644 index 0000000..0a36110 --- /dev/null +++ b/src/main/scala/fhetest/Checker/ExecuteResult.scala @@ -0,0 +1,29 @@ +package fhetest.Checker + +import fhetest.Utils.* + +trait ExecuteResult +case class Normal(res: String) extends ExecuteResult { + override def toString: String = res +} +case object InterpError extends ExecuteResult +case object PrintError extends ExecuteResult +case class LibraryError(msg: String) extends ExecuteResult { + override def toString: String = s"LibraryError: $msg" +} +case object ParseError extends ExecuteResult +// case object TimeoutError extends ExecuteResult //TODO: development +// case object Throw extends ExecuteResult + +case class BackendResultPair(backend: String, result: ExecuteResult) + +def isDiff( + expected: BackendResultPair, + obtained: BackendResultPair, +): Boolean = + (obtained.result, expected.result) match { + case (Normal(obtained), Normal(expected)) => + try { compare(obtained, expected); false } + catch { case _ => true } + case _ => true + } diff --git a/src/main/scala/fhetest/Checker/Utils.scala b/src/main/scala/fhetest/Checker/Utils.scala new file mode 100644 index 0000000..9348509 --- /dev/null +++ b/src/main/scala/fhetest/Checker/Utils.scala @@ -0,0 +1,22 @@ +package fhetest.Checker + +import java.io.{File, PrintWriter} +import java.nio.file.{Files, Path, Paths, StandardCopyOption} +import spray.json._ + +// file writer +def getPrintWriter(filename: String): PrintWriter = + new PrintWriter(new File(filename)) + +// dump given data to a file +def dumpFile(data: Any, filename: String): Unit = { + val nf = getPrintWriter(filename) + nf.print(data) + nf.close() +} + +// dump given data as JSON +def dumpJson[T](data: T, filename: String)(implicit + writer: JsonWriter[T], +): Unit = + dumpFile(data.toJson.prettyPrint, filename) diff --git a/src/main/scala/fhetest/Phase/Checker.scala b/src/main/scala/fhetest/Phase/Check.scala similarity index 67% rename from src/main/scala/fhetest/Phase/Checker.scala rename to src/main/scala/fhetest/Phase/Check.scala index 3d54a78..6975a02 100644 --- a/src/main/scala/fhetest/Phase/Checker.scala +++ b/src/main/scala/fhetest/Phase/Check.scala @@ -1,6 +1,7 @@ package fhetest.Phase import fhetest.Utils.* +import fhetest.Checker.* import org.twc.terminator.t2dsl_compiler.T2DSLsyntaxtree.*; import org.twc.terminator.SymbolTable; @@ -22,7 +23,8 @@ case object Check { getResults(ast, symbolTable, encType, backends, encParams) diffResults(interpResult, executeResults) } catch { - case _ => ParseError(List(BackendResultPair("Parser", ParseError))) + case _ => + ParserError(List(BackendResultPair("Parser", ParseError))) } } @@ -31,9 +33,16 @@ case object Check { backends: List[Backend], encParams: EncParams, ): LazyList[CheckResult] = { - for { + val checkResults = for { program <- programs } yield apply(program, backends, encParams) + + // TODO: Write Json file + // checkResults.foreach { + + // } + + checkResults } def apply( @@ -45,7 +54,7 @@ case object Check { if (dir.exists() && dir.isDirectory) { val files = Files.list(Paths.get(directory)) val fileList = files.iterator().asScala.toList - for { + val checkResults = for { filePath <- fileList.to(LazyList) } yield { val fileStr = Files.readAllLines(filePath).asScala.mkString("") @@ -55,37 +64,18 @@ case object Check { pgmStr + reportStr } + + // TODO: Write Json file + // checkResults.foreach { + + // } + + checkResults } else { throw new Exception("Directory does not exist or is not a directory") } } - trait CheckResult { - val results: List[BackendResultPair] - override def toString: String = { - val className = this.getClass.getSimpleName.replace("$", "") - val resultStrings = results.map { - case BackendResultPair(backendName, executeResult) => - s"\n- $backendName:\n ${executeResult.toString}" - } - s"[$className] ${resultStrings.mkString("")}" - } - } - case class Same(results: List[BackendResultPair]) extends CheckResult - case class Diff(results: List[BackendResultPair]) extends CheckResult - case class ParseError(results: List[BackendResultPair]) extends CheckResult - - def isDiff( - expected: BackendResultPair, - obtained: BackendResultPair, - ): Boolean = - (obtained.result, expected.result) match { - case (Normal(obtained), Normal(expected)) => - try { compare(obtained, expected); false } - catch { case _ => true } - case _ => true - } - def diffResults( expected: BackendResultPair, obtained: List[BackendResultPair], @@ -94,21 +84,6 @@ case object Check { if (obtained.forall(!isDiff(expected, _))) Same(results) else Diff(results) } - trait ExecuteResult - case class Normal(res: String) extends ExecuteResult { - override def toString: String = res - } - case object InterpError extends ExecuteResult - case object PrintError extends ExecuteResult - case class LibraryError(msg: String) extends ExecuteResult { - override def toString: String = s"LibraryError: $msg" - } - case object ParseError extends ExecuteResult - // case object TimeoutError extends ExecuteResult //TODO: development - // case object Throw extends ExecuteResult - - case class BackendResultPair(backend: String, result: ExecuteResult) - def getResults( ast: Goal, symbolTable: SymbolTable,