Compare JS output files against file instead of hardcoded set
A difference is not obvious when two sets are compared: there might be just one different element, but sets would be printed in one line in iteration order (which is non-fixed for hashsets). Also the properties: EXPECTED_JS_FILES_IN_OUTPUT_FOR_STDLIB_ONLY, EXPECTED_JS_FILES_IN_OUTPUT_FOR_MODULE_STDLIB_ONLY, EXPECTED_JS_FILES_IN_OUTPUT_NO_COPY, EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_DEFAULT_DIR, EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_CUSTOM_DIR are hard to distinguish in code and are not convenient to edit.
This commit is contained in:
@@ -67,6 +67,7 @@ import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import org.jetbrains.kotlin.test.MockLibraryUtil
|
||||
import org.jetbrains.kotlin.utils.PathUtil
|
||||
import org.jetbrains.kotlin.utils.Printer
|
||||
import org.jetbrains.org.objectweb.asm.ClassReader
|
||||
import org.jetbrains.org.objectweb.asm.ClassVisitor
|
||||
import org.jetbrains.org.objectweb.asm.MethodVisitor
|
||||
@@ -77,8 +78,8 @@ import java.io.FileNotFoundException
|
||||
import java.io.FileOutputStream
|
||||
import java.io.IOException
|
||||
import java.net.URLClassLoader
|
||||
import java.nio.file.Paths
|
||||
import java.util.*
|
||||
import java.util.regex.Pattern
|
||||
import java.util.zip.ZipOutputStream
|
||||
|
||||
open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
@@ -92,51 +93,6 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
private val KOTLIN_JS_LIBRARY = "jslib-example"
|
||||
private val PATH_TO_KOTLIN_JS_LIBRARY = AbstractKotlinJpsBuildTestCase.TEST_DATA_PATH + "general/KotlinJavaScriptProjectWithDirectoryAsLibrary/" + KOTLIN_JS_LIBRARY
|
||||
private val KOTLIN_JS_LIBRARY_JAR = "$KOTLIN_JS_LIBRARY.jar"
|
||||
private val STDLIB_JS_FILES = hashSetOf(
|
||||
"lib/kotlin.js",
|
||||
"lib/kotlin.meta.js",
|
||||
"lib/kotlin-experimental.js",
|
||||
"lib/kotlin-experimental.meta.js"
|
||||
)
|
||||
private val EXPECTED_JS_FILES_IN_OUTPUT_FOR_STDLIB_ONLY = hashSetOf(
|
||||
"$PROJECT_NAME.js",
|
||||
"$PROJECT_NAME.meta.js",
|
||||
"$PROJECT_NAME/root-package.kjsm"
|
||||
) + STDLIB_JS_FILES
|
||||
private val EXPECTED_JS_FILES_IN_OUTPUT_FOR_MODULE_STDLIB_ONLY = hashSetOf(
|
||||
"$ADDITIONAL_MODULE_NAME.js",
|
||||
"$ADDITIONAL_MODULE_NAME.meta.js",
|
||||
"$ADDITIONAL_MODULE_NAME/module2/module2.kjsm"
|
||||
) + STDLIB_JS_FILES
|
||||
private val EXPECTED_JS_FILES_IN_OUTPUT_NO_COPY = hashSetOf(
|
||||
"$PROJECT_NAME.js",
|
||||
"$PROJECT_NAME.meta.js",
|
||||
"$PROJECT_NAME/root-package.kjsm"
|
||||
)
|
||||
private val EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_DEFAULT_DIR = hashSetOf(
|
||||
"$PROJECT_NAME.js",
|
||||
"$PROJECT_NAME.meta.js",
|
||||
"lib/jslib-example.js",
|
||||
"lib/jslib-example.meta.js",
|
||||
"lib/file0.js",
|
||||
"lib/dir/file1.js",
|
||||
"lib/META-INF-ex/file2.js",
|
||||
"lib/res0.js",
|
||||
"lib/resdir/res1.js",
|
||||
"$PROJECT_NAME/root-package.kjsm"
|
||||
) + STDLIB_JS_FILES
|
||||
private val EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_CUSTOM_DIR = hashSetOf(
|
||||
"$PROJECT_NAME.js",
|
||||
"$PROJECT_NAME.meta.js",
|
||||
"custom/jslib-example.js",
|
||||
"custom/jslib-example.meta.js",
|
||||
"custom/file0.js",
|
||||
"custom/dir/file1.js",
|
||||
"custom/META-INF-ex/file2.js",
|
||||
"custom/res0.js",
|
||||
"custom/resdir/res1.js",
|
||||
"$PROJECT_NAME/root-package.kjsm"
|
||||
) + STDLIB_JS_FILES.map { it.replace("lib", "custom") }
|
||||
|
||||
private fun k2jsOutput(vararg moduleNames: String): Array<String> {
|
||||
val list = arrayListOf<String>()
|
||||
@@ -217,12 +173,17 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
JS_STDLIB,
|
||||
}
|
||||
|
||||
protected lateinit var originalProjectDir: File
|
||||
private val expectedOutputFile: File
|
||||
get() = File(originalProjectDir, "expected-output.txt")
|
||||
|
||||
override fun setUp() {
|
||||
super.setUp()
|
||||
val currentTestMethod = this::class.members.firstOrNull { it.name == "test" + getTestName(false) }
|
||||
val workingDirFromAnnotation = currentTestMethod?.annotations?.filterIsInstance<WorkingDir>()?.firstOrNull()?.name
|
||||
val sourceFilesRoot = File(AbstractKotlinJpsBuildTestCase.TEST_DATA_PATH + "general/" + (workingDirFromAnnotation ?: getTestName(false)))
|
||||
workDir = AbstractKotlinJpsBuildTestCase.copyTestDataToTmpDir(sourceFilesRoot)
|
||||
val projDirPath = Paths.get(TEST_DATA_PATH, "general", workingDirFromAnnotation ?: getTestName(false))
|
||||
originalProjectDir = projDirPath.toFile()
|
||||
workDir = AbstractKotlinJpsBuildTestCase.copyTestDataToTmpDir(originalProjectDir)
|
||||
orCreateProjectDir
|
||||
|
||||
JpsUtils.resetCaches()
|
||||
@@ -292,7 +253,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
initProject(JS_STDLIB)
|
||||
buildAllModules().assertSuccessful()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_FOR_STDLIB_ONLY, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
}
|
||||
|
||||
@@ -324,9 +285,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
initProject(JS_STDLIB)
|
||||
buildAllModules().assertSuccessful()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_FOR_STDLIB_ONLY, contentOfOutputDir(PROJECT_NAME))
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_FOR_MODULE_STDLIB_ONLY, contentOfOutputDir(ADDITIONAL_MODULE_NAME))
|
||||
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
checkWhen(touch("module2/src/module2.kt"), null, k2jsOutput(ADDITIONAL_MODULE_NAME))
|
||||
checkWhen(arrayOf(touch("src/test1.kt"), touch("module2/src/module2.kt")), null, k2jsOutput(PROJECT_NAME, ADDITIONAL_MODULE_NAME))
|
||||
@@ -355,7 +314,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
addDependency("KotlinJavaScript", jslibDir)
|
||||
buildAllModules().assertSuccessful()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_FOR_STDLIB_ONLY, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
}
|
||||
|
||||
@@ -364,28 +323,28 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
addDependency(KOTLIN_JS_LIBRARY, File(workDir, KOTLIN_JS_LIBRARY))
|
||||
buildAllModules().assertSuccessful()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_DEFAULT_DIR, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
}
|
||||
|
||||
fun testKotlinJavaScriptProjectWithLibrary() {
|
||||
doTestWithKotlinJavaScriptLibrary()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_DEFAULT_DIR, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
}
|
||||
|
||||
fun testKotlinJavaScriptProjectWithLibraryCustomOutputDir() {
|
||||
doTestWithKotlinJavaScriptLibrary()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_WITH_ADDITIONAL_LIB_AND_CUSTOM_DIR, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
}
|
||||
|
||||
fun testKotlinJavaScriptProjectWithLibraryNoCopy() {
|
||||
doTestWithKotlinJavaScriptLibrary()
|
||||
|
||||
assertEquals(EXPECTED_JS_FILES_IN_OUTPUT_NO_COPY, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME))
|
||||
}
|
||||
|
||||
@@ -395,7 +354,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
addDependency(KOTLIN_JS_LIBRARY, File(workDir, KOTLIN_JS_LIBRARY_JAR))
|
||||
buildAllModules().assertFailed()
|
||||
|
||||
assertEquals(Collections.EMPTY_SET, contentOfOutputDir(PROJECT_NAME))
|
||||
checkOutputFilesList()
|
||||
}
|
||||
|
||||
fun testKotlinJavaScriptProjectWithEmptyDependencies() {
|
||||
@@ -722,19 +681,41 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() {
|
||||
|
||||
}
|
||||
|
||||
private fun contentOfOutputDir(moduleName: String): Set<String> {
|
||||
val baseDir = getOutputDir(moduleName)
|
||||
val files = FileUtil.findFilesByMask(Pattern.compile(".*"), baseDir)
|
||||
val result = HashSet<String>()
|
||||
for (file in files) {
|
||||
val relativePath = FileUtil.getRelativePath(baseDir, file)
|
||||
assert(relativePath != null) { "relativePath should not be null" }
|
||||
result.add(toSystemIndependentName(relativePath!!))
|
||||
private fun checkOutputFilesList() {
|
||||
if (!expectedOutputFile.exists()) {
|
||||
expectedOutputFile.writeText("")
|
||||
throw IllegalStateException("$expectedOutputFile did not exist. Created empty file.")
|
||||
}
|
||||
return result
|
||||
|
||||
val sb = StringBuilder()
|
||||
val p = Printer(sb, " ")
|
||||
productionOutputDir.printFilesRecursively(p)
|
||||
|
||||
UsefulTestCase.assertSameLinesWithFile(expectedOutputFile.canonicalPath, sb.toString(), true)
|
||||
}
|
||||
|
||||
private fun getOutputDir(moduleName: String): File = File(workDir, "out/production/$moduleName")
|
||||
private fun File.printFilesRecursively(p: Printer) {
|
||||
val files = listFiles() ?: return
|
||||
|
||||
for (file in files.sortedBy { it.name }) {
|
||||
when {
|
||||
file.isFile -> {
|
||||
p.println(file.name)
|
||||
}
|
||||
file.isDirectory -> {
|
||||
p.println(file.name + "/")
|
||||
p.pushIndent()
|
||||
file.printFilesRecursively(p)
|
||||
p.popIndent()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private val productionOutputDir
|
||||
get() = File(workDir, "out/production")
|
||||
|
||||
private fun getOutputDir(moduleName: String): File = File(productionOutputDir, moduleName)
|
||||
|
||||
fun testReexportedDependency() {
|
||||
initProject()
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
kotlinProject/
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
lib/
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
Vendored
+20
@@ -0,0 +1,20 @@
|
||||
kotlinProject/
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
lib/
|
||||
META-INF-ex/
|
||||
file2.js
|
||||
dir/
|
||||
file1.js
|
||||
file0.js
|
||||
jslib-example.js
|
||||
jslib-example.meta.js
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
res0.js
|
||||
resdir/
|
||||
res1.js
|
||||
Vendored
+10
@@ -0,0 +1,10 @@
|
||||
kotlinProject/
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
lib/
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
kotlinProject/
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
lib/
|
||||
META-INF-ex/
|
||||
file2.js
|
||||
dir/
|
||||
file1.js
|
||||
file0.js
|
||||
jslib-example.js
|
||||
jslib-example.meta.js
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
res0.js
|
||||
resdir/
|
||||
res1.js
|
||||
Vendored
Vendored
+20
@@ -0,0 +1,20 @@
|
||||
kotlinProject/
|
||||
custom/
|
||||
META-INF-ex/
|
||||
file2.js
|
||||
dir/
|
||||
file1.js
|
||||
file0.js
|
||||
jslib-example.js
|
||||
jslib-example.meta.js
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
res0.js
|
||||
resdir/
|
||||
res1.js
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
kotlinProject/
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
kotlinProject/
|
||||
kotlinProject/
|
||||
root-package.kjsm
|
||||
kotlinProject.js
|
||||
kotlinProject.meta.js
|
||||
lib/
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
module2/
|
||||
lib/
|
||||
kotlin-experimental.js
|
||||
kotlin-experimental.meta.js
|
||||
kotlin.js
|
||||
kotlin.meta.js
|
||||
module2/
|
||||
module2/
|
||||
module2.kjsm
|
||||
module2.js
|
||||
module2.meta.js
|
||||
Reference in New Issue
Block a user