From 0da788c52121e44de6be0cdc7a0c4c6e1b125ff9 Mon Sep 17 00:00:00 2001 From: Felix Mulder Date: Tue, 25 Oct 2016 17:01:53 +0200 Subject: Add bin project to separate scripted tests from compiler tests --- bin/test/TestScripts.scala | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 bin/test/TestScripts.scala (limited to 'bin') diff --git a/bin/test/TestScripts.scala b/bin/test/TestScripts.scala new file mode 100644 index 000000000..1a200c1b9 --- /dev/null +++ b/bin/test/TestScripts.scala @@ -0,0 +1,91 @@ +package test + +import org.junit.Assert._ +import org.junit.{Before, After, Test} + +import scala.io.Source +import scala.sys.process.{Process, ProcessLogger} +import java.io.{File => JFile, FileNotFoundException} + +class TestScripts { + private val lineSep = util.Properties.lineSeparator + private def doUnlessWindows(op: => Unit) = + if (!System.getProperty("os.name").toLowerCase.contains("windows")) + op + else + Console.err.println("[warn] Could not perform test, windows batch-scripts not available") + + private def executeScript(script: String): (Int, String) = { + val sb = new StringBuilder + val ret = Process(script) ! ProcessLogger(sb append _) + (ret, sb.toString) + } + + private def deletePackages: Unit = { + def delete(path: String) = { + val file = new JFile(path) + if (file.exists) file.delete() + } + + try { + for (jar <- Source.fromFile("../.packages").getLines()) + delete(jar) + + delete("../.packages") + delete("./src/dotty/tools/dotc/Dummy.scala") + delete("HelloWorld.class") + delete("HelloWorld$.class") + } catch { + case _: FileNotFoundException => () + } + } + + @Before def buildUp = deletePackages + @After def tearDown = deletePackages + + /** bin/dotc script should be able to build hello world and successfully + * execute it using dotr + */ + @Test def buildAndRunHelloWorld = doUnlessWindows { + val (retDotc, dotcOutput) = executeScript("./bin/dotc ./tests/pos/HelloWorld.scala") + + // Check correct output of building and running dotc + assert( + retDotc == 0, + s"bin/dotc script did not run properly. Output:$lineSep$dotcOutput" + ) + + val (retDotr, dotrOutput) = executeScript("./bin/dotr HelloWorld") + assert( + retDotr == 0 && dotrOutput == "hello world", + s"Running hello world exited with status: $retDotr and output: $dotrOutput" + ) + } + + /** bin/dotc script should be able to detect changes in dotty sources and + * rebuild dotty if needed + */ + @Test def rebuildIfNecessary = doUnlessWindows { + val (retFirstBuild, _) = executeScript("./bin/dotc ./tests/pos/HelloWorld.scala") + assert(retFirstBuild == 0, "building dotc failed") + + // Create a new file to force rebuild + new JFile("./src/dotty/tools/dotc/Dummy.scala").createNewFile() + + val (retSecondBuild, output) = executeScript("./bin/dotc ./tests/pos/HelloWorld.scala") + assert( + retSecondBuild == 0 && output.contains("rebuilding"), + s"Rebuilding the tool should result in jar files being rebuilt. Status: $retSecondBuild, output:$lineSep$output") + } + + /** if no changes to dotty, dotc script should be fast */ + @Test def beFastOnNoChanges = doUnlessWindows { + val (retFirstBuild, _) = executeScript("./bin/dotc ./tests/pos/HelloWorld.scala") + assert(retFirstBuild == 0, "building dotc failed") + + val (ret, output) = executeScript("./bin/dotc ./tests/pos/HelloWorld.scala") + assert( + ret == 0 && !output.contains("rebuilding"), + s"Project recompiled when it didn't need to be. Status $ret, output:$lineSep$output") + } +} -- cgit v1.2.3