add tests for comparison of package members
This commit is contained in:
@@ -847,6 +847,7 @@ fun main(args: Array<String>) {
|
||||
model("comparison/classSignatureChange", extension = null, excludeParentDirs = true)
|
||||
model("comparison/classPrivateOnlyChange", extension = null, excludeParentDirs = true)
|
||||
model("comparison/classMembersOnlyChanged", extension = null, excludeParentDirs = true)
|
||||
model("comparison/packageMembers", extension = null, excludeParentDirs = true)
|
||||
model("comparison/unchanged", extension = null, excludeParentDirs = true)
|
||||
}
|
||||
}
|
||||
|
||||
+20
-12
@@ -18,9 +18,7 @@ package org.jetbrains.kotlin.jps.incremental
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import com.intellij.testFramework.UsefulTestCase
|
||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind
|
||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleFileFacadeKind
|
||||
import org.jetbrains.kotlin.load.kotlin.header.isCompatiblePackageFacadeKind
|
||||
import org.jetbrains.kotlin.load.kotlin.header.*
|
||||
import org.jetbrains.kotlin.serialization.jvm.BitEncoding
|
||||
import org.jetbrains.kotlin.test.JetTestUtils
|
||||
import org.jetbrains.kotlin.test.MockLibraryUtil
|
||||
@@ -32,8 +30,8 @@ public abstract class AbstractProtoComparisonTest : UsefulTestCase() {
|
||||
public fun doTest(testDataPath: String) {
|
||||
val testDir = JetTestUtils.tmpDir("testDirectory")
|
||||
|
||||
val oldClassFiles = compileFileAndGetClasses(testDataPath, testDir, "old.kt")
|
||||
val newClassFiles = compileFileAndGetClasses(testDataPath, testDir, "new.kt")
|
||||
val oldClassFiles = compileFileAndGetClasses(testDataPath, testDir, "old")
|
||||
val newClassFiles = compileFileAndGetClasses(testDataPath, testDir, "new")
|
||||
|
||||
val oldClassMap = oldClassFiles.toMap { it.name }
|
||||
val newClassMap = newClassFiles.toMap { it.name }
|
||||
@@ -63,12 +61,14 @@ public abstract class AbstractProtoComparisonTest : UsefulTestCase() {
|
||||
JetTestUtils.assertEqualsToFile(File(testDataPath + File.separator + "result.out"), sb.toString());
|
||||
}
|
||||
|
||||
private fun compileFileAndGetClasses(testPath: String, testDir: File, fileName: String): List<File> {
|
||||
|
||||
private fun compileFileAndGetClasses(testPath: String, testDir: File, prefix: String): List<File> {
|
||||
val files = File(testPath).listFiles { it.name.startsWith(prefix) }!!
|
||||
val sourcesDirectory = testDir.createSubDirectory("sources")
|
||||
val classesDirectory = testDir.createSubDirectory("$fileName.src")
|
||||
val classesDirectory = testDir.createSubDirectory("$prefix.src")
|
||||
|
||||
FileUtil.copy(File(testPath, fileName), File(sourcesDirectory, "main.kt"))
|
||||
files.forEach { file ->
|
||||
FileUtil.copy(file, File(sourcesDirectory, file.name.replaceFirst(prefix, "main")))
|
||||
}
|
||||
MockLibraryUtil.compileKotlin(sourcesDirectory.path, classesDirectory)
|
||||
|
||||
return File(classesDirectory, "test").listFiles() { it.name.endsWith(".class") }?.sortedBy { it.name }!!
|
||||
@@ -81,20 +81,28 @@ public abstract class AbstractProtoComparisonTest : UsefulTestCase() {
|
||||
val oldClassHeader = oldLocalFileKotlinClass.classHeader
|
||||
val newClassHeader = newLocalFileKotlinClass.classHeader
|
||||
|
||||
if (oldClassHeader.annotationData == null || newClassHeader.annotationData == null) {
|
||||
println("skip ${oldLocalFileKotlinClass.classId}")
|
||||
return
|
||||
}
|
||||
|
||||
val oldProtoBytes = BitEncoding.decodeBytes(oldClassHeader.annotationData!!)
|
||||
val newProtoBytes = BitEncoding.decodeBytes(newClassHeader.annotationData!!)
|
||||
|
||||
val oldProto = ProtoMapValue(
|
||||
oldClassHeader.isCompatiblePackageFacadeKind() || oldClassHeader.isCompatibleFileFacadeKind(),
|
||||
oldClassHeader.isCompatiblePackageFacadeKind() || oldClassHeader.isCompatibleFileFacadeKind() || oldClassHeader.isCompatibleMultifileClassPartKind(),
|
||||
oldProtoBytes, oldClassHeader.strings!!
|
||||
)
|
||||
val newProto = ProtoMapValue(
|
||||
newClassHeader.isCompatiblePackageFacadeKind() || newClassHeader.isCompatibleFileFacadeKind(),
|
||||
newClassHeader.isCompatiblePackageFacadeKind() || newClassHeader.isCompatibleFileFacadeKind() || newClassHeader.isCompatibleMultifileClassPartKind(),
|
||||
newProtoBytes, newClassHeader.strings!!
|
||||
)
|
||||
|
||||
val diff = when {
|
||||
newClassHeader.isCompatiblePackageFacadeKind(), newClassHeader.isCompatibleClassKind(), newClassHeader.isCompatibleFileFacadeKind() ->
|
||||
newClassHeader.isCompatiblePackageFacadeKind(),
|
||||
newClassHeader.isCompatibleClassKind(),
|
||||
newClassHeader.isCompatibleFileFacadeKind(),
|
||||
newClassHeader.isCompatibleMultifileClassPartKind() ->
|
||||
difference(oldProto, newProto)
|
||||
else -> {
|
||||
println("ignore ${oldLocalFileKotlinClass.classId}")
|
||||
|
||||
+25
-9
@@ -113,12 +113,6 @@ public class ProtoComparisonTestGenerated extends AbstractProtoComparisonTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("packageFacadeDifference")
|
||||
public void testPackageFacadeDifference() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@TestMetadata("jps-plugin/testData/comparison/classMembersOnlyChanged")
|
||||
@@ -159,9 +153,31 @@ public class ProtoComparisonTestGenerated extends AbstractProtoComparisonTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("packageFacadeDifference")
|
||||
public void testPackageFacadeDifference() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/");
|
||||
}
|
||||
|
||||
@TestMetadata("jps-plugin/testData/comparison/packageMembers")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class PackageMembers extends AbstractProtoComparisonTest {
|
||||
public void testAllFilesPresentInPackageMembers() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("jps-plugin/testData/comparison/packageMembers"), Pattern.compile("^([^\\.]+)$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("packageFacadeMultifileClassChanged")
|
||||
public void testPackageFacadeMultifileClassChanged() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("packageFacadePrivateOnlyChanges")
|
||||
public void testPackageFacadePrivateOnlyChanges() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("packageFacadePublicChanges")
|
||||
public void testPackageFacadePublicChanges() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
package test
|
||||
|
||||
public fun unchangedFun1() {}
|
||||
|
||||
public fun publicAddedFun1() {}
|
||||
|
||||
private fun addedFun1(): Int = 10
|
||||
|
||||
private val addedVal1: String = "A"
|
||||
|
||||
private val changedVal1: String = ""
|
||||
|
||||
private fun changedFun1(arg: String) {}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
package test
|
||||
|
||||
public fun unchangedFun2() {}
|
||||
|
||||
private fun addedFun2(): Int = 10
|
||||
|
||||
private val addedVal2: String = "A"
|
||||
|
||||
private val changedVal2: String = ""
|
||||
|
||||
private fun changedFun2(arg: String) {}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
package test
|
||||
|
||||
public fun unchangedFun1() {}
|
||||
|
||||
private fun removedFun1(): Int = 10
|
||||
|
||||
private val removedVal1: String = "A"
|
||||
|
||||
private val changedVal1: Int = 20
|
||||
|
||||
private fun changedFun1(arg: Int) {}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
@file:JvmName("Utils")
|
||||
@file:JvmMultifileClass
|
||||
package test
|
||||
|
||||
public fun unchangedFun2() {}
|
||||
|
||||
private fun removedFun2(): Int = 10
|
||||
|
||||
private val removedVal2: String = "A"
|
||||
|
||||
private val changedVal2: Int = 20
|
||||
|
||||
private fun changedFun2(arg: Int) {}
|
||||
Vendored
+5
@@ -0,0 +1,5 @@
|
||||
changes in test/TestPackage: NONE
|
||||
skip test/Utils
|
||||
changes in test/Utils__Main1Kt: MEMBERS
|
||||
[publicAddedFun1]
|
||||
changes in test/Utils__Main2Kt: NONE
|
||||
Reference in New Issue
Block a user