Last active
December 5, 2019 19:53
-
-
Save BramYeh/cfbcfb528506a109f72b5731c21d017d to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.bram.demo.test.models.gson | |
import com.google.gson.GsonBuilder | |
import org.junit.Assert | |
import org.junit.Test | |
class GsonKotlinTest { | |
// Data Class + some property has default value = default value doesn't work. | |
data class DataClass1( | |
val a: String? = "a", | |
val b: String?, | |
val c: String = "c", | |
val d: String | |
) | |
@Test | |
fun testDataClass1() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", DataClass1::class.java) | |
Assert.assertEquals(null, foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals(null, foo.c) | |
Assert.assertEquals(null, foo.d) | |
} | |
// Data Class + all property has default value = default values works. | |
data class DataClass2( | |
val a: String? = "a", | |
val b: String? = "b", | |
val c: String = "c", | |
val d: String = "d" | |
) | |
@Test | |
fun testDataClass2() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", DataClass2::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
} | |
// Class + constructor + some property has default value = default values doesn't work. | |
class Class1( | |
val a: String? = "a", | |
val b: String?, | |
val c: String = "c", | |
val d: String | |
) | |
@Test | |
fun testClass1() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", Class1::class.java) | |
Assert.assertEquals(null, foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals(null, foo.c) | |
Assert.assertEquals(null, foo.d) | |
} | |
// Class + no-args constructor = default values works. | |
class Class2 { | |
val a: String? = "a" | |
val b: String? = null | |
val c: String = "c" | |
var d: String = "d" | |
} | |
@Test | |
fun testClass2() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", Class2::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
} | |
// Class + constructor + all property has default value = default values works. | |
class Class3( | |
val a: String? = "a", | |
val b: String? = null, | |
val c: String = "c", | |
val d: String = "d" | |
) | |
@Test | |
fun testClass3() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", Class3::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
} | |
// Data Class + all property has default value = default values works. | |
data class DataClassDelegate( | |
val a: String? = "a", | |
val b: String? = "b", | |
val c: String = "c", | |
val d: String = "d" | |
) { | |
val e: String by lazy { | |
if (a.isNullOrEmpty()) { | |
"isNull" | |
} else { | |
"isNotNull" | |
} | |
} | |
} | |
@Test | |
fun testDataClassDelegate() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", DataClassDelegate::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
Assert.assertEquals("isNotNull", foo.e) | |
val dDelegate = DataClassDelegate() | |
Assert.assertEquals("a", dDelegate.a) | |
Assert.assertEquals("b", dDelegate.b) | |
Assert.assertEquals("c", dDelegate.c) | |
Assert.assertEquals("d", dDelegate.d) | |
Assert.assertEquals("isNotNull", dDelegate.e) | |
val json = GsonBuilder().create().toJson(dDelegate) | |
Assert.assertEquals("{\"e\$delegate\":{\"_value\":\"isNotNull\"},\"a\":\"a\",\"b\":\"b\",\"c\":\"c\",\"d\":\"d\"}", json) | |
try { | |
GsonBuilder().create().fromJson(json, DataClassDelegate::class.java) | |
Assert.fail() | |
} catch (e: RuntimeException) { | |
Assert.assertEquals("Unable to invoke no-args constructor for interface kotlin.Lazy. Registering an InstanceCreator with Gson for this type may fix this problem.", e.message) | |
} | |
} | |
// Data Class + all property has default value = default values works. | |
class ClassDelegate( | |
val a: String? = "a", | |
val b: String? = "b", | |
val c: String = "c", | |
val d: String = "d" | |
) { | |
val e: String by lazy { | |
if (a.isNullOrEmpty()) { | |
"isNull" | |
} else { | |
"isNotNull" | |
} | |
} | |
} | |
@Test | |
fun testClassDelegate() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", ClassDelegate::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
Assert.assertEquals("isNotNull", foo.e) | |
val delegate = ClassDelegate() | |
Assert.assertEquals("a", delegate.a) | |
Assert.assertEquals("b", delegate.b) | |
Assert.assertEquals("c", delegate.c) | |
Assert.assertEquals("d", delegate.d) | |
Assert.assertEquals("isNotNull", delegate.e) | |
val json = GsonBuilder().create().toJson(delegate) | |
Assert.assertEquals("{\"e\$delegate\":{\"_value\":\"isNotNull\"},\"a\":\"a\",\"b\":\"b\",\"c\":\"c\",\"d\":\"d\"}", json) | |
try { | |
GsonBuilder().create().fromJson(json, ClassDelegate::class.java) | |
Assert.fail() | |
} catch (e: RuntimeException) { | |
Assert.assertEquals("Unable to invoke no-args constructor for interface kotlin.Lazy. Registering an InstanceCreator with Gson for this type may fix this problem.", e.message) | |
} | |
} | |
// Data Class + all property has default value = default values works. | |
data class DataClassDelegateTransient( | |
val a: String? = "a", | |
val b: String? = "b", | |
val c: String = "c", | |
val d: String = "d" | |
) { | |
@delegate:Transient | |
val e: String by lazy { | |
if (a.isNullOrEmpty()) { | |
"isNull" | |
} else { | |
"isNotNull" | |
} | |
} | |
} | |
@Test | |
fun testDataClassDelegateTransient() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", DataClassDelegateTransient::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
Assert.assertEquals("isNotNull", foo.e) | |
val dDelegateTransient = DataClassDelegateTransient() | |
Assert.assertEquals("a", dDelegateTransient.a) | |
Assert.assertEquals("b", dDelegateTransient.b) | |
Assert.assertEquals("c", dDelegateTransient.c) | |
Assert.assertEquals("d", dDelegateTransient.d) | |
Assert.assertEquals("isNotNull", dDelegateTransient.e) | |
val json = GsonBuilder().create().toJson(dDelegateTransient) | |
Assert.assertEquals("{\"a\":\"a\",\"b\":\"b\",\"c\":\"c\",\"d\":\"d\"}", json) | |
val dDelegateTransientPlus = GsonBuilder().create().fromJson(json, DataClassDelegateTransient::class.java) | |
Assert.assertEquals("a", dDelegateTransientPlus.a) | |
Assert.assertEquals("b", dDelegateTransientPlus.b) | |
Assert.assertEquals("c", dDelegateTransientPlus.c) | |
Assert.assertEquals("d", dDelegateTransientPlus.d) | |
Assert.assertEquals("isNotNull", dDelegateTransientPlus.e) | |
} | |
// Data Class + all property has default value = default values works. | |
class ClassDelegateTransient( | |
val a: String? = "a", | |
val b: String? = "b", | |
val c: String = "c", | |
val d: String = "d" | |
) { | |
@delegate:Transient | |
val e: String by lazy { | |
if (a.isNullOrEmpty()) { | |
"isNull" | |
} else { | |
"isNotNull" | |
} | |
} | |
} | |
@Test | |
fun testClassDelegateTransient() { | |
val foo = GsonBuilder().create().fromJson("""{"b"="foo"}""", ClassDelegateTransient::class.java) | |
Assert.assertEquals("a", foo.a) | |
Assert.assertEquals("foo", foo.b) | |
Assert.assertEquals("c", foo.c) | |
Assert.assertEquals("d", foo.d) | |
Assert.assertEquals("isNotNull", foo.e) | |
val delegateTransient = ClassDelegateTransient() | |
Assert.assertEquals("a", delegateTransient.a) | |
Assert.assertEquals("b", delegateTransient.b) | |
Assert.assertEquals("c", delegateTransient.c) | |
Assert.assertEquals("d", delegateTransient.d) | |
Assert.assertEquals("isNotNull", delegateTransient.e) | |
val json = GsonBuilder().create().toJson(delegateTransient) | |
Assert.assertEquals("{\"a\":\"a\",\"b\":\"b\",\"c\":\"c\",\"d\":\"d\"}", json) | |
val delegateTransientPlus = GsonBuilder().create().fromJson(json, ClassDelegateTransient::class.java) | |
Assert.assertEquals("a", delegateTransientPlus.a) | |
Assert.assertEquals("b", delegateTransientPlus.b) | |
Assert.assertEquals("c", delegateTransientPlus.c) | |
Assert.assertEquals("d", delegateTransientPlus.d) | |
Assert.assertEquals("isNotNull", delegateTransientPlus.e) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment