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/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)
}
}
@@ -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}")
@@ -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);
}
@@ -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