Commit 9c368fec authored by Sergio Pérez's avatar Sergio Pérez
Browse files

Bencher Test Class

parent de59be5e
Loading
Loading
Loading
Loading
+109 −0
Original line number Diff line number Diff line
package eknife;

import eknife.EKnife;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class BencherTest {

    private static final String TEST_PKG = "bencher";
    private static final String DOT_ERLANG = ".erl";
    private static final String EDG_CRITERION = ".edg.criterion";
    private static final String EDG_SLICE = ".edg.sliced";
    private static final String EDG_OUTPUT_SLICE = ".edg.slice.output";
    public static int cont = 1;

    public static void findFiles(File directory, String suffix, Consumer<File> consumer) {
        File[] files = directory.listFiles();
        if (files == null)
            return;
        for (File f : files) {
            if (f.isDirectory())
                findFiles(f, suffix, consumer);
            else if (f.getName().endsWith(suffix))
                consumer.accept(f);
        }
    }

    private static String readFile(File file, Supplier<String> separator) {
        try (Scanner in = new Scanner(file)) {
            StringBuilder builder = new StringBuilder();
            while (in.hasNextLine())
                builder.append(in.nextLine()).append(separator.get());
            return builder.toString();
        } catch (FileNotFoundException e) {
            return "";
        }
    }

    private static String readFile(File file) {
        return readFile(file, () -> "\n");
    }

    private static boolean slicesMatch(File slice, File referenceSlice) {
        return Objects.equals(readFile(slice), readFile(referenceSlice));
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        File testFolder = new File("./e-knife-v1.1.0-src/e-Knife/src/test/resources/regression/", TEST_PKG);
        findFiles(testFolder, DOT_ERLANG, file -> {
            File sliceFile = new File(file.getParent(), file.getName() + EDG_CRITERION);
            if (!sliceFile.exists()) {
                int[] counter = new int[] { 1 };
                System.out.printf("%3d", counter[0]++);
                System.out.print(readFile(file, () -> String.format("\n%3d", counter[0]++)));
                System.out.printf("No criterion found for this program (%s), please input one (-1 to skip)\nCriterion: ", file);
                int line = in.nextInt();
                if (line == -1)
                    return;
                while (line <= 0 || line >= counter[0] - 2) {
                    System.out.printf("Your input is out-of-bounds, please try again [1-%d]: ", counter[0] - 2);
                    line = in.nextInt();
                }
                System.out.printf("Saving line %d as slicing criterion for %s... ", line, file);
                try (PrintWriter pw = new PrintWriter(sliceFile)) {
                    pw.write(line + "");
                    System.out.println("DONE");
                } catch (FileNotFoundException e) {
                    System.out.println("ERROR");
                }
            }
            else {
                String[] arguments = {"-i", "", "-o" ,"", "-l", "", "-v", ""};
                File outputDir = testFolder.getAbsoluteFile();

                String inputFileName = testFolder.getAbsolutePath() + File.separator + file.getName();
                String outputFileName = outputDir + File.separator + file.getName() + EDG_OUTPUT_SLICE;
                try (Scanner in2 = new Scanner(sliceFile)) {
                    int lineNumber = in2.nextInt();
                    String var = in2.nextLine();
                    arguments[1] = inputFileName;
                    arguments[3] = outputFileName;
                    arguments[5] = lineNumber+"";
                    arguments[7] = var.trim();

                    System.out.println("Slicing program "+ file.getName() + " " + BencherTest.cont + "/23");
                    BencherTest.cont++;

                    EKnife.main(arguments);
                    if (slicesMatch(new File(outputFileName),new File(inputFileName + EDG_SLICE))) {
                        System.out.println("SUCCESS");
                    } else {
                        System.out.println("Failure");
                    }

                } catch (FileNotFoundException | NoSuchElementException e) {
                    System.out.println("Error reading the criterion file");
                }
            }
        });
    }
}