/* * Copyright (C) 2011 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.web.controller.regexp; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import junit.framework.AssertionFailedError; import junit.framework.TestCase; /** * @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */ public class TestRegExpParser extends TestCase { public void testParseDisjunction() { parseParse("|"); parseParse("a|"); parseParse("|a"); parseParse("a|b"); } public void testParseAlternative() { parseParse("ab"); parseParse("^a$"); } public void testParseAssertion() { parseParse("^"); parseParse("$"); } public void testParseAny() { parseParse("."); } 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"); } public void testCharacterClass() throws Exception { parseParse("[a]"); parseParse("[{]"); parseParse("[a{]"); parseParse("[]a]"); parseParse("[[a]]"); parseParse("[a[b]]"); // failFail("[a"); failFail("[]"); } public void testCharacterClassNegation() throws Exception { parseParse("[^a]"); parseParse("[^]a]"); parseParse("[^[a]]"); parseParse("[^a[b]]"); // failFail("[^a"); failFail("[]"); } public void testCharacterClassRange() { parseParse("[a-b]"); parseParse("[-]"); parseParse("[ --]"); parseParse("[ --b]"); parseParse("[--/]"); parseParse("[a-]"); parseParse("[---]"); parseParse("[--]"); // parseFail("[--[ab]]"); // Parse - or a or b } public void testCharacterClassAlternative() { parseParse("[&]"); parseParse("[a&&b]"); parseParse("[a&&]"); parseParse("[a&&[b]]"); // failFail("[&&]"); failFail("[&&&]"); failFail("[&&&&]"); // parseFail("[&&b]"); } public void testCharacterClassEscape() { parseParse("[\\\\]"); parseParse("[\\[]"); parseParse("[\\]]"); parseParse("[\\.]"); parseParse("[\\-]"); // failFail("[\\k]"); } public void testCharacterClassAny() { parseParse("[.]"); parseParse("[^.]"); } public void testCharacterClassAssert() { parseParse("[$]"); parseParse("[^$]"); parseParse("[^^]"); parseParse("[$^]"); } 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)"); } 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"); } 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 { Stream stream = new Stream(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; } } } }