Fix nullable properties (#992)

* Fix missing nullability/annotations when unwrapping typealiases

Fixes #990

* Add extra nullable properties test + more nullability in alias test

* Add more complex typeAliasNullability test

* Recursively check nullability and track annotations in typealiases
This commit is contained in:
Zac Sweers
2019-11-02 21:55:20 -04:00
committed by GitHub
parent fe34a577e7
commit 7cf365cdbf
2 changed files with 65 additions and 3 deletions

View File

@@ -433,7 +433,7 @@ class DualKotlinTest(useReflection: Boolean) {
val parameterized: GenericClass<TypeAlias>,
val wildcardIn: GenericClass<in TypeAlias>,
val wildcardOut: GenericClass<out TypeAlias>,
val complex: GenericClass<GenericTypeAlias>
val complex: GenericClass<GenericTypeAlias>?
)
// Regression test for https://github.com/square/moshi/issues/991
@@ -481,11 +481,52 @@ class DualKotlinTest(useReflection: Boolean) {
val double: Double,
val nullableDouble: Double? = null
)
// Regression test for https://github.com/square/moshi/issues/990
@Test fun nullableProperties() {
val adapter = moshi.adapter<NullableList>()
@Language("JSON")
val testJson = """{"nullableList":null}"""
assertThat(adapter.serializeNulls().toJson(NullableList(null)))
.isEqualTo(testJson)
val result = adapter.fromJson(testJson)!!
assertThat(result.nullableList).isNull()
}
@JsonClass(generateAdapter = true)
data class NullableList(val nullableList: List<Any>?)
@Test fun typeAliasNullability() {
val adapter = moshi.adapter<TypeAliasNullability>()
@Language("JSON")
val testJson = """{"aShouldBeNonNull":3,"nullableAShouldBeNullable":null,"redundantNullableAShouldBeNullable":null,"manuallyNullableAShouldBeNullable":null,"convolutedMultiNullableShouldBeNullable":null,"deepNestedNullableShouldBeNullable":null}"""
val instance = TypeAliasNullability(3, null, null, null, null, null)
assertThat(adapter.serializeNulls().toJson(instance))
.isEqualTo(testJson)
val result = adapter.fromJson(testJson)!!
assertThat(result).isEqualTo(instance)
}
@JsonClass(generateAdapter = true)
data class TypeAliasNullability(
val aShouldBeNonNull: A,
val nullableAShouldBeNullable: NullableA,
val redundantNullableAShouldBeNullable: NullableA?,
val manuallyNullableAShouldBeNullable: A?,
val convolutedMultiNullableShouldBeNullable: NullableB?,
val deepNestedNullableShouldBeNullable: E
)
}
typealias TypeAlias = Int
@Suppress("REDUNDANT_PROJECTION")
typealias GenericTypeAlias = List<out GenericClass<in TypeAlias>>
typealias GenericTypeAlias = List<out GenericClass<in TypeAlias>?>?
@JsonClass(generateAdapter = true)
data class GenericClass<T>(val value: T)
@@ -493,3 +534,11 @@ data class GenericClass<T>(val value: T)
// Has to be outside since inline classes are only allowed on top level
@JsonClass(generateAdapter = true)
inline class InlineClass(val i: Int)
typealias A = Int
typealias NullableA = A?
typealias B = NullableA
typealias NullableB = B?
typealias C = NullableA
typealias D = C
typealias E = D