|
16 | 16 |
|
17 | 17 | package org.springframework.core
|
18 | 18 |
|
19 |
| -import java.lang.reflect.Method |
20 |
| - |
| 19 | +import org.junit.Assert.assertEquals |
| 20 | +import org.junit.Assert.assertFalse |
| 21 | +import org.junit.Assert.assertTrue |
21 | 22 | import org.junit.Before
|
22 | 23 | import org.junit.Test
|
23 |
| - |
24 |
| -import org.junit.Assert.* |
| 24 | +import java.lang.reflect.Method |
| 25 | +import java.lang.reflect.TypeVariable |
| 26 | +import kotlin.reflect.full.declaredFunctions |
| 27 | +import kotlin.reflect.jvm.javaMethod |
25 | 28 |
|
26 | 29 | /**
|
27 | 30 | * Tests for Kotlin support in [MethodParameter].
|
28 | 31 | *
|
29 | 32 | * @author Raman Gupta
|
30 | 33 | * @author Sebastien Deleuze
|
31 | 34 | * @author Juergen Hoeller
|
| 35 | + * @author Konrad Kaminski |
32 | 36 | */
|
33 | 37 | class KotlinMethodParameterTests {
|
34 | 38 |
|
@@ -57,11 +61,77 @@ class KotlinMethodParameterTests {
|
57 | 61 | assertFalse(MethodParameter(nonNullableMethod, -1).isOptional())
|
58 | 62 | }
|
59 | 63 |
|
| 64 | + @Test |
| 65 | + fun `Suspending function return type`() { |
| 66 | + assertEquals(Number::class.java, returnParameterType("suspendFun")) |
| 67 | + assertEquals(Number::class.java, returnGenericParameterType("suspendFun")) |
| 68 | + |
| 69 | + assertEquals(Producer::class.java, returnParameterType("suspendFun2")) |
| 70 | + assertEquals("org.springframework.core.Producer<? extends java.lang.Number>", returnGenericParameterTypeName("suspendFun2")) |
| 71 | + |
| 72 | + assertEquals(Wrapper::class.java, returnParameterType("suspendFun3")) |
| 73 | + assertEquals("org.springframework.core.Wrapper<java.lang.Number>", returnGenericParameterTypeName("suspendFun3")) |
| 74 | + |
| 75 | + assertEquals(Consumer::class.java, returnParameterType("suspendFun4")) |
| 76 | + assertEquals("org.springframework.core.Consumer<? super java.lang.Number>", returnGenericParameterTypeName("suspendFun4")) |
| 77 | + |
| 78 | + assertEquals(Producer::class.java, returnParameterType("suspendFun5")) |
| 79 | + assertTrue(returnGenericParameterType("suspendFun5") is TypeVariable<*>) |
| 80 | + assertEquals("org.springframework.core.Producer<? extends java.lang.Number>", returnGenericParameterTypeBoundName("suspendFun5")) |
| 81 | + |
| 82 | + assertEquals(Wrapper::class.java, returnParameterType("suspendFun6")) |
| 83 | + assertTrue(returnGenericParameterType("suspendFun6") is TypeVariable<*>) |
| 84 | + assertEquals("org.springframework.core.Wrapper<java.lang.Number>", returnGenericParameterTypeBoundName("suspendFun6")) |
| 85 | + |
| 86 | + assertEquals(Consumer::class.java, returnParameterType("suspendFun7")) |
| 87 | + assertTrue(returnGenericParameterType("suspendFun7") is TypeVariable<*>) |
| 88 | + assertEquals("org.springframework.core.Consumer<? super java.lang.Number>", returnGenericParameterTypeBoundName("suspendFun7")) |
| 89 | + |
| 90 | + assertEquals(Object::class.java, returnParameterType("suspendFun8")) |
| 91 | + assertEquals(Object::class.java, returnGenericParameterType("suspendFun8")) |
| 92 | + } |
| 93 | + |
| 94 | + private fun returnParameterType(funName: String) = returnMethodParameter(funName).parameterType |
| 95 | + private fun returnGenericParameterType(funName: String) = returnMethodParameter(funName).genericParameterType |
| 96 | + private fun returnGenericParameterTypeName(funName: String) = returnGenericParameterType(funName).typeName |
| 97 | + private fun returnGenericParameterTypeBoundName(funName: String) = (returnGenericParameterType(funName) as TypeVariable<*>).bounds[0].typeName |
| 98 | + |
| 99 | + private fun returnMethodParameter(funName: String) = |
| 100 | + MethodParameter(this::class.declaredFunctions.first { it.name == funName }.javaMethod!!, -1) |
60 | 101 |
|
61 | 102 | @Suppress("unused", "unused_parameter")
|
62 | 103 | fun nullable(p1: String?): Int? = 42
|
63 | 104 |
|
64 | 105 | @Suppress("unused", "unused_parameter")
|
65 | 106 | fun nonNullable(p1: String): Int = 42
|
66 | 107 |
|
| 108 | + @Suppress("unused", "unused_parameter") |
| 109 | + suspend fun suspendFun(p1: String): Number = TODO() |
| 110 | + |
| 111 | + @Suppress("unused", "unused_parameter") |
| 112 | + suspend fun suspendFun2(p1: String): Producer<Number> = TODO() |
| 113 | + |
| 114 | + @Suppress("unused", "unused_parameter") |
| 115 | + suspend fun suspendFun3(p1: String): Wrapper<Number> = TODO() |
| 116 | + |
| 117 | + @Suppress("unused", "unused_parameter") |
| 118 | + suspend fun suspendFun4(p1: String): Consumer<Number> = TODO() |
| 119 | + |
| 120 | + @Suppress("unused", "unused_parameter") |
| 121 | + suspend fun <T: Producer<Number>> suspendFun5(p1: String): T = TODO() |
| 122 | + |
| 123 | + @Suppress("unused", "unused_parameter") |
| 124 | + suspend fun <T: Wrapper<Number>> suspendFun6(p1: String): T = TODO() |
| 125 | + |
| 126 | + @Suppress("unused", "unused_parameter") |
| 127 | + suspend fun <T: Consumer<Number>> suspendFun7(p1: String): T = TODO() |
| 128 | + |
| 129 | + @Suppress("unused", "unused_parameter") |
| 130 | + suspend fun suspendFun8(p1: String): Any? = TODO() |
67 | 131 | }
|
| 132 | + |
| 133 | +interface Producer<out T> |
| 134 | + |
| 135 | +interface Wrapper<T> |
| 136 | + |
| 137 | +interface Consumer<in T> |
0 commit comments