Skip to content

Instantly share code, notes, and snippets.

@BramYeh
Last active December 5, 2019 19:53
Show Gist options
  • Save BramYeh/cfbcfb528506a109f72b5731c21d017d to your computer and use it in GitHub Desktop.
Save BramYeh/cfbcfb528506a109f72b5731c21d017d to your computer and use it in GitHub Desktop.
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