Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions src/main/kotlin/com/mapk/kmapper/BoundParameterForMap.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,51 +17,51 @@ internal sealed class BoundParameterForMap<S> {

abstract fun map(src: S): Any?

private class Plain<S : Any>(
internal class Plain<S : Any>(
override val name: String,
override val propertyGetter: Method
) : BoundParameterForMap<S>() {
override fun map(src: S): Any? = propertyGetter.invoke(src)
}

private class UseConverter<S : Any>(
internal class UseConverter<S : Any>(
override val name: String,
override val propertyGetter: Method,
private val converter: KFunction<*>
) : BoundParameterForMap<S>() {
override fun map(src: S): Any? = converter.call(propertyGetter.invoke(src))
}

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

private class UseBoundKMapper<S : Any, T : Any>(
internal class UseBoundKMapper<S : Any, T : Any>(
override val name: String,
override val propertyGetter: Method,
private val boundKMapper: BoundKMapper<T, *>
) : BoundParameterForMap<S>() {
override fun map(src: S): Any? = boundKMapper.map(propertyGetter.invoke(src) as T)
override fun map(src: S): Any? = (propertyGetter.invoke(src))?.let { boundKMapper.map(it as T) }
}

private class ToEnum<S : Any>(
internal class ToEnum<S : Any>(
override val name: String,
override val propertyGetter: Method,
private val paramClazz: Class<*>
) : BoundParameterForMap<S>() {
override fun map(src: S): Any? = EnumMapper.getEnum(paramClazz, propertyGetter.invoke(src) as String)
override fun map(src: S): Any? = EnumMapper.getEnum(paramClazz, propertyGetter.invoke(src) as String?)
}

private class ToString<S : Any>(
internal class ToString<S : Any>(
override val name: String,
override val propertyGetter: Method
) : BoundParameterForMap<S>() {
override fun map(src: S): String? = propertyGetter.invoke(src).toString()
override fun map(src: S): String? = propertyGetter.invoke(src)?.toString()
}

companion object {
Expand Down
148 changes: 148 additions & 0 deletions src/test/kotlin/com/mapk/kmapper/BoundParameterForMapTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package com.mapk.kmapper

import com.mapk.kmapper.testcommons.JvmLanguage
import kotlin.reflect.full.memberProperties
import kotlin.reflect.jvm.javaGetter
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNull
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test

@DisplayName("BoundKMapperのパラメータテスト")
class BoundParameterForMapTest {
data class IntSrc(val int: Int?)
data class StringSrc(val str: String?)
data class InnerSrc(val int: Int?, val str: String?)
data class ObjectSrc(val obj: Any?)

data class ObjectDst(val int: Int?, val str: String?)

@Nested
@DisplayName("Plainのテスト")
inner class PlainTest {
private val parameter =
BoundParameterForMap.Plain<StringSrc>("", StringSrc::class.memberProperties.single().javaGetter!!)

@Test
@DisplayName("not null")
fun isNotNull() {
val result = parameter.map(StringSrc("sss"))
assertEquals("sss", result)
}

@Test
@DisplayName("null")
fun isNull() {
assertNull(parameter.map(StringSrc(null)))
}
}

@Nested
@DisplayName("UseConverterのテスト")
inner class UseConverterTest {
// アクセシビリティの問題で公開状態に設定
@Suppress("MemberVisibilityCanBePrivate")
fun makeTwiceOrNull(int: Int?) = int?.let { it * 2 }

private val parameter = BoundParameterForMap.UseConverter<IntSrc>(
"", IntSrc::class.memberProperties.single().javaGetter!!, this::makeTwiceOrNull
)

@Test
@DisplayName("not null")
fun isNotNull() {
val result = parameter.map(IntSrc(1))
assertEquals(2, result)
}

@Test
@DisplayName("null")
fun isNull() {
assertNull(parameter.map(IntSrc(null)))
}
}

@Nested
@DisplayName("UseKMapperのテスト")
inner class UseKMapperTest {
private val parameter = BoundParameterForMap.UseKMapper<ObjectSrc>(
"", ObjectSrc::class.memberProperties.single().javaGetter!!, KMapper(::ObjectDst)
)

@Test
@DisplayName("not null")
fun isNotNull() {
val result = parameter.map(ObjectSrc(mapOf("int" to 0, "str" to null)))
assertEquals(ObjectDst(0, null), result)
}

@Test
@DisplayName("null")
fun isNull() {
assertNull(parameter.map(ObjectSrc(null)))
}
}

@Nested
@DisplayName("UseBoundKMapperのテスト")
inner class UseBoundKMapperTest {
private val parameter = BoundParameterForMap.UseBoundKMapper<ObjectSrc, InnerSrc>(
"", ObjectSrc::class.memberProperties.single().javaGetter!!, BoundKMapper(::ObjectDst, InnerSrc::class)
)

@Test
@DisplayName("not null")
fun isNotNull() {
val result = parameter.map(ObjectSrc(InnerSrc(null, "str")))
assertEquals(ObjectDst(null, "str"), result)
}

@Test
@DisplayName("null")
fun isNull() {
assertNull(parameter.map(ObjectSrc(null)))
}
}

@Nested
@DisplayName("ToEnumのテスト")
inner class ToEnumTest {
private val parameter = BoundParameterForMap.ToEnum<StringSrc>(
"", StringSrc::class.memberProperties.single().javaGetter!!, JvmLanguage::class.java
)

@Test
@DisplayName("not null")
fun isNotNull() {
val result = parameter.map(StringSrc("Java"))
assertEquals(JvmLanguage.Java, result)
}

@Test
@DisplayName("null")
fun isNull() {
assertNull(parameter.map(StringSrc(null)))
}
}

@Nested
@DisplayName("ToStringのテスト")
inner class ToStringTest {
private val parameter =
BoundParameterForMap.ToString<IntSrc>("", IntSrc::class.memberProperties.single().javaGetter!!)

@Test
@DisplayName("not null")
fun isNotNull() {
val result = parameter.map(IntSrc(1))
assertEquals("1", result)
}

@Test
@DisplayName("null")
fun isNull() {
assertNull(parameter.map(IntSrc(null)))
}
}
}
5 changes: 1 addition & 4 deletions src/test/kotlin/com/mapk/kmapper/EnumMappingTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@

package com.mapk.kmapper

import com.mapk.kmapper.testcommons.JvmLanguage
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.EnumSource

enum class JvmLanguage {
Java, Scala, Groovy, Kotlin
}

private class EnumMappingDst(val language: JvmLanguage?)

@DisplayName("文字列 -> Enumのマッピングテスト")
Expand Down
5 changes: 5 additions & 0 deletions src/test/kotlin/com/mapk/kmapper/testcommons/JvmLanguage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.mapk.kmapper.testcommons

enum class JvmLanguage {
Java, Scala, Groovy, Kotlin
}