Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit a97c74e

Browse files
authored
Merge pull request #36 from k163377/fixes_and_tests
Fixes BoundKMapper and add tests.
2 parents 2378aba + 5b4175f commit a97c74e

File tree

4 files changed

+164
-14
lines changed

4 files changed

+164
-14
lines changed

src/main/kotlin/com/mapk/kmapper/BoundParameterForMap.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,51 +17,51 @@ internal sealed class BoundParameterForMap<S> {
1717

1818
abstract fun map(src: S): Any?
1919

20-
private class Plain<S : Any>(
20+
internal class Plain<S : Any>(
2121
override val name: String,
2222
override val propertyGetter: Method
2323
) : BoundParameterForMap<S>() {
2424
override fun map(src: S): Any? = propertyGetter.invoke(src)
2525
}
2626

27-
private class UseConverter<S : Any>(
27+
internal class UseConverter<S : Any>(
2828
override val name: String,
2929
override val propertyGetter: Method,
3030
private val converter: KFunction<*>
3131
) : BoundParameterForMap<S>() {
3232
override fun map(src: S): Any? = converter.call(propertyGetter.invoke(src))
3333
}
3434

35-
private class UseKMapper<S : Any>(
35+
internal class UseKMapper<S : Any>(
3636
override val name: String,
3737
override val propertyGetter: Method,
3838
private val kMapper: KMapper<*>
3939
) : BoundParameterForMap<S>() {
4040
// 1引数で呼び出すとMap/Pairが適切に処理されないため、2引数目にダミーを噛ませている
41-
override fun map(src: S): Any? = kMapper.map(propertyGetter.invoke(src), PARAMETER_DUMMY)
41+
override fun map(src: S): Any? = propertyGetter.invoke(src)?.let { kMapper.map(it, PARAMETER_DUMMY) }
4242
}
4343

44-
private class UseBoundKMapper<S : Any, T : Any>(
44+
internal class UseBoundKMapper<S : Any, T : Any>(
4545
override val name: String,
4646
override val propertyGetter: Method,
4747
private val boundKMapper: BoundKMapper<T, *>
4848
) : BoundParameterForMap<S>() {
49-
override fun map(src: S): Any? = boundKMapper.map(propertyGetter.invoke(src) as T)
49+
override fun map(src: S): Any? = (propertyGetter.invoke(src))?.let { boundKMapper.map(it as T) }
5050
}
5151

52-
private class ToEnum<S : Any>(
52+
internal class ToEnum<S : Any>(
5353
override val name: String,
5454
override val propertyGetter: Method,
5555
private val paramClazz: Class<*>
5656
) : BoundParameterForMap<S>() {
57-
override fun map(src: S): Any? = EnumMapper.getEnum(paramClazz, propertyGetter.invoke(src) as String)
57+
override fun map(src: S): Any? = EnumMapper.getEnum(paramClazz, propertyGetter.invoke(src) as String?)
5858
}
5959

60-
private class ToString<S : Any>(
60+
internal class ToString<S : Any>(
6161
override val name: String,
6262
override val propertyGetter: Method
6363
) : BoundParameterForMap<S>() {
64-
override fun map(src: S): String? = propertyGetter.invoke(src).toString()
64+
override fun map(src: S): String? = propertyGetter.invoke(src)?.toString()
6565
}
6666

6767
companion object {
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package com.mapk.kmapper
2+
3+
import com.mapk.kmapper.testcommons.JvmLanguage
4+
import kotlin.reflect.full.memberProperties
5+
import kotlin.reflect.jvm.javaGetter
6+
import org.junit.jupiter.api.Assertions.assertEquals
7+
import org.junit.jupiter.api.Assertions.assertNull
8+
import org.junit.jupiter.api.DisplayName
9+
import org.junit.jupiter.api.Nested
10+
import org.junit.jupiter.api.Test
11+
12+
@DisplayName("BoundKMapperのパラメータテスト")
13+
class BoundParameterForMapTest {
14+
data class IntSrc(val int: Int?)
15+
data class StringSrc(val str: String?)
16+
data class InnerSrc(val int: Int?, val str: String?)
17+
data class ObjectSrc(val obj: Any?)
18+
19+
data class ObjectDst(val int: Int?, val str: String?)
20+
21+
@Nested
22+
@DisplayName("Plainのテスト")
23+
inner class PlainTest {
24+
private val parameter =
25+
BoundParameterForMap.Plain<StringSrc>("", StringSrc::class.memberProperties.single().javaGetter!!)
26+
27+
@Test
28+
@DisplayName("not null")
29+
fun isNotNull() {
30+
val result = parameter.map(StringSrc("sss"))
31+
assertEquals("sss", result)
32+
}
33+
34+
@Test
35+
@DisplayName("null")
36+
fun isNull() {
37+
assertNull(parameter.map(StringSrc(null)))
38+
}
39+
}
40+
41+
@Nested
42+
@DisplayName("UseConverterのテスト")
43+
inner class UseConverterTest {
44+
// アクセシビリティの問題で公開状態に設定
45+
@Suppress("MemberVisibilityCanBePrivate")
46+
fun makeTwiceOrNull(int: Int?) = int?.let { it * 2 }
47+
48+
private val parameter = BoundParameterForMap.UseConverter<IntSrc>(
49+
"", IntSrc::class.memberProperties.single().javaGetter!!, this::makeTwiceOrNull
50+
)
51+
52+
@Test
53+
@DisplayName("not null")
54+
fun isNotNull() {
55+
val result = parameter.map(IntSrc(1))
56+
assertEquals(2, result)
57+
}
58+
59+
@Test
60+
@DisplayName("null")
61+
fun isNull() {
62+
assertNull(parameter.map(IntSrc(null)))
63+
}
64+
}
65+
66+
@Nested
67+
@DisplayName("UseKMapperのテスト")
68+
inner class UseKMapperTest {
69+
private val parameter = BoundParameterForMap.UseKMapper<ObjectSrc>(
70+
"", ObjectSrc::class.memberProperties.single().javaGetter!!, KMapper(::ObjectDst)
71+
)
72+
73+
@Test
74+
@DisplayName("not null")
75+
fun isNotNull() {
76+
val result = parameter.map(ObjectSrc(mapOf("int" to 0, "str" to null)))
77+
assertEquals(ObjectDst(0, null), result)
78+
}
79+
80+
@Test
81+
@DisplayName("null")
82+
fun isNull() {
83+
assertNull(parameter.map(ObjectSrc(null)))
84+
}
85+
}
86+
87+
@Nested
88+
@DisplayName("UseBoundKMapperのテスト")
89+
inner class UseBoundKMapperTest {
90+
private val parameter = BoundParameterForMap.UseBoundKMapper<ObjectSrc, InnerSrc>(
91+
"", ObjectSrc::class.memberProperties.single().javaGetter!!, BoundKMapper(::ObjectDst, InnerSrc::class)
92+
)
93+
94+
@Test
95+
@DisplayName("not null")
96+
fun isNotNull() {
97+
val result = parameter.map(ObjectSrc(InnerSrc(null, "str")))
98+
assertEquals(ObjectDst(null, "str"), result)
99+
}
100+
101+
@Test
102+
@DisplayName("null")
103+
fun isNull() {
104+
assertNull(parameter.map(ObjectSrc(null)))
105+
}
106+
}
107+
108+
@Nested
109+
@DisplayName("ToEnumのテスト")
110+
inner class ToEnumTest {
111+
private val parameter = BoundParameterForMap.ToEnum<StringSrc>(
112+
"", StringSrc::class.memberProperties.single().javaGetter!!, JvmLanguage::class.java
113+
)
114+
115+
@Test
116+
@DisplayName("not null")
117+
fun isNotNull() {
118+
val result = parameter.map(StringSrc("Java"))
119+
assertEquals(JvmLanguage.Java, result)
120+
}
121+
122+
@Test
123+
@DisplayName("null")
124+
fun isNull() {
125+
assertNull(parameter.map(StringSrc(null)))
126+
}
127+
}
128+
129+
@Nested
130+
@DisplayName("ToStringのテスト")
131+
inner class ToStringTest {
132+
private val parameter =
133+
BoundParameterForMap.ToString<IntSrc>("", IntSrc::class.memberProperties.single().javaGetter!!)
134+
135+
@Test
136+
@DisplayName("not null")
137+
fun isNotNull() {
138+
val result = parameter.map(IntSrc(1))
139+
assertEquals("1", result)
140+
}
141+
142+
@Test
143+
@DisplayName("null")
144+
fun isNull() {
145+
assertNull(parameter.map(IntSrc(null)))
146+
}
147+
}
148+
}

src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@
22

33
package com.mapk.kmapper
44

5+
import com.mapk.kmapper.testcommons.JvmLanguage
56
import org.junit.jupiter.api.Assertions.assertEquals
67
import org.junit.jupiter.api.DisplayName
78
import org.junit.jupiter.api.Nested
89
import org.junit.jupiter.params.ParameterizedTest
910
import org.junit.jupiter.params.provider.EnumSource
1011

11-
enum class JvmLanguage {
12-
Java, Scala, Groovy, Kotlin
13-
}
14-
1512
private class EnumMappingDst(val language: JvmLanguage?)
1613

1714
@DisplayName("文字列 -> Enumのマッピングテスト")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.mapk.kmapper.testcommons
2+
3+
enum class JvmLanguage {
4+
Java, Scala, Groovy, Kotlin
5+
}

0 commit comments

Comments
 (0)