summaryrefslogblamecommitdiff
path: root/contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala
blob: 0af93c463ed1101d5988aac202c996cdc0422db9 (plain) (tree)
1
2
3
4
5
6
7
8
9

                          
                                           



                                              
                                     
                      
                                          































                                                                           



                                                      













                                                                                             







                                                           
                                        
                                                               
                                                                 
                                                                   

                                                                           
















































                                                                                     



                                                                     




























                                                                                                         



     
package mill.contrib.bloop

import bloop.config.{Config => BloopConfig}
import bloop.config.Config.{File => BloopFile}
import bloop.config.ConfigEncoderDecoders._
import mill._
import mill.contrib.bloop.CirceCompat._
import mill.scalajslib.api.ModuleKind
import mill.scalalib._
import mill.scalanativelib.api.ReleaseMode
import mill.util.{TestEvaluator, TestUtil}
import os.Path
import upickle.default._
import utest._

object BloopTests extends TestSuite {

  val workdir = os.pwd / 'target / 'workspace / "bloop"
  val testEvaluator = TestEvaluator.static(build)
  val testBloop = new BloopImpl(() => testEvaluator.evaluator, workdir)

  object build extends TestUtil.BaseModule {

    override def millSourcePath = BloopTests.workdir

    object scalaModule extends scalalib.ScalaModule with testBloop.Module {
      def scalaVersion = "2.12.8"
      val bloopVersion = "1.2.5"
      override def mainClass = Some("foo.bar.Main")

      override def ivyDeps = Agg(
        ivy"ch.epfl.scala::bloop-config:$bloopVersion"
      )
      override def scalacOptions = Seq(
        "-language:higherKinds"
      )

      object test extends super.Tests {
        def testFrameworks = Seq("utest.runner.Framework")
      }
    }

    object scalaModule2 extends scalalib.ScalaModule {
      def scalaVersion = "2.12.8"
    }

    object scalajsModule extends scalajslib.ScalaJSModule with testBloop.Module {
      override def scalaVersion = "2.12.8"
      override def scalaJSVersion = "0.6.28"
      override def linkerMode = T(Some(_root_.bloop.config.Config.LinkerMode.Release))
      override def moduleKind = T(ModuleKind.CommonJSModule)
    }

    object scalanativeModule extends scalanativelib.ScalaNativeModule with testBloop.Module {
      override def scalaVersion = "2.11.12"
      override def scalaNativeVersion = "0.3.8"
      override def releaseMode = T(ReleaseMode.Release)
    }


  }

  def readBloopConf(jsonFile: String) =
    read[BloopFile](os.read(workdir / ".bloop" / jsonFile))

  def tests: Tests = Tests {
    'genBloopTests - {

      testEvaluator(testBloop.install())
      val scalaModuleConfig = readBloopConf("scalaModule.json")
      val scalaModule2Config = readBloopConf("scalaModule2.json")
      val testModuleConfig = readBloopConf("scalaModule.test.json")
      val scalajsModuleConfig = readBloopConf("scalajsModule.json")
      val scalanativeModuleConfig = readBloopConf("scalanativeModule.json")

      'scalaModule - {
        val p = scalaModuleConfig.project
        val name = p.name
        val sources = p.sources.map(Path(_))
        val options = p.scala.get.options
        val version = p.scala.get.version
        val classpath = p.classpath.map(_.toString)
        val platform = p.platform.get.name
        val mainCLass = p.platform.get.mainClass.get
        val resolution = p.resolution.get.modules
        val sdb = testBloop.semanticDBVersion
        val sdbOpts = testBloop.semanticDBOptions

        assert(name == "scalaModule")
        assert(sources == List(workdir / "scalaModule" / "src"))
        assert(options.contains("-language:higherKinds"))
        assert(options.exists(_.contains(s"semanticdb-scalac_2.12.8-$sdb.jar")))
        assert(sdbOpts.forall(options.contains))
        assert(version == "2.12.8")
        assert(classpath.exists(_.contains("bloop-config_2.12-1.2.5.jar")))
        assert(platform == "jvm")
        assert(mainCLass == "foo.bar.Main")

        val bloopConfigDep = resolution.find(_.name == "bloop-config_2.12").get
        val artifacts = bloopConfigDep.artifacts
        assert(bloopConfigDep.version == build.scalaModule.bloopVersion)
        assert(bloopConfigDep.organization == "ch.epfl.scala")
        assert(artifacts.map(_.name).distinct == List("bloop-config_2.12"))
        assert(artifacts.flatMap(_.classifier).contains("sources"))
      }
      'scalaModuleTest - {
        val p = testModuleConfig.project
        val name = p.name
        val sources = p.sources.map(Path(_))
        val framework = p.test.get.frameworks.head.names.head
        val dep = p.dependencies.head
        val mainModuleClasspath = scalaModuleConfig.project.classpath
        assert(name == "scalaModule.test")
        assert(sources == List(workdir / "scalaModule" / "test" / "src"))
        assert(framework == "utest.runner.Framework")
        assert(dep == "scalaModule")
        assert(mainModuleClasspath.forall(p.classpath.contains))
      }
      'configAccessTest - {
        val (accessedConfig, _) =
          testEvaluator(build.scalaModule.bloop.config).asSuccess.get.value.right.get
        assert(accessedConfig == scalaModuleConfig)
      }
      'noDepTest - {
        val cp = scalaModule2Config.project.classpath.map(_.toString)
        assert(cp.exists(_.contains("scala-library-2.12.8")))
      }
      'scalajsModule - {
        val p = scalajsModuleConfig.project
        val name = p.name
        val sources = p.sources.map(Path(_))
        val version = p.scala.get.version
        val platform = p.platform.get.asInstanceOf[BloopConfig.Platform.Js]

        assert(name == "scalajsModule")
        assert(sources == List(workdir / "scalajsModule" / "src"))
        assert(version == "2.12.8")
        assert(platform.config.emitSourceMaps)
        assert(platform.config.kind == BloopConfig.ModuleKindJS.CommonJSModule)
        assert(platform.config.mode == BloopConfig.LinkerMode.Release)
      }
      'scalanativeModule - {
        val p = scalanativeModuleConfig.project
        val name = p.name
        val sources = p.sources.map(Path(_))
        val version = p.scala.get.version
        val platform = p.platform.get.asInstanceOf[BloopConfig.Platform.Native]

        val (clang, _) = testEvaluator(build.scalanativeModule.nativeClang).asSuccess.get.value.right.get

        assert(name == "scalanativeModule")
        assert(sources == List(workdir / "scalanativeModule" / "src"))
        assert(version == "2.11.12")
        assert(platform.config.mode == BloopConfig.LinkerMode.Release)
        assert(platform.config.clang == clang.toNIO)
      }
    }
  }

}