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:
Alexey Tsvetkov
2018-02-21 21:54:22 +03:00
parent 9fdd34ce6e
commit 7881a305d9
9 changed files with 155 additions and 68 deletions
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,5 @@
kotlinProject/
kotlinProject/
root-package.kjsm
kotlinProject.js
kotlinProject.meta.js
@@ -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