diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index 459fabb6bf4..e64d0cd9af3 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -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 { val list = arrayListOf() @@ -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()?.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 { - val baseDir = getOutputDir(moduleName) - val files = FileUtil.findFilesByMask(Pattern.compile(".*"), baseDir) - val result = HashSet() - 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() diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProject/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProject/expected-output.txt new file mode 100644 index 00000000000..8c9f16fe97e --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProject/expected-output.txt @@ -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 \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithDirectoryAsLibrary/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithDirectoryAsLibrary/expected-output.txt new file mode 100644 index 00000000000..c7d9de318a3 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithDirectoryAsLibrary/expected-output.txt @@ -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 \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithDirectoryAsStdlib/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithDirectoryAsStdlib/expected-output.txt new file mode 100644 index 00000000000..8c9f16fe97e --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithDirectoryAsStdlib/expected-output.txt @@ -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 \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibrary/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibrary/expected-output.txt new file mode 100644 index 00000000000..c7d9de318a3 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibrary/expected-output.txt @@ -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 \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryAndErrors/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryAndErrors/expected-output.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryCustomOutputDir/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryCustomOutputDir/expected-output.txt new file mode 100644 index 00000000000..9fad8b490fd --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryCustomOutputDir/expected-output.txt @@ -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 \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryNoCopy/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryNoCopy/expected-output.txt new file mode 100644 index 00000000000..cb855b4fc58 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithLibraryNoCopy/expected-output.txt @@ -0,0 +1,5 @@ +kotlinProject/ + kotlinProject/ + root-package.kjsm + kotlinProject.js + kotlinProject.meta.js \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithTwoModules/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithTwoModules/expected-output.txt new file mode 100644 index 00000000000..132d5fc6e80 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithTwoModules/expected-output.txt @@ -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 \ No newline at end of file