package com.puppycrawl.tools.checkstyle.bcel; import com.puppycrawl.tools.checkstyle.api.AuditEvent; import com.puppycrawl.tools.checkstyle.api.Configuration; import com.puppycrawl.tools.checkstyle.*; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.io.OutputStream; import java.io.PrintStream; import java.util.Locale; import java.util.Properties; import junit.framework.TestCase; public abstract class BcelCheckTestCase extends TestCase { /** a brief logger that only display info about errors */ protected static class BriefLogger extends DefaultLogger { public BriefLogger(OutputStream out) { super(out, true); } public void auditStarted(AuditEvent evt) {} public void fileFinished(AuditEvent evt) {} public void fileStarted(AuditEvent evt) {} } private final ByteArrayOutputStream mBAOS = new ByteArrayOutputStream(); protected final PrintStream mStream = new PrintStream(mBAOS); protected final Properties mProps = new Properties(); public static DefaultConfiguration createCheckConfig(Class aClazz) { final DefaultConfiguration checkConfig = new DefaultConfiguration(aClazz.getName()); return checkConfig; } protected Checker createChecker(Configuration aCheckConfig) throws Exception { final DefaultConfiguration dc = createCheckerConfig(aCheckConfig); final Checker c = new Checker(); // make sure the tests always run with english error messages // so the tests don't fail in supported locales like german final Locale locale = Locale.ENGLISH; c.setLocaleCountry(locale.getCountry()); c.setLocaleLanguage(locale.getLanguage()); c.configure(dc); c.addListener(new BriefLogger(mStream)); return c; } protected DefaultConfiguration createCheckerConfig(Configuration aConfig) { final DefaultConfiguration dc = new DefaultConfiguration("configuration"); final DefaultConfiguration twConf = createCheckConfig(ClassFileSetCheck.class); dc.addChild(twConf); twConf.addChild(aConfig); return dc; } protected static String getPath(String aFilename) throws IOException { final File f = new File(System.getProperty("testinputs.compiled.dir"), aFilename); return f.getCanonicalPath(); } protected void verify(Configuration aConfig, String aFileName, String[] aExpected) throws Exception { verify(createChecker(aConfig), aFileName, aFileName, aExpected); } protected void verify(Checker aC, String aFileName, String[] aExpected) throws Exception { verify(aC, aFileName, aFileName, aExpected); } protected void verify(Checker aC, String aProcessedFilename, String aMessageFileName, String[] aExpected) throws Exception { verify(aC, new File[] {new File(aProcessedFilename)}, aMessageFileName, aExpected); } protected void verify(Checker aC, File[] aProcessedFiles, String aMessageFileName, String[] aExpected) throws Exception { mStream.flush(); final int errs = aC.process(aProcessedFiles); // process each of the lines final ByteArrayInputStream bais = new ByteArrayInputStream(mBAOS.toByteArray()); final LineNumberReader lnr = new LineNumberReader(new InputStreamReader(bais)); for (int i = 0; i < aExpected.length; i++) { final String expected = aMessageFileName + ":" + aExpected[i]; final String actual = lnr.readLine(); assertEquals("error message " + i, expected, actual); } assertEquals("unexpected output: " + lnr.readLine(), aExpected.length, errs); aC.destroy(); } }