1 package net.sf.clirr.core.internal.checks;
2
3 import junit.framework.TestCase;
4 import net.sf.clirr.core.Checker;
5 import net.sf.clirr.core.ClassSelector;
6 import net.sf.clirr.core.ApiDifference;
7 import net.sf.clirr.core.CheckerFactory;
8 import net.sf.clirr.core.ClassFilter;
9 import net.sf.clirr.core.internal.ClassChangeCheck;
10 import net.sf.clirr.core.internal.bcel.BcelTypeArrayBuilder;
11 import net.sf.clirr.core.spi.JavaType;
12
13 import org.apache.bcel.util.ClassSet;
14
15 import java.io.File;
16 import java.net.URL;
17 import java.net.URLClassLoader;
18
19 /***
20 * Abstract Baseclass to test individual Checks.
21 * @author lkuehne
22 */
23 public abstract class AbstractCheckTestCase extends TestCase
24 {
25 protected final File getTestInputDir()
26 {
27
28 return new File(System.getProperty("testinput"));
29 }
30
31 protected void verify(
32 Checker checker,
33 ClassSet baseline, ClassSet current,
34 ApiDifference[] expected)
35 {
36 }
37
38 protected File[] getBaseLine()
39 {
40 return new File[]{
41 new File(getTestInputDir(), "testlib-v1.jar")
42 };
43 }
44
45 protected File[] getCurrent()
46 {
47 return new File[]{
48 new File(getTestInputDir(), "testlib-v2.jar")
49 };
50 }
51
52 protected void verify(ExpectedDiff[] expected)
53 throws Exception
54 {
55 TestDiffListener tdl = new TestDiffListener();
56 Checker checker = CheckerFactory.createChecker(createCheck(tdl));
57 ClassFilter classSelector = createClassSelector();
58
59 final JavaType[] origClasses =
60 BcelTypeArrayBuilder.createClassSet(getBaseLine(), new URLClassLoader(new URL[]{}), classSelector);
61
62 final JavaType[] newClasses =
63 BcelTypeArrayBuilder.createClassSet(getCurrent(), new URLClassLoader(new URL[]{}), classSelector);
64
65 checker.reportDiffs(origClasses, newClasses);
66
67 tdl.checkExpected(expected);
68 }
69
70 /***
71 * Creates an object which selects the appropriate classes from the
72 * test jars for this test.
73 * <p>
74 * This base implementation returns a selector which selects all classes
75 * in the base "testlib" package (but no sub-packages). Tests which wish
76 * to select different classes from the test jars should override this
77 * method.
78 */
79 protected ClassFilter createClassSelector()
80 {
81
82 ClassSelector classSelector = new ClassSelector(ClassSelector.MODE_IF);
83 classSelector.addPackage("testlib");
84 return classSelector;
85 }
86
87 /***
88 * Creates a check and sets it up so ApiDifferences are reported to the test diff listener.
89 *
90 * @param tdl the test diff listener that records the recognized api changes.
91 * @return the confiured check
92 */
93 protected abstract ClassChangeCheck createCheck(TestDiffListener tdl);
94 }