summaryrefslogtreecommitdiff
path: root/contrib/bloop/test/src/mill/contrib/bloop/BloopTests.scala
blob: 0af93c463ed1101d5988aac202c996cdc0422db9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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)
      }
    }
  }

}