OpenFPGA/libs/EXTERNAL/tcl8.6.12/tests/reg.test

1235 lines
42 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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::*
######## 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: