Commit aa31dca9 authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Tests for polymorphism and extended criteria support

Slicing criterion can include a variable. Multiple criteria can be included for a single file.
parent bb9138f3
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
                    <include>**/*.java</include>
                    <include>**/*.java.*.criterion</include>
                    <include>**/*.java.*.sliced</include>
                    <include>**/*.java.*.sliced.*</include>
                </includes>
            </testResource>
        </testResources>
+38 −22
Original line number Diff line number Diff line
@@ -47,23 +47,25 @@ public class SlicerTest {
    public static Arguments[] findAllFiles() {
        Collection<Arguments> args = new LinkedList<>();
        File testFolder = new File(Thread.currentThread().getContextClassLoader().getResource(TEST_PKG).getPath());
        findFiles(testFolder, DOT_JAVA, f -> createArgumentForTest(f).ifPresent(args::add));
        findFiles(testFolder, DOT_JAVA, f -> args.addAll(createArgumentForTest(f)));
        return args.toArray(Arguments[]::new);
    }

    private static Optional<Arguments> createArgumentForTest(File javaFile) {
        File slice = new File(javaFile.getParent(), javaFile.getName() + SDG_SLICE);
        Optional<SlicingCriterion> criterion = findSDGCriterion(javaFile);
        if (!slice.isFile() || !slice.canRead() || criterion.isEmpty())
            return Optional.empty();
        return Optional.of(Arguments.of(javaFile, slice, criterion.get()));
    private static Collection<Arguments> createArgumentForTest(File javaFile) {
        List<SlicingCriterion> criteria = findSDGCriterion(javaFile);
        Collection<Arguments> args = new LinkedList<>();
        for (int i = 0; i < criteria.size(); i++) {
            File slice = generateSliceFile(javaFile, i);
            if (slice.isFile() && slice.canRead())
                args.add(Arguments.of(javaFile, slice, criteria.get(i)));
        }
        return args;
    }

    @ParameterizedTest(name = "{0}")
    @ParameterizedTest(name = "{2}")
    @MethodSource("findAllFiles")
    public void slicerRegressionTest(File source, File target, SlicingCriterion sc) throws FileNotFoundException {
        if (!target.exists())
            return;
        assert target.exists(): "The reference slice does not exist!";
        Slice slice = slice(source ,sc);
        boolean equal = slicesMatch(slice, target);
        assert equal: "The slice for " + source.toString() + " has changed, please fix the error or update the reference slice.";
@@ -75,27 +77,37 @@ public class SlicerTest {
        findFiles(testFolder, DOT_JAVA, SlicerTest::createAndSaveSlice);
    }

    private static Optional<SlicingCriterion> findSDGCriterion(File javaFile) {
    private static List<SlicingCriterion> findSDGCriterion(File javaFile) {
        File criterionFile = new File(javaFile.getParentFile(), javaFile.getName() + SDG_CRITERION);
        try (Scanner in = new Scanner(criterionFile)) {
            return Optional.of(new FileLineSlicingCriterion(javaFile, in.nextInt()));
            List<SlicingCriterion> criteria = new LinkedList<>();
            while (in.hasNextInt()) {
                int line = in.nextInt();
                String var = null;
                if (in.hasNext())
                    var = in.next();
                criteria.add(new FileLineSlicingCriterion(javaFile, line, var));
            }
            return criteria;
        } catch (FileNotFoundException | NoSuchElementException e) {
            return Optional.empty();
            return new LinkedList<>();
        }
    }

    private static void createAndSaveSlice(File javaFile) {
        try {
            File sliceFile = new File(javaFile.getParent(), javaFile.getName() + SDG_SLICE);
            Optional<SlicingCriterion> sc = findSDGCriterion(javaFile);
            if (sc.isEmpty() || sliceFile.exists())
                return;
            Slice slice = slice(javaFile, sc.get());
            List<SlicingCriterion> criteria = findSDGCriterion(javaFile);
            for (int i = 0; i < criteria.size(); i++) {
                File sliceFile = generateSliceFile(javaFile, i);
                if (sliceFile.exists())
                    continue;
                Slice slice = slice(javaFile, criteria.get(i));
                var cus = slice.toAst();
                assert cus.size() == 1;
                try (PrintWriter pw = new PrintWriter(sliceFile)) {
                    pw.write(cus.getFirst().get().toString());
                }
            }
        } catch (FileNotFoundException e) {
            System.err.println("Could not save slice due to missing file or permissions");
        } catch (Exception e) {
@@ -105,6 +117,10 @@ public class SlicerTest {
        }
    }

    private static File generateSliceFile(File javaFile, int scIndex) {
        return new File(javaFile.getParent(), javaFile.getName() + SDG_SLICE + (scIndex > 0 ? "." + scIndex : ""));
    }

    private static boolean slicesMatch(Slice slice, File referenceSlice) {
        NodeList<CompilationUnit> cus = slice.toAst();
        assert cus.size() == 1;
+49 −0
Original line number Diff line number Diff line
class Test{
    public static void main(String args[]) {
        A a;
        if (Math.random() > 0)
            a = new A(10);
        else
            a = new B(5,1);
        int i = a.f();
        int j = a.g();
        int k = a.h();
    }
}

class A {
    int x;

    public A(int a) {
        this.x = a;
    }

    public int f() {
        return x;
    }

    public int g() {
        return x;
    }

    public int h() {
        return x;
    }
}

class B extends A {
    int y;

    public B(int a, int b) {
        super(a);
        y = b;
    }

    public int f() {
        return y;
    }

    public int g() {
        return super.g() + y;
    }
}
+3 −0
Original line number Diff line number Diff line
8 i
9 k
10 j
 No newline at end of file
+38 −0
Original line number Diff line number Diff line
class Test {

    public static void main(String[] args) {
        A a;
        if (Math.random() > 0)
            a = new A(10);
        else
            a = new B(5, 1);
        int i = a.f();
    }
}

class A {

    int x;

    public A(int a) {
        this.x = a;
    }

    public int f() {
        return x;
    }
}

class B extends A {

    int y;

    public B(int a, int b) {
        super(a);
        y = b;
    }

    public int f() {
        return y;
    }
}
Loading