|
17 | 17 |
|
18 | 18 | import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
|
19 | 19 |
|
| 20 | +import java.util.List; |
20 | 21 | import java.util.Set;
|
21 | 22 | import java.util.stream.Stream;
|
22 | 23 |
|
|
26 | 27 | import org.junit.jupiter.params.provider.MethodSource;
|
27 | 28 | import org.springframework.core.MethodParameter;
|
28 | 29 | import org.springframework.core.ResolvableType;
|
| 30 | +import org.springframework.javapoet.ClassName; |
29 | 31 | import org.springframework.javapoet.ParameterizedTypeName;
|
30 | 32 | import org.springframework.javapoet.TypeName;
|
31 | 33 | import org.springframework.javapoet.TypeVariableName;
|
@@ -63,30 +65,90 @@ void classNames(ResolvableType resolvableType, TypeName expected) {
|
63 | 65 | assertThat(TypeNames.className(resolvableType)).isEqualTo(expected);
|
64 | 66 | }
|
65 | 67 |
|
66 |
| - @Test |
67 |
| - void typeNameQuirksForMethodParameters() { |
| 68 | + @Test // GH-3374 |
| 69 | + void resolvedTypeNamesWithoutGenerics() { |
| 70 | + |
| 71 | + ResolvableType resolvableType = ResolvableType.forClass(List.class); |
| 72 | + assertThat(TypeNames.resolvedTypeName(resolvableType)).extracting(TypeName::toString).isEqualTo("java.util.List"); |
| 73 | + } |
| 74 | + |
| 75 | + @Test // GH-3374 |
| 76 | + void resolvedTypeNamesForMethodParameters() { |
68 | 77 |
|
69 | 78 | ReflectionUtils.doWithMethods(Concrete.class, method -> {
|
70 | 79 | if (!method.getName().contains("baseMethod")) {
|
71 | 80 | return;
|
72 | 81 | }
|
73 | 82 |
|
74 |
| - MethodParameter methodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); |
75 |
| - ResolvableType resolvableType = ResolvableType.forMethodParameter(methodParameter); |
| 83 | + MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); |
| 84 | + ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter); |
| 85 | + assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("T")); |
| 86 | + assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(MyType.class)); |
| 87 | + |
| 88 | + MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1) |
| 89 | + .withContainingClass(Concrete.class); |
| 90 | + ResolvableType resolvedCollectionParameterType = ResolvableType |
| 91 | + .forMethodParameter(refiedCollectionMethodParameter); |
| 92 | + assertThat(TypeNames.typeName(resolvedCollectionParameterType)) |
| 93 | + .isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T"))); |
| 94 | + assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType)) |
| 95 | + .isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class)); |
| 96 | + |
| 97 | + MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class); |
| 98 | + ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter); |
| 99 | + assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("T[]"); |
| 100 | + assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString) |
| 101 | + .isEqualTo("org.springframework.data.javapoet.TypeNamesUnitTests.MyType[]"); |
| 102 | + |
| 103 | + ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); |
| 104 | + assertThat(TypeNames.typeName(resolvedReturnType)) |
| 105 | + .isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T"))); |
| 106 | + assertThat(TypeNames.resolvedTypeName(resolvedReturnType)) |
| 107 | + .isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class)); |
| 108 | + }); |
| 109 | + |
| 110 | + ReflectionUtils.doWithMethods(Concrete.class, method -> { |
| 111 | + if (!method.getName().contains("otherMethod")) { |
| 112 | + return; |
| 113 | + } |
76 | 114 |
|
77 |
| - assertThat(TypeNames.typeName(resolvableType)).isEqualTo(TypeVariableName.get("T")); |
78 |
| - assertThat(TypeNames.resolvedTypeName(resolvableType)).isEqualTo(TypeName.get(MyType.class)); |
| 115 | + MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); |
| 116 | + ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter); |
| 117 | + assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("RT")); |
| 118 | + assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(Object.class)); |
| 119 | + |
| 120 | + MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1) |
| 121 | + .withContainingClass(Concrete.class); |
| 122 | + ResolvableType resolvedCollectionParameterType = ResolvableType |
| 123 | + .forMethodParameter(refiedCollectionMethodParameter); |
| 124 | + assertThat(TypeNames.typeName(resolvedCollectionParameterType)) |
| 125 | + .isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("RT"))); |
| 126 | + assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType)) |
| 127 | + .isEqualTo(ClassName.get(java.util.List.class)); |
| 128 | + |
| 129 | + MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class); |
| 130 | + ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter); |
| 131 | + assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("RT[]"); |
| 132 | + assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString) |
| 133 | + .isEqualTo("java.lang.Object[]"); |
| 134 | + |
| 135 | + ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); |
| 136 | + assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo("RT"); |
| 137 | + assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(TypeName.get(Object.class)); |
79 | 138 | });
|
80 | 139 | }
|
81 | 140 |
|
82 | 141 | interface GenericBase<T> {
|
83 |
| - java.util.List<T> baseMethod(T arg0); |
| 142 | + |
| 143 | + java.util.List<T> baseMethod(T arg0, java.util.List<T> arg1, T... arg2); |
| 144 | + |
| 145 | + <RT> RT otherMethod(RT arg0, java.util.List<RT> arg1, RT... arg2); |
84 | 146 | }
|
85 | 147 |
|
86 | 148 | interface Concrete extends GenericBase<MyType> {
|
87 | 149 |
|
88 | 150 | }
|
89 | 151 |
|
90 |
| - class MyType {} |
| 152 | + static class MyType {} |
91 | 153 |
|
92 | 154 | }
|
0 commit comments