vgritsenko    2003/12/20 09:21:44

  Modified:    .        build.xml
               docs     RETest.txt
               src/java/org/apache/regexp RETest.java
               xdocs    RETest.txt
  Log:
  Apply patch from Oleg Sukhodolsky: improvements to the RETest, and to the RETest.txt 
file format.
  Make RETest less chatty if result is success.
  
  Revision  Changes    Path
  1.6       +3 -2      jakarta-regexp/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-regexp/build.xml,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- build.xml 6 Sep 2003 01:45:51 -0000       1.5
  +++ build.xml 20 Dec 2003 17:21:44 -0000      1.6
  @@ -32,7 +32,7 @@
       <property name="javadoc.destdir" value="docs/api/"/>
       <property name="final.name" value="${project}-${version}"/>
       <property name="final.dir" value="${final.name}/"/>
  -    <property name="debug" value="off"/>
  +    <property name="debug" value="on"/>
       <property name="optimize" value="on"/>
       <property name="deprecation" value="off"/>
       <property name="RETest.txt" value="docs/RETest.txt"/>
  @@ -185,7 +185,8 @@
       <!-- Run RE Test Suite                                                  -->
       <!-- ================================================================== -->
       <target name="test" depends="jar">
  -      <java classname="org.apache.regexp.RETest" fork="yes">
  +      <java classname="org.apache.regexp.RETest" fork="yes"
  +            failonerror="yes">
           <arg value="${RETest.txt}"/>
           <classpath>
             <fileset dir="${build.dir}">
  
  
  
  1.12      +153 -2    jakarta-regexp/docs/RETest.txt
  
  Index: RETest.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-regexp/docs/RETest.txt,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- RETest.txt        1 Sep 2003 18:31:53 -0000       1.11
  +++ RETest.txt        20 Dec 2003 17:21:44 -0000      1.12
  @@ -2,6 +2,7 @@
   abc
   abc
   YES
  +1
   abc
   
   #2
  @@ -23,42 +24,49 @@
   abc
   xabcy
   YES
  +1
   abc
   
   #6
   abc
   ababc
   YES
  +1
   abc
   
   #7
   ab*c
   abc
   YES
  +1
   abc
   
   #8
   ab*bc
   abc
   YES
  +1
   abc
   
   #9
   ab*bc
   abbc
   YES
  +1
   abbc
   
   #10
   ab*bc
   abbbbc
   YES
  +1
   abbbbc
   
   #11
   ab+bc
   abbc
   YES
  +1
   abbc
   
   #12
  @@ -75,18 +83,21 @@
   ab+bc
   abbbbc
   YES
  +1
   abbbbc
   
   #15
   ab?bc
   abbc
   YES
  +1
   abbc
   
   #16
   ab?bc
   abc
   YES
  +1
   abc
   
   #17
  @@ -98,24 +109,28 @@
   ab?c
   abc
   YES
  +1
   abc
   
   #19
   a.c
   abc
   YES
  +1
   abc
   
   #20
   a.c
   axc
   YES
  +1
   axc
   
   #21
   a.*c
   axyzc
   YES
  +1
   axyzc
   
   #22
  @@ -132,6 +147,7 @@
   a[bc]d
   abd
   YES
  +1
   abd
   
   #25
  @@ -143,12 +159,14 @@
   a[b-d]e
   ace
   YES
  +1
   ace
   
   #27
   a[b-d]
   aac
   YES
  +1
   ac
   
   #28
  @@ -159,12 +177,14 @@
   a[-b]
   aa
   YES
  +1
   aa
   
   #30
   a[b-]
   ac
   YES
  +1
   ac
   
   #31
  @@ -187,6 +207,7 @@
   a[^bc]d
   aed
   YES
  +1
   aed
   
   #36
  @@ -198,18 +219,21 @@
   ab|cd
   abc
   YES
  +1
   ab
   
   #38
   ab|cd
   abcd
   YES
  +1
   ab
   
   #39
   ab|cd
   bcda
   YES
  +1
   cd
   
   #40
  @@ -220,6 +244,7 @@
   ()ef
   ef
   YES
  +2
   ef
   
   
  @@ -243,24 +268,28 @@
   a\(b
   a(b
   YES
  +1
   a(b
   
   #47
   a\(*b
   ab
   YES
  +1
   ab
   
   #48
   a\(*b
   a((b
   YES
  +1
   a((b
   
   #49
   a\\b
   a\b
   YES
  +1
   a\b
   
   #50
  @@ -275,6 +304,7 @@
   ((a))
   abc
   YES
  +3
   a
   a
   a
  @@ -283,6 +313,7 @@
   (a)b(c)
   abc
   YES
  +3
   abc
   a
   c
  @@ -291,6 +322,7 @@
   a+b+c
   aabbabc
   YES
  +1
   abc
   
   #55
  @@ -305,12 +337,14 @@
   a*
   aaaa
   YES
  +1
   aaaa
   
   #58
   a*
   baaaa
   YES
  +1
   
   
   #59
  @@ -329,6 +363,7 @@
   (ab|cd)e
   abcde
   YES
  +2
   cde
   cd
   
  @@ -336,30 +371,35 @@
   [abhgefdc]ij
   hij
   YES
  +1
   hij
   
   #64
   ab*
   xabyabbbz
   YES
  +1
   ab
   
   #65
   ab*
   xayabbbz
   YES
  +1
   a
   
   #66
   abcd*efg
   abcdefg
   YES
  +1
   abcdefg
   
   #67
   (ab|ab*)bc
   abc
   YES
  +2
   abc
   a
   
  @@ -368,6 +408,7 @@
   (a|b|c|d|e)f
   ef
   YES
  +2
   ef
   e
   
  @@ -375,12 +416,14 @@
   a|b|c|d|e
   e
   YES
  +1
   e
   
   #70
   (.*)c(.*)
   abcde
   YES
  +3
   abcde
   ab
   de
  @@ -389,6 +432,7 @@
   \((.*), (.*)\)
   (a, b)
   YES
  +3
   (a, b)
   a
   b
  @@ -397,6 +441,7 @@
   a(bc)d
   abcd
   YES
  +2
   abcd
   bc
   
  @@ -404,12 +449,14 @@
   a*
   x
   YES
  +1
   
   
   #74
   ([abc])*d
   abbbcd
   YES
  +2
   abbbcd
   c
   
  @@ -417,12 +464,14 @@
   a*
   
   YES
  +1
   
   
   #76
   ([abc])*bcd
   abcd
   YES
  +2
   abcd
   a
   
  @@ -430,6 +479,7 @@
   (a|b)c*d
   abcd
   YES
  +2
   bcd
   b
   
  @@ -437,6 +487,7 @@
   a([bc]*)c*
   abc
   YES
  +2
   abc
   bc
   
  @@ -444,12 +495,14 @@
   [a-zA-Z_][a-zA-Z0-9_]*
   alpha
   YES
  +1
   alpha
   
   #80
   ((a)(b)c)(d)
   abcd
   YES
  +5
   abcd
   abc
   a
  @@ -460,6 +513,7 @@
   (ab|a)b*c
   abc
   YES
  +2
   abc
   ab
   
  @@ -476,6 +530,7 @@
   (((((((((a)))))))))
   a
   YES
  +10
   a
   a
   a
  @@ -496,12 +551,14 @@
   abcd
   abcd
   YES
  +1
   abcd
   
   #87
   a[-]?c
   abc
   YES
  +1
   abc
   
   #88
  @@ -513,18 +570,21 @@
   multiple words
   multiple words, yeah
   YES
  +1
   multiple words
   
   #90
   a[bcd]*dcdcde
   adcdcde
   YES
  +1
   adcdcde
   
   #91
   a([bc]*)(c*d)
   abcd
   YES
  +3
   abcd
   bc
   d
  @@ -533,6 +593,7 @@
   a([bc]+)(c*d)
   abcd
   YES
  +3
   abcd
   bc
   d
  @@ -541,6 +602,7 @@
   a([bc]*)(c+d)
   abcd
   YES
  +3
   abcd
   b
   cd
  @@ -562,6 +624,7 @@
   ^abc$
   abc
   YES
  +1
   abc
   
   #98
  @@ -573,6 +636,7 @@
   ^abc
   abcc
   YES
  +1
   abc
   
   #100
  @@ -584,18 +648,21 @@
   abc$
   aabc
   YES
  +1
   abc
   
   #102
   ^
   abc
   YES
  +1
   
   
   #103
   $
   abc
   YES
  +1
   
   #104
   $b
  @@ -606,6 +673,7 @@
   (a+|b)*
   ab
   YES
  +2
   ab
   b
   
  @@ -613,6 +681,7 @@
   (a+|b)+
   ab
   YES
  +2
   ab
   b
   
  @@ -620,6 +689,7 @@
   (a+|b)?
   ab
   YES
  +2
   a
   a
   
  @@ -635,6 +705,7 @@
   [^ab]*
   cde
   YES
  +1
   cde
   
   #111
  @@ -646,6 +717,7 @@
   ^a(bc+|b[eh])g|.h$
   abh
   YES
  +1
   bh
   
   
  @@ -653,6 +725,7 @@
   (bc+d$|ef*g.|h?i(j|k))
   effgz
   YES
  +2
   effgz
   effgz
   
  @@ -661,6 +734,7 @@
   (bc+d$|ef*g.|h?i(j|k))
   ij
   YES
  +3
   ij
   ij
   j
  @@ -680,6 +754,7 @@
   (bc+d$|ef*g.|h?i(j|k))
   reffgz
   YES
  +2
   effgz
   effgz
   
  @@ -687,6 +762,7 @@
   a*b\s+c
   aaaab    c
   YES
  +1
   aaaab    c
   
   #119
  @@ -698,6 +774,7 @@
   a*(b*c*)
   aabbcc
   YES
  +2
   aabbcc
   bbcc
   
  @@ -705,18 +782,21 @@
   a?b+c*
   b
   YES
  +1
   b
   
   #122
   \d+
   99
   YES
  +1
   99
   
   #123
   ^[:javastart:]+[:javapart:]+$
   javaIdentifier0
   YES
  +1
   javaIdentifier0
   
   #124
  @@ -728,12 +808,14 @@
   [a-e]?d\\e
   yyzabecd\eyyz
   YES
  +1
   cd\e
   
   #126
   ((\w+)/)*(\w+)
   foo/bar/baz
   YES
  +4
   foo/bar/baz
   bar/
   bar
  @@ -743,6 +825,7 @@
   i am a green (giant|man|martian)
   i am a green man
   YES
  +2
   i am a green man
   man
   
  @@ -750,6 +833,7 @@
   ([a-c]+?)c
   abcabcabc
   YES
  +2
   abc
   ab
   
  @@ -757,6 +841,7 @@
   ([ab]*?)b
   aaaaabaaaababab
   YES
  +2
   aaaaab
   aaaaa
   
  @@ -764,6 +849,7 @@
   ([ab]*)b
   aaaaabaaaababab
   YES
  +2
   aaaaabaaaababab
   aaaaabaaaababa
   
  @@ -771,12 +857,14 @@
   ([ab]??)b
   bb
   YES
  +2
   b
   
   #132
   (c[ab]?)b
   cbb
   YES
  +2
   cbb
   cb
   
  @@ -784,6 +872,7 @@
   (c[ab]??)b
   cbb
   YES
  +2
   cb
   c
   
  @@ -791,6 +880,7 @@
   (c[ab]*?)b
   cbb
   YES
  +2
   cb
   c
   
  @@ -798,6 +888,7 @@
   [:digit:]+
   789
   YES
  +1
   789
   
   #136
  @@ -809,6 +900,7 @@
   [:xdigit:]+
   ffe5a
   YES
  +1
   ffe5a
   
   #138
  @@ -819,6 +911,7 @@
   (wee|week)(knights|knight)
   weeknights
   YES
  +3
   weeknights
   wee
   knights
  @@ -827,6 +920,7 @@
   (ac*)c*d[ac]*\1
   acdacaa
   YES
  +2
   acdac
   ac
   
  @@ -834,6 +928,7 @@
   (a.*b)(a.*b)
   accbaccccb
   YES
  +3
   accbaccccb
   accb
   accccb
  @@ -842,6 +937,7 @@
   (.)=\1
   x=x
   YES
  +2
   x=x
   x
   
  @@ -849,6 +945,7 @@
   ([ab])=\1
   a=a
   YES
  +2
   a=a
   a
   
  @@ -856,6 +953,7 @@
   ([ab]+)=\1
   abba=abba
   YES
  +2
   abba=abba
   abba
   
  @@ -863,18 +961,21 @@
   \u004a
   J
   YES
  +1
   J
   
   #146
   \x4a
   J
   YES
  +1
   J
   
   #147
   \[([:javastart:][:javapart:]*)\]
   foo[bar]baz
   YES
  +2
   [bar]
   bar
   
  @@ -882,6 +983,7 @@
   (\s*\w+)?
     aa
   YES
  +2
     aa
     aa
   
  @@ -889,30 +991,35 @@
   (?:a)
   a
   YES
  +1
   a
   
   #150
   (?:a)
   aa
   YES
  +1
   a
   
   #151
   (?:\w)
   abc
   YES
  +1
   a
   
   #152
   (?:\w\s\w)+
   a b c
   YES
  +1
   a b
   
   #153
   (a\w)(?:,(a\w))+
   ab,ac,ad
   YES
  +3
   ab,ac,ad
   ab
   ad
  @@ -921,6 +1028,7 @@
   z(\w\s+(?:\w\s+\w)+)z
   za   b bc   cd     dz
   YES
  +2
   za   b bc   cd     dz
   a   b bc   cd     d
   
  @@ -928,6 +1036,7 @@
   (([hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*
   http://www.test.com
   YES
  +4
   http://www.test.com
   http://
   http
  @@ -937,6 +1046,7 @@
   ((?:[hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*
   ftp://www.test.com
   YES
  +3
   ftp://www.test.com
   ftp://
   .com
  @@ -945,6 +1055,7 @@
   (([hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*
   htTp://www.test.com
   YES
  +3
   htTp://www.test.com
   htTp://
   htTp
  @@ -953,6 +1064,7 @@
   (?:([hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*
   FTP://www.test.com
   YES
  +3
   FTP://www.test.com
   FTP
   .com
  @@ -966,6 +1078,7 @@
   ^(?:(?:[hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*$
   FtP://www.test.com
   YES
  +1
   FtP://www.test.com
   
   #161
  @@ -977,24 +1090,28 @@
   ^(?:(?:[hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*$
   www.test.com
   YES
  +1
   www.test.com
   
   #163
   abc.*?x+yz
   abcaaaaaxyzbbbbxyz
   YES
  +1
   abcaaaaaxyz
   
   #164
   abc.+?x+yz
   abcaaaaaxyzbbbbxyz
   YES
  +1
   abcaaaaaxyz
   
   #165
   a.+?(c|d)
   aaaacaaaaad
   YES
  +2
   aaaac
   c
   
  @@ -1002,6 +1119,7 @@
   a.+(c|d)
   aaaacaaaaad
   YES
  +2
   aaaacaaaaad
   d
   
  @@ -1009,12 +1127,14 @@
   a+?b+?c+?
   aaabccaaabbbccc
   YES
  +1
   aaabc
   
   #168
   
a(.+)b(.+)c(.+)d(.+)e(.+)f(.+)g(.+)h(.+)i(.+)j(.+)k(.+)l(.+)m(.+)n(.+)o(.+)p(.+)q(.+)r
   a01b02c03d04e05f06g07h08i09j10k11l12m13n14o15p16q17r
   YES
  +18
   a01b02c03d04e05f06g07h08i09j10k11l12m13n14o15p16q17r
   01
   02
  @@ -1048,35 +1168,41 @@
   [^ac]+
   bd
   YES
  +1
   bd
   
   #172
   [^ca]+
   bd
   YES
  +1
   bd
   
   #173
   [^ac]+
   acb
   YES
  +1
   b
   
   #174
   [a-z]{0,3}
   123abcdefg123
   YES
  +1
   
   #175
   ab{0,1}a
   aa
   YES
  +1
   aa
   
   #176
   ab{0,1}a
   aba
   YES
  +1
   aba
   
   #177
  @@ -1088,18 +1214,21 @@
   ab{0,2}a
   aa
   YES
  +1
   aa
   
   #179
   ab{0,2}a
   aba
   YES
  +1
   aba
   
   #180
   ab{0,2}a
   abba
   YES
  +1
   abba
   
   #181
  @@ -1116,6 +1245,7 @@
   ab{1,1}a
   aba
   YES
  +1
   aba
   
   #184
  @@ -1132,12 +1262,14 @@
   ab{1,2}a
   aba
   YES
  +1
   aba
   
   #187
   ab{1,2}a
   abba
   YES
  +1
   abba
   
   #188
  @@ -1149,18 +1281,21 @@
   ab{0,}a
   aa
   YES
  +1
   aa
   
   #190
   ab{0,}a
   aba
   YES
  +1
   aba
   
   #191
   ab{0,}a
   abba
   YES
  +1
   abba
   
   #192
  @@ -1172,12 +1307,14 @@
   ab{1,}a
   aba
   YES
  +1
   aba
   
   #194
   ab{1,}a
   abba
   YES
  +1
   abba
   
   #195
  @@ -1189,6 +1326,7 @@
   ab{1}a
   aba
   YES
  +1
   aba
   
   #197
  @@ -1200,6 +1338,7 @@
   ab{0}a
   aa
   YES
  +1
   aa
   
   #199
  @@ -1221,6 +1360,7 @@
   ab{2}a
   abba
   YES
  +1
   abba
   
   #203
  @@ -1230,38 +1370,44 @@
   
   #204
   [ \-]
  - -
  +-
   YES
  - -
  +1
  +-
   
   #205
   [a-z0-9\.\-]+
   {regexp-1.2}
   YES
  +1
   regexp-1.2
   
   #206
   [a-z0-9\-\.]+
   {regexp-1.2}
   YES
  +1
   regexp-1.2
   
   #207
   [a-z\-0-9\.]+
   {regexp-1.2}
   YES
  +1
   regexp-1.2
   
   #208
   \w+
   a_b
   YES
  +1
   a_b
   
   #209
   ([0123])??((((1st)|(2nd))|(3rd))|(\dth))
   1st
   YES
  +6
   1st
   
   1st
  @@ -1273,6 +1419,7 @@
   [^\s\]'<>(),;:\.\[]
   -
   YES
  +1
   -
   
   #211
  @@ -1284,12 +1431,14 @@
   [^\s\(\)<>@,;:\\\"\.\[\]]
   -
   YES
  +1
   -
   
   #213
   a{0,1}b{0,1}c{0,1}d{0,1}e{0,1}f{0,1}g{0,1}h{0,1}i{0,1}j{0,1}k{0,1}l{0,1}
   acghij
   YES
  +1
   acghij
   
   #214
  @@ -1297,9 +1446,11 @@
   012
   YES
   1
  +1
   
   #215
   [^02468ACEGIKMOQSUW]
   UVW
   YES
  +1
   V
  
  
  
  1.8       +496 -271  jakarta-regexp/src/java/org/apache/regexp/RETest.java
  
  Index: RETest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-regexp/src/java/org/apache/regexp/RETest.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- RETest.java       7 Sep 2003 15:04:14 -0000       1.7
  +++ RETest.java       20 Dec 2003 17:21:44 -0000      1.8
  @@ -66,6 +66,9 @@
   import java.io.ObjectOutputStream;
   import java.io.ByteArrayInputStream;
   import java.io.ObjectInputStream;
  +import java.io.StringBufferInputStream;
  +import java.io.StringReader;
  +import java.io.IOException;
   
   /**
    * Data driven (and optionally interactive) testing harness to exercise regular
  @@ -84,8 +87,7 @@
       // A new line character.
       static final String NEW_LINE = System.getProperty( "line.separator" );
   
  -    // Construct a matcher and a debug compiler
  -    RE r = new RE();
  +    // Construct a debug compiler
       REDebugCompiler compiler = new REDebugCompiler();
   
       /**
  @@ -98,11 +100,14 @@
       {
           try
           {
  -            test( args );
  +            if (!test( args )) {
  +                System.exit(1);
  +            }
           }
           catch (Exception e)
           {
               e.printStackTrace();
  +            System.exit(1);
           }
       }
   
  @@ -147,6 +152,7 @@
        */
       void runInteractiveTests(String expr)
       {
  +        RE r = new RE();
           try
           {
               // Compile expression
  @@ -206,14 +212,26 @@
       void die(String s)
       {
           say("FATAL ERROR: " + s);
  -        System.exit(0);
  +        System.exit(-1);
       }
   
       /**
  -    * Fail with an error.
  -    * Will print a big failure message to System.out.
  -    * @param s Failure description
  -    */
  +     * Fail with an error. Will print a big failure message to System.out.
  +     *
  +     * @param log Output before failure
  +     * @param s Failure description
  +     */
  +    void fail(StringBuffer log, String s)
  +    {
  +        System.out.print(log.toString());
  +        fail(s);
  +    }
  +
  +    /**
  +     * Fail with an error. Will print a big failure message to System.out.
  +     *
  +     * @param s Failure description
  +     */
       void fail(String s)
       {
           failures++;
  @@ -225,22 +243,11 @@
           say(s);
           say("");
           // make sure the writer gets flushed.
  -        PrintWriter writer = new PrintWriter( System.out );
  -        compiler.dumpProgram( writer );
  -        writer.flush();
  -        say("" + NEW_LINE + "");
  -    }
  -
  -    /**
  -     * Show a success
  -     * @param s Success story
  -     */
  -    void success(String s)
  -    {
  -        if (showSuccesses)
  -        {
  -            show();
  -            say("Success: " + s);
  +        if (compiler != null) {
  +            PrintWriter writer = new PrintWriter( System.out );
  +            compiler.dumpProgram( writer );
  +            writer.flush();
  +            say("" + NEW_LINE + "");
           }
       }
   
  @@ -250,16 +257,7 @@
        */
       void say(String s)
       {
  -        System.out.println (s);
  -    }
  -
  -    /**
  -     * Show an expression
  -     */
  -    void show()
  -    {
  -        say("" + NEW_LINE + "-----------------------" + NEW_LINE + "");
  -        say("Expression #" + (n) + " \"" + expr + "\" ");
  +        System.out.println(s);
       }
   
       /**
  @@ -276,23 +274,10 @@
           }
       }
   
  -    // Pre-compiled regular expression "a*b"
  -    char[] re1Instructions =
  -    {
  -        0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,
  -        0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,
  -        0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,
  -        0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,
  -        0x0000,
  -    };
  -
  -    REProgram re1 = new REProgram(re1Instructions);
  -
       /*
  -     * Current expression and number in automated test
  -    */
  -    String expr;
  -    int n = 0;
  +     * number in automated test
  +     */
  +    int testCount = 0;
   
       /*
        * Count of failures in automated test
  @@ -307,218 +292,27 @@
       {
           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++)
  -        {
  -            say("s[" + i + "] = " + s[i]);
  -        }
  -
  -        r = new RE("a*b");
  -        String s1 = r.subst("aaaabfooaaabgarplyaaabwackyb", "-");
  -        say("s = " + s1);
  -
           // Some unit tests
  -        runAutomatedTests();
  +        testPrecompiledRE();
  +        testSplitAndGrep();
  +        testSubst();
  +        testOther();
   
           // Test from script file
           File testInput = new File(testDocument);
  -        if (! testInput.exists())
  +        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(""))
  -                    {
  -                        say("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();
  +                RETestCase testcase = getNextTestCase(br);
  +                if (testcase != null) {
  +                    testcase.runTest();
                   }
               }
           }
  @@ -534,14 +328,14 @@
           if (failures > 0) {
               say("*************** THERE ARE FAILURES! *******************");
           }
  -        say("Tests complete.  " + n + " tests, " + failures + " failure(s).");
  +        say("Tests complete.  " + testCount + " tests, " + failures + " 
failure(s).");
       }
   
       /**
        * Run automated unit test
        * @exception Exception thrown in case of error
        */
  -    void runAutomatedTests() throws Exception
  +    void testOther() throws Exception
       {
           // Serialization test 1: Compile regexp and serialize/deserialize it
           RE r = new RE("(a*)b");
  @@ -553,9 +347,10 @@
           if (!r.match("aaab"))
           {
               fail("Did not match 'aaab' with deserialized RE.");
  +        } else {
  +            say("aaaab = true");
  +            showParens(r);
           }
  -        say("aaaab = true");
  -        showParens(r);
   
           // Serialization test 2: serialize/deserialize used regexp
           out.reset();
  @@ -570,9 +365,10 @@
           if (!r.match("aaab"))
           {
               fail("Did not match 'aaab' with deserialized RE.");
  +        } else {
  +            say("aaaab = true");
  +            showParens(r);
           }
  -        say("aaaab = true");
  -        showParens(r);
   
           // Test MATCH_CASEINDEPENDENT
           r = new RE("abc(\\w*)");
  @@ -582,42 +378,471 @@
           if (!r.match("abcddd"))
           {
               fail("Did not match 'abcddd'.");
  +        } else {
  +            say("abcddd = true");
  +            showParens(r);
           }
  -        say("abcddd = true");
  -        showParens(r);
   
           if (!r.match("aBcDDdd"))
           {
               fail("Did not match 'aBcDDdd'.");
  +        } else {
  +            say("aBcDDdd = true");
  +            showParens(r);
           }
  -        say("aBcDDdd = true");
  -        showParens(r);
   
           if (!r.match("ABCDDDDD"))
           {
               fail("Did not match 'ABCDDDDD'.");
  +        } else {
  +            say("ABCDDDDD = true");
  +            showParens(r);
           }
  -        say("ABCDDDDD = true");
  -        showParens(r);
   
           // Test subst() with backreferences
           r = new RE("http://[\\.\\w\\-\\?/~_@&=%]+";);
           String s = r.subst("visit us: http://www.apache.org!";,
                              "1234<a href=\"$0\">$0</a>", RE.REPLACE_BACKREFERENCES);
  -        if (!s.equals("visit us: 1234<a 
href=\"http://www.apache.org\";>http://www.apache.org</a>!"))
  -        {
  -            fail("Wrong subst() result: " + s);
  -        }
  +        assertEquals("Wrong subst() result", "visit us: 1234<a 
href=\"http://www.apache.org\";>http://www.apache.org</a>!", s);
   
           // Test subst() with backreferences without leading characters
           // before first backreference
           r = new RE("(.*?)=(.*)");
           s = r.subst("variable=value",
  -                           "$1_test_$212", RE.REPLACE_BACKREFERENCES);
  -        if (!s.equals("variable_test_value12"))
  +                    "$1_test_$212", RE.REPLACE_BACKREFERENCES);
  +        assertEquals("Wrong subst() result", "variable_test_value12", s);
  +    }
  +
  +    private void testPrecompiledRE()
  +    {
  +        // Pre-compiled regular expression "a*b"
  +        char[] re1Instructions =
  +        {
  +            0x007c, 0x0000, 0x001a, 0x007c, 0x0000, 0x000d, 0x0041,
  +            0x0001, 0x0004, 0x0061, 0x007c, 0x0000, 0x0003, 0x0047,
  +            0x0000, 0xfff6, 0x007c, 0x0000, 0x0003, 0x004e, 0x0000,
  +            0x0003, 0x0041, 0x0001, 0x0004, 0x0062, 0x0045, 0x0000,
  +            0x0000,
  +        };
  +
  +        REProgram re1 = new REProgram(re1Instructions);
  +
  +        // Simple test of pre-compiled regular expressions
  +        RE r = new RE(re1);
  +        say("a*b");
  +        boolean result = r.match("aaab");
  +        say("aaab = " + result);
  +        showParens(r);
  +        if (!result) {
  +            fail("\"aaab\" doesn't match to precompiled \"a*b\"");
  +        }
  +
  +        result = r.match("b");
  +        say("b = " + result);
  +        showParens(r);
  +        if (!result) {
  +            fail("\"b\" doesn't match to precompiled \"a*b\"");
  +        }
  +
  +        result = r.match("c");
  +        say("c = " + result);
  +        showParens(r);
  +        if (result) {
  +            fail("\"c\" matches to precompiled \"a*b\"");
  +        }
  +
  +        result = r.match("ccccaaaaab");
  +        say("ccccaaaaab = " + result);
  +        showParens(r);
  +        if (!result) {
  +            fail("\"ccccaaaaab\" doesn't match to precompiled \"a*b\"");
  +        }
  +    }
  +
  +    private void testSplitAndGrep()
  +    {
  +        String[] expected = {"xxxx", "xxxx", "yyyy", "zzz"};
  +        RE r = new RE("a*b");
  +        String[] s = r.split("xxxxaabxxxxbyyyyaaabzzz");
  +        for (int i = 0; i < expected.length && i < s.length; i++) {
  +            assertEquals("Wrong splitted part", expected[i], s[i]);
  +        }
  +        assertEquals("Wrong number of splitted parts", expected.length,
  +                     s.length);
  +
  +        r = new RE("x+");
  +        expected = new String[] {"xxxx", "xxxx"};
  +        s = r.grep(s);
  +        for (int i = 0; i < s.length; i++)
  +        {
  +            say("s[" + i + "] = " + s[i]);
  +            assertEquals("Grep fails", expected[i], s[i]);
  +        }
  +        assertEquals("Wrong number of string found by grep", expected.length,
  +                     s.length);
  +    }
  +
  +    private void testSubst()
  +    {
  +        RE r = new RE("a*b");
  +        String expected = "-foo-garply-wacky-";
  +        String s1 = r.subst("aaaabfooaaabgarplyaaabwackyb", "-");
  +        say("s = " + s1);
  +        assertEquals("Wrong result of substitution", expected, s1);
  +    }
  +
  +    public void assertEquals(String message, String expected, String actual)
  +    {
  +        if (expected != null && !expected.equals(actual)
  +            || actual != null && !actual.equals(expected))
  +        {
  +            fail(message + " (expected \"" + expected
  +                 + "\", actual \"" + actual + "\")");
  +        }
  +    }
  +
  +    public void assertEquals(String message, int expected, int actual)
  +    {
  +        if (expected != actual) {
  +            fail(message + " (expected \"" + expected
  +                 + "\", actual \"" + actual + "\")");
  +        }
  +    }
  +
  +    /**
  +     * Converts yesno string to boolean.
  +     * @param yesno string representation of expected result
  +     * @return true if yesno is "YES", false if yesno is "NO"
  +     *         stops program otherwise.
  +     */
  +    private boolean getExpectedResult(String yesno)
  +    {
  +        if ("NO".equals(yesno))
  +        {
  +            return false;
  +        }
  +        else if ("YES".equals(yesno))
  +        {
  +            return true;
  +        }
  +        else
  +        {
  +            // Bad test script
  +            die("Test script error!");
  +            return false; //to please javac
  +        }
  +    }
  +
  +    /**
  +     * Finds next test description in a given script.
  +     * @param br <code>BufferedReader</code> for a script file
  +     * @return strign tag for next test description
  +     * @exception IOException if some io problems occured
  +     */
  +    private String findNextTest(BufferedReader br) throws IOException
  +    {
  +        String number = "";
  +
  +        while (br.ready())
  +        {
  +            number = br.readLine();
  +            if (number == null)
  +            {
  +                break;
  +            }
  +            number = number.trim();
  +            if (number.startsWith("#"))
  +            {
  +                break;
  +            }
  +            if (!number.equals(""))
  +            {
  +                say("Script error.  Line = " + number);
  +                System.exit(-1);
  +            }
  +        }
  +        return number;
  +    }
  +
  +    /**
  +     * Creates testcase for the next test description in the script file.
  +     * @param br <code>BufferedReader</code> for script file.
  +     * @return a new tescase or null.
  +     * @exception IOException if some io problems occured
  +     */
  +    private RETestCase getNextTestCase(BufferedReader br) throws IOException
  +    {
  +        // Find next re test case
  +        final String tag = findNextTest(br);
  +
  +        // Are we done?
  +        if (!br.ready())
  +        {
  +            return null;
  +        }
  +
  +        // Get expression
  +        final String expr = br.readLine();
  +
  +        // Get test information
  +        final String matchAgainst = br.readLine();
  +        final boolean badPattern = "ERR".equals(matchAgainst);
  +        boolean shouldMatch = false;
  +        int expectedParenCount = 0;
  +        String[] expectedParens = null;
  +        
  +        if (!badPattern) {
  +            shouldMatch = getExpectedResult(br.readLine().trim());
  +            if (shouldMatch) {
  +                expectedParenCount = Integer.parseInt(br.readLine().trim());
  +                expectedParens = new String[expectedParenCount];
  +                for (int i = 0; i < expectedParenCount; i++) {
  +                    expectedParens[i] = br.readLine();
  +                }
  +            }
  +        }
  +
  +        return new RETestCase(this, tag, expr, matchAgainst, badPattern,
  +                              shouldMatch, expectedParens);
  +    }
  +}
  +
  +final class RETestCase
  +{
  +    final private StringBuffer log = new StringBuffer();
  +    final private int number;
  +    final private String tag; // number from script file
  +    final private String pattern;
  +    final private String toMatch;
  +    final private boolean badPattern;
  +    final private boolean shouldMatch;
  +    final private String[] parens;
  +    final private RETest test;
  +    private RE regexp;
  +
  +    public RETestCase(RETest test, String tag, String pattern,
  +                      String toMatch, boolean badPattern,
  +                      boolean shouldMatch, String[] parens)
  +    {
  +        this.number = ++test.testCount;
  +        this.test = test;
  +        this.tag = tag;
  +        this.pattern = pattern;
  +        this.toMatch = toMatch;
  +        this.badPattern = badPattern;
  +        this.shouldMatch = shouldMatch;
  +        if (parens != null) {
  +            this.parens = new String[parens.length];
  +            for (int i = 0; i < parens.length; i++) {
  +                this.parens[i] = parens[i];
  +            }
  +        } else {
  +            this.parens = null;
  +        }
  +    }
  +
  +    public void runTest()
  +    {
  +        test.say(tag + "(" + number + "): " + pattern);
  +        if (testCreation()) {
  +            testMatch();
  +        }
  +    }
  +
  +    boolean testCreation()
  +    {
  +        try
  +        {
  +            // Compile it
  +            regexp = new RE();
  +            regexp.setProgram(test.compiler.compile(pattern));
  +            // Expression didn't cause an expected error
  +            if (badPattern)
  +            {
  +                test.fail(log, "Was expected to be an error, but wasn't.");
  +                return false;
  +            }
  +
  +            return true;
  +        }
  +        // Some expressions *should* cause exceptions to be thrown
  +        catch (Exception e)
  +        {
  +            // If it was supposed to be an error, report success and continue
  +            if (badPattern)
  +            {
  +                log.append("   Match: ERR\n");
  +                success("Produces an error (" + e.toString() + "), as expected.");
  +                return false;
  +            }
  +
  +            // Wasn't supposed to be an error
  +            String message = (e.getMessage() == null) ? e.toString() : 
e.getMessage();
  +            test.fail(log, "Produces an unexpected exception \"" + message + "\"");
  +            e.printStackTrace();
  +        }
  +        catch (Error e)
  +        {
  +            // Internal error happened
  +            test.fail(log, "Compiler threw fatal error \"" + e.getMessage() + "\"");
  +            e.printStackTrace();
  +        }
  +
  +        return false;
  +    }
  +
  +    private void testMatch()
  +    {
  +        log.append("   Match against: '" + toMatch + "'\n");
  +        // Try regular matching
  +        try
  +        {
  +            // Match against the string
  +            boolean result = regexp.match(toMatch);
  +            log.append("   Matched: " + (result ? "YES" : "NO") + "\n");
  +
  +            // Check result, parens, and iterators
  +            if (checkResult(result) && (!shouldMatch || checkParens()))
  +            {
  +                // test match(CharacterIterator, int)
  +                // for every CharacterIterator implementation.
  +                log.append("   Match using StringCharacterIterator\n");
  +                if (!tryMatchUsingCI(new StringCharacterIterator(toMatch)))
  +                    return;
  +
  +                log.append("   Match using CharacterArrayCharacterIterator\n");
  +                if (!tryMatchUsingCI(new 
CharacterArrayCharacterIterator(toMatch.toCharArray(), 0, toMatch.length())))
  +                    return;
  +
  +                log.append("   Match using StreamCharacterIterator\n");
  +                if (!tryMatchUsingCI(new StreamCharacterIterator(new 
StringBufferInputStream(toMatch))))
  +                    return;
  +
  +                log.append("   Match using ReaderCharacterIterator\n");
  +                if (!tryMatchUsingCI(new ReaderCharacterIterator(new 
StringReader(toMatch))))
  +                    return;
  +            }
  +        }
  +        // Matcher blew it
  +        catch(Exception e)
  +        {
  +            test.fail(log, "Matcher threw exception: " + e.toString());
  +            e.printStackTrace();
  +        }
  +        // Internal error
  +        catch(Error e)
  +        {
  +            test.fail(log, "Matcher threw fatal error \"" + e.getMessage() + "\"");
  +            e.printStackTrace();
  +        }
  +    }
  +
  +    private boolean checkResult(boolean result)
  +    {
  +        // Write status
  +        if (result == shouldMatch) {
  +            success((shouldMatch ? "Matched" : "Did not match")
  +                    + " \"" + toMatch + "\", as expected:");
  +            return true;
  +        } else {
  +            if (shouldMatch) {
  +                test.fail(log, "Did not match \"" + toMatch + "\", when expected 
to.");
  +            } else {
  +                test.fail(log, "Matched \"" + toMatch + "\", when not expected 
to.");
  +            }
  +            return false;
  +        }
  +    }
  +
  +    private boolean checkParens()
  +    {
  +        // Show subexpression registers
  +        if (test.showSuccesses)
  +        {
  +            test.showParens(regexp);
  +        }
  +
  +        log.append("   Paren count: " + regexp.getParenCount() + "\n");
  +        if(!assertEquals(log, "Wrong number of parens", parens.length, 
regexp.getParenCount()))
  +        {
  +            return false;
  +        }
  +
  +        // Check registers against expected contents
  +        for (int p = 0; p < regexp.getParenCount(); p++)
  +        {
  +            log.append("   Paren " + p + ": " + regexp.getParen(p) + "\n");
  +
  +            // Compare expected result with actual
  +            if (parens[p].length() == 0 && regexp.getParen(p) == null)
  +            {
  +                // Consider "" in test file equal to null
  +                continue;
  +            }
  +            if (!assertEquals(log, "Wrong register " + p, parens[p], 
regexp.getParen(p)))
  +            {
  +                return false;
  +            }
  +        }
  +
  +        return true;
  +    }
  +
  +    boolean tryMatchUsingCI(CharacterIterator matchAgainst)
  +    {
  +        try {
  +            boolean result = regexp.match(matchAgainst, 0);
  +            log.append("   Match: " + (result ? "YES" : "NO") + "\n");
  +            return checkResult(result) && (!shouldMatch || checkParens());
  +        }
  +        // Matcher blew it
  +        catch(Exception e)
           {
  -            fail("Wrong subst() result: " + s);
  +            test.fail(log, "Matcher threw exception: " + e.toString());
  +            e.printStackTrace();
           }
  +        // Internal error
  +        catch(Error e)
  +        {
  +            test.fail(log, "Matcher threw fatal error \"" + e.getMessage() + "\"");
  +            e.printStackTrace();
  +        }
  +        return false;
  +    }
   
  +    public boolean assertEquals(StringBuffer log, String message, String expected, 
String actual)
  +    {
  +        if (expected != null && !expected.equals(actual)
  +            || actual != null && !actual.equals(expected))
  +        {
  +            test.fail(log, message + " (expected \"" + expected
  +                      + "\", actual \"" + actual + "\")");
  +            return false;
  +        }
  +        return true;
  +    }
  +
  +    public boolean assertEquals(StringBuffer log, String message, int expected, int 
actual)
  +    {
  +        if (expected != actual) {
  +            test.fail(log, message + " (expected \"" + expected
  +                      + "\", actual \"" + actual + "\")");
  +            return false;
  +        }
  +        return true;
  +    }
  +
  +    /**
  +     * Show a success
  +     * @param s Success story
  +     */
  +    void success(String s)
  +    {
  +        if (test.showSuccesses)
  +        {
  +            test.say("" + RETest.NEW_LINE + "-----------------------" + 
RETest.NEW_LINE + "");
  +            test.say("Expression #" + (number) + " \"" + pattern + "\" ");
  +            test.say("Success: " + s);
  +        }
       }
   }
  
  
  
  1.11      +153 -2    jakarta-regexp/xdocs/RETest.txt
  
  Index: RETest.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-regexp/xdocs/RETest.txt,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- RETest.txt        1 Sep 2003 18:31:53 -0000       1.10
  +++ RETest.txt        20 Dec 2003 17:21:44 -0000      1.11
  @@ -2,6 +2,7 @@
   abc
   abc
   YES
  +1
   abc
   
   #2
  @@ -23,42 +24,49 @@
   abc
   xabcy
   YES
  +1
   abc
   
   #6
   abc
   ababc
   YES
  +1
   abc
   
   #7
   ab*c
   abc
   YES
  +1
   abc
   
   #8
   ab*bc
   abc
   YES
  +1
   abc
   
   #9
   ab*bc
   abbc
   YES
  +1
   abbc
   
   #10
   ab*bc
   abbbbc
   YES
  +1
   abbbbc
   
   #11
   ab+bc
   abbc
   YES
  +1
   abbc
   
   #12
  @@ -75,18 +83,21 @@
   ab+bc
   abbbbc
   YES
  +1
   abbbbc
   
   #15
   ab?bc
   abbc
   YES
  +1
   abbc
   
   #16
   ab?bc
   abc
   YES
  +1
   abc
   
   #17
  @@ -98,24 +109,28 @@
   ab?c
   abc
   YES
  +1
   abc
   
   #19
   a.c
   abc
   YES
  +1
   abc
   
   #20
   a.c
   axc
   YES
  +1
   axc
   
   #21
   a.*c
   axyzc
   YES
  +1
   axyzc
   
   #22
  @@ -132,6 +147,7 @@
   a[bc]d
   abd
   YES
  +1
   abd
   
   #25
  @@ -143,12 +159,14 @@
   a[b-d]e
   ace
   YES
  +1
   ace
   
   #27
   a[b-d]
   aac
   YES
  +1
   ac
   
   #28
  @@ -159,12 +177,14 @@
   a[-b]
   aa
   YES
  +1
   aa
   
   #30
   a[b-]
   ac
   YES
  +1
   ac
   
   #31
  @@ -187,6 +207,7 @@
   a[^bc]d
   aed
   YES
  +1
   aed
   
   #36
  @@ -198,18 +219,21 @@
   ab|cd
   abc
   YES
  +1
   ab
   
   #38
   ab|cd
   abcd
   YES
  +1
   ab
   
   #39
   ab|cd
   bcda
   YES
  +1
   cd
   
   #40
  @@ -220,6 +244,7 @@
   ()ef
   ef
   YES
  +2
   ef
   
   
  @@ -243,24 +268,28 @@
   a\(b
   a(b
   YES
  +1
   a(b
   
   #47
   a\(*b
   ab
   YES
  +1
   ab
   
   #48
   a\(*b
   a((b
   YES
  +1
   a((b
   
   #49
   a\\b
   a\b
   YES
  +1
   a\b
   
   #50
  @@ -275,6 +304,7 @@
   ((a))
   abc
   YES
  +3
   a
   a
   a
  @@ -283,6 +313,7 @@
   (a)b(c)
   abc
   YES
  +3
   abc
   a
   c
  @@ -291,6 +322,7 @@
   a+b+c
   aabbabc
   YES
  +1
   abc
   
   #55
  @@ -305,12 +337,14 @@
   a*
   aaaa
   YES
  +1
   aaaa
   
   #58
   a*
   baaaa
   YES
  +1
   
   
   #59
  @@ -329,6 +363,7 @@
   (ab|cd)e
   abcde
   YES
  +2
   cde
   cd
   
  @@ -336,30 +371,35 @@
   [abhgefdc]ij
   hij
   YES
  +1
   hij
   
   #64
   ab*
   xabyabbbz
   YES
  +1
   ab
   
   #65
   ab*
   xayabbbz
   YES
  +1
   a
   
   #66
   abcd*efg
   abcdefg
   YES
  +1
   abcdefg
   
   #67
   (ab|ab*)bc
   abc
   YES
  +2
   abc
   a
   
  @@ -368,6 +408,7 @@
   (a|b|c|d|e)f
   ef
   YES
  +2
   ef
   e
   
  @@ -375,12 +416,14 @@
   a|b|c|d|e
   e
   YES
  +1
   e
   
   #70
   (.*)c(.*)
   abcde
   YES
  +3
   abcde
   ab
   de
  @@ -389,6 +432,7 @@
   \((.*), (.*)\)
   (a, b)
   YES
  +3
   (a, b)
   a
   b
  @@ -397,6 +441,7 @@
   a(bc)d
   abcd
   YES
  +2
   abcd
   bc
   
  @@ -404,12 +449,14 @@
   a*
   x
   YES
  +1
   
   
   #74
   ([abc])*d
   abbbcd
   YES
  +2
   abbbcd
   c
   
  @@ -417,12 +464,14 @@
   a*
   
   YES
  +1
   
   
   #76
   ([abc])*bcd
   abcd
   YES
  +2
   abcd
   a
   
  @@ -430,6 +479,7 @@
   (a|b)c*d
   abcd
   YES
  +2
   bcd
   b
   
  @@ -437,6 +487,7 @@
   a([bc]*)c*
   abc
   YES
  +2
   abc
   bc
   
  @@ -444,12 +495,14 @@
   [a-zA-Z_][a-zA-Z0-9_]*
   alpha
   YES
  +1
   alpha
   
   #80
   ((a)(b)c)(d)
   abcd
   YES
  +5
   abcd
   abc
   a
  @@ -460,6 +513,7 @@
   (ab|a)b*c
   abc
   YES
  +2
   abc
   ab
   
  @@ -476,6 +530,7 @@
   (((((((((a)))))))))
   a
   YES
  +10
   a
   a
   a
  @@ -496,12 +551,14 @@
   abcd
   abcd
   YES
  +1
   abcd
   
   #87
   a[-]?c
   abc
   YES
  +1
   abc
   
   #88
  @@ -513,18 +570,21 @@
   multiple words
   multiple words, yeah
   YES
  +1
   multiple words
   
   #90
   a[bcd]*dcdcde
   adcdcde
   YES
  +1
   adcdcde
   
   #91
   a([bc]*)(c*d)
   abcd
   YES
  +3
   abcd
   bc
   d
  @@ -533,6 +593,7 @@
   a([bc]+)(c*d)
   abcd
   YES
  +3
   abcd
   bc
   d
  @@ -541,6 +602,7 @@
   a([bc]*)(c+d)
   abcd
   YES
  +3
   abcd
   b
   cd
  @@ -562,6 +624,7 @@
   ^abc$
   abc
   YES
  +1
   abc
   
   #98
  @@ -573,6 +636,7 @@
   ^abc
   abcc
   YES
  +1
   abc
   
   #100
  @@ -584,18 +648,21 @@
   abc$
   aabc
   YES
  +1
   abc
   
   #102
   ^
   abc
   YES
  +1
   
   
   #103
   $
   abc
   YES
  +1
   
   #104
   $b
  @@ -606,6 +673,7 @@
   (a+|b)*
   ab
   YES
  +2
   ab
   b
   
  @@ -613,6 +681,7 @@
   (a+|b)+
   ab
   YES
  +2
   ab
   b
   
  @@ -620,6 +689,7 @@
   (a+|b)?
   ab
   YES
  +2
   a
   a
   
  @@ -635,6 +705,7 @@
   [^ab]*
   cde
   YES
  +1
   cde
   
   #111
  @@ -646,6 +717,7 @@
   ^a(bc+|b[eh])g|.h$
   abh
   YES
  +1
   bh
   
   
  @@ -653,6 +725,7 @@
   (bc+d$|ef*g.|h?i(j|k))
   effgz
   YES
  +2
   effgz
   effgz
   
  @@ -661,6 +734,7 @@
   (bc+d$|ef*g.|h?i(j|k))
   ij
   YES
  +3
   ij
   ij
   j
  @@ -680,6 +754,7 @@
   (bc+d$|ef*g.|h?i(j|k))
   reffgz
   YES
  +2
   effgz
   effgz
   
  @@ -687,6 +762,7 @@
   a*b\s+c
   aaaab    c
   YES
  +1
   aaaab    c
   
   #119
  @@ -698,6 +774,7 @@
   a*(b*c*)
   aabbcc
   YES
  +2
   aabbcc
   bbcc
   
  @@ -705,18 +782,21 @@
   a?b+c*
   b
   YES
  +1
   b
   
   #122
   \d+
   99
   YES
  +1
   99
   
   #123
   ^[:javastart:]+[:javapart:]+$
   javaIdentifier0
   YES
  +1
   javaIdentifier0
   
   #124
  @@ -728,12 +808,14 @@
   [a-e]?d\\e
   yyzabecd\eyyz
   YES
  +1
   cd\e
   
   #126
   ((\w+)/)*(\w+)
   foo/bar/baz
   YES
  +4
   foo/bar/baz
   bar/
   bar
  @@ -743,6 +825,7 @@
   i am a green (giant|man|martian)
   i am a green man
   YES
  +2
   i am a green man
   man
   
  @@ -750,6 +833,7 @@
   ([a-c]+?)c
   abcabcabc
   YES
  +2
   abc
   ab
   
  @@ -757,6 +841,7 @@
   ([ab]*?)b
   aaaaabaaaababab
   YES
  +2
   aaaaab
   aaaaa
   
  @@ -764,6 +849,7 @@
   ([ab]*)b
   aaaaabaaaababab
   YES
  +2
   aaaaabaaaababab
   aaaaabaaaababa
   
  @@ -771,12 +857,14 @@
   ([ab]??)b
   bb
   YES
  +2
   b
   
   #132
   (c[ab]?)b
   cbb
   YES
  +2
   cbb
   cb
   
  @@ -784,6 +872,7 @@
   (c[ab]??)b
   cbb
   YES
  +2
   cb
   c
   
  @@ -791,6 +880,7 @@
   (c[ab]*?)b
   cbb
   YES
  +2
   cb
   c
   
  @@ -798,6 +888,7 @@
   [:digit:]+
   789
   YES
  +1
   789
   
   #136
  @@ -809,6 +900,7 @@
   [:xdigit:]+
   ffe5a
   YES
  +1
   ffe5a
   
   #138
  @@ -819,6 +911,7 @@
   (wee|week)(knights|knight)
   weeknights
   YES
  +3
   weeknights
   wee
   knights
  @@ -827,6 +920,7 @@
   (ac*)c*d[ac]*\1
   acdacaa
   YES
  +2
   acdac
   ac
   
  @@ -834,6 +928,7 @@
   (a.*b)(a.*b)
   accbaccccb
   YES
  +3
   accbaccccb
   accb
   accccb
  @@ -842,6 +937,7 @@
   (.)=\1
   x=x
   YES
  +2
   x=x
   x
   
  @@ -849,6 +945,7 @@
   ([ab])=\1
   a=a
   YES
  +2
   a=a
   a
   
  @@ -856,6 +953,7 @@
   ([ab]+)=\1
   abba=abba
   YES
  +2
   abba=abba
   abba
   
  @@ -863,18 +961,21 @@
   \u004a
   J
   YES
  +1
   J
   
   #146
   \x4a
   J
   YES
  +1
   J
   
   #147
   \[([:javastart:][:javapart:]*)\]
   foo[bar]baz
   YES
  +2
   [bar]
   bar
   
  @@ -882,6 +983,7 @@
   (\s*\w+)?
     aa
   YES
  +2
     aa
     aa
   
  @@ -889,30 +991,35 @@
   (?:a)
   a
   YES
  +1
   a
   
   #150
   (?:a)
   aa
   YES
  +1
   a
   
   #151
   (?:\w)
   abc
   YES
  +1
   a
   
   #152
   (?:\w\s\w)+
   a b c
   YES
  +1
   a b
   
   #153
   (a\w)(?:,(a\w))+
   ab,ac,ad
   YES
  +3
   ab,ac,ad
   ab
   ad
  @@ -921,6 +1028,7 @@
   z(\w\s+(?:\w\s+\w)+)z
   za   b bc   cd     dz
   YES
  +2
   za   b bc   cd     dz
   a   b bc   cd     d
   
  @@ -928,6 +1036,7 @@
   (([hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*
   http://www.test.com
   YES
  +4
   http://www.test.com
   http://
   http
  @@ -937,6 +1046,7 @@
   ((?:[hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*
   ftp://www.test.com
   YES
  +3
   ftp://www.test.com
   ftp://
   .com
  @@ -945,6 +1055,7 @@
   (([hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*
   htTp://www.test.com
   YES
  +3
   htTp://www.test.com
   htTp://
   htTp
  @@ -953,6 +1064,7 @@
   (?:([hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(\.[a-zA-Z0-9\-]+)*
   FTP://www.test.com
   YES
  +3
   FTP://www.test.com
   FTP
   .com
  @@ -966,6 +1078,7 @@
   ^(?:(?:[hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*$
   FtP://www.test.com
   YES
  +1
   FtP://www.test.com
   
   #161
  @@ -977,24 +1090,28 @@
   ^(?:(?:[hH][tT]{2}[pP]|[fF][tT][pP]):\/\/)?[a-zA-Z0-9\-]+(?:\.[a-zA-Z0-9\-]+)*$
   www.test.com
   YES
  +1
   www.test.com
   
   #163
   abc.*?x+yz
   abcaaaaaxyzbbbbxyz
   YES
  +1
   abcaaaaaxyz
   
   #164
   abc.+?x+yz
   abcaaaaaxyzbbbbxyz
   YES
  +1
   abcaaaaaxyz
   
   #165
   a.+?(c|d)
   aaaacaaaaad
   YES
  +2
   aaaac
   c
   
  @@ -1002,6 +1119,7 @@
   a.+(c|d)
   aaaacaaaaad
   YES
  +2
   aaaacaaaaad
   d
   
  @@ -1009,12 +1127,14 @@
   a+?b+?c+?
   aaabccaaabbbccc
   YES
  +1
   aaabc
   
   #168
   
a(.+)b(.+)c(.+)d(.+)e(.+)f(.+)g(.+)h(.+)i(.+)j(.+)k(.+)l(.+)m(.+)n(.+)o(.+)p(.+)q(.+)r
   a01b02c03d04e05f06g07h08i09j10k11l12m13n14o15p16q17r
   YES
  +18
   a01b02c03d04e05f06g07h08i09j10k11l12m13n14o15p16q17r
   01
   02
  @@ -1048,35 +1168,41 @@
   [^ac]+
   bd
   YES
  +1
   bd
   
   #172
   [^ca]+
   bd
   YES
  +1
   bd
   
   #173
   [^ac]+
   acb
   YES
  +1
   b
   
   #174
   [a-z]{0,3}
   123abcdefg123
   YES
  +1
   
   #175
   ab{0,1}a
   aa
   YES
  +1
   aa
   
   #176
   ab{0,1}a
   aba
   YES
  +1
   aba
   
   #177
  @@ -1088,18 +1214,21 @@
   ab{0,2}a
   aa
   YES
  +1
   aa
   
   #179
   ab{0,2}a
   aba
   YES
  +1
   aba
   
   #180
   ab{0,2}a
   abba
   YES
  +1
   abba
   
   #181
  @@ -1116,6 +1245,7 @@
   ab{1,1}a
   aba
   YES
  +1
   aba
   
   #184
  @@ -1132,12 +1262,14 @@
   ab{1,2}a
   aba
   YES
  +1
   aba
   
   #187
   ab{1,2}a
   abba
   YES
  +1
   abba
   
   #188
  @@ -1149,18 +1281,21 @@
   ab{0,}a
   aa
   YES
  +1
   aa
   
   #190
   ab{0,}a
   aba
   YES
  +1
   aba
   
   #191
   ab{0,}a
   abba
   YES
  +1
   abba
   
   #192
  @@ -1172,12 +1307,14 @@
   ab{1,}a
   aba
   YES
  +1
   aba
   
   #194
   ab{1,}a
   abba
   YES
  +1
   abba
   
   #195
  @@ -1189,6 +1326,7 @@
   ab{1}a
   aba
   YES
  +1
   aba
   
   #197
  @@ -1200,6 +1338,7 @@
   ab{0}a
   aa
   YES
  +1
   aa
   
   #199
  @@ -1221,6 +1360,7 @@
   ab{2}a
   abba
   YES
  +1
   abba
   
   #203
  @@ -1230,38 +1370,44 @@
   
   #204
   [ \-]
  - -
  +-
   YES
  - -
  +1
  +-
   
   #205
   [a-z0-9\.\-]+
   {regexp-1.2}
   YES
  +1
   regexp-1.2
   
   #206
   [a-z0-9\-\.]+
   {regexp-1.2}
   YES
  +1
   regexp-1.2
   
   #207
   [a-z\-0-9\.]+
   {regexp-1.2}
   YES
  +1
   regexp-1.2
   
   #208
   \w+
   a_b
   YES
  +1
   a_b
   
   #209
   ([0123])??((((1st)|(2nd))|(3rd))|(\dth))
   1st
   YES
  +6
   1st
   
   1st
  @@ -1273,6 +1419,7 @@
   [^\s\]'<>(),;:\.\[]
   -
   YES
  +1
   -
   
   #211
  @@ -1284,12 +1431,14 @@
   [^\s\(\)<>@,;:\\\"\.\[\]]
   -
   YES
  +1
   -
   
   #213
   a{0,1}b{0,1}c{0,1}d{0,1}e{0,1}f{0,1}g{0,1}h{0,1}i{0,1}j{0,1}k{0,1}l{0,1}
   acghij
   YES
  +1
   acghij
   
   #214
  @@ -1297,9 +1446,11 @@
   012
   YES
   1
  +1
   
   #215
   [^02468ACEGIKMOQSUW]
   UVW
   YES
  +1
   V
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to