From bc6746b9e659195dcd0ea7c05384a1fb2ac49d73 Mon Sep 17 00:00:00 2001 From: Michael Nedzelsky Date: Fri, 25 Sep 2015 16:24:24 +0300 Subject: [PATCH] add tests for comparison of package members --- .../kotlin/generators/tests/GenerateTests.kt | 1 + .../AbstractProtoComparisonTest.kt | 32 ++++++++++------- .../ProtoComparisonTestGenerated.java | 34 ++++++++++++++----- .../new1.kt | 15 ++++++++ .../new2.kt | 13 +++++++ .../old1.kt | 13 +++++++ .../old2.kt | 13 +++++++ .../result.out | 5 +++ .../packageFacadePrivateOnlyChanges}/new.kt | 0 .../packageFacadePrivateOnlyChanges}/old.kt | 0 .../result.out | 0 .../packageFacadePublicChanges}/new.kt | 0 .../packageFacadePublicChanges}/old.kt | 0 .../packageFacadePublicChanges}/result.out | 0 14 files changed, 105 insertions(+), 21 deletions(-) create mode 100644 jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new1.kt create mode 100644 jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new2.kt create mode 100644 jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old1.kt create mode 100644 jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old2.kt create mode 100644 jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/result.out rename jps-plugin/testData/comparison/{classPrivateOnlyChange/packageFacadeDifference => packageMembers/packageFacadePrivateOnlyChanges}/new.kt (100%) rename jps-plugin/testData/comparison/{classPrivateOnlyChange/packageFacadeDifference => packageMembers/packageFacadePrivateOnlyChanges}/old.kt (100%) rename jps-plugin/testData/comparison/{classPrivateOnlyChange/packageFacadeDifference => packageMembers/packageFacadePrivateOnlyChanges}/result.out (100%) rename jps-plugin/testData/comparison/{classMembersOnlyChanged/packageFacadeDifference => packageMembers/packageFacadePublicChanges}/new.kt (100%) rename jps-plugin/testData/comparison/{classMembersOnlyChanged/packageFacadeDifference => packageMembers/packageFacadePublicChanges}/old.kt (100%) rename jps-plugin/testData/comparison/{classMembersOnlyChanged/packageFacadeDifference => packageMembers/packageFacadePublicChanges}/result.out (100%) diff --git a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt index 87dadc9f1b3..66a51985167 100644 --- a/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt +++ b/generators/src/org/jetbrains/kotlin/generators/tests/GenerateTests.kt @@ -847,6 +847,7 @@ fun main(args: Array) { 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) } } diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt b/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt index ce42b21f41b..b407aecbd46 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/AbstractProtoComparisonTest.kt @@ -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 { - + private fun compileFileAndGetClasses(testPath: String, testDir: File, prefix: String): List { + 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}") diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java b/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java index 0452cdf8273..fca9885dc30 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/incremental/ProtoComparisonTestGenerated.java @@ -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); } diff --git a/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new1.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new1.kt new file mode 100644 index 00000000000..22064b47da0 --- /dev/null +++ b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new1.kt @@ -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) {} diff --git a/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new2.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new2.kt new file mode 100644 index 00000000000..dc7dce42888 --- /dev/null +++ b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/new2.kt @@ -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) {} diff --git a/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old1.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old1.kt new file mode 100644 index 00000000000..11fff787118 --- /dev/null +++ b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old1.kt @@ -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) {} diff --git a/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old2.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old2.kt new file mode 100644 index 00000000000..2c794b1fbe0 --- /dev/null +++ b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/old2.kt @@ -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) {} diff --git a/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/result.out b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/result.out new file mode 100644 index 00000000000..7868fd3e24c --- /dev/null +++ b/jps-plugin/testData/comparison/packageMembers/packageFacadeMultifileClassChanged/result.out @@ -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 diff --git a/jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/new.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/new.kt similarity index 100% rename from jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/new.kt rename to jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/new.kt diff --git a/jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/old.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/old.kt similarity index 100% rename from jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/old.kt rename to jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/old.kt diff --git a/jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/result.out b/jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/result.out similarity index 100% rename from jps-plugin/testData/comparison/classPrivateOnlyChange/packageFacadeDifference/result.out rename to jps-plugin/testData/comparison/packageMembers/packageFacadePrivateOnlyChanges/result.out diff --git a/jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/new.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/new.kt similarity index 100% rename from jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/new.kt rename to jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/new.kt diff --git a/jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/old.kt b/jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/old.kt similarity index 100% rename from jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/old.kt rename to jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/old.kt diff --git a/jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/result.out b/jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/result.out similarity index 100% rename from jps-plugin/testData/comparison/classMembersOnlyChanged/packageFacadeDifference/result.out rename to jps-plugin/testData/comparison/packageMembers/packageFacadePublicChanges/result.out