Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 168a0ae

Browse files
committedMay 8, 2021
Add AllLibrariesTest, refactor REPL tests
1 parent bc18179 commit 168a0ae

11 files changed

+472
-354
lines changed
 

‎build.gradle.kts

+20
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ dependencies {
126126
// Test dependencies: kotlin-test and Junit 5
127127
testImplementation(kotlin("test"))
128128
testImplementation("org.junit.jupiter:junit-jupiter-api:$junitVersion")
129+
testImplementation("org.junit.jupiter:junit-jupiter-params:$junitVersion")
129130
testImplementation("io.kotlintest:kotlintest-assertions:3.1.6")
130131

131132
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$junitVersion")
@@ -196,6 +197,25 @@ tasks.processResources {
196197
dependsOn(tasks.buildProperties)
197198
}
198199

200+
val createTestResources: Task by tasks.creating {
201+
val jupyterApiVersion: String by project
202+
203+
inputs.property("jupyterApiVersion", jupyterApiVersion)
204+
205+
val outputDir = file(project.buildDir.toPath().resolve("resources").resolve("test"))
206+
outputs.dir(outputDir)
207+
208+
doLast {
209+
outputDir.mkdirs()
210+
val propertiesFile = outputDir.resolve("PUBLISHED_JUPYTER_API_VERSION")
211+
propertiesFile.writeText(jupyterApiVersion)
212+
}
213+
}
214+
215+
tasks.processTestResources {
216+
dependsOn(createTestResources)
217+
}
218+
199219
tasks.check {
200220
if (!getFlag("skipReadmeCheck", false)) {
201221
dependsOn(tasks.checkReadme)

‎src/test/kotlin/org/jetbrains/kotlinx/jupyter/test/ApiTest.kt

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
package org.jetbrains.kotlinx.jupyter.test
22

33
import org.jetbrains.kotlinx.jupyter.EvalResult
4-
import org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl
54
import org.jetbrains.kotlinx.jupyter.repl.impl.getSimpleCompiler
6-
import org.jetbrains.kotlinx.jupyter.test.repl.AbstractReplTest
5+
import org.jetbrains.kotlinx.jupyter.test.repl.AbstractSingleReplTest
76
import org.junit.jupiter.api.Test
87
import kotlin.script.experimental.api.ScriptCompilationConfiguration
98
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
109
import kotlin.test.assertEquals
1110
import kotlin.test.assertTrue
1211

13-
class ApiTest : AbstractReplTest() {
14-
private val repl = ReplForJupyterImpl(resolutionInfoProvider, classpath)
12+
class ApiTest : AbstractSingleReplTest() {
13+
override val repl = makeSimpleRepl()
1514

1615
private fun jEval(jupyterId: Int, code: String): EvalResult {
1716
return repl.eval(code, jupyterId = jupyterId)

‎src/test/kotlin/org/jetbrains/kotlinx/jupyter/test/embeddingTest.kt

+11-16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.jetbrains.kotlinx.jupyter.test
22

3-
import org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl
43
import org.jetbrains.kotlinx.jupyter.api.MimeTypedResult
54
import org.jetbrains.kotlinx.jupyter.api.ResultHandlerCodeExecution
65
import org.jetbrains.kotlinx.jupyter.api.SubtypeRendererTypeHandler
@@ -11,9 +10,8 @@ import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceLocation
1110
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourcePathType
1211
import org.jetbrains.kotlinx.jupyter.api.libraries.ResourceType
1312
import org.jetbrains.kotlinx.jupyter.execute
14-
import org.jetbrains.kotlinx.jupyter.test.repl.AbstractReplTest
13+
import org.jetbrains.kotlinx.jupyter.test.repl.AbstractSingleReplTest
1514
import org.junit.jupiter.api.Test
16-
import java.io.File
1715
import kotlin.test.assertEquals
1816
import kotlin.test.assertTrue
1917

@@ -87,29 +85,26 @@ val testLibraryDefinition2 = LibraryDefinitionImpl(
8785
)
8886
)
8987

90-
class EmbedReplTest : AbstractReplTest() {
91-
private val repl = run {
92-
val embeddedClasspath: List<File> = System.getProperty("java.class.path").split(File.pathSeparator).map(::File)
93-
ReplForJupyterImpl(resolutionInfoProvider, embeddedClasspath, isEmbedded = true)
94-
}
88+
class EmbedReplTest : AbstractSingleReplTest() {
89+
override val repl = makeEmbeddedRepl()
9590

9691
@Test
9792
fun testSharedStaticVariables() {
98-
var res = repl.eval("org.jetbrains.kotlinx.jupyter.test.SomeSingleton.initialized")
93+
var res = eval("org.jetbrains.kotlinx.jupyter.test.SomeSingleton.initialized")
9994
assertEquals(false, res.resultValue)
10095

10196
SomeSingleton.initialized = true
10297

103-
res = repl.eval("org.jetbrains.kotlinx.jupyter.test.SomeSingleton.initialized")
98+
res = eval("org.jetbrains.kotlinx.jupyter.test.SomeSingleton.initialized")
10499
assertEquals(true, res.resultValue)
105100
}
106101

107102
@Test
108103
fun testCustomClasses() {
109-
repl.eval("class Point(val x: Int, val y: Int)")
110-
repl.eval("val p = Point(1,1)")
104+
eval("class Point(val x: Int, val y: Int)")
105+
eval("val p = Point(1,1)")
111106

112-
val res = repl.eval("p.x")
107+
val res = eval("p.x")
113108
assertEquals(1, res.resultValue)
114109
}
115110

@@ -118,9 +113,9 @@ class EmbedReplTest : AbstractReplTest() {
118113
repl.execute {
119114
addLibrary(testLibraryDefinition1)
120115
}
121-
val result1 = repl.eval("org.jetbrains.kotlinx.jupyter.test.TestSum(5, 8)")
116+
val result1 = eval("org.jetbrains.kotlinx.jupyter.test.TestSum(5, 8)")
122117
assertEquals(13, result1.resultValue)
123-
val result2 = repl.eval(
118+
val result2 = eval(
124119
"""
125120
import org.jetbrains.kotlinx.jupyter.test.TestFunList
126121
TestFunList(12, TestFunList(13, TestFunList(14, null)))
@@ -132,7 +127,7 @@ class EmbedReplTest : AbstractReplTest() {
132127
@Test
133128
fun testJsResources() {
134129
val displayHandler = TestDisplayHandler()
135-
val res = repl.eval(
130+
val res = eval(
136131
"USE(org.jetbrains.kotlinx.jupyter.test.testLibraryDefinition2)",
137132
displayHandler
138133
)

‎src/test/kotlin/org/jetbrains/kotlinx/jupyter/test/repl/AbstractReplTest.kt

+27
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,18 @@ package org.jetbrains.kotlinx.jupyter.test.repl
22

33
import kotlinx.coroutines.runBlocking
44
import org.jetbrains.kotlinx.jupyter.ReplForJupyter
5+
import org.jetbrains.kotlinx.jupyter.ReplForJupyterImpl
6+
import org.jetbrains.kotlinx.jupyter.dependencies.ResolverConfig
57
import org.jetbrains.kotlinx.jupyter.libraries.EmptyResolutionInfoProvider
8+
import org.jetbrains.kotlinx.jupyter.libraries.LibrariesDir
9+
import org.jetbrains.kotlinx.jupyter.libraries.ResolutionInfoProvider
10+
import org.jetbrains.kotlinx.jupyter.libraries.getStandardResolver
611
import org.jetbrains.kotlinx.jupyter.repl.CompletionResult
712
import org.jetbrains.kotlinx.jupyter.repl.ListErrorsResult
813
import org.jetbrains.kotlinx.jupyter.test.classpath
14+
import org.jetbrains.kotlinx.jupyter.test.standardResolverRuntimeProperties
15+
import org.jetbrains.kotlinx.jupyter.test.testRepositories
16+
import org.jetbrains.kotlinx.jupyter.test.testResolverConfig
917
import java.io.File
1018

1119
abstract class AbstractReplTest {
@@ -31,6 +39,25 @@ abstract class AbstractReplTest {
3139
}
3240
}
3341

42+
protected fun makeSimpleRepl(): ReplForJupyter {
43+
return ReplForJupyterImpl(resolutionInfoProvider, classpath)
44+
}
45+
46+
protected fun makeReplWithTestResolver(): ReplForJupyter {
47+
return ReplForJupyterImpl(resolutionInfoProvider, classpath, homeDir, testResolverConfig)
48+
}
49+
50+
protected fun makeReplWithStandardResolver(): ReplForJupyter {
51+
val standardResolutionInfoProvider = ResolutionInfoProvider.withDefaultDirectoryResolution(homeDir.resolve(LibrariesDir))
52+
val config = ResolverConfig(testRepositories, getStandardResolver(".", standardResolutionInfoProvider))
53+
return ReplForJupyterImpl(standardResolutionInfoProvider, classpath, homeDir, config, standardResolverRuntimeProperties)
54+
}
55+
56+
protected fun makeEmbeddedRepl(): ReplForJupyter {
57+
val embeddedClasspath: List<File> = System.getProperty("java.class.path").split(File.pathSeparator).map(::File)
58+
return ReplForJupyterImpl(resolutionInfoProvider, embeddedClasspath, isEmbedded = true)
59+
}
60+
3461
companion object {
3562
@JvmStatic
3663
val resolutionInfoProvider = EmptyResolutionInfoProvider
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.jetbrains.kotlinx.jupyter.test.repl
2+
3+
import org.jetbrains.kotlinx.jupyter.DisplayHandler
4+
import org.jetbrains.kotlinx.jupyter.ReplForJupyter
5+
import org.jetbrains.kotlinx.jupyter.api.Code
6+
7+
abstract class AbstractSingleReplTest : AbstractReplTest() {
8+
protected abstract val repl: ReplForJupyter
9+
10+
protected fun eval(code: Code, displayHandler: DisplayHandler? = null, jupyterId: Int = -1) =
11+
repl.eval(code, displayHandler, jupyterId)
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package org.jetbrains.kotlinx.jupyter.test.repl
2+
3+
import org.jetbrains.kotlinx.jupyter.libraries.LibrariesDir
4+
import org.jetbrains.kotlinx.jupyter.libraries.LibraryDescriptorExt
5+
import org.junit.jupiter.api.Disabled
6+
import org.junit.jupiter.api.parallel.Execution
7+
import org.junit.jupiter.api.parallel.ExecutionMode
8+
import org.junit.jupiter.params.ParameterizedTest
9+
import org.junit.jupiter.params.ParameterizedTest.ARGUMENTS_PLACEHOLDER
10+
import org.junit.jupiter.params.provider.MethodSource
11+
import java.nio.file.Files
12+
import java.util.stream.Stream
13+
import kotlin.io.path.Path
14+
import kotlin.io.path.extension
15+
import kotlin.io.path.nameWithoutExtension
16+
17+
/**
18+
* Run this test if you wish to check that all libraries
19+
* are resolved successfully
20+
*/
21+
@Execution(ExecutionMode.SAME_THREAD)
22+
@Disabled
23+
class AllLibrariesTest : AbstractSingleReplTest() {
24+
override val repl = makeReplWithStandardResolver()
25+
26+
@ParameterizedTest(name = ARGUMENTS_PLACEHOLDER)
27+
@MethodSource("libraryNames")
28+
fun testLibrary(libraryName: String) {
29+
if (libraryName in disabled) {
30+
println("Library '$libraryName' is skipped")
31+
return
32+
}
33+
val args = arguments[libraryName]?.invoke()?.let { "($it)" }.orEmpty()
34+
eval("%use $libraryName$args")
35+
36+
additionalTests[libraryName]?.invoke(this)
37+
}
38+
39+
companion object {
40+
private val disabled: Set<String> = setOf(
41+
// a lot of heavy dependencies
42+
// "deeplearning4j",
43+
// a lot of heavy dependencies
44+
// "deeplearning4j-cuda",
45+
// we already have a corresponding test
46+
// "dataframe",
47+
// may lead to OOM
48+
// "spark",
49+
)
50+
51+
private val arguments: Map<String, () -> String> = mapOf(
52+
"lib-ext" to { getResourceText("PUBLISHED_JUPYTER_API_VERSION") }
53+
)
54+
55+
private val additionalTests: Map<String, AllLibrariesTest.() -> Unit> = mapOf()
56+
57+
@JvmStatic
58+
fun libraryNames(): Stream<String> {
59+
return Files.walk(Path(LibrariesDir), 1)
60+
.filter { it.extension == LibraryDescriptorExt }
61+
.map { it.nameWithoutExtension }
62+
}
63+
64+
@Suppress("SameParameterValue")
65+
private fun getResourceText(name: String): String {
66+
val clazz = AllLibrariesTest::class.java
67+
val resource = clazz.classLoader.getResource(name) ?: return ""
68+
return resource.readText()
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)