From 6f4ba5480f9aa43baf49de774b64d0b3dbc95a10 Mon Sep 17 00:00:00 2001 From: ilyas Date: Wed, 6 May 2009 10:24:51 +0000 Subject: Scala decompiler test suite added --- src/partest/scala/tools/partest/PartestTask.scala | 13 +++++ .../scala/tools/partest/nest/CompileManager.scala | 1 + .../scala/tools/partest/nest/TestFile.scala | 9 ++++ src/partest/scala/tools/partest/nest/Worker.scala | 63 ++++++++++++++++++++-- src/scala-lang.iml | 16 +++--- 5 files changed, 87 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/partest/scala/tools/partest/PartestTask.scala b/src/partest/scala/tools/partest/PartestTask.scala index bda1f5b679..90073db13d 100644 --- a/src/partest/scala/tools/partest/PartestTask.scala +++ b/src/partest/scala/tools/partest/PartestTask.scala @@ -56,6 +56,10 @@ class PartestTask extends Task { shootoutFiles = Some(input) } + def addConfiguredScalapTests(input: FileSet) { + scalapFiles = Some(input) + } + def setClasspath(input: Path) { if (classpath.isEmpty) classpath = Some(input) @@ -119,6 +123,7 @@ class PartestTask extends Task { private var residentFiles: Option[FileSet] = None private var scriptFiles: Option[FileSet] = None private var shootoutFiles: Option[FileSet] = None + private var scalapFiles: Option[FileSet] = None private var errorOnFailed: Boolean = false private var scalacOpts: Option[String] = None private var timeout: Option[String] = None @@ -158,6 +163,7 @@ class PartestTask extends Task { private def getResidentFiles = getFiles(residentFiles) private def getScriptFiles = getFiles(scriptFiles) private def getShootoutFiles = getFiles(shootoutFiles) + private def getScalapFiles = getFiles(scalapFiles) override def execute() { if (debug) @@ -285,6 +291,13 @@ class PartestTask extends Task { allFailures += failures } + if (getScalapFiles.size > 0) { + log("Running scalap tests") + val (successes, failures) = runTestsForFiles(getScalapFiles, "scalap") + allSucesses += successes + allFailures += failures + } + if ((getPosFiles.size + getNegFiles.size + getRunFiles.size + getResidentFiles.size + getScriptFiles.size + getShootoutFiles.size) == 0) log("There where no tests to run.") else if (allFailures == 0) diff --git a/src/partest/scala/tools/partest/nest/CompileManager.scala b/src/partest/scala/tools/partest/nest/CompileManager.scala index fe175b2b7e..0f21efc346 100644 --- a/src/partest/scala/tools/partest/nest/CompileManager.scala +++ b/src/partest/scala/tools/partest/nest/CompileManager.scala @@ -105,6 +105,7 @@ class DirectCompiler(val fileManager: FileManager) extends SimpleCompiler { case "jvm" => JvmTestFile(files(0), fileManager, out.isEmpty) case "jvm5" => Jvm5TestFile(files(0), fileManager, out.isEmpty) case "shootout" => ShootoutTestFile(files(0), fileManager, out.isEmpty) + case "scalap" => ScalapTestFile(files(0), fileManager, out.isEmpty) case "scalacheck" => ScalaCheckTestFile(files(0), fileManager, out.isEmpty) } diff --git a/src/partest/scala/tools/partest/nest/TestFile.scala b/src/partest/scala/tools/partest/nest/TestFile.scala index 07a96956dd..3d83abe176 100644 --- a/src/partest/scala/tools/partest/nest/TestFile.scala +++ b/src/partest/scala/tools/partest/nest/TestFile.scala @@ -106,3 +106,12 @@ case class ShootoutTestFile(override val file: File, override val fileManager: F settings.outdir.value = file.getParent } } + +case class ScalapTestFile(override val file: File, override val fileManager: FileManager, createOutDir: Boolean) extends TestFile("scalap", file, fileManager, createOutDir) { + override def defineSettings(settings: Settings) { + baseSettings(settings) + settings.classpath.value = settings.classpath.value+ + File.pathSeparator+fileManager.CLASSPATH + settings.outdir.value = file.getParent + } +} diff --git a/src/partest/scala/tools/partest/nest/Worker.scala b/src/partest/scala/tools/partest/nest/Worker.scala index b1e83d6808..3f449b3827 100644 --- a/src/partest/scala/tools/partest/nest/Worker.scala +++ b/src/partest/scala/tools/partest/nest/Worker.scala @@ -7,17 +7,15 @@ package scala.tools.partest.nest -import java.io.{File, FileInputStream, FileOutputStream, PrintStream, - PrintWriter, StringWriter, FileWriter, InputStreamReader, - FileReader, OutputStreamWriter, BufferedReader} - -import java.net.URL +import java.io._ +import java.net.{URLClassLoader, URL} import java.util.{Timer, TimerTask} import scala.tools.nsc.{ObjectRunner, GenericRunnerCommand} import scala.actors.{Actor, Exit, TIMEOUT} import scala.actors.Actor._ +import scalap.scalax.rules.scalasig.{ByteCode, ClassFileParser, ScalaSigAttributeParsers} case class RunTests(kind: String, files: List[File]) case class Results(succ: Int, fail: Int, logs: List[LogFile], outdirs: List[File]) @@ -741,6 +739,61 @@ class Worker(val fileManager: FileManager) extends Actor { LogContext(logFile, None) } + case "scalap" => { + + def decompileFile(clazz: Class[_]) = { + val byteCode = ByteCode.forClass(clazz) + val classFile = ClassFileParser.parse(byteCode) + val Some(sig) = classFile.attribute("ScalaSig").map(_.byteCode).map(ScalaSigAttributeParsers.parse) + import scala.tools.scalap.Main._ + parseScalaSignature(sig) + } + + runInContext(file, kind, (logFile: File, outDir: File) => { + val sourceDir = file.getParentFile + val sourceDirName = sourceDir.getName + + // 1. Find file with result text + val results = sourceDir.listFiles(new FilenameFilter { + def accept(dir: File, name: String) = name == "result.test" + }) + + if (results.length != 1) { + NestUI.verbose("Result file not found in directory " + sourceDirName + " \n") + } else { + val resFile = results(0) + // 2. Compile source file + if (!compileMgr.shouldCompile(outDir, List(file), kind, logFile)) { + succeeded = false + } else { + + // 3. Decompile file and compare results + val className = sourceDirName.capitalize + val url = outDir.toURI.toURL + val loader = new URLClassLoader(Array(url), getClass.getClassLoader) + val clazz = loader.loadClass(className) + + val result = decompileFile(clazz) + + try { + val fstream = new FileWriter(logFile); + val out = new BufferedWriter(fstream); + out.write(result) + out.close(); + } catch { + case e: IOException => NestUI.verbose(e.getMessage()); succeeded = false + } + + val diff = fileManager.compareFiles(logFile, resFile) + if (!diff.equals("")) { + NestUI.verbose("output differs from log file\n") + succeeded = false + } + } + } + }) + } + case "script" => { val osName = System.getProperty("os.name", "") // when option "--failed" is provided diff --git a/src/scala-lang.iml b/src/scala-lang.iml index 365c7cd7f7..d74dfe8334 100644 --- a/src/scala-lang.iml +++ b/src/scala-lang.iml @@ -7,6 +7,9 @@ + + + @@ -22,19 +25,12 @@ - + - - - - - - - - - + + -- cgit v1.2.3