IC: add tests with moving files
Additionally added the ability to use directories in IC tests. #KT-8002 Obsolete
This commit is contained in:
+38
-17
@@ -35,7 +35,22 @@ fun copyTestSources(testDataDir: File, sourceDestinationDir: File, filePrefix: S
|
||||
it.isDirectory || it.name.startsWith(filePrefix) && (it.name.endsWith(".kt") || it.name.endsWith(".java"))
|
||||
}
|
||||
|
||||
sourceDestinationDir.walk().forEach { mapping[it] = File(testDataDir, filePrefix + it.name) }
|
||||
for (file in sourceDestinationDir.walk()) {
|
||||
if (!file.isFile) continue
|
||||
|
||||
val renamedFile =
|
||||
if (filePrefix.isEmpty()) {
|
||||
file
|
||||
}
|
||||
else {
|
||||
File(sourceDestinationDir, file.name.removePrefix(filePrefix)).apply {
|
||||
file.renameTo(this)
|
||||
}
|
||||
}
|
||||
|
||||
mapping[renamedFile] = File(testDataDir, file.name)
|
||||
}
|
||||
|
||||
return mapping
|
||||
}
|
||||
|
||||
@@ -48,7 +63,7 @@ fun getModificationsToPerform(
|
||||
|
||||
fun getModificationsForIteration(newSuffix: String, touchSuffix: String, deleteSuffix: String): List<Modification> {
|
||||
|
||||
fun getDirPrefix(fileName: String): String {
|
||||
fun splitToModuleNameAndFileName(fileName: String): Pair<String?, String> {
|
||||
val underscore = fileName.indexOf("_")
|
||||
|
||||
if (underscore != -1) {
|
||||
@@ -57,32 +72,38 @@ fun getModificationsToPerform(
|
||||
assert(moduleNames != null) { "File name has module prefix, but multi-module environment is absent" }
|
||||
assert(module in moduleNames!!) { "Module not found for file with prefix: $fileName" }
|
||||
|
||||
return "$module/src"
|
||||
return Pair(module, fileName.substring(underscore + 1))
|
||||
}
|
||||
|
||||
assert(moduleNames == null) { "Test is multi-module, but file has no module prefix: $fileName" }
|
||||
return "src"
|
||||
return Pair(null, fileName)
|
||||
}
|
||||
|
||||
val rules = mapOf<String, (String, File) -> Modification>(
|
||||
newSuffix to { path, file -> ModifyContent(path, file) },
|
||||
touchSuffix to { path, file -> TouchFile(path, touchPolicy) },
|
||||
deleteSuffix to { path, file -> DeleteFile(path) }
|
||||
)
|
||||
|
||||
val modifications = ArrayList<Modification>()
|
||||
for (file in testDataDir.listFiles()!!) {
|
||||
val fileName = file.name
|
||||
|
||||
if (fileName.endsWith(newSuffix)) {
|
||||
modifications.add(ModifyContent(getDirPrefix(fileName) + "/" + fileName.removeSuffix(newSuffix), file))
|
||||
}
|
||||
if (fileName.endsWith(touchSuffix)) {
|
||||
modifications.add(TouchFile(getDirPrefix(fileName) + "/" + fileName.removeSuffix(touchSuffix), touchPolicy))
|
||||
}
|
||||
if (fileName.endsWith(deleteSuffix)) {
|
||||
modifications.add(DeleteFile(getDirPrefix(fileName) + "/" + fileName.removeSuffix(deleteSuffix)))
|
||||
}
|
||||
for (file in testDataDir.walkTopDown()) {
|
||||
if (!file.isFile) continue
|
||||
|
||||
val relativeFilePath = file.toRelativeString(testDataDir)
|
||||
|
||||
val (suffix, createModification) = rules.entries.firstOrNull { file.path.endsWith(it.key) } ?: continue
|
||||
|
||||
val (moduleName, fileName) = splitToModuleNameAndFileName(relativeFilePath)
|
||||
val srcDir = moduleName?.let { "$it/src" } ?: "src"
|
||||
modifications.add(createModification(srcDir + "/" + fileName.removeSuffix(suffix), file))
|
||||
}
|
||||
|
||||
return modifications
|
||||
}
|
||||
|
||||
val haveFilesWithoutNumbers = testDataDir.listFiles { it -> it.name.matches(".+\\.(${COMMANDS_AS_REGEX_PART})$".toRegex()) }?.isNotEmpty() ?: false
|
||||
val haveFilesWithNumbers = testDataDir.listFiles { it -> it.name.matches(".+\\.(${COMMANDS_AS_REGEX_PART})\\.\\d+$".toRegex()) }?.isNotEmpty() ?: false
|
||||
val haveFilesWithoutNumbers = testDataDir.walkTopDown().any { it.name.matches(".+\\.($COMMANDS_AS_REGEX_PART)$".toRegex()) }
|
||||
val haveFilesWithNumbers = testDataDir.walkTopDown().any { it.name.matches(".+\\.($COMMANDS_AS_REGEX_PART)\\.\\d+$".toRegex()) }
|
||||
|
||||
if (haveFilesWithoutNumbers && haveFilesWithNumbers) {
|
||||
throw IllegalStateException("Bad test data format: files ending with both unnumbered and numbered ${COMMANDS_AS_MESSAGE_PART} were found")
|
||||
|
||||
@@ -913,7 +913,7 @@ fun main(args: Array<String>) {
|
||||
testGroup("jps-plugin/test", "jps-plugin/testData") {
|
||||
testClass<AbstractIncrementalJpsTest>() {
|
||||
model("incremental/multiModule", extension = null, excludeParentDirs = true)
|
||||
model("incremental/pureKotlin", extension = null, excludeParentDirs = true)
|
||||
model("incremental/pureKotlin", extension = null, recursive = false)
|
||||
model("incremental/withJava", extension = null, excludeParentDirs = true)
|
||||
model("incremental/inlineFunCallSite", extension = null, excludeParentDirs = true)
|
||||
}
|
||||
@@ -933,7 +933,7 @@ fun main(args: Array<String>) {
|
||||
testGroup("jps-plugin/test", "jps-plugin/testData") {
|
||||
testClass<AbstractExperimentalIncrementalJpsTest>() {
|
||||
model("incremental/multiModule", extension = null, excludeParentDirs = true)
|
||||
model("incremental/pureKotlin", extension = null, excludeParentDirs = true)
|
||||
model("incremental/pureKotlin", extension = null, recursive = false)
|
||||
model("incremental/withJava", extension = null, excludeParentDirs = true)
|
||||
model("incremental/inlineFunCallSite", extension = null, excludeParentDirs = true)
|
||||
model("incremental/classHierarchyAffected", extension = null, excludeParentDirs = true)
|
||||
|
||||
+19
-2
@@ -103,6 +103,12 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveFileToAnotherModule")
|
||||
public void testMoveFileToAnotherModule() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/moveFileToAnotherModule/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("simpleDependency")
|
||||
public void testSimpleDependency() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/simpleDependency/");
|
||||
@@ -176,7 +182,7 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInPureKotlin() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/pureKotlin"), Pattern.compile("^([^\\.]+)$"), true);
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/pureKotlin"), Pattern.compile("^([^\\.]+)$"), false);
|
||||
}
|
||||
|
||||
@TestMetadata("annotations")
|
||||
@@ -485,6 +491,18 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveFileWithChangingPackage")
|
||||
public void testMoveFileWithChangingPackage() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveFileWithChangingPackage/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveFileWithoutChangingPackage")
|
||||
public void testMoveFileWithoutChangingPackage() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveFileWithoutChangingPackage/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("multifileClassFileAdded")
|
||||
public void testMultifileClassFileAdded() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/");
|
||||
@@ -784,7 +802,6 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/valRemoveCustomAccessor/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("jps-plugin/testData/incremental/withJava")
|
||||
|
||||
@@ -103,6 +103,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveFileToAnotherModule")
|
||||
public void testMoveFileToAnotherModule() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/moveFileToAnotherModule/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("simpleDependency")
|
||||
public void testSimpleDependency() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/simpleDependency/");
|
||||
@@ -176,7 +182,7 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
|
||||
}
|
||||
|
||||
public void testAllFilesPresentInPureKotlin() throws Exception {
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/pureKotlin"), Pattern.compile("^([^\\.]+)$"), true);
|
||||
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/incremental/pureKotlin"), Pattern.compile("^([^\\.]+)$"), false);
|
||||
}
|
||||
|
||||
@TestMetadata("annotations")
|
||||
@@ -485,6 +491,18 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveFileWithChangingPackage")
|
||||
public void testMoveFileWithChangingPackage() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveFileWithChangingPackage/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("moveFileWithoutChangingPackage")
|
||||
public void testMoveFileWithoutChangingPackage() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/moveFileWithoutChangingPackage/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("multifileClassFileAdded")
|
||||
public void testMultifileClassFileAdded() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/multifileClassFileAdded/");
|
||||
@@ -784,7 +802,6 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/pureKotlin/valRemoveCustomAccessor/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("jps-plugin/testData/incremental/withJava")
|
||||
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
================ Step #1 =================
|
||||
|
||||
Compiling files:
|
||||
module1/src/b.kt
|
||||
End of files
|
||||
Exit code: ADDITIONAL_PASS_REQUIRED
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module1/META-INF/module1.kotlin_module
|
||||
out/production/module1/a/A.class
|
||||
out/production/module1/a/AKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
module1/src/a.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module2/META-INF/module2.kotlin_module
|
||||
out/production/module2/b/B.class
|
||||
out/production/module2/b/BKt.class
|
||||
End of files
|
||||
Cleaning output files:
|
||||
out/production/module2/usage/UseClassBKt.class
|
||||
out/production/module2/usage/UseFunBKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
module2/src/useClassB.kt
|
||||
module2/src/useFunB.kt
|
||||
End of files
|
||||
Exit code: ADDITIONAL_PASS_REQUIRED
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module2/META-INF/module2.kotlin_module
|
||||
out/production/module2/usage/UseClassAKt.class
|
||||
out/production/module2/usage/UseFunAKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
module2/src/useClassA.kt
|
||||
module2/src/useFunA.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
module1->
|
||||
module2->module1
|
||||
Vendored
+26
@@ -0,0 +1,26 @@
|
||||
================ Step #1 =================
|
||||
|
||||
Compiling files:
|
||||
module1/src/b.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module2/META-INF/module2.kotlin_module
|
||||
out/production/module2/b/B.class
|
||||
out/production/module2/b/BKt.class
|
||||
End of files
|
||||
Cleaning output files:
|
||||
out/production/module2/usage/UseClassBKt.class
|
||||
out/production/module2/usage/UseFunBKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
module2/src/useClassB.kt
|
||||
module2/src/useFunB.kt
|
||||
End of files
|
||||
Marked as dirty by Kotlin:
|
||||
module1/src/b.kt
|
||||
Exit code: ADDITIONAL_PASS_REQUIRED
|
||||
------------------------------------------
|
||||
Exit code: NOTHING_DONE
|
||||
------------------------------------------
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package a
|
||||
|
||||
class A
|
||||
|
||||
fun a() {
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package b
|
||||
|
||||
class B
|
||||
|
||||
fun b() {
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
package b
|
||||
|
||||
class B
|
||||
|
||||
fun b() {
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package usage
|
||||
|
||||
fun useClassA() {
|
||||
a.A()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package usage
|
||||
|
||||
fun useClassB() {
|
||||
b.B()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package usage
|
||||
|
||||
fun useFunA() {
|
||||
a.a()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package usage
|
||||
|
||||
fun useFunB() {
|
||||
b.b()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package bar
|
||||
|
||||
class Foo
|
||||
|
||||
fun bar() {}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
package bar
|
||||
|
||||
private fun dummy() {}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
================ Step #1 =================
|
||||
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/foo/AKt.class
|
||||
out/production/module/foo/Foo.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/bar/a.kt
|
||||
End of files
|
||||
Exit code: ADDITIONAL_PASS_REQUIRED
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/bar/DummyKt.class
|
||||
out/production/module/baz/UseClassKt.class
|
||||
out/production/module/baz/UseFunKt.class
|
||||
out/production/module/foo/DummyKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/bar/dummy.kt
|
||||
src/foo/dummy.kt
|
||||
src/useClass.kt
|
||||
src/useFun.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
Vendored
+25
@@ -0,0 +1,25 @@
|
||||
================ Step #1 =================
|
||||
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/foo/AKt.class
|
||||
out/production/module/foo/Foo.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/bar/a.kt
|
||||
End of files
|
||||
Marked as dirty by Kotlin:
|
||||
src/useFun.kt
|
||||
Exit code: ADDITIONAL_PASS_REQUIRED
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/baz/UseClassKt.class
|
||||
out/production/module/baz/UseFunKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/useClass.kt
|
||||
src/useFun.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package foo
|
||||
|
||||
class Foo
|
||||
|
||||
fun bar() {}
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
package foo
|
||||
|
||||
private fun dummy() {}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package baz
|
||||
|
||||
import foo.*
|
||||
import bar.*
|
||||
|
||||
fun useClass() {
|
||||
Foo()
|
||||
}
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package baz
|
||||
|
||||
import foo.*
|
||||
import bar.*
|
||||
|
||||
fun useFun() {
|
||||
bar()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package baz
|
||||
|
||||
class Foo
|
||||
|
||||
fun bar() {}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
================ Step #1 =================
|
||||
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/baz/AKt.class
|
||||
out/production/module/baz/Foo.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/bar/a.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
Cleaning output files:
|
||||
out/production/module/META-INF/module.kotlin_module
|
||||
out/production/module/baz/UseClassKt.class
|
||||
out/production/module/baz/UseFunKt.class
|
||||
End of files
|
||||
Compiling files:
|
||||
src/useClass.kt
|
||||
src/useFun.kt
|
||||
End of files
|
||||
Exit code: OK
|
||||
------------------------------------------
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package baz
|
||||
|
||||
class Foo
|
||||
|
||||
fun bar() {}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package baz
|
||||
|
||||
fun useClass() {
|
||||
Foo()
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package baz
|
||||
|
||||
fun useFun() {
|
||||
bar()
|
||||
}
|
||||
Reference in New Issue
Block a user