1+ package org.jetbrains.kotlin.gradle.frontend
2+
3+ import org.gradle.testkit.runner.GradleRunner
4+ import org.gradle.testkit.runner.TaskOutcome
5+ import org.jetbrains.kotlin.gradle.frontend.util.mkdirsOrFail
6+ import org.junit.Before
7+ import org.junit.Rule
8+ import org.junit.Test
9+ import org.junit.rules.TemporaryFolder
10+ import org.junit.rules.TestName
11+ import org.junit.rules.TestWatcher
12+ import org.junit.runner.Description
13+ import java.io.File
14+ import kotlin.test.assertEquals
15+ import kotlin.test.assertTrue
16+
17+ class NewMppTest {
18+ private val gradleVersion: String = " 4.10.3"
19+ private val kotlinVersion: String = " 1.3.10"
20+
21+ private val port = 8098
22+ private val builder = BuildScriptBuilder ()
23+
24+ private lateinit var settingsGradleFile: File
25+ private lateinit var buildGradleFile: File
26+ private lateinit var runner: GradleRunner
27+
28+ @get:Rule
29+ val testName = TestName ()
30+
31+ @get:Rule
32+ val failedRule = object : TestWatcher () {
33+ override fun failed (e : Throwable ? , description : Description ? ) {
34+ val dst = File (" build/tests/${testName.methodName.replace(" [" , " -" ).replace(" ]" , " " )} " ).apply { mkdirsOrFail() }
35+ projectDir.root.copyRecursively(dst, true ) { file, copyError ->
36+ System .err.println (" Failed to copy $file due to ${copyError.message} " )
37+ OnErrorAction .SKIP
38+ }
39+ println (" Copied project to ${dst.absolutePath} " )
40+ }
41+
42+ /*
43+ // useful for debugging
44+ override fun succeeded(description: Description?) {
45+ failed(null, description)
46+ }
47+ // */
48+ }
49+
50+ @get:Rule
51+ val projectDir = TemporaryFolder ()
52+
53+ val D = " $"
54+
55+ fun File.makeParentsAndWriteText (text : String ) {
56+ parentFile.mkdirsOrFail()
57+ writeText(text)
58+ }
59+
60+ @Before
61+ fun setUp () {
62+ projectDir.create()
63+ projectDir.root.resolve(" build/kotlin-build/caches" ).mkdirsOrFail()
64+
65+ buildGradleFile = projectDir.root.resolve(" build.gradle" )
66+ settingsGradleFile = projectDir.root.resolve(" settings.gradle" )
67+
68+ projectDir.root.resolve(" src/commonMain/kotlin/sample/Sample.kt" ).makeParentsAndWriteText(" expect fun f(): Int" )
69+ projectDir.root.resolve(" src/commonTest/kotlin/sample/SampleTests.kt" ).makeParentsAndWriteText(
70+ """
71+ class SampleTests {
72+ @Test
73+ fun testMe() {
74+ assertTrue(f() > 0)
75+ }
76+ }
77+ """
78+ )
79+
80+ projectDir.root.resolve(" src/jsMain/kotlin/sample/SampleJs.kt" ).makeParentsAndWriteText(" actual fun f(): Int = 1" )
81+ projectDir.root.resolve(" src/jsTest/kotlin/sample/SampleTestsJs.kt" ).makeParentsAndWriteText(
82+ """
83+ class SampleTestsJs {
84+ @Test
85+ fun testMe() {
86+ assertTrue(f() == 1)
87+ }
88+ }
89+ """
90+ )
91+
92+ projectDir.root.resolve(" src/jvmMain/kotlin/sample/SampleJvm.kt" ).makeParentsAndWriteText(" actual fun f(): Int = 2" )
93+ projectDir.root.resolve(" src/jvmTest/kotlin/sample/SampleTestsJvm.kt" ).makeParentsAndWriteText(
94+ """
95+ class SampleTestsJvm {
96+ @Test
97+ fun testMe() {
98+ assertTrue(f() == 2)
99+ }
100+ }
101+ """
102+ )
103+
104+ buildGradleFile.parentFile.mkdirsOrFail()
105+ settingsGradleFile.parentFile.mkdirsOrFail()
106+
107+ runner = GradleRunner .create()
108+ .withProjectDir(projectDir.root)
109+ .withPluginClasspath()
110+ .withGradleVersion(gradleVersion)
111+
112+ settingsGradleFile.writeText(
113+ """
114+ pluginManagement {
115+ resolutionStrategy {
116+ eachPlugin {
117+ if (requested.id.id == "kotlin-multiplatform") {
118+ useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:$D {requested.version}")
119+ }
120+ }
121+ }
122+
123+ resolutionStrategy {
124+ eachPlugin {
125+ if (requested.id.id == "org.jetbrains.kotlin.frontend") {
126+ useModule('org.jetbrains.kotlin:kotlin-frontend-plugin:0.0.38-SNAPSHOT')
127+ }
128+ }
129+ }
130+
131+ repositories {
132+ mavenCentral()
133+ maven { url 'https://plugins.gradle.org/m2/' }
134+ }
135+ }
136+
137+ rootProject.name = 'new-mpp'
138+ """
139+ )
140+ }
141+
142+ @Test
143+ fun testSimple () {
144+ buildGradleFile.writeText(
145+ """
146+ plugins {
147+ id 'kotlin-multiplatform' version '$kotlinVersion '
148+ id 'org.jetbrains.kotlin.frontend'
149+ }
150+
151+ repositories {
152+ jcenter()
153+ maven { url "http://dl.bintray.com/kotlin/ktor" }
154+ mavenCentral()
155+ }
156+
157+ kotlin {
158+ targets {
159+ fromPreset(presets.jvm, 'jvm')
160+ fromPreset(presets.js, 'js') {
161+ configure([compilations.main, compilations.test]) {
162+ tasks.getByName(compileKotlinTaskName).kotlinOptions {
163+ sourceMap = true
164+ moduleKind = "commonjs"
165+ metaInfo = true
166+ }
167+ }
168+
169+ configure(compilations.main) {
170+ tasks.getByName(compileKotlinTaskName).kotlinOptions {
171+ main = "call"
172+ }
173+ }
174+ }
175+ }
176+
177+ sourceSets {
178+ commonMain {
179+ dependencies {
180+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
181+ }
182+ }
183+ commonTest {
184+ dependencies {
185+ implementation 'org.jetbrains.kotlin:kotlin-test-common'
186+ implementation 'org.jetbrains.kotlin:kotlin-test-annotations-common'
187+ }
188+ }
189+ jvmMain {
190+ dependencies {
191+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
192+ }
193+ }
194+ jvmTest {
195+ dependencies {
196+ implementation 'org.jetbrains.kotlin:kotlin-test'
197+ implementation 'org.jetbrains.kotlin:kotlin-test-junit'
198+ }
199+ }
200+ jsMain {
201+ dependencies {
202+ implementation 'org.jetbrains.kotlin:kotlin-stdlib-js'
203+ }
204+ }
205+ jsTest {
206+ dependencies {
207+ implementation 'org.jetbrains.kotlin:kotlin-test-js'
208+ }
209+ }
210+ }
211+ }
212+
213+ kotlinFrontend {
214+ npm {
215+ devDependency("karma")
216+ }
217+
218+ sourceMaps = true
219+
220+ webpackBundle {
221+ bundleName = "main"
222+ }
223+ }
224+ """
225+ )
226+
227+ val result = runner.withArguments(" bundle" ).build()
228+
229+ assertEquals(TaskOutcome .SUCCESS , result.task(" :npm-preunpack" )?.outcome)
230+ assertEquals(TaskOutcome .SUCCESS , result.task(" :npm-install" )?.outcome)
231+ assertEquals(TaskOutcome .SUCCESS , result.task(" :webpack-config" )?.outcome)
232+ assertEquals(TaskOutcome .SUCCESS , result.task(" :webpack-bundle" )?.outcome)
233+
234+ assertTrue { projectDir.root.resolve(" build/classes/kotlin/js/main/new-mpp.js" ).isFile }
235+ assertTrue { projectDir.root.resolve(" build/bundle/main.bundle.js" ).isFile }
236+ }
237+ }
0 commit comments