OSDN Git Service

mrcImageOpticalFlow & mrcImageLucasKanade & mrcImageHornSchunckの変更
[eos/base.git] / util / src / TclTk / tcl8.6.12 / tests / reg.test
diff --git a/util/src/TclTk/tcl8.6.12/tests/reg.test b/util/src/TclTk/tcl8.6.12/tests/reg.test
new file mode 100644 (file)
index 0000000..34edc97
--- /dev/null
@@ -0,0 +1,1234 @@
+# reg.test --
+#
+# This file contains a collection of tests for one or more of the Tcl
+# built-in commands.  Sourcing this file into Tcl runs the tests and
+# generates output for errors.  No output means no errors were found.
+# (Don't panic if you are seeing this as part of the reg distribution
+# and aren't using Tcl -- reg's own regression tester also knows how
+# to read this file, ignoring the Tcl-isms.)
+#
+# Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
+
+if {"::tcltest" ni [namespace children]} {
+    package require tcltest 2.5
+}
+
+::tcltest::loadTestedCommands
+catch [list package require -exact Tcltest [info patchlevel]]
+
+# All tests require the testregexp command, return if this
+# command doesn't exist
+
+::tcltest::testConstraint testregexp [llength [info commands testregexp]]
+::tcltest::testConstraint localeRegexp 0
+
+# This file uses some custom procedures, defined below, for regexp regression
+# testing.  The name of the procedure indicates the general nature of the
+# test:
+#      expectError     compile error expected
+#      expectNomatch   match failure expected
+#      expectMatch     successful match
+#      expectIndices   successful match with -indices (used in checking things
+#                      like nonparticipating subexpressions)
+#      expectPartial   unsuccessful match with -indices (!!) (used in checking
+#                      partial-match reporting)
+# There is also "doing" which sets up title and major test number for each
+# block of tests.
+
+# The first 3 arguments are constant: a minor number (which often gets
+# a letter or two suffixed to it internally), some flags, and the RE
+# itself.  For expectError, the remaining argument is the name of the
+# compile error expected, less the leading "REG_".  For the rest, the
+# next argument is the string to try the match against.  Remaining
+# arguments are the substring expected to be matched, and any
+# substrings expected to be matched by subexpressions.  (For
+# expectNomatch, these arguments are optional, and if present are
+# ignored except that they indicate how many subexpressions should be
+# present in the RE.)  It is an error for the number of subexpression
+# arguments to be wrong.  Cases involving nonparticipating
+# subexpressions, checking where empty substrings are located,
+# etc. should be done using expectIndices and expectPartial.
+
+# The flag characters are complex and a bit eclectic.  Generally speaking,
+# lowercase letters are compile options, uppercase are expected re_info
+# bits, and nonalphabetics are match options, controls for how the test is
+# run, or testing options.  The one small surprise is that AREs are the
+# default, and you must explicitly request lesser flavors of RE.  The flags
+# are as follows.  It is admitted that some are not very mnemonic.
+# There are some others which are purely debugging tools and are not
+# useful in this file.
+#
+#      -       no-op (placeholder)
+#      +       provide fake xy equivalence class and ch collating element
+#      %       force small state-set cache in matcher (to test cache replace)
+#      ^       beginning of string is not beginning of line
+#      $       end of string is not end of line
+#      *       test is Unicode-specific, needs big character set
+#
+#      &       test as both ARE and BRE
+#      b       BRE
+#      e       ERE
+#      a       turn advanced-features bit on (error unless ERE already)
+#      q       literal string, no metacharacters at all
+#
+#      i       case-independent matching
+#      o       ("opaque") no subexpression capture
+#      p       newlines are half-magic, excluded from . and [^ only
+#      w       newlines are half-magic, significant to ^ and $ only
+#      n       newlines are fully magic, both effects
+#      x       expanded RE syntax
+#      t       incomplete-match reporting
+#
+#      A       backslash-_a_lphanumeric seen
+#      B       ERE/ARE literal-_b_race heuristic used
+#      E       backslash (_e_scape) seen within []
+#      H       looka_h_ead constraint seen
+#      I       _i_mpossible to match
+#      L       _l_ocale-specific construct seen
+#      M       unportable (_m_achine-specific) construct seen
+#      N       RE can match empty (_n_ull) string
+#      P       non-_P_OSIX construct seen
+#      Q       {} _q_uantifier seen
+#      R       back _r_eference seen
+#      S       POSIX-un_s_pecified syntax seen
+#      T       prefers shortest (_t_iny)
+#      U       saw original-POSIX botch:  unmatched right paren in ERE (_u_gh)
+
+# The one area we can't easily test is memory-allocation failures (which
+# are hard to provoke on command).  Embedded NULs also are not tested at
+# the moment, but this is a historical accident which should be fixed.
+
+
+# test procedures and related
+namespace eval RETest {
+    namespace export doing expect* knownBug
+
+    variable regBug 0
+
+    # re_info abbreviation mapping table
+    variable infonames
+    array set infonames {
+       A REG_UBSALNUM
+       B REG_UBRACES
+       E REG_UBBS
+       H REG_ULOOKAHEAD
+       I REG_UIMPOSSIBLE
+       L REG_ULOCALE
+       M REG_UUNPORT
+       N REG_UEMPTYMATCH
+       P REG_UNONPOSIX
+       Q REG_UBOUNDS
+       R REG_UBACKREF
+       S REG_UUNSPEC
+       T REG_USHORTEST
+       U REG_UPBOTCH
+    }
+    variable infonameorder "RHQBAUEPSMLNIT" ;# must match bit order, lsb first
+
+    # build test number (internal)
+    proc TestNum {args} {
+       return reg-[join [concat $args] .]
+    }
+
+    # build description, with possible modifiers (internal)
+    proc TestDesc {args} {
+       variable description
+
+       set testid [concat $args]
+       set d $description
+       if {[llength $testid] > 1} {
+           set d "$d ([lrange $testid 1 end])"
+       }
+       return $d
+    }
+
+    # build trailing options and flags argument from a flags string (internal)
+    proc TestFlags {fl} {
+       set args [list]
+       set flags ""
+       foreach f [split $fl ""] {
+           switch -exact -- $f {
+               "i" { lappend args "-nocase" }
+               "x" { lappend args "-expanded" }
+               "n" { lappend args "-line" }
+               "p" { lappend args "-linestop" }
+               "w" { lappend args "-lineanchor" }
+               "-" { }
+               default { append flags $f }
+           }
+       }
+       if {$flags ne ""} {
+           lappend args -xflags $flags
+       }
+       return $args
+    }
+
+    # build info-flags list from a flags string (internal)
+    proc TestInfoFlags {fl} {
+       variable infonames
+       variable infonameorder
+
+       set ret [list]
+       foreach f [split $infonameorder ""] {
+           if {[string match *$f* $fl]} {
+               lappend ret $infonames($f)
+           }
+       }
+       return $ret
+    }
+
+    # Share the generation of the list of test constraints so it is
+    # done the same on all routes.
+    proc TestConstraints {flags} {
+       set constraints [list testregexp]
+
+       variable regBug
+       if {$regBug} {
+           # This will trigger registration as a skipped test
+           lappend constraints knownBug
+       }
+
+       # Tcl locale stuff doesn't do the ch/xy test fakery yet
+       if {[string match *+* $flags]} {
+           # This will trigger registration as a skipped test
+           lappend constraints localeRegexp
+       }
+
+       return $constraints
+    }
+
+    # match expected, internal routine that does the work
+    # parameters like the "real" routines except they don't have "opts",
+    #  which is a possibly-empty list of switches for the regexp match attempt
+    # The ! flag is used to indicate expected match failure (for REG_EXPECT,
+    #  which wants argument testing even in the event of failure).
+    proc MatchExpected {opts testid flags re target args} {
+       # if &, test as both BRE and ARE
+       if {[string match *&* $flags]} {
+           set f [string map {& {}} $flags]
+           MatchExpected $opts "$testid ARE" ${f}  $re $target {*}$args
+           MatchExpected $opts "$testid BRE" ${f}b $re $target {*}$args
+           return
+       }
+
+       set constraints [TestConstraints $flags]
+
+       set f [TestFlags $flags]
+       set infoflags [TestInfoFlags $flags]
+       set ccmd [list testregexp -about        {*}$f $re]
+       set ecmd [list testregexp {*}$opts {*}$f $re $target]
+
+       set nsub [expr {[llength $args] - 1}]
+       set names [list]
+       set refs ""
+       for {set i 0} {$i < [llength $args]} {incr i} {
+           if {$i == 0} {
+               set name match
+           } else {
+               set name sub$i
+           }
+           lappend names $name
+           append refs " \$$name"
+           set $name ""
+       }
+       if {[string match *o* $flags]} {        ;# REG_NOSUB kludge
+           set nsub 0                          ;# unsigned value cannot be -1
+       }
+       if {[string match *t* $flags]} {        ;# REG_EXPECT
+           incr nsub -1                        ;# the extra does not count
+       }
+       set erun "list \[[concat $ecmd $names]\] $refs"
+       set result [list [expr {![string match *!* $flags]}] {*}$args]
+       set info [list $nsub $infoflags]
+
+       ::tcltest::test [TestNum $testid compile] [TestDesc $testid compile] \
+               -constraints $constraints -body $ccmd -result $info
+       ::tcltest::test [TestNum $testid execute] [TestDesc $testid execute] \
+               -constraints $constraints -body $erun -result $result
+    }
+
+    # set major test number and description
+    proc doing {major desc} {
+       variable description "RE engine $desc"
+    }
+
+    # compilation error expected
+    proc expectError {testid flags re err} {
+       # if &, test as both ARE and BRE
+       if {[string match *&* $flags]} {
+           set f [string map {& {}} $flags]
+           expectError "$testid ARE" ${f}  $re $err
+           expectError "$testid BRE" ${f}b $re $err
+           return
+       }
+
+       set constraints [TestConstraints $flags]
+
+       set cmd [list testregexp -about {*}[TestFlags $flags] $re]
+       ::tcltest::test [TestNum $testid error] [TestDesc $testid error] \
+               -constraints $constraints -result [list 1 REG_$err] -body \
+               "list \[catch \{$cmd\}\] \[lindex \$::errorCode 1\]"
+    }
+
+    # match failure expected
+    proc expectNomatch {testid flags re target args} {
+       variable regBug
+       # if &, test as both ARE and BRE
+       if {[string match *&* $flags]} {
+           set f [string map {& {}} $flags]
+           expectNomatch "$testid ARE" ${f}  $re $target {*}$args
+           expectNomatch "$testid BRE" ${f}b $re $target {*}$args
+           return
+       }
+
+       set constraints [TestConstraints $flags]
+
+       set f [TestFlags $flags]
+       set infoflags [TestInfoFlags $flags]
+       set ccmd [list testregexp -about {*}$f $re]
+       set nsub [expr {[llength $args] - 1}]
+       if {$nsub < 0} {
+           # didn't tell us number of subexps
+           set ccmd "lreplace \[$ccmd\] 0 0"
+           set info [list $infoflags]
+       } else {
+           set info [list $nsub $infoflags]
+       }
+       set ecmd [list testregexp {*}$f $re $target]
+
+       ::tcltest::test [TestNum $testid compile] [TestDesc $testid compile] \
+               -constraints $constraints -body $ccmd -result $info
+       ::tcltest::test [TestNum $testid execute] [TestDesc $testid execute] \
+               -constraints $constraints -body $ecmd -result 0
+    }
+
+    # match expected (no missing, empty, or ambiguous submatches)
+    # expectMatch testno flags re target mat submat ...
+    proc expectMatch {args} {
+       MatchExpected {} {*}$args
+    }
+
+    # match expected (full fanciness)
+    # expectIndices testno flags re target mat submat ...
+    proc expectIndices {args} {
+       MatchExpected -indices {*}$args
+    }
+
+    # partial match expected
+    # expectPartial testno flags re target mat "" ...
+    # Quirk:  number of ""s must be one more than number of subREs.
+    proc expectPartial {args} {
+       lset args 1 ![lindex $args 1]   ;# add ! flag
+       MatchExpected -indices {*}$args
+    }
+
+    # test is a knownBug
+    proc knownBug {args} {
+       variable regBug 1
+       uplevel \#0 $args
+       set regBug 0
+    }
+}
+namespace import RETest::*
+\f
+######## the tests themselves ########
+
+# support functions and preliminary misc.
+# This is sensitive to changes in message wording, but we really have to
+# test the code->message expansion at least once.
+::tcltest::test reg-0.1 "regexp error reporting" {
+    list [catch {regexp (*) ign} msg] $msg
+} {1 {couldn't compile regular expression pattern: quantifier operand invalid}}
+
+
+doing 1 "basic sanity checks"
+expectMatch    1.1 &           abc     abc             abc
+expectNomatch  1.2 &           abc     def
+expectMatch    1.3 &           abc     xyabxabce       abc
+
+
+doing 2 "invalid option combinations"
+expectError    2.1 qe          a       INVARG
+expectError    2.2 qa          a       INVARG
+expectError    2.3 qx          a       INVARG
+expectError    2.4 qn          a       INVARG
+expectError    2.5 ba          a       INVARG
+
+
+doing 3 "basic syntax"
+expectIndices  3.1 &NS         ""      a       {0 -1}
+expectMatch    3.2 NS          a|      a       a
+expectMatch    3.3 -           a|b     a       a
+expectMatch    3.4 -           a|b     b       b
+expectMatch    3.5 NS          a||b    b       b
+expectMatch    3.6 &           ab      ab      ab
+
+
+doing 4 "parentheses"
+expectMatch    4.1  -          (a)e            ae      ae      a
+expectMatch    4.2  o          (a)e            ae
+expectMatch    4.3  b          {\(a\)b}        ab      ab      a
+expectMatch    4.4  -          a((b)c)         abc     abc     bc      b
+expectMatch    4.5  -          a(b)(c)         abc     abc     b       c
+expectError    4.6  -          a(b             EPAREN
+expectError    4.7  b          {a\(b}          EPAREN
+# sigh, we blew it on the specs here... someday this will be fixed in POSIX,
+#  but meanwhile, it's fixed in AREs
+expectMatch    4.8  eU         a)b             a)b     a)b
+expectError    4.9  -          a)b             EPAREN
+expectError    4.10 b          {a\)b}          EPAREN
+expectMatch    4.11 P          a(?:b)c         abc     abc
+expectError    4.12 e          a(?:b)c         BADRPT
+expectIndices  4.13 S          a()b            ab      {0 1}   {1 0}
+expectMatch    4.14 SP         a(?:)b          ab      ab
+expectIndices  4.15 S          a(|b)c          ac      {0 1}   {1 0}
+expectMatch    4.16 S          a(b|)c          abc     abc     b
+
+
+doing 5 "simple one-char matching"
+# general case of brackets done later
+expectMatch    5.1 &           a.b             axb     axb
+expectNomatch  5.2 &n          "a.b"           "a\nb"
+expectMatch    5.3 &           {a[bc]d}        abd     abd
+expectMatch    5.4 &           {a[bc]d}        acd     acd
+expectNomatch  5.5 &           {a[bc]d}        aed
+expectNomatch  5.6 &           {a[^bc]d}       abd
+expectMatch    5.7 &           {a[^bc]d}       aed     aed
+expectNomatch  5.8 &p          "a\[^bc]d"      "a\nd"
+
+
+doing 6 "context-dependent syntax"
+# plus odds and ends
+expectError    6.1  -          *       BADRPT
+expectMatch    6.2  b          *       *       *
+expectMatch    6.3  b          {\(*\)} *       *       *
+expectError    6.4  -          (*)     BADRPT
+expectMatch    6.5  b          ^*      *       *
+expectError    6.6  -          ^*      BADRPT
+expectNomatch  6.7  &          ^b      ^b
+expectMatch    6.8  b          x^      x^      x^
+expectNomatch  6.9  I          x^      x
+expectMatch    6.10 n          "\n^"   "x\nb"  "\n"
+expectNomatch  6.11 bS         {\(^b\)} ^b
+expectMatch    6.12 -          (^b)    b       b       b
+expectMatch    6.13 &          {x$}    x       x
+expectMatch    6.14 bS         {\(x$\)} x      x       x
+expectMatch    6.15 -          {(x$)}  x       x       x
+expectMatch    6.16 b          {x$y}   "x\$y"  "x\$y"
+expectNomatch  6.17 I          {x$y}   xy
+expectMatch    6.18 n          "x\$\n" "x\n"   "x\n"
+expectError    6.19 -          +       BADRPT
+expectError    6.20 -          ?       BADRPT
+
+
+doing 7 "simple quantifiers"
+expectMatch    7.1  &N         a*      aa      aa
+expectIndices  7.2  &N         a*      b       {0 -1}
+expectMatch    7.3  -          a+      aa      aa
+expectMatch    7.4  -          a?b     ab      ab
+expectMatch    7.5  -          a?b     b       b
+expectError    7.6  -          **      BADRPT
+expectMatch    7.7  bN         **      ***     ***
+expectError    7.8  &          a**     BADRPT
+expectError    7.9  &          a**b    BADRPT
+expectError    7.10 &          ***     BADRPT
+expectError    7.11 -          a++     BADRPT
+expectError    7.12 -          a?+     BADRPT
+expectError    7.13 -          a?*     BADRPT
+expectError    7.14 -          a+*     BADRPT
+expectError    7.15 -          a*+     BADRPT
+
+
+doing 8 "braces"
+expectMatch    8.1  NQ         "a{0,1}"        ""      ""
+expectMatch    8.2  NQ         "a{0,1}"        ac      a
+expectError    8.3  -          "a{1,0}"        BADBR
+expectError    8.4  -          "a{1,2,3}"      BADBR
+expectError    8.5  -          "a{257}"        BADBR
+expectError    8.6  -          "a{1000}"       BADBR
+expectError    8.7  -          "a{1"           EBRACE
+expectError    8.8  -          "a{1n}"         BADBR
+expectMatch    8.9  BS         "a{b"           "a\{b"  "a\{b"
+expectMatch    8.10 BS         "a{"            "a\{"   "a\{"
+expectMatch    8.11 bQ         "a\\{0,1\\}b"   cb      b
+expectError    8.12 b          "a\\{0,1"       EBRACE
+expectError    8.13 -          "a{0,1\\"       BADBR
+expectMatch    8.14 Q          "a{0}b"         ab      b
+expectMatch    8.15 Q          "a{0,0}b"       ab      b
+expectMatch    8.16 Q          "a{0,1}b"       ab      ab
+expectMatch    8.17 Q          "a{0,2}b"       b       b
+expectMatch    8.18 Q          "a{0,2}b"       aab     aab
+expectMatch    8.19 Q          "a{0,}b"        aab     aab
+expectMatch    8.20 Q          "a{1,1}b"       aab     ab
+expectMatch    8.21 Q          "a{1,3}b"       aaaab   aaab
+expectNomatch  8.22 Q          "a{1,3}b"       b
+expectMatch    8.23 Q          "a{1,}b"        aab     aab
+expectNomatch  8.24 Q          "a{2,3}b"       ab
+expectMatch    8.25 Q          "a{2,3}b"       aaaab   aaab
+expectNomatch  8.26 Q          "a{2,}b"        ab
+expectMatch    8.27 Q          "a{2,}b"        aaaab   aaaab
+
+
+doing 9 "brackets"
+expectMatch    9.1  &          {a[bc]}         ac      ac
+expectMatch    9.2  &          {a[-]}          a-      a-
+expectMatch    9.3  &          {a[[.-.]]}      a-      a-
+expectMatch    9.4  &L         {a[[.zero.]]}   a0      a0
+expectMatch    9.5  &LM        {a[[.zero.]-9]} a2      a2
+expectMatch    9.6  &M         {a[0-[.9.]]}    a2      a2
+expectMatch    9.7  &+L        {a[[=x=]]}      ax      ax
+expectMatch    9.8  &+L        {a[[=x=]]}      ay      ay
+expectNomatch  9.9  &+L        {a[[=x=]]}      az
+expectError    9.10 &          {a[0-[=x=]]}    ERANGE
+expectMatch    9.11 &L         {a[[:digit:]]}  a0      a0
+expectError    9.12 &          {a[[:woopsie:]]}        ECTYPE
+expectNomatch  9.13 &L         {a[[:digit:]]}  ab
+expectError    9.14 &          {a[0-[:digit:]]}        ERANGE
+expectMatch    9.15 &LP        {[[:<:]]a}      a       a
+expectMatch    9.16 &LP        {a[[:>:]]}      a       a
+expectError    9.17 &          {a[[..]]b}      ECOLLATE
+expectError    9.18 &          {a[[==]]b}      ECOLLATE
+expectError    9.19 &          {a[[::]]b}      ECTYPE
+expectError    9.20 &          {a[[.a}         EBRACK
+expectError    9.21 &          {a[[=a}         EBRACK
+expectError    9.22 &          {a[[:a}         EBRACK
+expectError    9.23 &          {a[}            EBRACK
+expectError    9.24 &          {a[b}           EBRACK
+expectError    9.25 &          {a[b-}          EBRACK
+expectError    9.26 &          {a[b-c}         EBRACK
+expectMatch    9.27 &M         {a[b-c]}        ab      ab
+expectMatch    9.28 &          {a[b-b]}        ab      ab
+expectMatch    9.29 &M         {a[1-2]}        a2      a2
+expectError    9.30 &          {a[c-b]}        ERANGE
+expectError    9.31 &          {a[a-b-c]}      ERANGE
+expectMatch    9.32 &M         {a[--?]b}       a?b     a?b
+expectMatch    9.33 &          {a[---]b}       a-b     a-b
+expectMatch    9.34 &          {a[]b]c}        a]c     a]c
+expectMatch    9.35 EP         {a[\]]b}        a]b     a]b
+expectNomatch  9.36 bE         {a[\]]b}        a]b
+expectMatch    9.37 bE         {a[\]]b}        "a\\]b" "a\\]b"
+expectMatch    9.38 eE         {a[\]]b}        "a\\]b" "a\\]b"
+expectMatch    9.39 EP         {a[\\]b}        "a\\b"  "a\\b"
+expectMatch    9.40 eE         {a[\\]b}        "a\\b"  "a\\b"
+expectMatch    9.41 bE         {a[\\]b}        "a\\b"  "a\\b"
+expectError    9.42 -          {a[\Z]b}        EESCAPE
+expectMatch    9.43 &          {a[[b]c}        "a\[c"  "a\[c"
+expectMatch    9.44 EMP*       {a[\u00fe-\u0507][\u00ff-\u0300]b} \
+       "a\u0102\u02ffb"        "a\u0102\u02ffb"
+
+
+doing 10 "anchors and newlines"
+expectMatch    10.1  &         ^a      a       a
+expectNomatch  10.2  &^        ^a      a
+expectIndices  10.3  &N        ^       a       {0 -1}
+expectIndices  10.4  &         {a$}    aba     {2 2}
+expectNomatch  10.5  {&$}      {a$}    a
+expectIndices  10.6  &N        {$}     ab      {2 1}
+expectMatch    10.7  &n        ^a      a       a
+expectMatch    10.8  &n        "^a"    "b\na"  "a"
+expectIndices  10.9  &w        "^a"    "a\na"  {0 0}
+expectIndices  10.10 &n^       "^a"    "a\na"  {2 2}
+expectMatch    10.11 &n        {a$}    a       a
+expectMatch    10.12 &n        "a\$"   "a\nb"  "a"
+expectIndices  10.13 &n        "a\$"   "a\na"  {0 0}
+expectIndices  10.14 N         ^^      a       {0 -1}
+expectMatch    10.15 b         ^^      ^       ^
+expectIndices  10.16 N         {$$}    a       {1 0}
+expectMatch    10.17 b         {$$}    "\$"    "\$"
+expectMatch    10.18 &N        {^$}    ""      ""
+expectNomatch  10.19 &N        {^$}    a
+expectIndices  10.20 &nN       "^\$"   a\n\nb  {2 1}
+expectMatch    10.21 N         {$^}    ""      ""
+expectMatch    10.22 b         {$^}    "\$^"   "\$^"
+expectMatch    10.23 P         {\Aa}   a       a
+expectMatch    10.24 ^P        {\Aa}   a       a
+expectNomatch  10.25 ^nP       {\Aa}   "b\na"
+expectMatch    10.26 P         {a\Z}   a       a
+expectMatch    10.27 \$P       {a\Z}   a       a
+expectNomatch  10.28 \$nP      {a\Z}   "a\nb"
+expectError    10.29 -         ^*      BADRPT
+expectError    10.30 -         {$*}    BADRPT
+expectError    10.31 -         {\A*}   BADRPT
+expectError    10.32 -         {\Z*}   BADRPT
+
+
+doing 11 "boundary constraints"
+expectMatch    11.1  &LP       {[[:<:]]a}      a       a
+expectMatch    11.2  &LP       {[[:<:]]a}      -a      a
+expectNomatch  11.3  &LP       {[[:<:]]a}      ba
+expectMatch    11.4  &LP       {a[[:>:]]}      a       a
+expectMatch    11.5  &LP       {a[[:>:]]}      a-      a
+expectNomatch  11.6  &LP       {a[[:>:]]}      ab
+expectMatch    11.7  bLP       {\<a}           a       a
+expectNomatch  11.8  bLP       {\<a}           ba
+expectMatch    11.9  bLP       {a\>}           a       a
+expectNomatch  11.10 bLP       {a\>}           ab
+expectMatch    11.11 LP        {\ya}           a       a
+expectNomatch  11.12 LP        {\ya}           ba
+expectMatch    11.13 LP        {a\y}           a       a
+expectNomatch  11.14 LP        {a\y}           ab
+expectMatch    11.15 LP        {a\Y}           ab      a
+expectNomatch  11.16 LP        {a\Y}           a-
+expectNomatch  11.17 LP        {a\Y}           a
+expectNomatch  11.18 LP        {-\Y}           -a
+expectMatch    11.19 LP        {-\Y}           -%      -
+expectNomatch  11.20 LP        {\Y-}           a-
+expectError    11.21 -         {[[:<:]]*}      BADRPT
+expectError    11.22 -         {[[:>:]]*}      BADRPT
+expectError    11.23 b         {\<*}           BADRPT
+expectError    11.24 b         {\>*}           BADRPT
+expectError    11.25 -         {\y*}           BADRPT
+expectError    11.26 -         {\Y*}           BADRPT
+expectMatch    11.27 LP        {\ma}           a       a
+expectNomatch  11.28 LP        {\ma}           ba
+expectMatch    11.29 LP        {a\M}           a       a
+expectNomatch  11.30 LP        {a\M}           ab
+expectNomatch  11.31 ILP       {\Ma}           a
+expectNomatch  11.32 ILP       {a\m}           a
+
+
+doing 12 "character classes"
+expectMatch    12.1  LP        {a\db}          a0b     a0b
+expectNomatch  12.2  LP        {a\db}          axb
+expectNomatch  12.3  LP        {a\Db}          a0b
+expectMatch    12.4  LP        {a\Db}          axb     axb
+expectMatch    12.5  LP        "a\\sb"         "a b"   "a b"
+expectMatch    12.6  LP        "a\\sb"         "a\tb"  "a\tb"
+expectMatch    12.7  LP        "a\\sb"         "a\nb"  "a\nb"
+expectNomatch  12.8  LP        {a\sb}          axb
+expectMatch    12.9  LP        {a\Sb}          axb     axb
+expectNomatch  12.10 LP        "a\\Sb"         "a b"
+expectMatch    12.11 LP        {a\wb}          axb     axb
+expectNomatch  12.12 LP        {a\wb}          a-b
+expectNomatch  12.13 LP        {a\Wb}          axb
+expectMatch    12.14 LP        {a\Wb}          a-b     a-b
+expectMatch    12.15 LP        {\y\w+z\y}      adze-guz        guz
+expectMatch    12.16 LPE       {a[\d]b}        a1b     a1b
+expectMatch    12.17 LPE       "a\[\\s]b"      "a b"   "a b"
+expectMatch    12.18 LPE       {a[\w]b}        axb     axb
+
+
+doing 13 "escapes"
+expectError    13.1  &         "a\\"           EESCAPE
+expectMatch    13.2  -         {a\<b}          a<b     a<b
+expectMatch    13.3  e         {a\<b}          a<b     a<b
+expectMatch    13.4  bAS       {a\wb}          awb     awb
+expectMatch    13.5  eAS       {a\wb}          awb     awb
+expectMatch    13.6  PL        "a\\ab"         "a\007b"        "a\007b"
+expectMatch    13.7  P         "a\\bb"         "a\bb"  "a\bb"
+expectMatch    13.8  P         {a\Bb}          "a\\b"  "a\\b"
+expectMatch    13.9  MP        "a\\chb"        "a\bb"  "a\bb"
+expectMatch    13.10 MP        "a\\cHb"        "a\bb"  "a\bb"
+expectMatch    13.11 LMP       "a\\e"          "a\033" "a\033"
+expectMatch    13.12 P         "a\\fb"         "a\fb"  "a\fb"
+expectMatch    13.13 P         "a\\nb"         "a\nb"  "a\nb"
+expectMatch    13.14 P         "a\\rb"         "a\rb"  "a\rb"
+expectMatch    13.15 P         "a\\tb"         "a\tb"  "a\tb"
+expectMatch    13.16 P         "a\\u0008x"     "a\bx"  "a\bx"
+expectMatch    13.17 P         {a\u008x}       "a\bx"  "a\bx"
+expectError    13.17.1 -       {a\ux}          EESCAPE
+expectMatch    13.18 P         "a\\u00088x"    "a\b8x" "a\b8x"
+expectMatch    13.19 P         "a\\U00000008x" "a\bx"  "a\bx"
+expectMatch    13.20 P         {a\U0000008x}   "a\bx"  "a\bx"
+expectMatch    13.21 P         "a\\vb"         "a\vb"  "a\vb"
+expectMatch    13.22 MP        "a\\x08x"       "a\bx"  "a\bx"
+expectError    13.23 -         {a\xq}          EESCAPE
+expectMatch    13.24 MP        "a\\x08x"       "a\bx"  "a\bx"
+expectError    13.25 -         {a\z}           EESCAPE
+expectMatch    13.26 MP        "a\\010b"       "a\bb"  "a\bb"
+expectMatch    13.27 P         "a\\U00001234x" "a\u1234x"      "a\u1234x"
+expectMatch    13.28 P         {a\U00001234x}  "a\u1234x"      "a\u1234x"
+expectMatch    13.29 P         "a\\U0001234x"  "a\u1234x"      "a\u1234x"
+expectMatch    13.30 P         {a\U0001234x}   "a\u1234x"      "a\u1234x"
+expectMatch    13.31 P         "a\\U000012345x"        "a\u12345x"     "a\u12345x"
+expectMatch    13.32 P         {a\U000012345x} "a\u12345x"     "a\u12345x"
+expectMatch    13.33 P         "a\\U1000000x"  "a\ufffd0x"     "a\ufffd0x"
+expectMatch    13.34 P         {a\U1000000x}   "a\ufffd0x"     "a\ufffd0x"
+
+
+doing 14 "back references"
+# ugh
+expectMatch    14.1  RP        {a(b*)c\1}      abbcbb  abbcbb  bb
+expectMatch    14.2  RP        {a(b*)c\1}      ac      ac      ""
+expectNomatch  14.3  RP        {a(b*)c\1}      abbcb
+expectMatch    14.4  RP        {a(b*)\1}       abbcbb  abb     b
+expectMatch    14.5  RP        {a(b|bb)\1}     abbcbb  abb     b
+expectMatch    14.6  RP        {a([bc])\1}     abb     abb     b
+expectNomatch  14.7  RP        {a([bc])\1}     abc
+expectMatch    14.8  RP        {a([bc])\1}     abcabb  abb     b
+expectNomatch  14.9  RP        {a([bc])*\1}    abc
+expectNomatch  14.10 RP        {a([bc])\1}     abB
+expectMatch    14.11 iRP       {a([bc])\1}     abB     abB     b
+expectMatch    14.12 RP        {a([bc])\1+}    abbb    abbb    b
+expectMatch    14.13 QRP       "a(\[bc])\\1{3,4}"      abbbb   abbbb   b
+expectNomatch  14.14 QRP       "a(\[bc])\\1{3,4}"      abbb
+expectMatch    14.15 RP        {a([bc])\1*}    abbb    abbb    b
+expectMatch    14.16 RP        {a([bc])\1*}    ab      ab      b
+expectMatch    14.17 RP        {a([bc])(\1*)}  ab      ab      b       ""
+expectError    14.18 -         {a((b)\1)}      ESUBREG
+expectError    14.19 -         {a(b)c\2}       ESUBREG
+expectMatch    14.20 bR        {a\(b*\)c\1}    abbcbb  abbcbb  bb
+expectMatch    14.21 RP        {^([bc])\1*$}   bbb     bbb     b
+expectMatch    14.22 RP        {^([bc])\1*$}   ccc     ccc     c
+expectNomatch  14.23 RP        {^([bc])\1*$}   bcb
+expectMatch    14.24 LRP       {^(\w+)( \1)+$} {abc abc abc} {abc abc abc} abc { abc}
+expectNomatch  14.25 LRP       {^(\w+)( \1)+$} {abc abd abc}
+expectNomatch  14.26 LRP       {^(\w+)( \1)+$} {abc abc abd}
+expectMatch    14.27 RP        {^(.+)( \1)+$}  {abc abc abc} {abc abc abc} abc { abc}
+expectNomatch  14.28 RP        {^(.+)( \1)+$}  {abc abd abc}
+expectNomatch  14.29 RP        {^(.+)( \1)+$}  {abc abc abd}
+
+
+doing 15 "octal escapes vs back references"
+# initial zero is always octal
+expectMatch    15.1  MP        "a\\010b"       "a\bb"  "a\bb"
+expectMatch    15.2  MP        "a\\0070b"      "a\0070b"       "a\0070b"
+expectMatch    15.3  MP        "a\\07b"        "a\007b"        "a\007b"
+expectMatch    15.4  MP        "a(b)(b)(b)(b)(b)(b)(b)(b)(b)(b)\\07c" \
+       "abbbbbbbbbb\007c" abbbbbbbbbb\007c b b b b b b b b b b
+# a single digit is always a backref
+expectError    15.5  -         {a\7b}  ESUBREG
+# otherwise it's a backref only if within range (barf!)
+expectMatch    15.6  MP        "a\\10b"        "a\bb"  "a\bb"
+expectMatch    15.7  MP        {a\101b}        aAb     aAb
+expectMatch    15.8  RP        {a(b)(b)(b)(b)(b)(b)(b)(b)(b)(b)\10c} \
+       "abbbbbbbbbbbc" abbbbbbbbbbbc b b b b b b b b b b
+# but we're fussy about border cases -- guys who want octal should use the zero
+expectError    15.9  - {a((((((((((b\10))))))))))c}    ESUBREG
+# BREs don't have octal, EREs don't have backrefs
+expectMatch    15.10 MP        "a\\12b"        "a\nb"  "a\nb"
+expectError    15.11 b         {a\12b}         ESUBREG
+expectMatch    15.12 eAS       {a\12b}         a12b    a12b
+expectMatch    15.13 MP        {a\701b}        a\u00381b       a\u00381b
+
+
+doing 16 "expanded syntax"
+expectMatch    16.1 xP         "a b c"         "abc"   "abc"
+expectMatch    16.2 xP         "a b #oops\nc\td"       "abcd"  "abcd"
+expectMatch    16.3 x          "a\\ b\\\tc"    "a b\tc"        "a b\tc"
+expectMatch    16.4 xP         "a b\\#c"       "ab#c"  "ab#c"
+expectMatch    16.5 xP         "a b\[c d]e"    "ab e"  "ab e"
+expectMatch    16.6 xP         "a b\[c#d]e"    "ab#e"  "ab#e"
+expectMatch    16.7 xP         "a b\[c#d]e"    "abde"  "abde"
+expectMatch    16.8 xSPB       "ab{ d"         "ab\{d" "ab\{d"
+expectMatch    16.9 xPQ        "ab{ 1 , 2 }c"  "abc"   "abc"
+
+
+doing 17 "misc syntax"
+expectMatch    17.1 P  a(?#comment)b   ab      ab
+
+
+doing 18 "unmatchable REs"
+expectNomatch  18.1 I  a^b             ab
+
+
+doing 19 "case independence"
+expectMatch    19.1 &i         ab              Ab      Ab
+expectMatch    19.2 &i         {a[bc]}         aC      aC
+expectNomatch  19.3 &i         {a[^bc]}        aB
+expectMatch    19.4 &iM        {a[b-d]}        aC      aC
+expectNomatch  19.5 &iM        {a[^b-d]}       aC
+
+
+doing 20 "directors and embedded options"
+expectError    20.1  &         ***?            BADPAT
+expectMatch    20.2  q         ***?            ***?    ***?
+expectMatch    20.3  &P        ***=a*b         a*b     a*b
+expectMatch    20.4  q         ***=a*b         ***=a*b ***=a*b
+expectMatch    20.5  bLP       {***:\w+}       ab      ab
+expectMatch    20.6  eLP       {***:\w+}       ab      ab
+expectError    20.7  &         ***:***=a*b     BADRPT
+expectMatch    20.8  &P        ***:(?b)a+b     a+b     a+b
+expectMatch    20.9  P         (?b)a+b         a+b     a+b
+expectError    20.10 e         {(?b)\w+}       BADRPT
+expectMatch    20.11 bAS       {(?b)\w+}       (?b)w+  (?b)w+
+expectMatch    20.12 iP        (?c)a           a       a
+expectNomatch  20.13 iP        (?c)a           A
+expectMatch    20.14 APS       {(?e)\W+}       WW      WW
+expectMatch    20.15 P         (?i)a+          Aa      Aa
+expectNomatch  20.16 P         "(?m)a.b"       "a\nb"
+expectMatch    20.17 P         "(?m)^b"        "a\nb"  "b"
+expectNomatch  20.18 P         "(?n)a.b"       "a\nb"
+expectMatch    20.19 P         "(?n)^b"        "a\nb"  "b"
+expectNomatch  20.20 P         "(?p)a.b"       "a\nb"
+expectNomatch  20.21 P         "(?p)^b"        "a\nb"
+expectMatch    20.22 P         (?q)a+b         a+b     a+b
+expectMatch    20.23 nP        "(?s)a.b"       "a\nb"  "a\nb"
+expectMatch    20.24 xP        "(?t)a b"       "a b"   "a b"
+expectMatch    20.25 P         "(?w)a.b"       "a\nb"  "a\nb"
+expectMatch    20.26 P         "(?w)^b"        "a\nb"  "b"
+expectMatch    20.27 P         "(?x)a b"       "ab"    "ab"
+expectError    20.28 -         (?z)ab          BADOPT
+expectMatch    20.29 P         (?ici)a+        Aa      Aa
+expectError    20.30 P         (?i)(?q)a+      BADRPT
+expectMatch    20.31 P         (?q)(?i)a+      (?i)a+  (?i)a+
+expectMatch    20.32 P         (?qe)a+         a       a
+expectMatch    20.33 xP        "(?q)a b"       "a b"   "a b"
+expectMatch    20.34 P         "(?qx)a b"      "a b"   "a b"
+expectMatch    20.35 P         (?qi)ab         Ab      Ab
+
+
+doing 21 "capturing"
+expectMatch    21.1  -         a(b)c           abc     abc     b
+expectMatch    21.2  P         a(?:b)c         xabc    abc
+expectMatch    21.3  -         a((b))c         xabcy   abc     b       b
+expectMatch    21.4  P         a(?:(b))c       abcy    abc     b
+expectMatch    21.5  P         a((?:b))c       abc     abc     b
+expectMatch    21.6  P         a(?:(?:b))c     abc     abc
+expectIndices  21.7  Q         "a(b){0}c"      ac      {0 1}   {-1 -1}
+expectMatch    21.8  -         a(b)c(d)e       abcde   abcde   b       d
+expectMatch    21.9  -         (b)c(d)e        bcde    bcde    b       d
+expectMatch    21.10 -         a(b)(d)e        abde    abde    b       d
+expectMatch    21.11 -         a(b)c(d)        abcd    abcd    b       d
+expectMatch    21.12 -         (ab)(cd)        xabcdy  abcd    ab      cd
+expectMatch    21.13 -         a(b)?c          xabcy   abc     b
+expectIndices  21.14 -         a(b)?c          xacy    {1 2}   {-1 -1}
+expectMatch    21.15 -         a(b)?c(d)?e     xabcdey abcde   b       d
+expectIndices  21.16 -         a(b)?c(d)?e     xacdey  {1 4}   {-1 -1} {3 3}
+expectIndices  21.17 -         a(b)?c(d)?e     xabcey  {1 4}   {2 2}   {-1 -1}
+expectIndices  21.18 -         a(b)?c(d)?e     xacey   {1 3}   {-1 -1} {-1 -1}
+expectMatch    21.19 -         a(b)*c          xabcy   abc     b
+expectIndices  21.20 -         a(b)*c          xabbbcy {1 5}   {4 4}
+expectIndices  21.21 -         a(b)*c          xacy    {1 2}   {-1 -1}
+expectMatch    21.22 -         a(b*)c          xabbbcy abbbc   bbb
+expectMatch    21.23 -         a(b*)c          xacy    ac      ""
+expectNomatch  21.24 -         a(b)+c          xacy
+expectMatch    21.25 -         a(b)+c          xabcy   abc     b
+expectIndices  21.26 -         a(b)+c          xabbbcy {1 5}   {4 4}
+expectMatch    21.27 -         a(b+)c          xabbbcy abbbc   bbb
+expectIndices  21.28 Q         "a(b){2,3}c"    xabbbcy {1 5}   {4 4}
+expectIndices  21.29 Q         "a(b){2,3}c"    xabbcy  {1 4}   {3 3}
+expectNomatch  21.30 Q         "a(b){2,3}c"    xabcy
+expectMatch    21.31 LP        "\\y(\\w+)\\y"  "-- abc-"       "abc"   "abc"
+expectMatch    21.32 -         a((b|c)d+)+     abacdbd acdbd   bd      b
+expectMatch    21.33 N         (.*).*          abc     abc     abc
+expectMatch    21.34 N         (a*)*           bc      ""      ""
+expectMatch    21.35 M         { TO (([a-z0-9._]+|"([^"]+|"")+")+)}    {asd TO foo}    { TO foo} foo o {}
+
+
+doing 22 "multicharacter collating elements"
+# again ugh
+expectMatch    22.1  &+L       {a[c]e}         ace     ace
+expectNomatch  22.2  &+IL      {a[c]h}         ach
+expectMatch    22.3  &+L       {a[[.ch.]]}     ach     ach
+expectNomatch  22.4  &+L       {a[[.ch.]]}     ace
+expectMatch    22.5  &+L       {a[c[.ch.]]}    ac      ac
+expectMatch    22.6  &+L       {a[c[.ch.]]}    ace     ac
+expectMatch    22.7  &+L       {a[c[.ch.]]}    ache    ach
+expectNomatch  22.8  &+L       {a[^c]e}        ace
+expectMatch    22.9  &+L       {a[^c]e}        abe     abe
+expectMatch    22.10 &+L       {a[^c]e}        ache    ache
+expectNomatch  22.11 &+L       {a[^[.ch.]]}    ach
+expectMatch    22.12 &+L       {a[^[.ch.]]}    ace     ac
+expectMatch    22.13 &+L       {a[^[.ch.]]}    ac      ac
+expectMatch    22.14 &+L       {a[^[.ch.]]}    abe     ab
+expectNomatch  22.15 &+L       {a[^c[.ch.]]}   ach
+expectNomatch  22.16 &+L       {a[^c[.ch.]]}   ace
+expectNomatch  22.17 &+L       {a[^c[.ch.]]}   ac
+expectMatch    22.18 &+L       {a[^c[.ch.]]}   abe     ab
+expectMatch    22.19 &+L       {a[^b]}         ac      ac
+expectMatch    22.20 &+L       {a[^b]}         ace     ac
+expectMatch    22.21 &+L       {a[^b]}         ach     ach
+expectNomatch  22.22 &+L       {a[^b]}         abe
+
+
+doing 23 "lookahead constraints"
+expectMatch    23.1 HP         a(?=b)b*        ab      ab
+expectNomatch  23.2 HP         a(?=b)b*        a
+expectMatch    23.3 HP         a(?=b)b*(?=c)c* abc     abc
+expectNomatch  23.4 HP         a(?=b)b*(?=c)c* ab
+expectNomatch  23.5 HP         a(?!b)b*        ab
+expectMatch    23.6 HP         a(?!b)b*        a       a
+expectMatch    23.7 HP         (?=b)b          b       b
+expectNomatch  23.8 HP         (?=b)b          a
+
+
+doing 24 "non-greedy quantifiers"
+expectMatch    24.1  PT        ab+?            abb     ab
+expectMatch    24.2  PT        ab+?c           abbc    abbc
+expectMatch    24.3  PT        ab*?            abb     a
+expectMatch    24.4  PT        ab*?c           abbc    abbc
+expectMatch    24.5  PT        ab??            ab      a
+expectMatch    24.6  PT        ab??c           abc     abc
+expectMatch    24.7  PQT       "ab{2,4}?"      abbbb   abb
+expectMatch    24.8  PQT       "ab{2,4}?c"     abbbbc  abbbbc
+expectMatch    24.9  -         3z*             123zzzz456      3zzzz
+expectMatch    24.10 PT        3z*?            123zzzz456      3
+expectMatch    24.11 -         z*4             123zzzz456      zzzz4
+expectMatch    24.12 PT        z*?4            123zzzz456      zzzz4
+expectMatch    24.13 PT        {^([^/]+?)(?:/([^/]+?))(?:/([^/]+?))?$} {foo/bar/baz}   {foo/bar/baz} {foo} {bar} {baz}
+
+
+doing 25 "mixed quantifiers"
+# this is very incomplete as yet
+# should include |
+expectMatch    25.1 PNT        {^(.*?)(a*)$}   "xyza"  xyza    xyz     a
+expectMatch    25.2 PNT        {^(.*?)(a*)$}   "xyzaa" xyzaa   xyz     aa
+expectMatch    25.3 PNT        {^(.*?)(a*)$}   "xyz"   xyz     xyz     ""
+
+
+doing 26 "tricky cases"
+# attempts to trick the matcher into accepting a short match
+expectMatch    26.1 -          (week|wee)(night|knights) \
+       "weeknights" weeknights wee knights
+expectMatch    26.2 RP         {a(bc*).*\1}    abccbccb abccbccb       b
+expectMatch    26.3 -          {a(b.[bc]*)+}   abcbd   abcbd   bd
+
+
+doing 27 "implementation misc."
+# duplicate arcs are suppressed
+expectMatch    27.1 P          a(?:b|b)c       abc     abc
+# make color/subcolor relationship go back and forth
+expectMatch    27.2 &          {[ab][ab][ab]}  aba     aba
+expectMatch    27.3 &          {[ab][ab][ab][ab][ab][ab][ab]} \
+       "abababa" abababa
+
+
+doing 28 "boundary busters etc."
+# color-descriptor allocation changes at 10
+expectMatch    28.1 &          abcdefghijkl    "abcdefghijkl"  abcdefghijkl
+# so does arc allocation
+expectMatch    28.2 P          a(?:b|c|d|e|f|g|h|i|j|k|l|m)n   "agn"   agn
+# subexpression tracking also at 10
+expectMatch    28.3 -          a(((((((((((((b)))))))))))))c \
+       "abc" abc b b b b b b b b b b b b b
+# state-set handling changes slightly at unsigned size (might be 64...)
+# (also stresses arc allocation)
+expectMatch    28.4  Q         "ab{1,100}c"    abbc    abbc
+expectMatch    28.5  Q         "ab{1,100}c" \
+       "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc" \
+       abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc
+expectMatch    28.6  Q         "ab{1,100}c" \
+       "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc"\
+       abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc
+# force small cache and bust it, several ways
+expectMatch    28.7  LP        {\w+abcdefgh}   xyzabcdefgh     xyzabcdefgh
+expectMatch    28.8  %LP       {\w+abcdefgh}   xyzabcdefgh     xyzabcdefgh
+expectMatch    28.9  %LP       {\w+abcdefghijklmnopqrst} \
+       "xyzabcdefghijklmnopqrst" xyzabcdefghijklmnopqrst
+expectIndices  28.10 %LP       {\w+(abcdefgh)?} xyz    {0 2}   {-1 -1}
+expectIndices  28.11 %LP       {\w+(abcdefgh)?} xyzabcdefg     {0 9}   {-1 -1}
+expectIndices  28.12 %LP       {\w+(abcdefghijklmnopqrst)?} \
+       "xyzabcdefghijklmnopqrs" {0 21} {-1 -1}
+
+
+doing 29 "incomplete matches"
+expectPartial          29.1  t         def     abc     {3 2}   ""
+expectPartial          29.2  t         bcd     abc     {1 2}   ""
+expectPartial          29.3  t         abc     abab    {0 3}   ""
+expectPartial          29.4  t         abc     abdab   {3 4}   ""
+expectIndices          29.5  t         abc     abc     {0 2}   {0 2}
+expectIndices          29.6  t         abc     xyabc   {2 4}   {2 4}
+expectPartial          29.7  t         abc+    xyab    {2 3}   ""
+expectIndices          29.8  t         abc+    xyabc   {2 4}   {2 4}
+knownBug expectIndices 29.9  t         abc+    xyabcd  {2 4}   {6 5}
+expectIndices          29.10 t         abc+    xyabcdd {2 4}   {7 6}
+expectPartial          29.11 tPT       abc+?   xyab    {2 3}   ""
+# the retain numbers in these two may look wrong, but they aren't
+expectIndices          29.12 tPT       abc+?   xyabc   {2 4}   {5 4}
+expectIndices          29.13 tPT       abc+?   xyabcc  {2 4}   {6 5}
+expectIndices          29.14 tPT       abc+?   xyabcd  {2 4}   {6 5}
+expectIndices          29.15 tPT       abc+?   xyabcdd {2 4}   {7 6}
+expectIndices          29.16 t         abcd|bc xyabc   {3 4}   {2 4}
+expectPartial          29.17 tn        .*k     "xx\nyyy"       {3 5}   ""
+
+
+doing 30 "misc. oddities and old bugs"
+expectError    30.1 &          ***     BADRPT
+expectMatch    30.2 N          a?b*    abb     abb
+expectMatch    30.3 N          a?b*    bb      bb
+expectMatch    30.4 &          a*b     aab     aab
+expectMatch    30.5 &          ^a*b    aaaab   aaaab
+expectMatch    30.6 &M         {[0-6][1-2][0-3][0-6][1-6][0-6]} \
+       "010010" 010010
+# temporary REG_BOSONLY kludge
+expectMatch    30.7 s          abc     abcd    abc
+expectNomatch  30.8 s          abc     xabcd
+# back to normal stuff
+expectMatch    30.9 HLP        {(?n)^(?![t#])\S+} \
+       "tk\n\n#\n#\nit0"       it0
+
+
+# Now for tests *not* written by Henry Spencer
+
+namespace import -force ::tcltest::test
+
+# Tests resulting from bugs reported by users
+test reg-31.1 {[[:xdigit:]] behaves correctly when followed by [[:space:]]} {
+    set str {2:::DebugWin32}
+    set re {([[:xdigit:]])([[:space:]]*)}
+    list [regexp $re $str match xdigit spaces] $match $xdigit $spaces
+    # Code used to produce {1 2:::DebugWin32 2 :::DebugWin32} !!!
+} {1 2 2 {}}
+
+test reg-32.1 {canmatch functionality -- at end} testregexp {
+    set pat {blah}
+    set line "asd asd"
+    # can match at the final d, if '%' follows
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 7}
+test reg-32.2 {canmatch functionality -- at end} testregexp {
+    set pat {s%$}
+    set line "asd asd"
+    # can only match after the end of the string
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 7}
+test reg-32.3 {canmatch functionality -- not last char} testregexp {
+    set pat {[^d]%$}
+    set line "asd asd"
+    # can only match after the end of the string
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 7}
+test reg-32.3.1 {canmatch functionality -- no match} testregexp {
+    set pat {\Zx}
+    set line "asd asd"
+    # can match the last char, if followed by x
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 -1}
+test reg-32.4 {canmatch functionality -- last char} {knownBug testregexp} {
+    set pat {.x}
+    set line "asd asd"
+    # can match the last char, if followed by x
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+test reg-32.4.1 {canmatch functionality -- last char} {knownBug testregexp} {
+    set pat {.x$}
+    set line "asd asd"
+    # can match the last char, if followed by x
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+test reg-32.5 {canmatch functionality -- last char} {knownBug testregexp} {
+    set pat {.[^d]x$}
+    set line "asd asd"
+    # can match the last char, if followed by not-d and x.
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+test reg-32.6 {canmatch functionality -- last char} {knownBug testregexp} {
+    set pat {[^a]%[^\r\n]*$}
+    set line "asd asd"
+    # can match at the final d, if '%' follows
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+test reg-32.7 {canmatch functionality -- last char} {knownBug testregexp} {
+    set pat {[^a]%$}
+    set line "asd asd"
+    # can match at the final d, if '%' follows
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+test reg-32.8 {canmatch functionality -- last char} {knownBug testregexp} {
+    set pat {[^x]%$}
+    set line "asd asd"
+    # can match at the final d, if '%' follows
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+test reg-32.9 {canmatch functionality -- more complex case} {knownBug testregexp} {
+    set pat {((\B\B|\Bh+line)[ \t]*|[^\B]%[^\r\n]*)$}
+    set line "asd asd"
+    # can match at the final d, if '%' follows
+    set res [testregexp -xflags -- c $pat $line resvar]
+    lappend res $resvar
+} {0 6}
+
+# Tests reg-33.*: Checks for bug fixes
+
+test reg-33.1 {Bug 230589} {
+    regexp {[ ]*(^|[^%])%V} "*%V2" m s
+} 1
+test reg-33.2 {Bug 504785} {
+    regexp -inline {([^_.]*)([^.]*)\.(..)(.).*} bbcos_001_c01.q1la
+} {bbcos_001_c01.q1la bbcos _001_c01 q1 l}
+test reg-33.3 {Bug 505048} {
+    regexp {\A\s*[^<]*\s*<([^>]+)>} a<a>
+} 1
+test reg-33.4 {Bug 505048} {
+    regexp {\A\s*([^b]*)b} ab
+} 1
+test reg-33.5 {Bug 505048} {
+    regexp {\A\s*[^b]*(b)} ab
+} 1
+test reg-33.6 {Bug 505048} {
+    regexp {\A(\s*)[^b]*(b)} ab
+} 1
+test reg-33.7 {Bug 505048} {
+    regexp {\A\s*[^b]*b} ab
+} 1
+test reg-33.8 {Bug 505048} {
+    regexp -inline {\A\s*[^b]*b} ab
+} ab
+test reg-33.9 {Bug 505048} {
+    regexp -indices -inline {\A\s*[^b]*b} ab
+} {{0 1}}
+test reg-33.10 {Bug 840258} -body {
+    regsub {(^|\n)+\.*b} \n.b {} tmp
+} -cleanup {
+    unset tmp
+} -result 1
+test reg-33.11 {Bug 840258} -body {
+    regsub {(^|[\n\r]+)\.*\?<.*?(\n|\r)+} \
+           "TQ\r\n.?<5000267>Test already stopped\r\n" {} tmp
+} -cleanup {
+    unset tmp
+} -result 1
+test reg-33.12 {Bug 1810264 - bad read} {
+    regexp {\3161573148} {\3161573148}
+} 0
+test reg-33.13 {Bug 1810264 - infinite loop} {
+    regexp {($|^)*} {x}
+} 1
+# Some environments have small default stack sizes. [Bug 1905562]
+test reg-33.14 {Bug 1810264 - super-expensive expression} nonPortable {
+    regexp {(x{200}){200}$y} {x}
+} 0
+
+test reg-33.15.1 {Bug 3603557 - an "in the wild" RE} {
+    lindex [regexp -expanded -about {
+       ^TETRA_MODE_CMD                         # Message Type
+       ([[:blank:]]+)                          # Pad
+       (ETS_1_1|ETS_1_2|ETS_2_2)               # SystemCode
+       ([[:blank:]]+)                          # Pad
+       (CONTINUOUS|CARRIER|MCCH|TRAFFIC)       # SharingMode
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,2})                      # ColourCode
+       ([[:blank:]]+)                          # Pad
+       (1|2|3|4|6|9|12|18)                     # TSReservedFrames
+       ([[:blank:]]+)                          # Pad
+       (PASS|TRUE|FAIL|FALSE)                  # UPlaneDTX
+       ([[:blank:]]+)                          # Pad
+       (PASS|TRUE|FAIL|FALSE)                  # Frame18Extension
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,4})                      # MCC
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,5})                      # MNC
+       ([[:blank:]]+)                          # Pad
+       (BOTH|BCAST|ENQRY|NONE)                 # NbrCellBcast
+       ([[:blank:]]+)                          # Pad
+       (UNKNOWN|LOW|MEDIUM|HIGH)               # CellServiceLevel
+       ([[:blank:]]+)                          # Pad
+       (PASS|TRUE|FAIL|FALSE)                  # LateEntryInfo
+       ([[:blank:]]+)                          # Pad
+       (300|400)                               # FrequencyBand
+       ([[:blank:]]+)                          # Pad
+       (NORMAL|REVERSE)                        # ReverseOperation
+       ([[:blank:]]+)                          # Pad
+       (NONE|\+6\.25|\-6\.25|\+12\.5)          # Offset
+       ([[:blank:]]+)                          # Pad
+       (10)                                    # DuplexSpacing
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,4})                      # MainCarrierNr
+       ([[:blank:]]+)                          # Pad
+       (0|1|2|3)                               # NrCSCCH
+       ([[:blank:]]+)                          # Pad
+       (15|20|25|30|35|40|45)                  # MSTxPwrMax
+       ([[:blank:]]+)                          # Pad
+       (\-125|\-120|\-115|\-110|\-105|\-100|\-95|\-90|\-85|\-80|\-75|\-70|\-65|\-60|\-55|\-50)
+                                               # RxLevAccessMin
+       ([[:blank:]]+)                          # Pad
+       (\-53|\-51|\-49|\-47|\-45|\-43|\-41|\-39|\-37|\-35|\-33|\-31|\-29|\-27|\-25|\-23)
+                                               # AccessParameter
+       ([[:blank:]]+)                          # Pad
+       (DISABLE|[[:digit:]]{3,4})              # RadioDLTimeout
+       ([[:blank:]]+)                          # Pad
+       (\-[[:digit:]]{2,3})                    # RSSIThreshold
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,5})                      # CCKIdSCKVerNr
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,5})                      # LocationArea
+       ([[:blank:]]+)                          # Pad
+       ([(1|0)]{16})                           # SubscriberClass
+       ([[:blank:]]+)                          # Pad
+       ([(1|0)]{12})                           # BSServiceDetails
+       ([[:blank:]]+)                          # Pad
+       (RANDOMIZE|IMMEDIATE|[[:digit:]]{1,2})  # IMM
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,2})                      # WT
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,2})                      # Nu
+       ([[:blank:]]+)                          # Pad
+       ([0-1])                                 # FrameLngFctr
+       ([[:blank:]]+)                          # Pad
+       ([[:digit:]]{1,2})                      # TSPtr
+       ([[:blank:]]+)                          # Pad
+       ([0-7])                                 # MinPriority
+       ([[:blank:]]+)                          # Pad
+       (PASS|TRUE|FAIL|FALSE)                  # ExtdSrvcsEnabled
+       ([[:blank:]]+)                          # Pad
+       (.*)                                    # ConditionalFields
+    }] 0
+} 68
+test reg-33.16.1 {Bug [8d2c0da36d]- another "in the wild" RE} {
+    lindex [regexp -about "^MRK:client1: =1339 14HKelly Talisman 10011000 (\[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]*) \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 8 0 8 0 0 0 77 77 1 1 2 0 11 { 1 3 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 13HC6 My Creator 2 3 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 31HC7 Slightly offensive name, huh 3 8 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 23HE-mail:kelly@hotbox.com 4 9 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 17Hcompface must die 5 10 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 0 3HAir 6 12 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 14HPGP public key 7 13 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 16Hkelly@hotbox.com 8 30 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 0 12H2 text/plain 9 30 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 0 13H2 x-kom/basic 10 33 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 1H0 11 14 8 \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* \[0-9\]* 00000000 1 1H3 }\r?"] 0
+} 1
+
+test reg-33.15 {constraint fixes} {
+    regexp {(^)+^} x
+} 1
+test reg-33.16 {constraint fixes} {
+    regexp {($^)+} x
+} 0
+test reg-33.17 {constraint fixes} {
+    regexp {(^$)*} x
+} 1
+test reg-33.18 {constraint fixes} {
+    regexp {(^(?!aa))+} {aa bb cc}
+} 0
+test reg-33.19 {constraint fixes} {
+    regexp {(^(?!aa)(?!bb)(?!cc))+} {aa x}
+} 0
+test reg-33.20 {constraint fixes} {
+    regexp {(^(?!aa)(?!bb)(?!cc))+} {bb x}
+} 0
+test reg-33.21 {constraint fixes} {
+    regexp {(^(?!aa)(?!bb)(?!cc))+} {cc x}
+} 0
+test reg-33.22 {constraint fixes} {
+    regexp {(^(?!aa)(?!bb)(?!cc))+} {dd x}
+} 1
+
+test reg-33.23 {} {
+    regexp {abcd(\m)+xyz} x
+} 0
+test reg-33.24 {} {
+    regexp {abcd(\m)+xyz} a
+} 0
+test reg-33.25 {} {
+    regexp {^abcd*(((((^(a c(e?d)a+|)+|)+|)+|)+|a)+|)} x
+} 0
+test reg-33.26 {} {
+    regexp {a^(^)bcd*xy(((((($a+|)+|)+|)+$|)+|)+|)^$} x
+} 0
+test reg-33.27 {} {
+    regexp {xyz(\Y\Y)+} x
+} 0
+test reg-33.28 {} {
+    regexp {x|(?:\M)+} x
+} 1
+test reg-33.29 {} {
+    # This is near the limits of the RE engine
+    regexp [string repeat x*y*z* 480] x
+} 1
+
+test reg-33.30 {Bug 1080042} {
+    regexp {(\Y)+} foo
+} 1
+test reg-33.31 {Bug 7c64aa5e1a} {
+    regexp -inline {(?b).\{1,10\}} {abcdef}
+} abcdef
+
+
+# cleanup
+::tcltest::cleanupTests
+return
+
+# Local Variables:
+# mode: tcl
+# End: