summaryrefslogtreecommitdiff
path: root/integration
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2018-01-17 23:44:01 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2018-01-17 23:44:01 -0800
commit1341e29629ec633a8d9db0e1717434ab560aab42 (patch)
treeb70ce24feef8ddb7e009a1521e2ca14868a7a5da /integration
parent26e3702f3fccdedbb9dd44574678e9217d16959c (diff)
downloadmill-1341e29629ec633a8d9db0e1717434ab560aab42.tar.gz
mill-1341e29629ec633a8d9db0e1717434ab560aab42.tar.bz2
mill-1341e29629ec633a8d9db0e1717434ab560aab42.zip
Introduce an Ammonite build to our test suite
Diffstat (limited to 'integration')
-rw-r--r--integration/src/test/resources/ammonite/build.sc177
-rw-r--r--integration/src/test/scala/mill/integration/AmmoniteTests.scala36
-rw-r--r--integration/src/test/scala/mill/integration/IntegrationTestSuite.scala8
3 files changed, 220 insertions, 1 deletions
diff --git a/integration/src/test/resources/ammonite/build.sc b/integration/src/test/resources/ammonite/build.sc
new file mode 100644
index 00000000..cb8d32ab
--- /dev/null
+++ b/integration/src/test/resources/ammonite/build.sc
@@ -0,0 +1,177 @@
+import mill._, scalalib._
+val binCrossScalaVersions = Seq("2.11.11", "2.12.4")
+val fullCrossScalaVersions = Seq(
+ "2.11.3", "2.11.4", "2.11.5", "2.11.6", "2.11.7", "2.11.8", "2.11.9", "2.11.11",
+ "2.12.0", "2.12.1", "2.12.2", "2.12.3", "2.12.4"
+)
+trait AmmModule extends mill.scalalib.CrossSbtModule{
+ def testFramework = "utest.runner.Framework"
+ def scalacOptions = Seq("-P:acyclic:force", "-target:jvm-1.7")
+ def compileIvyDeps = Agg(ivy"com.lihaoyi::acyclic:0.1.7")
+ def scalacPluginIvyDeps = Agg(ivy"com.lihaoyi::acyclic:0.1.7")
+ trait Tests extends super.Tests{
+ def ivyDeps = Agg(ivy"com.lihaoyi::utest:0.6.0")
+ def testFramework = "utest.runner.Framework"
+ }
+}
+
+object ops extends Cross[OpsModule](binCrossScalaVersions:_*)
+class OpsModule(val crossScalaVersion: String) extends AmmModule{
+ def ivyDeps = Agg(ivy"com.lihaoyi::geny:0.1.2")
+
+ object test extends Tests
+}
+
+object terminal extends Cross[TerminalModule](binCrossScalaVersions:_*)
+class TerminalModule(val crossScalaVersion: String) extends AmmModule{
+ def ivyDeps = Agg(
+ ivy"com.lihaoyi::sourcecode:0.1.3",
+ ivy"com.lihaoyi::fansi:0.2.3"
+ )
+ def compileIvyDeps = Agg(
+ ivy"org.scala-lang:scala-reflect:$crossScalaVersion"
+ )
+
+ object test extends Tests
+}
+
+object amm extends Cross[MainModule](fullCrossScalaVersions:_*){
+ object util extends Cross[UtilModule](binCrossScalaVersions:_*)
+ class UtilModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(ops())
+ def ivyDeps = Agg(
+ ivy"com.lihaoyi::upickle:0.5.1",
+ ivy"com.lihaoyi::pprint:0.5.2",
+ ivy"com.lihaoyi::fansi:0.2.4"
+ )
+ }
+
+
+ object runtime extends Cross[RuntimeModule](binCrossScalaVersions:_*)
+ class RuntimeModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(ops(), amm.util())
+ def ivyDeps = Agg(
+ ivy"io.get-coursier::coursier:1.0.0",
+ ivy"io.get-coursier::coursier-cache:1.0.0",
+ ivy"org.scalaj::scalaj-http:2.3.0"
+ )
+
+ def generatedSources = T{
+ import ammonite.ops._
+ mkdir(T.ctx().dest)
+ cp(build.basePath/'project/"Constants.scala", T.ctx().dest/"Constants.scala")
+ Seq(PathRef(T.ctx().dest))
+ }
+ }
+
+ object interp extends Cross[InterpModule](fullCrossScalaVersions:_*)
+ class InterpModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(ops(), amm.util(), amm.runtime())
+ def ivyDeps = Agg(
+ ivy"org.scala-lang:scala-compiler:$crossScalaVersion",
+ ivy"org.scala-lang:scala-reflect:$crossScalaVersion",
+ ivy"com.lihaoyi::scalaparse:1.0.0",
+ ivy"org.javassist:javassist:3.21.0-GA"
+ )
+ }
+
+ object repl extends Cross[ReplModule](fullCrossScalaVersions:_*)
+ class ReplModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(
+ ops(), amm.util(),
+ amm.runtime(), amm.interp(),
+ terminal()
+ )
+ def ivyDeps = Agg(
+ ivy"jline:jline:2.14.3",
+ ivy"com.github.javaparser:javaparser-core:3.2.5",
+ ivy"com.github.scopt::scopt:3.5.0"
+ )
+
+ object test extends Tests{
+ def resources = T.input {
+ super.resources() ++
+ ReplModule.this.sources() ++
+ ReplModule.this.externalCompileDepSources()
+ }
+ }
+ }
+}
+class MainModule(val crossScalaVersion: String) extends AmmModule{
+
+ def mainClass = Some("ammonite.Main")
+
+ def moduleDeps = Seq(
+ terminal(), ops(),
+ amm.util(), amm.runtime(),
+ amm.interp(), amm.repl()
+ )
+ def ivyDeps = Agg(
+ ivy"com.github.scopt::scopt:3.5.0",
+ )
+
+ def runClasspath =
+ super.runClasspath() ++
+ ops().sources() ++
+ terminal().sources() ++
+ amm.util().sources() ++
+ amm.runtime().sources() ++
+ amm.interp().sources() ++
+ amm.repl().sources() ++
+ sources() ++
+ externalCompileDepSources()
+
+
+
+ def prependShellScript =
+ "#!/usr/bin/env sh\n" +
+ """exec java -jar -Xmx500m -XX:+UseG1GC $JAVA_OPTS "$0" "$@""""
+
+
+ object test extends Tests{
+ def moduleDeps = super.moduleDeps ++ Seq(amm.repl().test)
+ def ivyDeps = super.ivyDeps() ++ Agg(
+ ivy"com.chuusai::shapeless:2.3.2"
+ )
+ }
+}
+
+object shell extends Cross[ShellModule](fullCrossScalaVersions:_*)
+class ShellModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(ops(), amm())
+ object test extends Tests{
+ def moduleDeps = super.moduleDeps ++ Seq(amm.repl().test)
+ // (test in Test) := (test in Test).dependsOn(packageBin in Compile).value,
+ // (run in Test) := (run in Test).dependsOn(packageBin in Compile).evaluated,
+ // (testOnly in Test) := (testOnly in Test).dependsOn(packageBin in Compile).evaluated
+ }
+}
+object integration extends Cross[IntegrationModule](fullCrossScalaVersions:_*)
+class IntegrationModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(ops(), amm())
+ // (test in Test) := (test in Test).dependsOn(integrationTasks:_*).value,
+ // (run in Test) := (run in Test).dependsOn(integrationTasks:_*).evaluated,
+ // (testOnly in Test) := (testOnly in Test).dependsOn(integrationTasks:_*).evaluated,
+ // (console in Test) := (console in Test).dependsOn(integrationTasks:_*).value,
+ // initialCommands in (Test, console) := "ammonite.integration.Main.main(null)"
+ object test extends Tests {
+ }
+}
+
+object sshd extends Cross[SshdModule](fullCrossScalaVersions:_*)
+class SshdModule(val crossScalaVersion: String) extends AmmModule{
+ def moduleDeps = Seq(ops(), amm())
+ def ivyDeps = Agg(
+ // sshd-core 1.3.0 requires java8
+ ivy"org.apache.sshd:sshd-core:1.2.0",
+ ivy"org.bouncycastle:bcprov-jdk15on:1.56",
+ )
+ object test extends Tests {
+ def ivyDeps = super.ivyDeps() ++ Agg(
+ // slf4j-nop makes sshd server use logger that writes into the void
+ ivy"org.slf4j:slf4j-nop:1.7.12",
+ ivy"com.jcraft:jsch:0.1.54",
+ ivy"org.scalacheck::scalacheck:1.12.6"
+ )
+ }
+} \ No newline at end of file
diff --git a/integration/src/test/scala/mill/integration/AmmoniteTests.scala b/integration/src/test/scala/mill/integration/AmmoniteTests.scala
new file mode 100644
index 00000000..22bd3cb8
--- /dev/null
+++ b/integration/src/test/scala/mill/integration/AmmoniteTests.scala
@@ -0,0 +1,36 @@
+package mill.integration
+
+import ammonite.ops._
+import utest._
+
+object AmmoniteTests extends IntegrationTestSuite("MILL_AMMONITE_REPO", "ammonite") {
+ val tests = Tests{
+ initWorkspace()
+
+ def check(scalaVersion: String) = {
+ val replTests = eval(
+ s"amm.repl[$scalaVersion].test", "{ammonite.unit,ammonite.session.ProjectTests.guava}"
+ )
+ val replTestMeta = meta(s"amm.repl[$scalaVersion].test.test")
+ assert(
+ replTests,
+ replTestMeta.contains("ammonite.session.ProjectTests.guava"),
+ replTestMeta.contains("ammonite.unit.SourceTests.objectInfo.thirdPartyJava")
+ )
+
+ val compileResult = eval(
+ "--all", s"{shell,sshd,amm,integration}[$scalaVersion].test.compile"
+ )
+
+ assert(
+ compileResult,
+ ls.rec(workspacePath / 'out / 'integration / scalaVersion / 'test / 'compile)
+ .exists(_.name == "ErrorTruncationTests.class")
+ )
+ }
+
+ 'scala2118 - check("2.11.8")
+ 'scala2124 - check("2.12.4")
+
+ }
+}
diff --git a/integration/src/test/scala/mill/integration/IntegrationTestSuite.scala b/integration/src/test/scala/mill/integration/IntegrationTestSuite.scala
index ba4415fa..293411c5 100644
--- a/integration/src/test/scala/mill/integration/IntegrationTestSuite.scala
+++ b/integration/src/test/scala/mill/integration/IntegrationTestSuite.scala
@@ -3,6 +3,8 @@ package mill.integration
import java.io.{ByteArrayInputStream, ByteArrayOutputStream, InputStream, PrintStream}
import ammonite.ops._
+import mill.define.Segments
+import mill.main.ParseArgs
import utest._
abstract class IntegrationTestSuite(repoKey: String, workspaceSlug: String) extends TestSuite{
@@ -15,7 +17,11 @@ abstract class IntegrationTestSuite(repoKey: String, workspaceSlug: String) exte
stdOutErr, stdOutErr, stdIn
)
def eval(s: String*) = runner.runScript(workspacePath / "build.sc", s.toList)
- def meta(s: String) = read(workspacePath / "out" / RelPath(s.replaceAll("\\.", "/")) / "meta.json")
+ def meta(s: String) = {
+ val (List(selector), args) = ParseArgs.apply(Seq(s)).right.get
+
+ read(workspacePath / "out" / selector.flatMap(_.pathSegments) / "meta.json")
+ }
def initWorkspace() = {
rm(workspacePath)
mkdir(workspacePath / up)