/* * Copyright 2013 eXo Platform SAS * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package juzu.impl.router.regex; import junit.framework.AssertionFailedError; import juzu.impl.common.CharStream; import juzu.test.AbstractTestCase; import org.junit.Test; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class RegExpParserTestCase extends AbstractTestCase { @Test public void testParseDisjunction() { parseParse("|"); parseParse("a|"); parseParse("|a"); parseParse("a|b"); } @Test public void testParseAlternative() { parseParse("ab"); parseParse("^a$"); } @Test public void testParseAssertion() { parseParse("^"); parseParse("$"); } @Test public void testParseAny() { parseParse("."); } @Test public void testParseCharacterLiteral() { parseParse("a"); parseParse("-"); parseParse("]"); parseParse("\\$"); parseParse("\\00"); parseParse("\\01"); parseParse("\\018"); parseParse("\\011"); parseParse("\\0311"); parseParse("\\x00"); parseParse("\\xFF"); parseParse("\\xff"); parseParse("\\u0000"); parseParse("\\uFFFF"); // failFail("\\"); failFail("\\k"); failFail("\\0"); failFail("\\08"); failFail("\\x1"); failFail("\\x1G"); failFail("\\u1"); failFail("\\u12"); failFail("\\u123"); failFail("\\u123G"); } @Test public void testCharacterClass() throws Exception { parseParse("[a]"); parseParse("[{]"); parseParse("[a{]"); parseParse("[]a]"); parseParse("[[a]]"); parseParse("[a[b]]"); // failFail("[a"); failFail("[]"); } @Test public void testCharacterClassNegation() throws Exception { parseParse("[^a]"); parseParse("[^]a]"); parseParse("[^[a]]"); parseParse("[^a[b]]"); // failFail("[^a"); failFail("[]"); } @Test public void testCharacterClassRange() { parseParse("[a-b]"); parseParse("[-]"); parseParse("[ --]"); parseParse("[ --b]"); parseParse("[--/]"); parseParse("[a-]"); parseParse("[---]"); parseParse("[--]"); // parseFail("[--[ab]]"); // Parse - or a or b } @Test public void testCharacterClassAlternative() { parseParse("[&]"); parseParse("[a&&b]"); parseParse("[a&&]"); parseParse("[a&&[b]]"); // failFail("[&&]"); failFail("[&&&]"); failFail("[&&&&]"); // parseFail("[&&b]"); } @Test public void testCharacterClassEscape() { parseParse("[\\\\]"); parseParse("[\\[]"); parseParse("[\\]]"); parseParse("[\\.]"); parseParse("[\\-]"); // failFail("[\\k]"); } @Test public void testCharacterClassAny() { parseParse("[.]"); parseParse("[^.]"); } @Test public void testCharacterClassAssert() { parseParse("[$]"); parseParse("[^$]"); parseParse("[^^]"); parseParse("[$^]"); } @Test public void testParseGroup() { parseParse("()"); parseParse("(?)"); parseParse("(a)"); parseParse("(|)"); parseParse("(a|)"); parseParse("(|a)"); parseParse("(a|b)"); parseParse("(()())"); // parseParse("(?:)"); parseParse("(?=)"); parseParse("(?!)"); parseParse("(?<=)"); parseParse("(?<!)"); // failFail("(?a)"); failFail("("); failFail(")"); failFail("(?<)"); failFail("(?<a)"); } @Test public void testParseQuantifier() { parseParse("^?"); parseParse("$?"); parseParse("a?"); parseParse("()?"); parseParse("[a]?"); parseParse("^*"); parseParse("$*"); parseParse("a*"); parseParse("()*"); parseParse("[a]*"); parseParse("^+"); parseParse("$+"); parseParse("a+"); parseParse("()+"); parseParse("[a]+"); parseParse("a{0}"); parseParse("a{0,}"); parseParse("a{0,1}"); // failFail("?"); failFail("+"); failFail("*"); failFail("{"); failFail("a{"); failFail("a{}"); failFail("a{b"); failFail("a{0"); failFail("a{0,"); failFail("a{0,1"); } @Test public void testParseQuantifierMode() { parseParse("a??"); parseParse("a?+"); parseParse("a+?"); parseParse("a++"); parseParse("a*?"); parseParse("a*+"); parseParse("a{0}?"); parseParse("a{0}+"); } void parseFail(String s) { parse(s, false, true); } void parseParse(String s) { parse(s, false, false); } void failFail(String s) { parse(s, true, true); } void parse(String s, boolean javaFail, boolean javaccFail) { try { Pattern.compile(s); if (javaFail) { throw new AssertionFailedError("Was expecting " + s + " to not be compilable"); } } catch (PatternSyntaxException e) { if (!javaFail) { AssertionFailedError afe = new AssertionFailedError("Was expecting " + s + " to be compilable"); afe.initCause(e); throw afe; } } try { CharStream stream = new CharStream(s); Lexer lexer = new Lexer(stream); REParser parser = new REParser(lexer); parser.parse(); assertEquals(s.length(), stream.getIndex()); if (lexer.hasNext()) { throw new SyntaxException(); } if (javaccFail) { throw new AssertionFailedError("Was expecting " + s + " to not be compilable"); } } catch (SyntaxException e) { if (!javaccFail) { AssertionFailedError afe = new AssertionFailedError("Was expecting " + s + " to be compilable"); afe.initCause(e); throw afe; } } } }