/**
* Copyright © 2010-2014 Nokia
*
* 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.jsonschema2pojo.integration;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.io.output.NullWriter;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.jsonschema2pojo.integration.util.Compiler;
import org.jsonschema2pojo.integration.util.Jsonschema2PojoRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import javax.tools.Diagnostic;
import javax.tools.Diagnostic.Kind;
import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import static org.jsonschema2pojo.integration.util.CodeGenerationHelper.config;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.*;
/**
* <p>Tests looking for warning coming from generated output.</p>
*
* <p>Notes: The eclipse compiler used in these tests has an open issue with the SuppressWarnings annotation. As a result, some warnings must be
* accepted here that would not be present in practice.
* <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=469725">Bug 469725 - ECJ compiler: @SuppressWarnings annotation is ignored when ecj is invoked via java compiler tool API</a>
* </p>
*
* @author Christian Trimble
*
*/
@RunWith(Parameterized.class)
public class CompilerWarningIT {
@Rule public Jsonschema2PojoRule schemaRule = new Jsonschema2PojoRule().captureDiagnostics();
@Parameters(name="{0}")
public static Collection<Object[]> parameters() {
JavaCompiler systemJavaCompiler = Compiler.systemJavaCompiler();
JavaCompiler eclipseCompiler = Compiler.eclipseCompiler();
return Arrays.asList(new Object[][] {
{
"includeAccessorsWithSystemJavaCompiler",
systemJavaCompiler,
config("includeDynamicAccessors", true),
"/schema/dynamic/parentType.json",
Matchers.empty()
},
{
"includeAccessorsWithEclipseCompiler",
eclipseCompiler,
config("includeDynamicAccessors", true),
"/schema/dynamic/parentType.json",
onlyCastExceptions()
}
});
}
private JavaCompiler compiler;
private Map<String, Object> config;
private String schema;
private Matcher<List<Diagnostic<? extends JavaFileObject>>> matcher;
public CompilerWarningIT(String label, JavaCompiler compiler, Map<String, Object> config, String schema, Matcher<List<Diagnostic<? extends JavaFileObject>>> matcher) {
this.compiler = compiler;
this.config = config;
this.schema = schema;
this.matcher = matcher;
}
@Test
public void checkWarnings() {
schemaRule.generate(schema, "com.example", config);
schemaRule.compile(compiler, new NullWriter(), new ArrayList<File>(), config);
List<Diagnostic<? extends JavaFileObject>> warnings = warnings(schemaRule.getDiagnostics());
assertThat(warnings, matcher);
}
public static List<Diagnostic<? extends JavaFileObject>> warnings(List<Diagnostic<? extends JavaFileObject>> all) {
List<Diagnostic<? extends JavaFileObject>> warnings = new ArrayList<Diagnostic<? extends JavaFileObject>>();
for( Diagnostic<? extends JavaFileObject> entry : all ) {
if( entry.getKind() == Kind.WARNING ) {
warnings.add(entry);
}
}
return warnings;
}
public static Matcher<Iterable<Diagnostic<? extends JavaFileObject>>> onlyCastExceptions() {
return Matchers.everyItem(hasMessage(containsString("Type safety: Unchecked cast from")));
}
public static Matcher<Diagnostic<? extends JavaFileObject>> hasMessage( Matcher<String> messageMatcher ) {
return new FeatureMatcher<Diagnostic<? extends JavaFileObject>, String>(messageMatcher, "message", "message") {
@Override
protected String featureValueOf(Diagnostic<? extends JavaFileObject> actual) {
return actual.getMessage(Locale.ENGLISH);
}
};
}
}