From 2f7bc8ca79e68a29a475d08f04be5e490ae2c6e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Wed, 25 Aug 2021 16:26:21 +0200 Subject: [PATCH] Parcelize: Add tests for parcelable value classes --- .../parcelize/ir/IrParcelSerializerFactory.kt | 1 - .../testData/box/parcelableValueClass.kt | 39 ++++++++++++++ .../testData/box/parcelizeCustomValueClass.kt | 38 +++++++++++++ .../testData/box/valueClasses.kt | 54 +++++++++++++++++++ .../test/ParcelizeBoxTestGenerated.java | 15 ++++++ .../test/ParcelizeIrBoxTestGenerated.java | 15 ++++++ 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt create mode 100644 plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt create mode 100644 plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt diff --git a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializerFactory.kt b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializerFactory.kt index 066ea19fdce..8b79cd2e6c3 100644 --- a/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializerFactory.kt +++ b/plugins/parcelize/parcelize-compiler/src/org/jetbrains/kotlin/parcelize/ir/IrParcelSerializerFactory.kt @@ -34,7 +34,6 @@ class IrParcelSerializerFactory(symbols: AndroidSymbols) { return IrCustomParcelSerializer(parceler) } - // TODO inline classes val classifier = irType.erasedUpperBound val classifierFqName = classifier.fqNameWhenAvailable?.asString() when (classifierFqName) { diff --git a/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt b/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt new file mode 100644 index 00000000000..58309b2c224 --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt @@ -0,0 +1,39 @@ +// WITH_RUNTIME +// See: https://issuetracker.google.com/177856519 +// IGNORE_BACKEND: JVM + +@file:JvmName("TestKt") +package test + +import kotlinx.parcelize.* +import android.os.Parcel +import android.os.Parcelable +import java.util.UUID + +@JvmInline +value class ParcelableUuid(val uuid: UUID) : Parcelable { + override fun describeContents(): Int = 0 + override fun writeToParcel(parcel: Parcel, flags: Int) = parcel.writeString(uuid.toString()) + companion object { + @JvmField + val CREATOR = object : Parcelable.Creator { + override fun createFromParcel(source: Parcel): ParcelableUuid = ParcelableUuid(UUID.fromString(source.readString())) + override fun newArray(size: Int): Array = arrayOfNulls(size) + } + } +} + +@Parcelize +class Data(val uuid: ParcelableUuid) : Parcelable + +fun box() = parcelTest { parcel -> + val data = Data(ParcelableUuid(UUID.randomUUID())) + data.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val data2 = readFromParcel(parcel) + assert(data2.uuid.uuid == data.uuid.uuid) +} diff --git a/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt b/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt new file mode 100644 index 00000000000..97710c9fab1 --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt @@ -0,0 +1,38 @@ +// WITH_RUNTIME +// See: https://issuetracker.google.com/177856519 +// IGNORE_BACKEND: JVM + +@file:JvmName("TestKt") +package test + +import kotlinx.parcelize.* +import android.os.Parcel +import android.os.Parcelable +import java.util.UUID + +@JvmInline +@Parcelize +value class ParcelableUuid(val uuid: UUID) : Parcelable { + private companion object : Parceler { + override fun ParcelableUuid.write(parcel: Parcel, flags: Int) { + parcel.writeString(uuid.toString()) + } + + override fun create(parcel: Parcel) = ParcelableUuid(UUID.fromString(parcel.readString())) + } +} + +@Parcelize +class Data(val uuid: ParcelableUuid) : Parcelable + +fun box() = parcelTest { parcel -> + val data = Data(ParcelableUuid(UUID.randomUUID())) + data.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val data2 = readFromParcel(parcel) + assert(data2.uuid.uuid == data.uuid.uuid) +} diff --git a/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt b/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt new file mode 100644 index 00000000000..7dc338a02e7 --- /dev/null +++ b/plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt @@ -0,0 +1,54 @@ +// WITH_RUNTIME +// See: https://issuetracker.google.com/177856519 +// IGNORE_BACKEND: JVM + +@file:JvmName("TestKt") +package test + +import kotlinx.parcelize.* +import android.os.Parcel +import android.os.Parcelable +import java.util.UUID + +@JvmInline +@Parcelize +value class ParcelableInt(val value: Int) : Parcelable + +@JvmInline +@Parcelize +value class ParcelableString(val value: String) : Parcelable + +@JvmInline +@Parcelize +value class ParcelableValueClass(val value: ParcelableInt) : Parcelable + +@JvmInline +@Parcelize +value class ParcelableNullableValueClass(val value: ParcelableString?) : Parcelable + +@Parcelize +data class Data( + val parcelableInt: ParcelableInt, + val parcelableString: ParcelableString, + val parcelableValueClass: ParcelableValueClass, + val parcelableNullableValueClass: ParcelableNullableValueClass, + val parcelableNullableValueClassNullable: ParcelableNullableValueClass?, +) : Parcelable + +fun box() = parcelTest { parcel -> + val data = Data( + ParcelableInt(10), + ParcelableString(""), + ParcelableValueClass(ParcelableInt(30)), + ParcelableNullableValueClass(null), + null, + ) + data.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + parcel.setDataPosition(0) + + val data2 = readFromParcel(parcel) + assert(data2 == data) +} diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java index f622e610414..5414c207fab 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeBoxTestGenerated.java @@ -305,6 +305,16 @@ public class ParcelizeBoxTestGenerated extends AbstractParcelizeBoxTest { runTest("plugins/parcelize/parcelize-compiler/testData/box/openParcelize.kt"); } + @TestMetadata("parcelableValueClass.kt") + public void testParcelableValueClass() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt"); + } + + @TestMetadata("parcelizeCustomValueClass.kt") + public void testParcelizeCustomValueClass() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt"); + } + @TestMetadata("persistableBundle.kt") public void testPersistableBundle() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt"); @@ -354,4 +364,9 @@ public class ParcelizeBoxTestGenerated extends AbstractParcelizeBoxTest { public void testTypeParameters() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt"); } + + @TestMetadata("valueClasses.kt") + public void testValueClasses() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt"); + } } diff --git a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java index 06c4793d5b9..b761ae660f8 100644 --- a/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java +++ b/plugins/parcelize/parcelize-compiler/tests/org/jetbrains/kotlin/parcelize/test/ParcelizeIrBoxTestGenerated.java @@ -305,6 +305,16 @@ public class ParcelizeIrBoxTestGenerated extends AbstractParcelizeIrBoxTest { runTest("plugins/parcelize/parcelize-compiler/testData/box/openParcelize.kt"); } + @TestMetadata("parcelableValueClass.kt") + public void testParcelableValueClass() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/parcelableValueClass.kt"); + } + + @TestMetadata("parcelizeCustomValueClass.kt") + public void testParcelizeCustomValueClass() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/parcelizeCustomValueClass.kt"); + } + @TestMetadata("persistableBundle.kt") public void testPersistableBundle() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/box/persistableBundle.kt"); @@ -354,4 +364,9 @@ public class ParcelizeIrBoxTestGenerated extends AbstractParcelizeIrBoxTest { public void testTypeParameters() throws Exception { runTest("plugins/parcelize/parcelize-compiler/testData/box/typeParameters.kt"); } + + @TestMetadata("valueClasses.kt") + public void testValueClasses() throws Exception { + runTest("plugins/parcelize/parcelize-compiler/testData/box/valueClasses.kt"); + } }