mirror of
https://github.com/mapstruct/mapstruct.git
synced 2025-07-12 00:00:08 +08:00
Providing infrastructure for tests expecting AP compilation failures
This commit is contained in:
parent
dc72351e70
commit
eec600c3bf
@ -17,6 +17,7 @@ package org.mapstruct.ap.testutil;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.net.URLClassLoader;
|
import java.net.URLClassLoader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -32,6 +33,9 @@ import javax.tools.StandardLocation;
|
|||||||
import javax.tools.ToolProvider;
|
import javax.tools.ToolProvider;
|
||||||
|
|
||||||
import org.mapstruct.ap.MappingProcessor;
|
import org.mapstruct.ap.MappingProcessor;
|
||||||
|
import org.mapstruct.ap.testutil.compilation.annotation.CompilationResult;
|
||||||
|
import org.mapstruct.ap.testutil.compilation.annotation.ExpectedCompilationOutcome;
|
||||||
|
import org.mapstruct.ap.testutil.compilation.model.CompilationOutcomeDescriptor;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.BeforeMethod;
|
import org.testng.annotations.BeforeMethod;
|
||||||
|
|
||||||
@ -71,8 +75,8 @@ public abstract class MapperTestBase {
|
|||||||
String testDependenciesDir = basePath + "/target/test-dependencies/";
|
String testDependenciesDir = basePath + "/target/test-dependencies/";
|
||||||
|
|
||||||
classPath = new ArrayList<File>();
|
classPath = new ArrayList<File>();
|
||||||
for ( String oneLibrary : libraries ) {
|
for ( String library : libraries ) {
|
||||||
classPath.add( new File( testDependenciesDir, oneLibrary ) );
|
classPath.add( new File( testDependenciesDir, library ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
createOutputDirs();
|
createOutputDirs();
|
||||||
@ -86,14 +90,33 @@ public abstract class MapperTestBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@BeforeMethod
|
@BeforeMethod
|
||||||
public void generateMapperImplementation() {
|
public void generateMapperImplementation(Method testMethod) {
|
||||||
diagnostics = new DiagnosticCollector<JavaFileObject>();
|
diagnostics = new DiagnosticCollector<JavaFileObject>();
|
||||||
List<File> sourceFiles = getSourceFiles( getTestClasses() );
|
List<File> sourceFiles = getSourceFiles( getTestClasses() );
|
||||||
|
|
||||||
boolean compilationSuccessful = compile( diagnostics, sourceFiles );
|
boolean compilationSuccessful = compile( diagnostics, sourceFiles );
|
||||||
|
|
||||||
assertThat( compilationSuccessful ).describedAs( "Compilation failed: " + diagnostics.getDiagnostics() )
|
CompilationOutcomeDescriptor actualResult = CompilationOutcomeDescriptor.forResult(
|
||||||
.isTrue();
|
sourceDir,
|
||||||
|
compilationSuccessful,
|
||||||
|
diagnostics.getDiagnostics()
|
||||||
|
);
|
||||||
|
CompilationOutcomeDescriptor expectedResult = CompilationOutcomeDescriptor.forExpectedCompilationResult(
|
||||||
|
testMethod.getAnnotation( ExpectedCompilationOutcome.class )
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( expectedResult.getCompilationResult() == CompilationResult.SUCCEEDED ) {
|
||||||
|
assertThat( actualResult.getCompilationResult() )
|
||||||
|
.describedAs( "Compilation failed. Diagnostics: " + actualResult.getDiagnostics() )
|
||||||
|
.isEqualTo( CompilationResult.SUCCEEDED );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
assertThat( actualResult.getCompilationResult() )
|
||||||
|
.describedAs( "Compilation succeeded but should have failed." )
|
||||||
|
.isEqualTo( CompilationResult.FAILED );
|
||||||
|
}
|
||||||
|
|
||||||
|
assertThat( actualResult.getDiagnostics() ).isEqualTo( expectedResult.getDiagnostics() );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2013 Gunnar Morling (http://www.gunnarmorling.de/)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.testutil.compilation.annotation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The result of a compilation.
|
||||||
|
*
|
||||||
|
* @author Gunnar Morling
|
||||||
|
*/
|
||||||
|
public enum CompilationResult {
|
||||||
|
SUCCEEDED, FAILED;
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2013 Gunnar Morling (http://www.gunnarmorling.de/)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.testutil.compilation.annotation;
|
||||||
|
|
||||||
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An expected diagnostic of a compilation.
|
||||||
|
*
|
||||||
|
* @author Gunnar Morling
|
||||||
|
*/
|
||||||
|
public @interface Diagnostic {
|
||||||
|
|
||||||
|
Class<?> type();
|
||||||
|
|
||||||
|
Kind kind();
|
||||||
|
|
||||||
|
int line();
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2013 Gunnar Morling (http://www.gunnarmorling.de/)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.testutil.compilation.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the expected outcome of a compilation, comprising the actual result
|
||||||
|
* and optionally one or more diagnostics.
|
||||||
|
*
|
||||||
|
* @author Gunnar Morling
|
||||||
|
*/
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface ExpectedCompilationOutcome {
|
||||||
|
CompilationResult value();
|
||||||
|
|
||||||
|
Diagnostic[] diagnostics();
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2013 Gunnar Morling (http://www.gunnarmorling.de/)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.testutil.compilation.model;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import javax.tools.JavaFileObject;
|
||||||
|
|
||||||
|
import org.mapstruct.ap.testutil.compilation.annotation.CompilationResult;
|
||||||
|
import org.mapstruct.ap.testutil.compilation.annotation.Diagnostic;
|
||||||
|
import org.mapstruct.ap.testutil.compilation.annotation.ExpectedCompilationOutcome;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the outcome of a compilation.
|
||||||
|
*
|
||||||
|
* @author Gunnar Morling
|
||||||
|
*/
|
||||||
|
public class CompilationOutcomeDescriptor {
|
||||||
|
|
||||||
|
private CompilationResult compilationResult;
|
||||||
|
private Set<DiagnosticDescriptor> diagnostics;
|
||||||
|
|
||||||
|
private CompilationOutcomeDescriptor(CompilationResult compilationResult,
|
||||||
|
Set<DiagnosticDescriptor> diagnostics) {
|
||||||
|
this.compilationResult = compilationResult;
|
||||||
|
this.diagnostics = diagnostics;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CompilationOutcomeDescriptor forExpectedCompilationResult(ExpectedCompilationOutcome expectedCompilationResult) {
|
||||||
|
if ( expectedCompilationResult == null ) {
|
||||||
|
return new CompilationOutcomeDescriptor(
|
||||||
|
CompilationResult.SUCCEEDED,
|
||||||
|
Collections.<DiagnosticDescriptor>emptySet()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Set<DiagnosticDescriptor> diagnosticDescriptors = new HashSet<DiagnosticDescriptor>();
|
||||||
|
for ( Diagnostic diagnostic : expectedCompilationResult.diagnostics() ) {
|
||||||
|
diagnosticDescriptors.add( DiagnosticDescriptor.forDiagnostic( diagnostic ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CompilationOutcomeDescriptor( expectedCompilationResult.value(), diagnosticDescriptors );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CompilationOutcomeDescriptor forResult(String sourceDir, boolean compilationSuccessful, List<javax.tools.Diagnostic<? extends JavaFileObject>> diagnostics) {
|
||||||
|
CompilationResult compilationResult = compilationSuccessful ? CompilationResult.SUCCEEDED : CompilationResult.FAILED;
|
||||||
|
|
||||||
|
Set<DiagnosticDescriptor> diagnosticDescriptors = new HashSet<DiagnosticDescriptor>();
|
||||||
|
for ( javax.tools.Diagnostic<? extends JavaFileObject> diagnostic : diagnostics ) {
|
||||||
|
diagnosticDescriptors.add( DiagnosticDescriptor.forDiagnostic( sourceDir, diagnostic ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CompilationOutcomeDescriptor( compilationResult, diagnosticDescriptors );
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompilationResult getCompilationResult() {
|
||||||
|
return compilationResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<DiagnosticDescriptor> getDiagnostics() {
|
||||||
|
return diagnostics;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ( ( compilationResult == null ) ? 0 : compilationResult
|
||||||
|
.hashCode() );
|
||||||
|
result = prime * result
|
||||||
|
+ ( ( diagnostics == null ) ? 0 : diagnostics.hashCode() );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if ( this == obj ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( obj == null ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( getClass() != obj.getClass() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
CompilationOutcomeDescriptor other = (CompilationOutcomeDescriptor) obj;
|
||||||
|
if ( compilationResult != other.compilationResult ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( diagnostics == null ) {
|
||||||
|
if ( other.diagnostics != null ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( !diagnostics.equals( other.diagnostics ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "CompilationResultDescriptor [compilationResult="
|
||||||
|
+ compilationResult + ", diagnostics=" + diagnostics + "]";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,128 @@
|
|||||||
|
/**
|
||||||
|
* Copyright 2012-2013 Gunnar Morling (http://www.gunnarmorling.de/)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.mapstruct.ap.testutil.compilation.model;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import javax.tools.Diagnostic.Kind;
|
||||||
|
import javax.tools.JavaFileObject;
|
||||||
|
|
||||||
|
import org.mapstruct.ap.testutil.compilation.annotation.Diagnostic;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a diagnostic ocurred during a compilation.
|
||||||
|
*
|
||||||
|
* @author Gunnar Morling
|
||||||
|
*/
|
||||||
|
public class DiagnosticDescriptor {
|
||||||
|
|
||||||
|
private final String sourceFileName;
|
||||||
|
private final Kind kind;
|
||||||
|
private final long line;
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
private DiagnosticDescriptor(String sourceFileName, Kind kind, long line, String message) {
|
||||||
|
this.sourceFileName = sourceFileName;
|
||||||
|
this.kind = kind;
|
||||||
|
this.line = line;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DiagnosticDescriptor forDiagnostic(Diagnostic diagnostic) {
|
||||||
|
String soureFileName = diagnostic.type().getName().replaceAll( "\\.", File.separator ) + ".java";
|
||||||
|
return new DiagnosticDescriptor( soureFileName, diagnostic.kind(), diagnostic.line(), "" );
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DiagnosticDescriptor forDiagnostic(String sourceDir, javax.tools.Diagnostic<? extends JavaFileObject> diagnostic) {
|
||||||
|
return new DiagnosticDescriptor(
|
||||||
|
diagnostic.getSource().getName().substring( sourceDir.length() + 1 ),
|
||||||
|
diagnostic.getKind(),
|
||||||
|
diagnostic.getLineNumber(),
|
||||||
|
""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSourceFileName() {
|
||||||
|
return sourceFileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Kind getKind() {
|
||||||
|
return kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getLine() {
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result + ( ( kind == null ) ? 0 : kind.hashCode() );
|
||||||
|
result = prime * result + (int) ( line ^ ( line >>> 32 ) );
|
||||||
|
result = prime * result + ( ( message == null ) ? 0 : message.hashCode() );
|
||||||
|
result = prime * result
|
||||||
|
+ ( ( sourceFileName == null ) ? 0 : sourceFileName.hashCode() );
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if ( this == obj ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if ( obj == null ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( getClass() != obj.getClass() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
DiagnosticDescriptor other = (DiagnosticDescriptor) obj;
|
||||||
|
if ( kind != other.kind ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( line != other.line ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( message == null ) {
|
||||||
|
if ( other.message != null ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( !message.equals( other.message ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( sourceFileName == null ) {
|
||||||
|
if ( other.sourceFileName != null ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( !sourceFileName.equals( other.sourceFileName ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "DiagnosticDescriptor [sourceFileName=" + sourceFileName
|
||||||
|
+ ", kind=" + kind + ", line=" + line + ", message=" + message
|
||||||
|
+ "]";
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user