114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson/*
214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  Licensed to the Apache Software Foundation (ASF) under one or more
314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  contributor license agreements.  See the NOTICE file distributed with
414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  this work for additional information regarding copyright ownership.
514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  The ASF licenses this file to You under the Apache License, Version 2.0
614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  (the "License"); you may not use this file except in compliance with
714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  the License.  You may obtain a copy of the License at
814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *
914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
1014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *
1114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  Unless required by applicable law or agreed to in writing, software
1214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  distributed under the License is distributed on an "AS IS" BASIS,
1314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  See the License for the specific language governing permissions and
1514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson *  limitations under the License.
1614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson */
1714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
184557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.util.regex;
1914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
20eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughesimport java.util.ArrayList;
214557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.regex.Matcher;
224557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.util.regex.Pattern;
2369860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniakimport java.util.regex.PatternSyntaxException;
244557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport junit.framework.TestCase;
2514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
2614816f17144d90174628ee82dc616d4b9c921149Jesse Wilsonpublic class OldMatcherTest extends TestCase {
2714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    String[] groupPatterns = { "(a|b)*aabb", "((a)|b)*aabb", "((a|b)*)a(abb)",
2814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            "(((a)|(b))*)aabb", "(((a)|(b))*)aa(b)b", "(((a)|(b))*)a(a(b)b)" };
2914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
3014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testAppendReplacement() {
3114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile("XX");
3214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher m = pat.matcher("Today is XX-XX-XX ...");
3314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        StringBuffer sb = new StringBuffer();
3414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
3514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (int i = 0; m.find(); i++) {
3614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendReplacement(sb, new Integer(i * 10 + i).toString());
3714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
3814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.appendTail(sb);
3914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Today is 0-11-22 ...", sb.toString());
4014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
4114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        pat = Pattern.compile("cat");
4214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m = pat.matcher("one-cat-two-cats-in-the-yard");
4314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        sb = new StringBuffer();
4414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Throwable t = null;
4514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.find();
4614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        try {
4714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendReplacement(null, "dog");
4814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        } catch (NullPointerException e) {
4914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            t = e;
5014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
5114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertNotNull(t);
5214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        t = null;
5314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.find();
5414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        try {
5514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendReplacement(sb, null);
5614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        } catch (NullPointerException e) {
5714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            t = e;
5814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
5914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertNotNull(t);
6014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
6114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
6214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_resetLjava_lang_String() {
6314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
6414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString1 = "babbabbcccabbabbabbabbabb";
6514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString2 = "cddcddcddcddcddbbbb";
6614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
6714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString1);
6814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
6914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        while (mat.find());
7014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Reset should return itself 1", mat, mat.reset(testString2));
7114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("After reset matcher should not find pattern in given input", mat.find());
7214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Reset should return itself 2", mat, mat.reset(testString1));
7314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("After reset matcher should find pattern in given input", mat.find());
7414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
7514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
7614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testAppendTail() {
7714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern p = Pattern.compile("cat");
7814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher m = p.matcher("one-cat-two-cats-in-the-yard");
7914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        StringBuffer sb = new StringBuffer();
8014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        while (m.find()) {
8114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendReplacement(sb, "dog");
8214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
8314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.appendTail(sb);
8414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("one-dog-two-dogs-in-the-yard", sb.toString());
8514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
8614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        p = Pattern.compile("cat|yard");
8714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m = p.matcher("one-cat-two-cats-in-the-yard");
8814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        sb = new StringBuffer();
8914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        while (m.find()) {
9014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendReplacement(sb, "dog");
9114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
9214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("one-dog-two-dogs-in-the-dog", sb.toString());
9314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.appendTail(sb);
9414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("one-dog-two-dogs-in-the-dog", sb.toString());
9514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
9614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        p = Pattern.compile("cat");
9714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m = p.matcher("one-cat-two-cats-in-the-yard");
9814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        sb = new StringBuffer();
9914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        while (m.find()) {
10014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendReplacement(sb, "dog");
10114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
10214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Throwable t = null;
10314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        try {
10414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.appendTail(null);
10514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        } catch (NullPointerException e) {
10614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            t = e;
10714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
10814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertNotNull(t);
10914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
11014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
11114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_reset() {
11214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
11314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "babbabbcccabbabbabbabbabb";
11414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
11514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
11614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
11714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        while (mat.find());
11814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Reset should return itself", mat, mat.reset());
11914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("After reset matcher should find pattern in given input", mat.find());
12014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
12114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
12214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_hasAnchoringBounds() {
12314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "abb";
12414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "abb";
12514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
12614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
12714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
12814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Matcher uses anchoring bound by default",
12914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mat.hasAnchoringBounds());
13014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
13114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mu = mat.useAnchoringBounds(true);
13214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Incorrect value of anchoring bounds",
13314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mu.hasAnchoringBounds());
13414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
13514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mu = mat.useAnchoringBounds(false);
13614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Incorrect value of anchoring bounds",
13714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mu.hasAnchoringBounds());
13814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
13914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
14014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_hasTransparentBounds() {
14114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "abb";
14214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "ab\nb";
14314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
14414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
14514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
14614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Matcher uses opaque bounds by default",
14714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mat.hasTransparentBounds());
14814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
14914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mu = mat.useTransparentBounds(true);
15014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Incorrect value of anchoring bounds",
15114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mu.hasTransparentBounds());
15214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
15314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mu = mat.useTransparentBounds(false);
15414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Incorrect value of anchoring bounds",
15514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mu.hasTransparentBounds());
15614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
15714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
15814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_startI() {
15914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(((abb)a)(bb))";
16014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
16114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
16214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
16314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int start = 3;
16414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int end = 6;
16514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int i, j;
16614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
16714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (j = 0; j < 3; j++) {
16814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            while (mat.find(start + j - 2)) {
16914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                for (i = 0; i < 4; i++) {
17014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                    assertEquals("Start is wrong for group " + i + " :" + mat.group(i), start, mat.start(i));
17114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                }
17214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals("Start is wrong for group " + i + " :" + mat.group(i), start + 4, mat.start(i));
17314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
17414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                start = end;
17514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                end += 3;
17614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            }
17714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
17814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
17914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
18014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_endI() {
18114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(((abb)a)(bb))";
18214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
18314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
18414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
18514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int start = 3;
18614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int end = 6;
18714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int i, j;
18814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
18914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (j = 0; j < 3; j++) {
19014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            while (mat.find(start + j - 2)) {
19114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                for (i = 0; i < 4; i++) {
19214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                    assertEquals("End is wrong for group " + i + " :" + mat.group(i), start + mat.group(i).length(), mat.end(i));
19314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                }
19414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals("End is wrong for group " + i + " :" + mat.group(i), start + 4 + mat.group(i).length(), mat.end(i));
19514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
19614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                start = end;
19714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                end += 3;
19814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            }
19914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
20014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
20114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
20214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
20314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_lookingAt() {
20414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(((abb)a)(bb))";
20514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString1 = "babbabbcccabbabbabbabbabb";
20614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString2 = "abbabb";
20714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
20814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat1 = pat.matcher(testString1);
20914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat2 = pat.matcher(testString2);
21014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
21114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Should not find given pattern in 1 string", mat1.lookingAt());
21214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat1.region(1, 10);
21314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Should find given pattern in region of string", mat1.lookingAt());
21414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Should find given pattern in 2 string", mat2.lookingAt());
21514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
21614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
21714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_findI() {
21814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
21914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
22014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
22114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
22214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int start = 3;
22314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int end = 6;
22414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int j;
22514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
22614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (j = 0; j < 3; j++) {
22714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            while (mat.find(start + j - 2)) {
22814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals(start, mat.start(1));
22914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals(end, mat.end(1));
23014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
23114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                start = end;
23214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                end += 3;
23314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            }
23414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            start = 6;
23514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            end = 9;
23614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
23714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
23814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        testPattern = "(\\d{1,3})";
23914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        testString = "aaaa123456789045";
24014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
24114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat2 = Pattern.compile(testPattern);
24214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat2 = pat2.matcher(testString);
24314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        start = 4;
24414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int length = 3;
24514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (j = 0; j < length; j++) {
24614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            for (int i = 4 + j; i < testString.length() - length; i += length) {
24714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                mat2.find(i);
24814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals(testString.substring(i, i + length), mat2.group(1));
24914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            }
25014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
25114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
25291cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        String string3 = "Brave new world";
25314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat3 = Pattern.compile("new");
25491cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        Matcher mat3 = pat3.matcher(string3);
25591cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes
25691cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        // find(int) throws for out of range indexes.
25791cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        try {
25891cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes            mat3.find(-1);
25991cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes            fail();
26091cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        } catch (IndexOutOfBoundsException expected) {
26191cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        }
26291cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertFalse(mat3.find(string3.length()));
26391cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        try {
26491cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes            mat3.find(string3.length() + 1);
26591cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes            fail();
26691cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        } catch (IndexOutOfBoundsException expected) {
26791cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        }
26814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
26914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(mat3.find(6));
27014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(mat3.find(7));
27114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
27214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat3.region(7, 10);
27391cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertFalse(mat3.find()); // No "new" in the region.
27414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
27591cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertTrue(mat3.find(3)); // find(int) ignores the region.
27691cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertTrue(mat3.find(6)); // find(int) ignores the region.
27791cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertFalse(mat3.find(7)); // No "new" >= 7.
27891cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes
27991cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        mat3.region(1, 4);
28091cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertFalse(mat3.find()); // No "new" in the region.
28191cd2eae0c1fd2e04d46876856b33b8324aa8b5fElliott Hughes        assertTrue(mat3.find(5)); // find(int) ignores the region.
28214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
283ceacc61d16fe3aec9c805de525a79f547e607a27Elliott Hughes
28414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testSEOLsymbols() {
28514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile("^a\\(bb\\[$");
28614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher("a(bb[");
28714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
28814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(mat.matches());
28914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
29014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
29114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_start() {
29214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
29314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
29414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
29514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
29614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int start = 3;
29714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int end = 6;
29814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int j;
29914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
30014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (j = 0; j < 3; j++) {
30114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            while (mat.find()) {
30214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals("Start is wrong", start, mat.start());
30314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
30414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                start = end;
30514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                end += 3;
30614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            }
30714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
30814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
30914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
31014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_end() {
31114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
31214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
31314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
31414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
31514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int start = 3;
31614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int end = 6;
31714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        int j;
31814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
31914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (j = 0; j < 3; j++) {
32014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            while (mat.find()) {
32114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                assertEquals("Start is wrong", end, mat.end());
32214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
32314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                start = end;
32414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                end += 3;
32514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            }
32614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
32714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
328ceacc61d16fe3aec9c805de525a79f547e607a27Elliott Hughes
32914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testGroupCount() {
33014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        for (int i = 0; i < groupPatterns.length; i++) {
33114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            Pattern test = Pattern.compile(groupPatterns[i]);
33214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            Matcher mat = test.matcher("ababababbaaabb");
33314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            mat.matches();
33414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            assertEquals(i + 1, mat.groupCount());
33514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
33614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
33714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
33814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
33914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testRegion() {
34014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern p = Pattern.compile("abba");
34114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher m = p.matcher("Gabba gabba hey");
34214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
34314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.region(0, 15);
34414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(m.find());
34514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(m.find());
34614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(m.find());
34714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
34814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.region(5, 15);
34914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(m.find());
35014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(m.find());
35114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
35214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        m.region(10, 15);
35314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(m.find());
35414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
35514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Throwable t = null;
35614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
35714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        try {
35814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.region(-1, 15);
35914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        } catch (IndexOutOfBoundsException e) {
36014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            t = e;
36114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
36214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertNotNull(t);
36314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
36414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        t = null;
36514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        try {
36614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            m.region(0, 16);
36714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        } catch (IndexOutOfBoundsException e) {
36814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            t = e;
36914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
37014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertNotNull(t);
37114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
37214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
37314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
37414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testMatchesURI() {
37514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.
37614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                compile("^(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?");
37714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat
37814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                .matcher("file:/c:/workspace/api/build.win32/classes/META-INF/"
37914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson                        + "services/javax.xml.parsers.DocumentBuilderFactory");
38014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(mat.matches());
38114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
38214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
38314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
38414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testQuoteReplacement() {
38514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("\\$dollar and slash\\\\", Matcher.quoteReplacement("$dollar and slash\\"));
38614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
38714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
38814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testUnicode() {
38914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
39014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\x61a").matcher("aa").matches());
39114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson//        assertTrue(Pattern.matches("\\u0061a", "aa"));
39214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\0141a").matcher("aa").matches());
39314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\0777").matcher("?7").matches());
39414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
39514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
396ceacc61d16fe3aec9c805de525a79f547e607a27Elliott Hughes
39714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testUnicodeCategory() {
39814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\p{Ll}").matcher("k").matches()); // Unicode lower case
39914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\P{Ll}").matcher("K").matches()); // Unicode non-lower
40014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        // case
40114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\p{Lu}").matcher("K").matches()); // Unicode upper case
40214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("\\P{Lu}").matcher("k").matches()); // Unicode non-upper
40314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        // case
40414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        // combinations
40514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("[\\p{L}&&[^\\p{Lu}]]").matcher("k").matches());
40614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("[\\p{L}&&[^\\p{Ll}]]").matcher("K").matches());
40714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(Pattern.compile("[\\p{L}&&[^\\p{Lu}]]").matcher("K").matches());
40814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(Pattern.compile("[\\p{L}&&[^\\p{Ll}]]").matcher("k").matches());
40914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
41014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        // category/character combinations
41114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(Pattern.compile("[\\p{L}&&[^a-z]]").matcher("k").matches());
41214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("[\\p{L}&&[^a-z]]").matcher("K").matches());
41314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
41414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("[\\p{Lu}a-z]").matcher("k").matches());
41514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("[a-z\\p{Lu}]").matcher("k").matches());
41614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
41714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(Pattern.compile("[\\p{Lu}a-d]").matcher("k").matches());
41814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(Pattern.compile("[a-d\\p{Lu}]").matcher("K").matches());
41914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
42014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        //        assertTrue(Pattern.matches("[\\p{L}&&[^\\p{Lu}&&[^K]]]", "K"));
42114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(Pattern.compile("[\\p{L}&&[^\\p{Lu}&&[^G]]]").matcher("K").matches());
42214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
42314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
42414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
42514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_regionStart() {
42614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
42714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
42814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
42914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
43014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
43114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Region sould start from 0 position", 0, mat.regionStart());
43214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(1, 10);
43314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Region sould start from 1 position after setting new region", 1, mat.regionStart());
43414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.reset();
43514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Region sould start from 0 position after reset", 0, mat.regionStart());
43614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
43714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
43814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_regionEnd() {
43914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(abb)";
44014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "cccabbabbabbabbabb";
44114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
44214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
44314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
44414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Region end value should be equal to string length", testString.length(), mat.regionEnd());
44514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(1, 10);
44614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Region end value should be equal to 10 after setting new region", 10, mat.regionEnd());
44714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.reset();
44814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Region end value should be equal to string length after reset", testString.length(), mat.regionEnd());
44914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
45014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
45114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_toMatchResult() {
45214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "(((abb)a)(bb))";
45314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "babbabbcccabbabbabbabbabb";
45414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
45514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
45614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
45714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(1, 7);
45814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("matcher should find pattern in given region", mat.matches());
45914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("matched section should start from 1 position", 1, mat.toMatchResult().start());
46014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("matched section for 2 group should start from 1 position", 1, mat.toMatchResult().start(2));
46114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("matched section for whole pattern should end on 7 position", 7, mat.toMatchResult().end());
46214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("matched section for 3 group should end at 4 position", 4, mat.toMatchResult().end(3));
46314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("group not matched", "abbabb", mat.toMatchResult().group());
46414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("3 group not matched", "abb", mat.toMatchResult().group(3));
46514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("Total number of groups does not matched with given pattern", 4, mat.toMatchResult().groupCount());
46614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson   }
46714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
46814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_usePatternLjava_util_regex_Pattern() {
46914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern1 = "(((abb)a)(bb))";
47014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern2 = "(abbabb)";
47114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern3 = "(babb)";
47214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "babbabbcccabbabbabbabbabb";
47314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern1);
47414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
47514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
47614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(1, 7);
47714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("matcher should find pattern in given region in case of groupe in pattern", mat.matches());
47814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("", mat, mat.usePattern(Pattern.compile(testPattern2)));
47914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("matcher should find pattern in given region", mat.matches());
48014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertEquals("", mat, mat.usePattern(Pattern.compile(testPattern3)));
48114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("matcher should not find pattern in given region", mat.matches());
48214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson   }
48314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
48414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_anchoringBounds() {
48514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "^ro$";
48614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "android";
48714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
48814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
48914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
49014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(2, 5);
49114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.useAnchoringBounds(false);
49214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Shouldn't find pattern with non-anchoring bounds", mat.find(0));
49314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
49414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(2, 5);
49514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.useAnchoringBounds(true);
49614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Should find pattern with anchoring bounds", mat.find(0));
49714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
49814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
49914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_transparentBounds() {
50014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "and(?=roid)";
50114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "android";
50214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
50314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
50414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
50514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(0, 3);
50614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.useTransparentBounds(false);
50714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Shouldn't find pattern with opaque bounds", mat.matches());
50814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
50914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.useTransparentBounds(true);
51014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Should find pattern transparent bounds", mat.matches()); // ***
51114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
51214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        testPattern = "and(?!roid)";
51314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        testString = "android";
51414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        pat = Pattern.compile(testPattern);
51514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat = pat.matcher(testString);
51614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
51714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.region(0, 3);
51814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.useTransparentBounds(false);
51914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("Should find pattern with opaque bounds", mat.matches());
52014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
52114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat.useTransparentBounds(true);
52214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse("Shouldn't find pattern transparent bounds", mat.matches()); // ***
52314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
52414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
52514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_hitEnd() {
52614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "abb";
52714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "babbabbcccabbabbabbabbabb";
52814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
52914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
53014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
53114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        while (mat.find()) {
53214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson            assertFalse("hitEnd should return false during parsing input", mat.hitEnd());
53314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        }
53414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue("hitEnd should return true after finding last match", mat.hitEnd()); // ***
53514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
53614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
53714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void test_requireEnd() {
53814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testPattern = "bba";
53914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        String testString = "abbbbba";
54014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pat = Pattern.compile(testPattern);
54114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Matcher mat = pat.matcher(testString);
54214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
54314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(mat.find());
54414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertFalse(mat.requireEnd());
54514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
54614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        testPattern = "bba$";
54714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        testString = "abbbbba";
54814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        pat = Pattern.compile(testPattern);
54914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        mat = pat.matcher(testString);
55014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
55114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(mat.find());
55214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(mat.requireEnd());
55314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
55414816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
55514816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    /*
55614816f17144d90174628ee82dc616d4b9c921149Jesse Wilson     * Regression test for HARMONY-674
55714816f17144d90174628ee82dc616d4b9c921149Jesse Wilson     */
55814816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    public void testPatternMatcher() throws Exception {
55914816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        Pattern pattern = Pattern.compile("(?:\\d+)(?:pt)");
56014816f17144d90174628ee82dc616d4b9c921149Jesse Wilson        assertTrue(pattern.matcher("14pt").matches());
56114816f17144d90174628ee82dc616d4b9c921149Jesse Wilson    }
56214816f17144d90174628ee82dc616d4b9c921149Jesse Wilson
563953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes    public void testUnicodeCharacterClasses() throws Exception {
564953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        // http://code.google.com/p/android/issues/detail?id=21176
565953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        // We use the Unicode TR-18 definitions: http://www.unicode.org/reports/tr18/#Compatibility_Properties
566953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        assertTrue("\u0666".matches("\\d")); // ARABIC-INDIC DIGIT SIX
567953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        assertFalse("\u0666".matches("\\D")); // ARABIC-INDIC DIGIT SIX
568953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        assertTrue("\u1680".matches("\\s")); // OGHAM SPACE MARK
569953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        assertFalse("\u1680".matches("\\S")); // OGHAM SPACE MARK
570953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        assertTrue("\u00ea".matches("\\w")); // LATIN SMALL LETTER E WITH CIRCUMFLEX
571953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes        assertFalse("\u00ea".matches("\\W")); // LATIN SMALL LETTER E WITH CIRCUMFLEX
572953dfe37db00b2610807c3f895c72183c7ce5b14Elliott Hughes    }
573eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes
574eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes    // http://code.google.com/p/android/issues/detail?id=41143
575eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes    public void testConcurrentMatcherAccess() throws Exception {
576eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        final Pattern p = Pattern.compile("(^|\\W)([a-z])");
577eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        final Matcher m = p.matcher("");
578eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes
579eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        ArrayList<Thread> threads = new ArrayList<Thread>();
5805e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer        for (int i = 0; i < 5; ++i) {
581eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes            Thread t = new Thread(new Runnable() {
582eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                public void run() {
5835e5169a394fd431609c3419bb4052e71dc73fed3Tobias Thierer                    for (int i = 0; i < 1024; ++i) {
584eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                        String s = "some example text";
585eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                        m.reset(s);
586eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                        try {
587eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                            StringBuffer sb = new StringBuffer(s.length());
588eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                            while (m.find()) {
589eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                                m.appendReplacement(sb, m.group(1) + m.group(2));
590eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                            }
591eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                            m.appendTail(sb);
592eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                        } catch (Exception expected) {
593eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                            // This code is inherently unsafe and crazy;
594eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                            // we're just trying to provoke native crashes!
595eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                        }
596eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                    }
597eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes                }
598eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes            });
599eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes            threads.add(t);
600eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        }
601eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes
602eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        for (Thread t : threads) {
603eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes            t.start();
604eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        }
605eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        for (Thread t : threads) {
606eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes            t.join();
607eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes        }
608eb9689bf8aee71f16fbe22a2c90d25628dd431ecElliott Hughes    }
609d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes
610d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes    // https://code.google.com/p/android/issues/detail?id=33040
611d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes    public void test33040() throws Exception {
612d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes        Pattern p = Pattern.compile("ma");
613d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes        // replaceFirst resets the region; apparently, this was broken in Android 1.6.
614d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes        String result = p.matcher("mama").region(2, 4).replaceFirst("mi");
615d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes        assertEquals("mima", result);
616d475c44c493d219eb8e3caa6c1c8aadb0ee3c2e7Elliott Hughes    }
61769860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
61869860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak    public void testNamedGroupCapture() throws Exception {
61969860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        Matcher m = Pattern.compile("(?<first>[a-f]*)(?<second>[h-k]*)")
62069860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            .matcher("abcdefhkhk");
62169860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
62269860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertTrue(m.matches());
62369860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals("abcdef", m.group("first"));
62469860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals(0, m.start("first"));
62569860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals(6, m.end("first"));
62669860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
62769860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals("hkhk", m.group("second"));
62869860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals(6, m.start("second"));
62969860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals(10, m.end("second"));
63069860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
63169860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        try {
63269860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            m.group("third");
63369860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            fail();
63469860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        } catch (IllegalArgumentException expected) {}
63569860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
63669860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        try {
63769860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            Pattern.compile("(?<>[a-f]*)");
63869860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            fail();
63969860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        } catch(PatternSyntaxException expected) {}
64069860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak    }
64169860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
64269860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak    public void testNamedGroupBackreference() throws Exception {
64369860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        Matcher m = Pattern.compile("(?<somegroup>[a-z]+)X\\k<somegroup>")
64469860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            .matcher("foobarXfoobar");
64569860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
64669860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertTrue(m.matches());
64769860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals("foobar", m.group("somegroup"));
64869860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals(0, m.start("somegroup"));
64969860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals(6, m.end("somegroup"));
65069860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
65169860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        try {
65269860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            Pattern.compile("\\k<nosuchgroup>");
65369860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            fail();
65469860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        } catch(PatternSyntaxException expected) {}
65569860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak    }
65669860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
65769860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak    public void testNamedGroupReplace() throws Exception {
65869860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        assertEquals("a0123zxx", "0123zxx".replaceAll("(?<numbers>[0-9]+)", "a${numbers}"));
65969860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
66069860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        // badly formatted replace string
66169860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        try {
66269860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            "0123zxx".replaceAll("(?<numbers>[0-9]+)", "a${numbers");
66369860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            fail();
66469860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        } catch(IllegalArgumentException expected) {}
66569860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
66669860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        // group that doesn't exist
66769860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        try {
66869860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            "0123zxx".replaceAll("(?<numbers>[0-9]+)", "a${other}");
66969860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak            fail();
67069860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak        } catch(IllegalArgumentException expected) {}
67169860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak    }
67269860bf2b28f0e14741a8895abdb77b45d1ed55dPrzemyslaw Szczepaniak
67314816f17144d90174628ee82dc616d4b9c921149Jesse Wilson}
674