test(module): add import resolution tests
This commit is contained in:
1 parent
e4ee9baa36
commit
de6ee84b47
1 file changed
+65
@@ -0,0 +1,65 @@
|
||||
package lumen
|
||||
|
||||
import java.io.File
|
||||
import kotlin.io.path.createTempDirectory
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
class ImportTest {
|
||||
private fun runModules(files: Map<String, String>, main: String): String {
|
||||
val dir = createTempDirectory("lumen-import").toFile()
|
||||
try {
|
||||
for ((name, source) in files) {
|
||||
val file = File(dir, name)
|
||||
file.parentFile.mkdirs()
|
||||
file.writeText(source)
|
||||
}
|
||||
val buffer = StringBuilder()
|
||||
Lumen.runFile(File(dir, main), buffer)
|
||||
return buffer.toString()
|
||||
} finally {
|
||||
dir.deleteRecursively()
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun importBringsDefinitionsIntoScope() {
|
||||
val output = runModules(
|
||||
mapOf(
|
||||
"lib/util.lumen" to "fn double(x) { return x * 2 }\nlet unit = 1",
|
||||
"main.lumen" to "import \"lib/util.lumen\"\nprintln(double(21))\nprintln(unit)"
|
||||
),
|
||||
"main.lumen"
|
||||
)
|
||||
assertEquals("42\n1\n", output)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun diamondImportLoadsSharedModuleOnce() {
|
||||
val output = runModules(
|
||||
mapOf(
|
||||
"base.lumen" to "println(\"loading base\")\nfn origin() { return \"base\" }",
|
||||
"left.lumen" to "import \"base.lumen\"\nfn left() { return origin() }",
|
||||
"right.lumen" to "import \"base.lumen\"\nfn right() { return origin() }",
|
||||
"main.lumen" to "import \"left.lumen\"\nimport \"right.lumen\"\nprintln(left() + right())"
|
||||
),
|
||||
"main.lumen"
|
||||
)
|
||||
val baseLoads = output.split("\n").count { it == "loading base" }
|
||||
assertEquals(1, baseLoads, "shared module must run exactly once")
|
||||
assertEquals("loading base\nbasebase\n", output)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun mutualImportsDoNotLoopForever() {
|
||||
val output = runModules(
|
||||
mapOf(
|
||||
"a.lumen" to "import \"b.lumen\"\nfn fromA() { return \"A\" }",
|
||||
"b.lumen" to "import \"a.lumen\"\nfn fromB() { return \"B\" }",
|
||||
"main.lumen" to "import \"a.lumen\"\nprintln(fromA() + fromB())"
|
||||
),
|
||||
"main.lumen"
|
||||
)
|
||||
assertEquals("AB\n", output)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user