IC: add tests with moving files

Additionally added the ability to use directories in IC tests.

 #KT-8002 Obsolete
This commit is contained in:
Zalim Bashorov
2016-03-23 13:38:47 +03:00
parent d230afe726
commit 9a9b863c9d
30 changed files with 314 additions and 23 deletions
@@ -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)
@@ -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")
@@ -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
------------------------------------------
@@ -0,0 +1,2 @@
module1->
module2->module1
@@ -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
------------------------------------------
@@ -0,0 +1,6 @@
package a
class A
fun a() {
}
@@ -0,0 +1,6 @@
package b
class B
fun b() {
}
@@ -0,0 +1,6 @@
package b
class B
fun b() {
}
@@ -0,0 +1,5 @@
package usage
fun useClassA() {
a.A()
}
@@ -0,0 +1,5 @@
package usage
fun useClassB() {
b.B()
}
@@ -0,0 +1,5 @@
package usage
fun useFunA() {
a.a()
}
@@ -0,0 +1,5 @@
package usage
fun useFunB() {
b.b()
}
@@ -0,0 +1,5 @@
package bar
class Foo
fun bar() {}
@@ -0,0 +1,3 @@
package bar
private fun dummy() {}
@@ -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
------------------------------------------
@@ -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
------------------------------------------
@@ -0,0 +1,5 @@
package foo
class Foo
fun bar() {}
@@ -0,0 +1,3 @@
package foo
private fun dummy() {}
@@ -0,0 +1,8 @@
package baz
import foo.*
import bar.*
fun useClass() {
Foo()
}
@@ -0,0 +1,8 @@
package baz
import foo.*
import bar.*
fun useFun() {
bar()
}
@@ -0,0 +1,5 @@
package baz
class Foo
fun bar() {}
@@ -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
------------------------------------------
@@ -0,0 +1,5 @@
package baz
class Foo
fun bar() {}
@@ -0,0 +1,5 @@
package baz
fun useClass() {
Foo()
}
@@ -0,0 +1,5 @@
package baz
fun useFun() {
bar()
}