示例#1
0
 /**
  * Dump parenthesized subexpressions found by a regular expression matcher object
  *
  * @param r Matcher object with results to show
  */
 void showParens(RE r) {
   // Loop through each paren
   for (int i = 0; i < r.getParenCount(); i++) {
     // Show paren register
     say("$" + i + " = " + r.getParen(i));
   }
 }
示例#2
0
  /**
   * Run automated unit test
   *
   * @exception Exception thrown in case of error
   */
  void runAutomatedTests() throws Exception {
    // Serialization test 1: Compile regexp and serialize/deserialize it
    RE r = new RE("(a*)b");
    say("Serialized/deserialized (a*)b");
    ByteArrayOutputStream out = new ByteArrayOutputStream(128);
    new ObjectOutputStream(out).writeObject(r);
    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
    r = (RE) new ObjectInputStream(in).readObject();
    if (!r.match("aaab")) {
      fail("Did not match 'aaab' with deserialized RE.");
    }
    say("aaaab = true");
    showParens(r);

    // Serialization test 2: serialize/deserialize used regexp
    out.reset();
    say("Deserialized (a*)b");
    new ObjectOutputStream(out).writeObject(r);
    in = new ByteArrayInputStream(out.toByteArray());
    r = (RE) new ObjectInputStream(in).readObject();
    if (r.getParenCount() != 0) {
      fail("Has parens after deserialization.");
    }
    if (!r.match("aaab")) {
      fail("Did not match 'aaab' with deserialized RE.");
    }
    say("aaaab = true");
    showParens(r);

    // Test MATCH_CASEINDEPENDENT
    r = new RE("abc(\\w*)");
    say("MATCH_CASEINDEPENDENT abc(\\w*)");
    r.setMatchFlags(RE.MATCH_CASEINDEPENDENT);
    say("abc(d*)");
    if (!r.match("abcddd")) {
      fail("Did not match 'abcddd'.");
    }
    say("abcddd = true");
    showParens(r);

    if (!r.match("aBcDDdd")) {
      fail("Did not match 'aBcDDdd'.");
    }
    say("aBcDDdd = true");
    showParens(r);

    if (!r.match("ABCDDDDD")) {
      fail("Did not match 'ABCDDDDD'.");
    }
    say("ABCDDDDD = true");
    showParens(r);
  }
示例#3
0
  /**
   * Compile and test matching against a single expression
   *
   * @param expr Expression to compile and test
   */
  void runInteractiveTests(String expr) {
    try {
      // Compile expression
      r.setProgram(compiler.compile(expr));

      // Show expression
      say("" + NEW_LINE + "" + expr + "" + NEW_LINE + "");

      // Show program for compiled expression
      PrintWriter writer = new PrintWriter(System.out);
      compiler.dumpProgram(writer);
      writer.flush();

      boolean running = true;
      // Test matching against compiled expression
      while (running) {
        // Read from keyboard
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("> ");
        System.out.flush();
        String match = br.readLine();

        if (match != null) {
          // Try a match against the keyboard input
          if (r.match(match)) {
            say("Match successful.");
          } else {
            say("Match failed.");
          }

          // Show subparen registers
          showParens(r);
        } else {
          running = false;
          System.out.println();
        }
      }
    } catch (Exception e) {
      say("Error: " + e.toString());
      e.printStackTrace();
    }
  }
