diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKpmProjectContainer.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKpmProjectContainer.kt new file mode 100644 index 00000000000..48c8e6e0d51 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKpmProjectContainer.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.kpm.idea + +import java.io.Serializable + +fun IdeaKpmProjectContainer(project: ByteArray): IdeaKpmProjectBinaryContainer { + return IdeaKpmProjectBinaryContainerImpl(project) +} + +fun IdeaKpmProjectContainer(project: IdeaKpmProject): IdeaKpmProjectInstanceContainer { + return IdeaKpmProjectInstanceContainerImpl(project) +} + +sealed interface IdeaKpmProjectContainer : Serializable { + val project: T + val binaryOrNull: ByteArray? + val instanceOrNull: IdeaKpmProject? +} + +interface IdeaKpmProjectBinaryContainer : IdeaKpmProjectContainer { + override val instanceOrNull: Nothing? get() = null + override val binaryOrNull: ByteArray get() = project +} + +interface IdeaKpmProjectInstanceContainer : IdeaKpmProjectContainer { + override val instanceOrNull: IdeaKpmProject get() = project + override val binaryOrNull: Nothing? get() = null +} + +private data class IdeaKpmProjectBinaryContainerImpl(override val project: ByteArray) : IdeaKpmProjectBinaryContainer { + override fun equals(other: Any?): Boolean { + if (other === this) return true + if (other !is IdeaKpmProjectBinaryContainer) return false + return other.project.contentEquals(this.project) + } + + override fun hashCode(): Int { + return project.contentHashCode() + } + + companion object { + const val serialVersionUID = 0L + } +} + +private data class IdeaKpmProjectInstanceContainerImpl( + override val project: IdeaKpmProject +) : IdeaKpmProjectInstanceContainer { + companion object { + const val serialVersionUID = 0L + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKpmProjectContainerTest.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKpmProjectContainerTest.kt new file mode 100644 index 00000000000..b65173cbf38 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/test/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/IdeaKpmProjectContainerTest.kt @@ -0,0 +1,57 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.kpm.idea + +import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.TestIdeaKpmInstances +import kotlin.test.* + +class IdeaKpmProjectContainerTest { + + @Test + fun `test - binary container - equality`() { + val container1 = IdeaKpmProjectContainer(byteArrayOf(1)) + val container2 = IdeaKpmProjectContainer(byteArrayOf(1)) + val container3 = IdeaKpmProjectContainer(byteArrayOf(1, 2)) + + assertEquals(container1, container2) + assertNotEquals(container2, container3) + } + + @Test + fun `test - instance container - equality`() { + val container1 = IdeaKpmProjectContainer(TestIdeaKpmInstances.simpleProject) + val container2 = IdeaKpmProjectContainer(TestIdeaKpmInstances.simpleProject.copy()) + val container3 = IdeaKpmProjectContainer(TestIdeaKpmInstances.simpleProject.copy(gradlePluginVersion = "some.other.version")) + + assertEquals(container1, container2) + assertNotEquals(container2, container3) + } + + @Test + fun `test - binary container - instanceOrNull`() { + assertNull(IdeaKpmProjectContainer(byteArrayOf()).instanceOrNull) + assertNotNull(IdeaKpmProjectBinaryContainer::class.java.getMethod("getInstanceOrNull")) + } + + @Test + fun `test - instance container - instanceOrNull`() { + assertSame(TestIdeaKpmInstances.simpleProject, IdeaKpmProjectContainer(TestIdeaKpmInstances.simpleProject).instanceOrNull) + assertNotNull(IdeaKpmProjectInstanceContainer::class.java.getMethod("getInstanceOrNull")) + } + + @Test + fun `test - binary container - binaryOrNull`() { + val binary = byteArrayOf() + assertEquals(binary, IdeaKpmProjectContainer(binary).binaryOrNull) + assertNotNull(IdeaKpmProjectBinaryContainer::class.java.getMethod("getBinaryOrNull")) + } + + @Test + fun `test - instance container - binaryOrNull`() { + assertNull(IdeaKpmProjectContainer(TestIdeaKpmInstances.simpleProject).binaryOrNull) + assertNotNull(IdeaKpmProjectInstanceContainer::class.java.getMethod("getBinaryOrNull")) + } +}