|  | 
| 15 | 15 |  */ | 
| 16 | 16 | package org.springframework.data.javapoet; | 
| 17 | 17 | 
 | 
| 18 |  | -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; | 
|  | 18 | +import static org.assertj.core.api.AssertionsForInterfaceTypes.*; | 
| 19 | 19 | 
 | 
|  | 20 | +import java.lang.reflect.Method; | 
|  | 21 | +import java.util.ArrayList; | 
| 20 | 22 | import java.util.List; | 
| 21 | 23 | import java.util.Set; | 
| 22 | 24 | import java.util.stream.Stream; | 
|  | 
| 25 | 27 | import org.junit.jupiter.params.ParameterizedTest; | 
| 26 | 28 | import org.junit.jupiter.params.provider.Arguments; | 
| 27 | 29 | import org.junit.jupiter.params.provider.MethodSource; | 
|  | 30 | + | 
| 28 | 31 | import org.springframework.core.MethodParameter; | 
| 29 | 32 | import org.springframework.core.ResolvableType; | 
| 30 | 33 | import org.springframework.data.geo.Distance; | 
|  | 
| 37 | 40 | import org.springframework.util.ReflectionUtils; | 
| 38 | 41 | 
 | 
| 39 | 42 | /** | 
|  | 43 | + * Tests for {@link TypeNames}. | 
|  | 44 | + * | 
| 40 | 45 |  * @author Christoph Strobl | 
|  | 46 | + * @author Mark Paluch | 
| 41 | 47 |  */ | 
| 42 | 48 | class TypeNamesUnitTests { | 
| 43 | 49 | 
 | 
| @@ -75,84 +81,104 @@ void resolvedTypeNamesWithoutGenerics() { | 
| 75 | 81 | 		assertThat(TypeNames.resolvedTypeName(resolvableType)).extracting(TypeName::toString).isEqualTo("java.util.List"); | 
| 76 | 82 | 	} | 
| 77 | 83 | 
 | 
| 78 |  | -	@Test // GH-3374 | 
| 79 |  | -	void resolvedTypeNamesForMethodParameters() { | 
|  | 84 | +	static List<Method> concreteMethods() { | 
|  | 85 | + | 
|  | 86 | +		List<Method> methods = new ArrayList<>(); | 
| 80 | 87 | 
 | 
| 81 | 88 | 		ReflectionUtils.doWithMethods(Concrete.class, method -> { | 
| 82 | 89 | 			if (!method.getName().contains("baseMethod")) { | 
| 83 | 90 | 				return; | 
| 84 | 91 | 			} | 
| 85 |  | - | 
| 86 |  | -			MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); | 
| 87 |  | -			ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter); | 
| 88 |  | -			assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("T")); | 
| 89 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(MyType.class)); | 
| 90 |  | - | 
| 91 |  | -			MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1) | 
| 92 |  | -					.withContainingClass(Concrete.class); | 
| 93 |  | -			ResolvableType resolvedCollectionParameterType = ResolvableType | 
| 94 |  | -					.forMethodParameter(refiedCollectionMethodParameter); | 
| 95 |  | -			assertThat(TypeNames.typeName(resolvedCollectionParameterType)) | 
| 96 |  | -					.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T"))); | 
| 97 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType)) | 
| 98 |  | -					.isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class)); | 
| 99 |  | - | 
| 100 |  | -			MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class); | 
| 101 |  | -			ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter); | 
| 102 |  | -			assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("T[]"); | 
| 103 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString) | 
| 104 |  | -					.isEqualTo("org.springframework.data.javapoet.TypeNamesUnitTests.MyType[]"); | 
| 105 |  | - | 
| 106 |  | -			ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); | 
| 107 |  | -			assertThat(TypeNames.typeName(resolvedReturnType)) | 
| 108 |  | -					.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T"))); | 
| 109 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedReturnType)) | 
| 110 |  | -					.isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class)); | 
|  | 92 | +			methods.add(method); | 
| 111 | 93 | 		}); | 
| 112 | 94 | 
 | 
|  | 95 | +		return methods; | 
|  | 96 | +	} | 
|  | 97 | + | 
|  | 98 | +	static List<Method> otherMethods() { | 
|  | 99 | + | 
|  | 100 | +		List<Method> methods = new ArrayList<>(); | 
|  | 101 | + | 
| 113 | 102 | 		ReflectionUtils.doWithMethods(Concrete.class, method -> { | 
| 114 | 103 | 			if (!method.getName().contains("otherMethod")) { | 
| 115 | 104 | 				return; | 
| 116 | 105 | 			} | 
| 117 |  | - | 
| 118 |  | -			MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); | 
| 119 |  | -			ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter); | 
| 120 |  | -			assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("RT")); | 
| 121 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(Object.class)); | 
| 122 |  | - | 
| 123 |  | -			MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1) | 
| 124 |  | -					.withContainingClass(Concrete.class); | 
| 125 |  | -			ResolvableType resolvedCollectionParameterType = ResolvableType | 
| 126 |  | -					.forMethodParameter(refiedCollectionMethodParameter); | 
| 127 |  | -			assertThat(TypeNames.typeName(resolvedCollectionParameterType)) | 
| 128 |  | -					.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("RT"))); | 
| 129 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType)) | 
| 130 |  | -					.isEqualTo(ClassName.get(java.util.List.class)); | 
| 131 |  | - | 
| 132 |  | -			MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class); | 
| 133 |  | -			ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter); | 
| 134 |  | -			assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("RT[]"); | 
| 135 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString) | 
| 136 |  | -					.isEqualTo("java.lang.Object[]"); | 
| 137 |  | - | 
| 138 |  | -			ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); | 
| 139 |  | -			assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo("RT"); | 
| 140 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(TypeName.get(Object.class)); | 
|  | 106 | +			methods.add(method); | 
| 141 | 107 | 		}); | 
| 142 | 108 | 
 | 