示例#4
0
  /**
   * Run automated tests in RETest.txt file (from Perl 4.0 test battery)
   *
   * @exception Exception thrown in case of error
   */
  void runAutomatedTests(String testDocument) throws Exception {
    long ms = System.currentTimeMillis();

    // Simple test of pre-compiled regular expressions
    RE r = new RE(re1);
    say("a*b");
    say("aaaab = " + r.match("aaab"));
    showParens(r);
    say("b = " + r.match("b"));
    showParens(r);
    say("c = " + r.match("c"));
    showParens(r);
    say("ccccaaaaab = " + r.match("ccccaaaaab"));
    showParens(r);

    r = new RE("a*b");
    String[] s = r.split("xxxxaabxxxxbyyyyaaabzzz");
    r = new RE("x+");
    s = r.grep(s);
    for (int i = 0; i < s.length; i++) {
      System.out.println("s[" + i + "] = " + s[i]);
    }

    r = new RE("a*b");
    String s1 = r.subst("aaaabfooaaabgarplyaaabwackyb", "-");
    System.out.println("s = " + s1);

    // Some unit tests
    runAutomatedTests();

    // Test from script file
    File testInput = new File(testDocument);
    if (!testInput.exists()) throw new Exception("Could not find: " + testDocument);
    BufferedReader br = new BufferedReader(new FileReader(testInput));
    try {
      // While input is available, parse lines
      while (br.ready()) {
        // Find next re test case
        String number = "";
        String yesno;
        while (br.ready()) {
          number = br.readLine();
          if (number == null) {
            break;
          }
          number = number.trim();
          if (number.startsWith("#")) {
            break;
          }
          if (!number.equals("")) {
            System.out.println("Script error.  Line = " + number);
            System.exit(0);
          }
        }

        // Are we done?
        if (!br.ready()) {
          break;
        }

        // Get expression
        expr = br.readLine();
        n++;
        say("");
        say(n + ". " + expr);
        say("");

        // Compile it
        try {
          r.setProgram(compiler.compile(expr));
        }

        // Some expressions *should* cause exceptions to be thrown
        catch (Exception e) {
          // Get expected result
          yesno = br.readLine().trim();

          // If it was supposed to be an error, report success and continue
          if (yesno.equals("ERR")) {
            say("   Match: ERR");
            success("Produces an error (" + e.toString() + "), as expected.");
            continue;
          }

          // Wasn't supposed to be an error
          String message = e.getMessage() == null ? e.toString() : e.getMessage();
          fail("Produces an unexpected exception \"" + message + "\"");
          e.printStackTrace();
        } catch (Error e) {
          // Internal error happened
          fail("Compiler threw fatal error \"" + e.getMessage() + "\"");
          e.printStackTrace();
        }

        // Get string to match against
        String matchAgainst = br.readLine().trim();
        say("   Match against: '" + matchAgainst + "'");

        // Expression didn't cause an expected error
        if (matchAgainst.equals("ERR")) {
          fail("Was expected to be an error, but wasn't.");
          continue;
        }

        // Try matching
        try {
          // Match against the string
          boolean b = r.match(matchAgainst);

          // Get expected result
          yesno = br.readLine().trim();

          // If match succeeded
          if (b) {
            // Status
            say("   Match: YES");

            // Match wasn't supposed to succeed
            if (yesno.equals("NO")) {
              fail("Matched \"" + matchAgainst + "\", when not expected to.");
            } else if (yesno.equals("YES")) {
              // Match succeeded as expected
              success("Matched \"" + matchAgainst + "\", as expected:");

              // Show subexpression registers
              if (showSuccesses) {
                showParens(r);
              }

              say("   Paren count: " + r.getParenCount());

              // Check registers against expected contents
              for (int p = 0; p < r.getParenCount(); p++) {
                // Get next register
                String register = br.readLine().trim();
                say("   Paren " + p + " : " + r.getParen(p));

                // Compare expected result with actual
                if (register.length() == 0 && r.getParen(p) == null) {
                  // Consider "" in test file equal to null
                } else if (!register.equals(r.getParen(p))) {
                  // Register isn't what it was supposed to be
                  fail(
                      "Register "
                          + p
                          + " should be = \""
                          + register
                          + "\", but is \""
                          + r.getParen(p)
                          + "\" instead.");
                }
              }
            } else {
              // Bad test script
              die("Test script error!");
            }
          } else {
            // Status
            say("   Match: NO");

            // Match failed
            if (yesno.equals("YES")) {
              // Should have failed
              fail("Did not match \"" + matchAgainst + "\", when expected to.");
            } else if (yesno.equals("NO")) {
              // Should have failed
              success("Did not match \"" + matchAgainst + "\", as expected.");
            } else {
              // Bad test script
              die("Test script error!");
            }
          }
        }

        // Matcher blew it
        catch (Exception e) {
          fail("Matcher threw exception: " + e.toString());
          e.printStackTrace();
        }

        // Internal error
        catch (Error e) {
          fail("Matcher threw fatal error \"" + e.getMessage() + "\"");
          e.printStackTrace();
        }
      }
    } finally {
      br.close();
    }

    // Show match time
    System.out.println(
        NEW_LINE + NEW_LINE + "Match time = " + (System.currentTimeMillis() - ms) + " ms.");

    // Print final results
    System.out.println(NEW_LINE + "Tests complete.  " + n + " tests, " + failures + " failure(s).");
  }