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

Commit 6418203

Browse files
authored
Merge pull request #42 from k163377/fix_converter_nullability
Fix converter nullability.
2 parents 08b5947 + 2303efe commit 6418203

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

src/main/kotlin/com/mapk/conversion/KConvert.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ annotation class KConvertBy(val converters: Array<KClass<out AbstractKConverter<
99

1010
abstract class AbstractKConverter<A : Annotation, S : Any, D : Any>(protected val annotation: A) {
1111
abstract val srcClass: KClass<S>
12-
abstract fun convert(source: S?): D?
12+
abstract fun convert(source: S): D?
1313
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ internal sealed class BoundParameterForMap<S> {
2929
override val propertyGetter: Method,
3030
private val converter: KFunction<*>
3131
) : BoundParameterForMap<S>() {
32-
override fun map(src: S): Any? = converter.call(propertyGetter.invoke(src))
32+
override fun map(src: S): Any? = propertyGetter.invoke(src)?.let { converter.call(it) }
3333
}
3434

3535
internal class UseKMapper<S : Any>(

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

+42-7
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@ import java.math.BigInteger
88
import kotlin.reflect.KClass
99
import kotlin.reflect.jvm.jvmName
1010
import org.junit.jupiter.api.Assertions.assertEquals
11+
import org.junit.jupiter.api.Assertions.assertNull
1112
import org.junit.jupiter.api.DisplayName
1213
import org.junit.jupiter.api.Nested
14+
import org.junit.jupiter.api.Test
15+
import org.junit.jupiter.api.assertDoesNotThrow
1316
import org.junit.jupiter.params.ParameterizedTest
1417
import org.junit.jupiter.params.provider.EnumSource
1518
import org.junit.jupiter.params.provider.ValueSource
@@ -36,7 +39,7 @@ class ConversionTest {
3639
}
3740

3841
override val srcClass = String::class
39-
override fun convert(source: String?): Number? = source?.let(converter)
42+
override fun convert(source: String): Number? = source.let(converter)
4043
}
4144

4245
class FromNumber(annotation: ToNumber) : AbstractKConverter<ToNumber, Number, Number>(annotation) {
@@ -53,12 +56,13 @@ class ConversionTest {
5356
}
5457

5558
override val srcClass = Number::class
56-
override fun convert(source: Number?): Number? = source?.let(converter)
59+
override fun convert(source: Number): Number? = source.let(converter)
5760
}
5861

59-
data class Dst(@ToNumber(BigDecimal::class) val number: BigDecimal)
62+
data class Dst(@ToNumber(BigDecimal::class) val number: BigDecimal?)
6063
data class NumberSrc(val number: Number)
6164
data class StringSrc(val number: String)
65+
object NullSrc { val number: Number? = null }
6266

6367
enum class NumberSource(val values: Array<Number>) {
6468
Doubles(arrayOf(1.0, -2.0, 3.5)),
@@ -72,12 +76,14 @@ class ConversionTest {
7276
@Nested
7377
@DisplayName("KMapper")
7478
inner class KMapperTest {
79+
private val mapper = KMapper(::Dst)
80+
7581
@ParameterizedTest
7682
@EnumSource(NumberSource::class)
7783
@DisplayName("Numberソース")
7884
fun fromNumber(numbers: NumberSource) {
7985
numbers.values.forEach {
80-
val actual = KMapper(::Dst).map(NumberSrc(it))
86+
val actual = mapper.map(NumberSrc(it))
8187
assertEquals(0, BigDecimal.valueOf(it.toDouble()).compareTo(actual.number))
8288
}
8389
}
@@ -86,20 +92,31 @@ class ConversionTest {
8692
@ValueSource(strings = ["100", "2.0", "-500"])
8793
@DisplayName("Stringソース")
8894
fun fromString(str: String) {
89-
val actual = KMapper(::Dst).map(StringSrc(str))
95+
val actual = mapper.map(StringSrc(str))
9096
assertEquals(0, BigDecimal(str).compareTo(actual.number))
9197
}
98+
99+
@Test
100+
@DisplayName("nullを入れた際に変換処理に入らないことのテスト")
101+
fun fromNull() {
102+
assertDoesNotThrow {
103+
val actual = mapper.map(NullSrc)
104+
assertNull(actual.number)
105+
}
106+
}
92107
}
93108

94109
@Nested
95110
@DisplayName("PlainKMapper")
96111
inner class PlainKMapperTest {
112+
private val mapper = PlainKMapper(::Dst)
113+
97114
@ParameterizedTest
98115
@EnumSource(NumberSource::class)
99116
@DisplayName("Numberソース")
100117
fun fromNumber(numbers: NumberSource) {
101118
numbers.values.forEach {
102-
val actual = PlainKMapper(::Dst).map(NumberSrc(it))
119+
val actual = mapper.map(NumberSrc(it))
103120
assertEquals(0, BigDecimal.valueOf(it.toDouble()).compareTo(actual.number))
104121
}
105122
}
@@ -108,9 +125,18 @@ class ConversionTest {
108125
@ValueSource(strings = ["100", "2.0", "-500"])
109126
@DisplayName("Stringソース")
110127
fun fromString(str: String) {
111-
val actual = PlainKMapper(::Dst).map(StringSrc(str))
128+
val actual = mapper.map(StringSrc(str))
112129
assertEquals(0, BigDecimal(str).compareTo(actual.number))
113130
}
131+
132+
@Test
133+
@DisplayName("nullを入れた際に変換処理に入らないことのテスト")
134+
fun fromNull() {
135+
assertDoesNotThrow {
136+
val actual = mapper.map(NullSrc)
137+
assertNull(actual.number)
138+
}
139+
}
114140
}
115141

116142
@Nested
@@ -133,5 +159,14 @@ class ConversionTest {
133159
val actual = BoundKMapper<StringSrc, Dst>().map(StringSrc(str))
134160
assertEquals(0, BigDecimal(str).compareTo(actual.number))
135161
}
162+
163+
@Test
164+
@DisplayName("nullを入れた際に変換処理に入らないことのテスト")
165+
fun fromNull() {
166+
assertDoesNotThrow {
167+
val actual = BoundKMapper<NullSrc, Dst>(::Dst).map(NullSrc)
168+
assertNull(actual.number)
169+
}
170+
}
136171
}
137172
}

0 commit comments

Comments
 (0)