| 143 |  | -		ReflectionUtils.doWithMethods(Concrete.class, method -> { | 
| 144 |  | -			if (!method.getName().contains("findByLocationNear")) { | 
| 145 |  | -				return; | 
| 146 |  | -			} | 
|  | 109 | +		return methods; | 
|  | 110 | +	} | 
| 147 | 111 | 
 | 
| 148 |  | -			ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); | 
|  | 112 | +	@ParameterizedTest // GH-3374 | 
|  | 113 | +	@MethodSource("concreteMethods") | 
|  | 114 | +	void resolvedTypeNamesForMethodParameters(Method method) { | 
|  | 115 | + | 
|  | 116 | +		MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); | 
|  | 117 | +		ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter); | 
|  | 118 | +		assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("T")); | 
|  | 119 | +		assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(MyType.class)); | 
|  | 120 | + | 
|  | 121 | +		MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1) | 
|  | 122 | +				.withContainingClass(Concrete.class); | 
|  | 123 | +		ResolvableType resolvedCollectionParameterType = ResolvableType.forMethodParameter(refiedCollectionMethodParameter); | 
|  | 124 | +		assertThat(TypeNames.typeName(resolvedCollectionParameterType)) | 
|  | 125 | +				.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T"))); | 
|  | 126 | +		assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType)) | 
|  | 127 | +				.isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.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("T[]"); | 
|  | 132 | +		assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString) | 
|  | 133 | +				.isEqualTo("org.springframework.data.javapoet.TypeNamesUnitTests.MyType[]"); | 
|  | 134 | + | 
|  | 135 | +		ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); | 
|  | 136 | +		assertThat(TypeNames.typeName(resolvedReturnType)) | 
|  | 137 | +				.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T"))); | 
|  | 138 | +		assertThat(TypeNames.resolvedTypeName(resolvedReturnType)) | 
|  | 139 | +				.isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class)); | 
| 149 | 140 | 
 | 
| 150 |  | -			assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo( | 
| 151 |  | -					"java.util.List<org.springframework.data.geo.GeoResult<org.springframework.data.javapoet.TypeNamesUnitTests.MyType>>"); | 
| 152 |  | -			assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(ParameterizedTypeName | 
| 153 |  | -					.get(ClassName.get(java.util.List.class), ParameterizedTypeName.get(GeoResult.class, MyType.class))); | 
| 154 |  | -		}); | 
|  | 141 | +	} | 
|  | 142 | + | 
|  | 143 | +	@ParameterizedTest // GH-3374 | 
|  | 144 | +	@MethodSource("otherMethods") | 
|  | 145 | +	void resolvedTypeNamesForOtherMethodParameters(Method method) { | 
|  | 146 | + | 
|  | 147 | +		MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class); | 
|  | 148 | +		ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter); | 
|  | 149 | +		assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("RT")); | 
|  | 150 | +		assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(Object.class)); | 
|  | 151 | + | 
|  | 152 | +		MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1) | 
|  | 153 | +				.withContainingClass(Concrete.class); | 
|  | 154 | +		ResolvableType resolvedCollectionParameterType = ResolvableType.forMethodParameter(refiedCollectionMethodParameter); | 
|  | 155 | +		assertThat(TypeNames.typeName(resolvedCollectionParameterType)) | 
|  | 156 | +				.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("RT"))); | 
|  | 157 | +		assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType)) | 
|  | 158 | +				.isEqualTo(ClassName.get(java.util.List.class)); | 
|  | 159 | + | 
|  | 160 | +		MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class); | 
|  | 161 | +		ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter); | 
|  | 162 | +		assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("RT[]"); | 
|  | 163 | +		assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString) | 
|  | 164 | +				.isEqualTo("java.lang.Object[]"); | 
|  | 165 | + | 
|  | 166 | +		ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); | 
|  | 167 | +		assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo("RT"); | 
|  | 168 | +		assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(TypeName.get(Object.class)); | 
|  | 169 | +	} | 
|  | 170 | + | 
|  | 171 | +	@Test // GH-3374 | 
|  | 172 | +	void resolvesTypeNamesForMethodParameters() throws NoSuchMethodException { | 
|  | 173 | + | 
|  | 174 | +		Method method = Concrete.class.getDeclaredMethod("findByLocationNear", Point.class, Distance.class); | 
|  | 175 | + | 
|  | 176 | +		ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class); | 
| 155 | 177 | 
 | 
|  | 178 | +		assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo( | 
|  | 179 | +				"java.util.List<org.springframework.data.geo.GeoResult<org.springframework.data.javapoet.TypeNamesUnitTests.MyType>>"); | 
|  | 180 | +		assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(ParameterizedTypeName | 
|  | 181 | +				.get(ClassName.get(java.util.List.class), ParameterizedTypeName.get(GeoResult.class, MyType.class))); | 
| 156 | 182 | 	} | 
| 157 | 183 | 
 | 
| 158 | 184 | 	interface GenericBase<T> { | 
|  | 
0 commit comments