From 04f414f600c0184150cfa6b66e22ee5f8a573c32 Mon Sep 17 00:00:00 2001 From: Zac Sweers Date: Sat, 18 Jan 2020 22:46:54 -0500 Subject: [PATCH] Add ComplexGenericsInheritanceTest --- .../codegen/ComplexGenericsInheritanceTest.kt | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt diff --git a/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt new file mode 100644 index 0000000..a69f7d0 --- /dev/null +++ b/kotlin/tests/src/test/kotlin/com/squareup/moshi/kotlin/codegen/ComplexGenericsInheritanceTest.kt @@ -0,0 +1,132 @@ +@file:Suppress("UNUSED", "UNUSED_PARAMETER") + +package com.squareup.moshi.kotlin.codegen + +import com.squareup.moshi.JsonClass +import com.squareup.moshi.Moshi +import com.squareup.moshi.kotlin.reflect.adapter +import org.assertj.core.api.Assertions.assertThat +import org.intellij.lang.annotations.Language +import org.junit.Test + +@ExperimentalStdlibApi +class ComplexGenericsInheritanceTest { + + private val moshi = Moshi.Builder().build() + + @Test + fun simple() { + val adapter = moshi.adapter() + + @Language("JSON") + val json = """{"data":{"name":"foo"},"data2":"bar","data3":"baz"}""" + + val instance = adapter.fromJson(json)!! + val testInstance = PersonResponse().apply { + data = Person("foo") + } + assertThat(instance).isEqualTo(testInstance) + assertThat(adapter.toJson(instance)).isEqualTo(json) + } + + @Test + fun nested() { + val adapter = moshi.adapter() + + @Language("JSON") + val json = """{"data":{"name":"foo"},"data2":"bar","data3":"baz"}""" + + val instance = adapter.fromJson(json)!! + val testInstance = NestedPersonResponse().apply { + data = Person("foo") + } + assertThat(instance).isEqualTo(testInstance) + assertThat(adapter.toJson(instance)).isEqualTo(json) + } + + @Test + fun untyped() { + val adapter = moshi.adapter>() + + @Language("JSON") + val json = """{"data":{"name":"foo"},"data2":"bar","data3":"baz"}""" + + val instance = adapter.fromJson(json)!! + val testInstance = UntypedNestedPersonResponse().apply { + data = Person("foo") + } + assertThat(instance).isEqualTo(testInstance) + assertThat(adapter.toJson(instance)).isEqualTo(json) + } + + @Test + fun complex() { + val adapter = moshi.adapter>>() + + @Language("JSON") + val json = """{"layer4E":{"name":"layer4E"},"layer4F":{"data":{"name":"layer4F"},"data2":"layer4F","data3":"layer4F"},"layer3C":[1,2,3],"layer3D":"layer3D","layer2":"layer2","layer1":"layer1"}""" + + val instance = adapter.fromJson(json)!! + val testInstance = Layer4( + layer4E = Person("layer4E"), + layer4F = UntypedNestedPersonResponse().apply { + data = Person("layer4F") + data2 = "layer4F" + data3 = "layer4F" + } + ).apply { + layer3C = listOf(1, 2, 3) + layer3D = "layer3D" + layer2 = "layer2" + layer1 = "layer1" + } + assertThat(instance).isEqualTo(testInstance) + assertThat(adapter.toJson(testInstance)).isEqualTo(json) + } +} + +open class ResponseWithSettableProperty { + var data: T? = null + var data2: R? = null + var data3: R? = null +} + +interface Personable + +@JsonClass(generateAdapter = true) +data class Person(val name: String) : Personable + +@JsonClass(generateAdapter = true) +data class PersonResponse( + val extra: String? = null) : ResponseWithSettableProperty() + +abstract class NestedResponse : ResponseWithSettableProperty() + +@JsonClass(generateAdapter = true) +data class NestedPersonResponse(val extra: String? = null) : NestedResponse() + +@JsonClass(generateAdapter = true) +data class UntypedNestedPersonResponse( + val extra: String? = null +) : NestedResponse() + +interface LayerInterface + +abstract class Layer1 { + var layer1: A? = null +} + +abstract class Layer2 : Layer1(), LayerInterface { + var layer2: B? = null +} + +abstract class Layer3 : Layer2() { + var layer3C: C? = null + var layer3D: D? = null +} + +@JsonClass(generateAdapter = true) +data class Layer4( + val layer4E: E, + val layer4F: F? = null +) : Layer3, String>(), LayerInterface