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
5 changes: 5 additions & 0 deletions src/main/kotlin/com/mapk/annotations/KUseDefaultArgument.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.mapk.annotations

@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.RUNTIME)
annotation class KUseDefaultArgument
15 changes: 15 additions & 0 deletions src/main/kotlin/com/mapk/core/Functions.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,25 @@
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

/**
* パラメータからエイリアスもしくはプロパティ名を取得する関数
*/
fun KParameter.getAliasOrName(): String? = findAnnotation<KParameterAlias>()?.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
}
80 changes: 80 additions & 0 deletions src/test/kotlin/com/mapk/core/FunctionsTest.kt
Original file line number Diff line number Diff line change
@@ -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<KParameterAlias>()
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<KUseDefaultArgument>())
every { parameter.isOptional } returns false
assertThrows<IllegalArgumentException> { parameter.isUseDefaultArgument() }
}

@Test
@DisplayName("正常入力")
fun isCorrect() {
every { parameter.annotations } returns listOf(mockk<KUseDefaultArgument>())
every { parameter.isOptional } returns true
assertTrue(parameter.isUseDefaultArgument())
}
}
}