package japicmp.cmp;
import japicmp.config.Options;
import japicmp.model.JApiClass;
import japicmp.output.OutputFilter;
import japicmp.output.stdout.StdoutOutputGenerator;
import japicmp.util.CtClassBuilder;
import japicmp.util.CtFieldBuilder;
import japicmp.util.CtMethodBuilder;
import javassist.ClassPool;
import javassist.CtClass;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static japicmp.util.Helper.getJApiClass;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.core.IsNot.not;
import static org.junit.Assert.assertThat;
public class ShowSyntheticTest {
@Test
public void testShowSynthetic() throws Exception {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setIncludeSynthetic(true);
List<JApiClass> jApiClasses = ClassesHelper.compareClasses(options, new ClassesHelper.ClassesGenerator() {
@Override
public List<CtClass> createOldClasses(ClassPool classPool) throws Exception {
CtClass ctClass = new CtClassBuilder().addToClassPool(classPool);
return Collections.singletonList(ctClass);
}
@Override
public List<CtClass> createNewClasses(ClassPool classPool) throws Exception {
CtClass ctClass = new CtClassBuilder().addToClassPool(classPool);
CtMethodBuilder.create().publicAccess().syntheticModifier().addToClass(ctClass);
CtFieldBuilder.create().syntheticModifier().addToClass(ctClass);
CtClass syntheticClass = new CtClassBuilder().syntheticModifier().name("japicmp.SyntheticClass").addToClassPool(classPool);
return Arrays.asList(ctClass, syntheticClass);
}
});
assertThat(jApiClasses.size(), is(2));
JApiClass jApiClass = getJApiClass(jApiClasses, CtClassBuilder.DEFAULT_CLASS_NAME);
assertThat(jApiClass.getMethods().size(), is(1));
assertThat(jApiClass.getFields().size(), is(1));
Options configOptions = Options.newDefault();
configOptions.setIncludeSynthetic(true);
StdoutOutputGenerator stdoutOutputGenerator = new StdoutOutputGenerator(configOptions, jApiClasses);
String output = stdoutOutputGenerator.generate();
assertThat(output, containsString("+++ NEW CLASS: PUBLIC(+) SYNTHETIC(+) japicmp.SyntheticClass"));
assertThat(output, containsString("+++ NEW FIELD: PUBLIC(+) SYNTHETIC(+) int field"));
assertThat(output, containsString("+++ NEW METHOD: PUBLIC(+) SYNTHETIC(+) japicmp.Test method()"));
}
@Test
public void testNotShowSynthetic() throws Exception {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
options.setIncludeSynthetic(false);
List<JApiClass> jApiClasses = ClassesHelper.compareClasses(options, new ClassesHelper.ClassesGenerator() {
@Override
public List<CtClass> createOldClasses(ClassPool classPool) throws Exception {
CtClass ctClass = new CtClassBuilder().addToClassPool(classPool);
return Collections.singletonList(ctClass);
}
@Override
public List<CtClass> createNewClasses(ClassPool classPool) throws Exception {
CtClass ctClass = new CtClassBuilder().addToClassPool(classPool);
CtMethodBuilder.create().syntheticModifier().addToClass(ctClass);
CtFieldBuilder.create().syntheticModifier().addToClass(ctClass);
CtClass syntheticClass = new CtClassBuilder().syntheticModifier().name("japicmp.SyntheticClass").addToClassPool(classPool);
return Arrays.asList(ctClass, syntheticClass);
}
});
Options configOptions = Options.newDefault();
configOptions.setIncludeSynthetic(false);
(new OutputFilter(configOptions)).filter(jApiClasses);
assertThat(jApiClasses.size(), is(1));
JApiClass jApiClass = getJApiClass(jApiClasses, CtClassBuilder.DEFAULT_CLASS_NAME);
assertThat(jApiClass.getMethods().size(), is(0));
assertThat(jApiClass.getFields().size(), is(0));
configOptions.setIncludeSynthetic(true);
StdoutOutputGenerator stdoutOutputGenerator = new StdoutOutputGenerator(configOptions, jApiClasses);
String output = stdoutOutputGenerator.generate();
assertThat(output, not(containsString("+++ NEW CLASS: PUBLIC(+) SYNTHETIC(+) japicmp.SyntheticClass")));
assertThat(output, not(containsString("+++ NEW FIELD: PUBLIC(+) SYNTHETIC(+) int field")));
assertThat(output, not(containsString("+++ NEW METHOD: PUBLIC(+) SYNTHETIC(+) japicmp.Test method()")));
}
}