/* * © Copyright 2015 - SourceClear Inc */ package com.sourceclear.gramtest; import com.google.common.io.Files; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.antlr.v4.runtime.ANTLRFileStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.ParserRuleContext; import org.apache.commons.cli.*; /** * */ public class Main { ///////////////////////////// Class Attributes \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ////////////////////////////// Class Methods \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ public static void main(String[] args ) { // create the parser CommandLineParser parser = new DefaultParser(); // create Options object Options options = new Options(); Option help = new Option("h","help",false,"prints this message"); Option maxoption = Option.builder("num").type(Integer.class) .argName("number of tests") .hasArg() .desc("maximum number of test cases") .build(); Option depthoption = Option.builder("dep").type(Integer.class) .argName("depth of rules") .hasArg() .desc("maximum depth for recursive rules") .build(); Option maxsizeoption = Option.builder("max").type(Integer.class) .argName("max size of test") .hasArg() .desc("maximum size of each generated test") .build(); Option minsizeoption = Option.builder("min").type(Integer.class) .argName("min size of test") .hasArg() .desc("minimum size of each generated test") .build(); Option grammarfile = Option.builder("file").argName("grammar file") .hasArg() .desc("path to the grammar file (in BNF notation)") .build(); Option testsfolder = Option.builder("tests").argName("test folder") .hasArg() .desc("path to the folder to store generated tests") .build(); Option extension = Option.builder("ext").argName("extension") .hasArg() .desc("file extension for generated tests") .build(); Option usemingen = Option.builder("mingen").type(Boolean.class) .argName("minimal generator") .hasArg() .desc("use minimal sentence generation (true/false)") .build(); options.addOption(help); options.addOption(grammarfile); options.addOption(testsfolder); options.addOption(extension); options.addOption(maxoption); options.addOption(depthoption); options.addOption(usemingen); options.addOption(maxsizeoption); options.addOption(minsizeoption); try { // parse the command line arguments CommandLine line = parser.parse(options, args); if(line.hasOption("help") || line.getOptions().length == 0) { HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("gramtest [options]", options); } else if(line.hasOption("file")) { String filename = line.getOptionValue("file"); int num = 100; int depth = 2; int max = 4; int min = 1; String extStr = "txt"; boolean useMinGen = true; if(line.hasOption("num")) { num = Integer.valueOf(line.getOptionValue("num")); } if(line.hasOption("dep")) { depth = Integer.valueOf(line.getOptionValue("dep")); } if(line.hasOption("max")) { max = Integer.valueOf(line.getOptionValue("max")); } if(line.hasOption("min")) { min = Integer.valueOf(line.getOptionValue("min")); } if(line.hasOption("mingen")) { useMinGen = Boolean.valueOf(line.getOptionValue("mingen")); } if(line.hasOption("ext")) { extStr = String.valueOf(line.getOptionValue("ext")); } Lexer lexer; try { lexer = new bnfLexer(new ANTLRFileStream(filename)); CommonTokenStream tokens = new CommonTokenStream(lexer); bnfParser grammarparser = new bnfParser(tokens); //grammarparser.setTrace(true); ParserRuleContext tree = grammarparser.rulelist(); GeneratorVisitor extractor = new GeneratorVisitor(num,depth,min,max,useMinGen); extractor.visit(tree); List<String> generatedTests = extractor.getTests(); System.out.println("Generating tests ..."); if(line.hasOption("tests")) { String folderPath = line.getOptionValue("tests"); int i = 1; for(String s: generatedTests) { File f = new File(folderPath+"/"+i+"."+extStr); Files.createParentDirs(f); Files.write(s, f, Charset.forName("UTF-8")); i++; } System.out.println("All tests have been saved in the "+ folderPath + " folder!"); } else { for(String s : generatedTests) { System.out.println(s); } } } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, "Exception: grammar file cannot be read!", ex); } } else { System.out.println("Error: grammar file not specified!"); System.out.println("Please give the path to the grammar file using the \"-file\" option."); } } catch(ParseException exp) { // oops, something went wrong System.err.println( "Parsing failed. Reason: " + exp.getMessage() ); } } //////////////////////////////// Attributes \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ /////////////////////////////// Constructors \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ ////////////////////////////////// Methods \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ //------------------------ Implements: //------------------------ Overrides: //---------------------------- Abstract Methods ----------------------------- //---------------------------- Utility Methods ------------------------------ //---------------------------- Property Methods ----------------------------- }