add tests for comparison of package members

This commit is contained in:
Michael Nedzelsky
2015-09-25 16:24:24 +03:00
parent c7b52bfdc1
commit bc6746b9e6
14 changed files with 105 additions and 21 deletions
@@ -847,6 +847,7 @@ fun main(args: Array<String>) {
model("comparison/classSignatureChange", extension = null, excludeParentDirs = true) model("comparison/classSignatureChange", extension = null, excludeParentDirs = true)
model("comparison/classPrivateOnlyChange", extension = null, excludeParentDirs = true) model("comparison/classPrivateOnlyChange", extension = null, excludeParentDirs = true)
model("comparison/classMembersOnlyChanged", 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) model("comparison/unchanged", extension = null, excludeParentDirs = true)
} }
} }
@@ -18,9 +18,7 @@ package org.jetbrains.kotlin.jps.incremental
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import com.intellij.testFramework.UsefulTestCase import com.intellij.testFramework.UsefulTestCase
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleClassKind import org.jetbrains.kotlin.load.kotlin.header.*
import org.jetbrains.kotlin.load.kotlin.header.isCompatibleFileFacadeKind
import org.jetbrains.kotlin.load.kotlin.header.isCompatiblePackageFacadeKind
import org.jetbrains.kotlin.serialization.jvm.BitEncoding import org.jetbrains.kotlin.serialization.jvm.BitEncoding
import org.jetbrains.kotlin.test.JetTestUtils import org.jetbrains.kotlin.test.JetTestUtils
import org.jetbrains.kotlin.test.MockLibraryUtil import org.jetbrains.kotlin.test.MockLibraryUtil
@@ -32,8 +30,8 @@ public abstract class AbstractProtoComparisonTest : UsefulTestCase() {
public fun doTest(testDataPath: String) { public fun doTest(testDataPath: String) {
val testDir = JetTestUtils.tmpDir("testDirectory") val testDir = JetTestUtils.tmpDir("testDirectory")
val oldClassFiles = compileFileAndGetClasses(testDataPath, testDir, "old.kt") val oldClassFiles = compileFileAndGetClasses(testDataPath, testDir, "old")
val newClassFiles = compileFileAndGetClasses(testDataPath, testDir, "new.kt") val newClassFiles = compileFileAndGetClasses(testDataPath, testDir, "new")
val oldClassMap = oldClassFiles.toMap { it.name } val oldClassMap = oldClassFiles.toMap { it.name }
val newClassMap = newClassFiles.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()); 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 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) MockLibraryUtil.compileKotlin(sourcesDirectory.path, classesDirectory)
return File(classesDirectory, "test").listFiles() { it.name.endsWith(".class") }?.sortedBy { it.name }!! 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 oldClassHeader = oldLocalFileKotlinClass.classHeader
val newClassHeader = newLocalFileKotlinClass.classHeader val newClassHeader = newLocalFileKotlinClass.classHeader
if (oldClassHeader.annotationData == null || newClassHeader.annotationData == null) {
println("skip ${oldLocalFileKotlinClass.classId}")
return
}
val oldProtoBytes = BitEncoding.decodeBytes(oldClassHeader.annotationData!!) val oldProtoBytes = BitEncoding.decodeBytes(oldClassHeader.annotationData!!)
val newProtoBytes = BitEncoding.decodeBytes(newClassHeader.annotationData!!) val newProtoBytes = BitEncoding.decodeBytes(newClassHeader.annotationData!!)
val oldProto = ProtoMapValue( val oldProto = ProtoMapValue(
oldClassHeader.isCompatiblePackageFacadeKind() || oldClassHeader.isCompatibleFileFacadeKind(), oldClassHeader.isCompatiblePackageFacadeKind() || oldClassHeader.isCompatibleFileFacadeKind() || oldClassHeader.isCompatibleMultifileClassPartKind(),
oldProtoBytes, oldClassHeader.strings!! oldProtoBytes, oldClassHeader.strings!!
) )
val newProto = ProtoMapValue( val newProto = ProtoMapValue(
newClassHeader.isCompatiblePackageFacadeKind() || newClassHeader.isCompatibleFileFacadeKind(), newClassHeader.isCompatiblePackageFacadeKind() || newClassHeader.isCompatibleFileFacadeKind() || newClassHeader.isCompatibleMultifileClassPartKind(),
newProtoBytes, newClassHeader.strings!! newProtoBytes, newClassHeader.strings!!
) )
val diff = when { val diff = when {
newClassHeader.isCompatiblePackageFacadeKind(), newClassHeader.isCompatibleClassKind(), newClassHeader.isCompatibleFileFacadeKind() -> newClassHeader.isCompatiblePackageFacadeKind(),
newClassHeader.isCompatibleClassKind(),
newClassHeader.isCompatibleFileFacadeKind(),
newClassHeader.isCompatibleMultifileClassPartKind() ->
difference(oldProto, newProto) difference(oldProto, newProto)
else -> { else -> {
println("ignore ${oldLocalFileKotlinClass.classId}") println("ignore ${oldLocalFileKotlinClass.classId}")
@@ -113,12 +113,6 @@ public class ProtoComparisonTestGenerated extends AbstractProtoComparisonTest {
doTest(fileName); 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") @TestMetadata("jps-plugin/testData/comparison/classMembersOnlyChanged")
@@ -159,9 +153,31 @@ public class ProtoComparisonTestGenerated extends AbstractProtoComparisonTest {
doTest(fileName); 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); doTest(fileName);
} }
@@ -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) {}
@@ -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) {}
@@ -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) {}
@@ -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) {}
@@ -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