diff --git a/src/main/kotlin/com/mapk/annotations/KUseDefaultArgument.kt b/src/main/kotlin/com/mapk/annotations/KUseDefaultArgument.kt new file mode 100644 index 0000000..9df1c33 --- /dev/null +++ b/src/main/kotlin/com/mapk/annotations/KUseDefaultArgument.kt @@ -0,0 +1,5 @@ +package com.mapk.annotations + +@Target(AnnotationTarget.VALUE_PARAMETER) +@Retention(AnnotationRetention.RUNTIME) +annotation class KUseDefaultArgument diff --git a/src/main/kotlin/com/mapk/core/Functions.kt b/src/main/kotlin/com/mapk/core/Functions.kt index ef29771..2ec6302 100644 --- a/src/main/kotlin/com/mapk/core/Functions.kt +++ b/src/main/kotlin/com/mapk/core/Functions.kt @@ -1,6 +1,8 @@ package com.mapk.core import com.mapk.annotations.KParameterAlias +import com.mapk.annotations.KUseDefaultArgument +import java.lang.IllegalArgumentException import kotlin.reflect.KParameter import kotlin.reflect.full.findAnnotation @@ -8,3 +10,16 @@ import kotlin.reflect.full.findAnnotation * パラメータからエイリアスもしくはプロパティ名を取得する関数 */ fun KParameter.getAliasOrName(): String? = findAnnotation()?.value ?: name + +/** + * デフォルト引数を用いるかチェックする関数 + */ +fun KParameter.isUseDefaultArgument(): Boolean { + if (annotations.any { it is KUseDefaultArgument }) { + if (!isOptional) { + throw IllegalArgumentException("Find KUseDefaultArgument, but it's not has default argument.") + } + return true + } + return false +} diff --git a/src/test/kotlin/com/mapk/core/FunctionsTest.kt b/src/test/kotlin/com/mapk/core/FunctionsTest.kt new file mode 100644 index 0000000..28a1287 --- /dev/null +++ b/src/test/kotlin/com/mapk/core/FunctionsTest.kt @@ -0,0 +1,80 @@ +package com.mapk.core + +import com.mapk.annotations.KParameterAlias +import com.mapk.annotations.KUseDefaultArgument +import io.mockk.every +import io.mockk.mockk +import java.lang.IllegalArgumentException +import kotlin.reflect.KParameter +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +@DisplayName("関数類のテスト") +class FunctionsTest { + lateinit var parameter: KParameter + + @BeforeEach + fun beforeEach() { + parameter = mockk() + } + + @Nested + @DisplayName("エイリアス関連のテスト") + inner class GetAliasOrNameTest { + @Test + @DisplayName("エイリアス無し") + fun noAlias() { + val paramName = "mocked name" + every { parameter.annotations } returns emptyList() + every { parameter.name } returns paramName + + assertEquals(paramName, parameter.getAliasOrName()) + } + + @Test + @DisplayName("エイリアス有り") + fun withAlias() { + val aliasedName = "aliased name" + + val alias = mockk() + every { alias.value } returns aliasedName + + every { parameter.annotations } returns listOf(alias) + + assertEquals(aliasedName, parameter.getAliasOrName()) + } + } + + @Nested + @DisplayName("デフォルト引数を用いるかの判定関数のテスト") + inner class IsUseDefaultArgumentTest { + @Test + @DisplayName("デフォルト引数を用いない場合") + fun noDefaultArgument() { + every { parameter.annotations } returns emptyList() + assertFalse(parameter.isUseDefaultArgument()) + } + + @Test + @DisplayName("デフォルト引数を用いる指定が有るが、実際はデフォルト引数が設定されていない場合") + fun isIncorrect() { + every { parameter.annotations } returns listOf(mockk()) + every { parameter.isOptional } returns false + assertThrows { parameter.isUseDefaultArgument() } + } + + @Test + @DisplayName("正常入力") + fun isCorrect() { + every { parameter.annotations } returns listOf(mockk()) + every { parameter.isOptional } returns true + assertTrue(parameter.isUseDefaultArgument()) + } + } +}