11package org .mapstruct .extensions .spring .converter ;
22
3+ import static com .google .common .collect .Iterables .concat ;
4+ import static com .google .testing .compile .CompilationSubject .assertThat ;
5+ import static com .google .testing .compile .Compiler .javac ;
36import static java .lang .annotation .ElementType .METHOD ;
47import static java .lang .annotation .RetentionPolicy .SOURCE ;
58import static javax .lang .model .element .Modifier .*;
69import static org .assertj .core .api .BDDAssertions .then ;
10+ import static org .assertj .core .api .InstanceOfAssertFactories .list ;
711import static org .mockito .ArgumentMatchers .any ;
812
13+ import com .google .testing .compile .Compilation ;
914import com .squareup .javapoet .*;
10- import java .io .IOException ;
1115import java .io .Writer ;
1216import java .lang .annotation .Retention ;
1317import java .lang .annotation .Target ;
1418import java .lang .ref .WeakReference ;
1519import java .time .Clock ;
20+ import java .util .List ;
1621import java .util .Locale ;
1722import javax .tools .*;
1823import org .junit .jupiter .api .Test ;
@@ -51,7 +56,7 @@ class ConverterMapperProcessorTest extends AbstractProcessorTest {
5156
5257 @ Captor private ArgumentCaptor <ConversionServiceAdapterDescriptor > descriptorArgumentCaptor ;
5358
54- private boolean compile (final JavaFileObject ... additionalCompilationUnits ) throws IOException {
59+ private Compilation compile (final JavaFileObject ... additionalCompilationUnits ) {
5560 return compile (processor , additionalCompilationUnits );
5661 }
5762
@@ -72,46 +77,75 @@ private static TypeSpec buildConfigClassWithExternalConversion(final String clas
7277 }
7378
7479 @ Test
75- void shouldCompileSimpleConverterMapper () throws IOException {
80+ void shouldCompileSimpleConverterMapper () {
7681 // Given
7782 final JavaFile mapperFile =
7883 JavaFile .builder (
7984 PACKAGE_NAME , converterMapperWithoutGenericSourceOrTargetTypeBuilder ().build ())
8085 .build ();
8186
82- // When
83- final boolean compileResult = compile (mapperFile .toJavaFileObject ());
84-
85- // Then
86- then (compileResult ).isTrue ();
87+ // When - Then
88+ assertThat (
89+ javac ()
90+ .withProcessors (processor )
91+ .compile (concat (List .of (mapperFile .toJavaFileObject ()), COMMON_COMPILATION_UNITS )))
92+ .succeeded ();
93+ BDDMockito .then (adapterGenerator )
94+ .should ()
95+ .writeGeneratedCodeToOutput (descriptorArgumentCaptor .capture (), any (Writer .class ));
96+ then (descriptorArgumentCaptor .getValue ())
97+ .isNotNull ()
98+ .extracting (ConversionServiceAdapterDescriptor ::getFromToMappings )
99+ .asInstanceOf (list (FromToMapping .class ))
100+ .containsExactly (new FromToMapping ().source (CAR_CLASS_NAME ).target (CAR_DTO_CLASS_NAME ));
87101 }
88102
89103 @ Test
90- void shouldCompileConverterMapperWithGenericSourceType () throws IOException {
104+ void shouldCompileConverterMapperWithGenericSourceType () {
91105 // Given
92106 final JavaFile mapperFile =
93107 JavaFile .builder (PACKAGE_NAME , converterMapperWithGenericSourceTypeBuilder ().build ())
94108 .build ();
95109
96- // When
97- final boolean compileResult = compile (mapperFile .toJavaFileObject ());
98-
99- // Then
100- then (compileResult ).isTrue ();
110+ // When - Then
111+ assertThat (
112+ javac ()
113+ .withProcessors (processor )
114+ .compile (concat (List .of (mapperFile .toJavaFileObject ()), COMMON_COMPILATION_UNITS )))
115+ .succeeded ();
116+ BDDMockito .then (adapterGenerator )
117+ .should ()
118+ .writeGeneratedCodeToOutput (descriptorArgumentCaptor .capture (), any (Writer .class ));
119+ then (descriptorArgumentCaptor .getValue ())
120+ .isNotNull ()
121+ .extracting (ConversionServiceAdapterDescriptor ::getFromToMappings )
122+ .asInstanceOf (list (FromToMapping .class ))
123+ .containsExactly (
124+ new FromToMapping ().source (genericSourceTypeName ()).target (CAR_DTO_CLASS_NAME ));
101125 }
102126
103127 @ Test
104- void shouldCompileConverterMapperWithGenericTargetType () throws IOException {
128+ void shouldCompileConverterMapperWithGenericTargetType () {
105129 // Given
106130 final JavaFile mapperFile =
107131 JavaFile .builder (PACKAGE_NAME , converterMapperWithGenericTargetTypeBuilder ().build ())
108132 .build ();
109133
110- // When
111- final boolean compileResult = compile (mapperFile .toJavaFileObject ());
112-
113- // Then
114- then (compileResult ).isTrue ();
134+ // When - Then
135+ assertThat (
136+ javac ()
137+ .withProcessors (processor )
138+ .compile (concat (List .of (mapperFile .toJavaFileObject ()), COMMON_COMPILATION_UNITS )))
139+ .succeeded ();
140+ BDDMockito .then (adapterGenerator )
141+ .should ()
142+ .writeGeneratedCodeToOutput (descriptorArgumentCaptor .capture (), any (Writer .class ));
143+ then (descriptorArgumentCaptor .getValue ())
144+ .isNotNull ()
145+ .extracting (ConversionServiceAdapterDescriptor ::getFromToMappings )
146+ .asInstanceOf (list (FromToMapping .class ))
147+ .containsExactly (
148+ new FromToMapping ().source (CAR_CLASS_NAME ).target (genericTargetTypeName ()));
115149 }
116150
117151 private static TypeSpec .Builder converterMapperWithoutGenericSourceOrTargetTypeBuilder () {
@@ -127,15 +161,23 @@ private static TypeSpec.Builder converterMapperBuilder(
127161 }
128162
129163 private static TypeSpec .Builder converterMapperWithGenericSourceTypeBuilder () {
130- return converterMapperBuilder (
131- ParameterizedTypeName .get (ClassName .get (WeakReference .class ), CAR_CLASS_NAME ),
132- CAR_DTO_CLASS_NAME );
164+ return converterMapperBuilder (genericSourceTypeName (), CAR_DTO_CLASS_NAME );
165+ }
166+
167+ private static ParameterizedTypeName genericSourceTypeName () {
168+ return genericTypeName (CAR_CLASS_NAME );
169+ }
170+
171+ private static ParameterizedTypeName genericTypeName (final ClassName wrappedClassName ) {
172+ return ParameterizedTypeName .get (ClassName .get (WeakReference .class ), wrappedClassName );
133173 }
134174
135175 private static TypeSpec .Builder converterMapperWithGenericTargetTypeBuilder () {
136- return converterMapperBuilder (
137- CAR_CLASS_NAME ,
138- ParameterizedTypeName .get (ClassName .get (WeakReference .class ), CAR_DTO_CLASS_NAME ));
176+ return converterMapperBuilder (CAR_CLASS_NAME , genericTargetTypeName ());
177+ }
178+
179+ private static ParameterizedTypeName genericTargetTypeName () {
180+ return genericTypeName (CAR_DTO_CLASS_NAME );
139181 }
140182
141183 private static TypeSpec .Builder plainCarMapperBuilder (
@@ -155,18 +197,20 @@ private static MethodSpec convertMethod(
155197 }
156198
157199 @ Test
158- void shouldIgnoreNonConverterMappers () throws IOException {
200+ void shouldIgnoreNonConverterMappers () {
159201 // Given
160202 final JavaFile plainMapperFile =
161203 JavaFile .builder (
162204 PACKAGE_NAME , plainCarMapperBuilder (CAR_CLASS_NAME , CAR_DTO_CLASS_NAME ).build ())
163205 .build ();
164206
165- // When
166- final boolean compileResult = compile (plainMapperFile .toJavaFileObject ());
167-
168- // Then
169- then (compileResult ).isTrue ();
207+ // When - Then
208+ assertThat (
209+ javac ()
210+ .withProcessors (processor )
211+ .compile (
212+ concat (List .of (plainMapperFile .toJavaFileObject ()), COMMON_COMPILATION_UNITS )))
213+ .succeeded ();
170214 BDDMockito .then (adapterGenerator )
171215 .should ()
172216 .writeGeneratedCodeToOutput (descriptorArgumentCaptor .capture (), any (Writer .class ));
@@ -176,7 +220,7 @@ PACKAGE_NAME, plainCarMapperBuilder(CAR_CLASS_NAME, CAR_DTO_CLASS_NAME).build())
176220 }
177221
178222 @ Test
179- void shouldProcessOnlyConvertMethodForMapperWithMultipleMethods () throws IOException {
223+ void shouldProcessOnlyConvertMethodForMapperWithMultipleMethods () {
180224 // Given
181225 final JavaFile mapperFile =
182226 JavaFile .builder (
@@ -186,11 +230,12 @@ void shouldProcessOnlyConvertMethodForMapperWithMultipleMethods() throws IOExcep
186230 .build ())
187231 .build ();
188232
189- // When
190- final boolean compileResult = compile (mapperFile .toJavaFileObject ());
191-
192- // Then
193- then (compileResult ).isTrue ();
233+ // When - Then
234+ assertThat (
235+ javac ()
236+ .withProcessors (processor )
237+ .compile (concat (List .of (mapperFile .toJavaFileObject ()), COMMON_COMPILATION_UNITS )))
238+ .succeeded ();
194239 BDDMockito .then (adapterGenerator )
195240 .should ()
196241 .writeGeneratedCodeToOutput (descriptorArgumentCaptor .capture (), any (Writer .class ));
@@ -202,7 +247,7 @@ void shouldProcessOnlyConvertMethodForMapperWithMultipleMethods() throws IOExcep
202247 }
203248
204249 @ Test
205- void shouldAddConversionServiceCallsForExternalConversions () throws IOException {
250+ void shouldAddConversionServiceCallsForExternalConversions () {
206251 // Given
207252 final JavaFile mappingConfigFile =
208253 JavaFile .builder (
@@ -213,12 +258,17 @@ PACKAGE_NAME, buildConfigClassWithExternalConversion("StringToLocaleConfig"))
213258 PACKAGE_NAME , converterMapperWithoutGenericSourceOrTargetTypeBuilder ().build ())
214259 .build ();
215260
216- // When
217- final boolean compileResult =
218- compile (mappingConfigFile .toJavaFileObject (), mapperFile .toJavaFileObject ());
261+ // When - Then
262+ assertThat (
263+ javac ()
264+ .withProcessors (processor )
265+ .compile (
266+ concat (
267+ List .of (
268+ mapperFile .toJavaFileObject (), mappingConfigFile .toJavaFileObject ()),
269+ COMMON_COMPILATION_UNITS )))
270+ .succeeded ();
219271
220- // Then
221- then (compileResult ).isTrue ();
222272 BDDMockito .then (adapterGenerator )
223273 .should ()
224274 .writeGeneratedCodeToOutput (descriptorArgumentCaptor .capture (), any (Writer .class ));
@@ -234,7 +284,7 @@ PACKAGE_NAME, converterMapperWithoutGenericSourceOrTargetTypeBuilder().build())
234284 }
235285
236286 @ Test
237- void shouldCompileMapperWithDelegatingConverterAnnotation () throws IOException {
287+ void shouldCompileMapperWithDelegatingConverterAnnotation () {
238288 final var delegatingConverterAnnotationTypeSpec =
239289 TypeSpec .annotationBuilder (ClassName .get (DelegatingConverter .class ))
240290 .addAnnotation (
@@ -279,12 +329,11 @@ void shouldCompileMapperWithDelegatingConverterAnnotation() throws IOException {
279329 final var autowiredFile =
280330 JavaFile .builder ("org.springframework.beans.factory.annotation" , autowiredTypeSpec ).build ();
281331
282- final var compileResult =
283- compile (
284- delegatingConverterFile .toJavaFileObject (),
285- mapperFile .toJavaFileObject (),
286- autowiredFile .toJavaFileObject ());
287-
288- then (compileResult ).isTrue ();
332+ assertThat (
333+ compile (
334+ delegatingConverterFile .toJavaFileObject (),
335+ mapperFile .toJavaFileObject (),
336+ autowiredFile .toJavaFileObject ()))
337+ .succeeded ();
289338 }
290339}
0 commit comments