Skip to content

Commit aa9d219

Browse files
authored
Use Google's compile-testing library. (#49)
* Use Google's compile-testing library. * Google Compile Testing Library working now. * Google Compile Testing Library working now.
1 parent b74f80e commit aa9d219

File tree

4 files changed

+111
-74
lines changed

4 files changed

+111
-74
lines changed

extensions/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ dependencies {
99
testImplementation libs.assertj
1010
testImplementation libs.bundles.junit.jupiter
1111
testImplementation libs.commons.io
12+
testImplementation libs.compile.testing
1213
testImplementation libs.dummymaker
1314
testImplementation libs.guava
1415
testImplementation libs.mapstruct.core

extensions/src/test/java/org/mapstruct/extensions/spring/converter/AbstractProcessorTest.java

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package org.mapstruct.extensions.spring.converter;
22

33
import static com.google.common.collect.Iterables.concat;
4-
import static java.nio.file.Files.createTempDirectory;
54
import static java.util.Arrays.asList;
6-
import static java.util.Collections.singletonList;
75
import static javax.lang.model.element.Modifier.*;
8-
import static javax.tools.StandardLocation.CLASS_OUTPUT;
96

7+
import com.google.testing.compile.Compilation;
8+
import com.google.testing.compile.Compiler;
109
import com.squareup.javapoet.*;
11-
import java.io.IOException;
1210
import java.util.Set;
1311
import javax.annotation.processing.Processor;
1412
import javax.tools.*;
@@ -49,27 +47,14 @@ protected static JavaFileObject toJavaFileObject(JavaFile.Builder fileBuilder) {
4947
COMPONENT_JAVA_FILE_OBJECT,
5048
LAZY_JAVA_FILE_OBJECT);
5149

52-
protected static boolean compile(
53-
final Processor processor, final JavaFileObject... additionalCompilationUnits)
54-
throws IOException {
50+
protected static Compilation compile(
51+
final Processor processor, final JavaFileObject... additionalCompilationUnits) {
5552
return compile(processor, concat(COMMON_COMPILATION_UNITS, asList(additionalCompilationUnits)));
5653
}
5754

58-
protected static boolean compile(
59-
final Processor processor, final Iterable<JavaFileObject> compilationUnits)
60-
throws IOException {
61-
final var compiler = ToolProvider.getSystemJavaCompiler();
62-
63-
final var diagnostics = new DiagnosticCollector<JavaFileObject>();
64-
final var fileManager = compiler.getStandardFileManager(diagnostics, null, null);
65-
fileManager.setLocation(CLASS_OUTPUT, singletonList(createTempDirectory("classes").toFile()));
66-
67-
final var task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
68-
task.setProcessors(singletonList(processor));
69-
70-
final var success = task.call();
71-
diagnostics.getDiagnostics().forEach(System.err::println);
72-
return success;
55+
protected static Compilation compile(
56+
final Processor processor, final Iterable<JavaFileObject> compilationUnits) {
57+
return Compiler.javac().withProcessors(processor).compile(compilationUnits);
7358
}
7459

7560
private static TypeSpec buildSimpleModelClassTypeSpec(final String className) {

extensions/src/test/java/org/mapstruct/extensions/spring/converter/ConverterMapperProcessorTest.java

Lines changed: 101 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
package 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;
36
import static java.lang.annotation.ElementType.METHOD;
47
import static java.lang.annotation.RetentionPolicy.SOURCE;
58
import static javax.lang.model.element.Modifier.*;
69
import static org.assertj.core.api.BDDAssertions.then;
10+
import static org.assertj.core.api.InstanceOfAssertFactories.list;
711
import static org.mockito.ArgumentMatchers.any;
812

13+
import com.google.testing.compile.Compilation;
914
import com.squareup.javapoet.*;
10-
import java.io.IOException;
1115
import java.io.Writer;
1216
import java.lang.annotation.Retention;
1317
import java.lang.annotation.Target;
1418
import java.lang.ref.WeakReference;
1519
import java.time.Clock;
20+
import java.util.List;
1621
import java.util.Locale;
1722
import javax.tools.*;
1823
import 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
}

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ asciidoctorPlugin = "3.3.2"
33
assertj = "3.24.2"
44
commons-io = "2.13.0"
55
commons-lang3 = "3.13.0"
6+
compile-testing = "0.21.0"
67
dependencyCheck = "8.4.0"
78
dummymaker = "4.0.0"
89
guava = "32.1.2-jre"
@@ -21,6 +22,7 @@ versionsPlugin = "0.48.0"
2122
assertj = { group = "org.assertj", name = "assertj-core", version.ref = "assertj"}
2223
commons-io = { group = "commons-io", name = "commons-io", version.ref = "commons-io" }
2324
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version.ref = "commons-lang3" }
25+
compile-testing = { group = "com.google.testing.compile", name = "compile-testing", version.ref = "compile-testing" }
2426
dummymaker = { group = "com.github.goodforgod", name = "dummymaker", version.ref = "dummymaker"}
2527
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
2628
jakarta-annotation = { group = "jakarta.annotation", name = "jakarta.annotation-api", version.ref = "jakarta-annotation-api" }

0 commit comments

Comments
 (0)