reg.test
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:30k
源码类别:

通讯编程

开发平台:

Visual C++

  1. # reg.test --
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. # (Don't panic if you are seeing this as part of the reg distribution
  7. # and aren't using Tcl -- reg's own regression tester also knows how
  8. # to read this file, ignoring the Tcl-isms.)
  9. #
  10. # Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
  11. #
  12. # RCS: @(#) $Id: reg.test,v 1.16.2.4 2007/12/18 11:23:16 dkf Exp $
  13. if {[lsearch [namespace children] ::tcltest] == -1} {
  14.     package require tcltest 2
  15.     namespace import -force ::tcltest::*
  16. }
  17. # All tests require the testregexp command, return if this
  18. # command doesn't exist
  19. ::tcltest::testConstraint testregexp 
  20. [expr {[info commands testregexp] != {}}]
  21. ::tcltest::testConstraint localeRegexp 0
  22. # This file uses some custom procedures, defined below, for regexp regression
  23. # testing.  The name of the procedure indicates the general nature of the
  24. # test:
  25. # e compile error expected
  26. # f match failure expected
  27. # m successful match
  28. # i successful match with -indices (used in checking things like
  29. # nonparticipating subexpressions)
  30. # p unsuccessful match with -indices (!!) (used in checking
  31. # partial-match reporting)
  32. # There is also "doing" which sets up title and major test number for each
  33. # block of tests.
  34. # The first 3 arguments are constant:  a minor number (which often gets
  35. # a letter or two suffixed to it internally), some flags, and the RE itself.
  36. # For e, the remaining argument is the name of the compile error expected,
  37. # less the leading "REG_".  For the rest, the next argument is the string
  38. # to try the match against.  Remaining arguments are the substring expected
  39. # to be matched, and any substrings expected to be matched by subexpressions.
  40. # (For f, these arguments are optional, and if present are ignored except
  41. # that they indicate how many subexpressions should be present in the RE.)
  42. # It is an error for the number of subexpression arguments to be wrong.
  43. # Cases involving nonparticipating subexpressions, checking where empty
  44. # substrings are located, etc. should be done using i and p.
  45. # The flag characters are complex and a bit eclectic.  Generally speaking, 
  46. # lowercase letters are compile options, uppercase are expected re_info
  47. # bits, and nonalphabetics are match options, controls for how the test is 
  48. # run, or testing options.  The one small surprise is that AREs are the
  49. # default, and you must explicitly request lesser flavors of RE.  The flags
  50. # are as follows.  It is admitted that some are not very mnemonic.
  51. # There are some others which are purely debugging tools and are not
  52. # useful in this file.
  53. #
  54. # - no-op (placeholder)
  55. # + provide fake xy equivalence class and ch collating element
  56. # % force small state-set cache in matcher (to test cache replace)
  57. # ^ beginning of string is not beginning of line
  58. # $ end of string is not end of line
  59. # * test is Unicode-specific, needs big character set
  60. #
  61. # & test as both ARE and BRE
  62. # b BRE
  63. # e ERE
  64. # a turn advanced-features bit on (error unless ERE already)
  65. # q literal string, no metacharacters at all
  66. #
  67. # i case-independent matching
  68. # o ("opaque") no subexpression capture
  69. # p newlines are half-magic, excluded from . and [^ only
  70. # w newlines are half-magic, significant to ^ and $ only
  71. # n newlines are fully magic, both effects
  72. # x expanded RE syntax
  73. # t incomplete-match reporting
  74. #
  75. # A backslash-_a_lphanumeric seen
  76. # B ERE/ARE literal-_b_race heuristic used
  77. # E backslash (_e_scape) seen within []
  78. # H looka_h_ead constraint seen
  79. # I _i_mpossible to match
  80. # L _l_ocale-specific construct seen
  81. # M unportable (_m_achine-specific) construct seen
  82. # N RE can match empty (_n_ull) string
  83. # P non-_P_OSIX construct seen
  84. # Q {} _q_uantifier seen
  85. # R back _r_eference seen
  86. # S POSIX-un_s_pecified syntax seen
  87. # T prefers shortest (_t_iny)
  88. # U saw original-POSIX botch:  unmatched right paren in ERE (_u_gh)
  89. # The one area we can't easily test is memory-allocation failures (which
  90. # are hard to provoke on command).  Embedded NULs also are not tested at
  91. # the moment, but this is a historical accident which should be fixed.
  92. # test procedures and related
  93. set ask "about"
  94. set xflags "xflags"
  95. set testbypassed 0
  96. # re_info abbreviation mapping table
  97. set infonames(A) "REG_UBSALNUM"
  98. set infonames(B) "REG_UBRACES"
  99. set infonames(E) "REG_UBBS"
  100. set infonames(H) "REG_ULOOKAHEAD"
  101. set infonames(I) "REG_UIMPOSSIBLE"
  102. set infonames(L) "REG_ULOCALE"
  103. set infonames(M) "REG_UUNPORT"
  104. set infonames(N) "REG_UEMPTYMATCH"
  105. set infonames(P) "REG_UNONPOSIX"
  106. set infonames(Q) "REG_UBOUNDS"
  107. set infonames(R) "REG_UBACKREF"
  108. set infonames(S) "REG_UUNSPEC"
  109. set infonames(T) "REG_USHORTEST"
  110. set infonames(U) "REG_UPBOTCH"
  111. set infonameorder "RHQBAUEPSMLNIT" ;# must match bit order, lsb first
  112. # set major test number and description
  113. proc doing {major desc} {
  114. global prefix description testbypassed
  115. if {$testbypassed != 0} {
  116. puts stdout "!!! bypassed $testbypassed tests in
  117.  $prefix, `$description'"
  118. }
  119. set prefix reg-$major
  120. set description "reg $desc"
  121. set testbypassed 0
  122. }
  123. # build test number (internal)
  124. proc tno {testid} {
  125. return [join $testid .]
  126. }
  127. # build description, with possible modifiers (internal)
  128. proc desc {testid} {
  129. global description
  130. set d $description
  131. if {[llength $testid] > 1} {
  132. set d "([lreplace $testid 0 0]) $d"
  133. }
  134. return $d
  135. }
  136. # build trailing options and flags argument from a flags string (internal)
  137. proc flags {fl} {
  138. global xflags
  139. set args [list]
  140. set flags ""
  141. foreach f [split $fl ""] {
  142. switch -exact -- $f {
  143. "i" { lappend args "-nocase" }
  144. "x" { lappend args "-expanded" }
  145. "n" { lappend args "-line" }
  146. "p" { lappend args "-linestop" }
  147. "w" { lappend args "-lineanchor" }
  148. "-" { }
  149. default { append flags $f }
  150. }
  151. }
  152. if {[string compare $flags ""] != 0} {
  153. lappend args -$xflags $flags
  154. }
  155. return $args
  156. }
  157. # build info-flags list from a flags string (internal)
  158. proc infoflags {fl} {
  159. global infonames infonameorder
  160. set ret [list]
  161. foreach f [split $infonameorder ""] {
  162. if {[string first $f $fl] >= 0} {
  163. lappend ret $infonames($f)
  164. }
  165. }
  166. return $ret
  167. }
  168. # compilation error expected
  169. proc e {testid flags re err} {
  170. global prefix ask errorCode
  171. # Tcl locale stuff doesn't do the ch/xy test fakery yet
  172. if {[string first "+" $flags] >= 0} {
  173.     # This will register as a skipped test
  174.     test $prefix.[tno $testid] [desc $testid] localeRegexp {} {}
  175.     return
  176. }
  177. # if &, test as both ARE and BRE
  178. set amp [string first "&" $flags]
  179. if {$amp >= 0} {
  180. set f [string range $flags 0 [expr $amp - 1]]
  181. append f [string range $flags [expr $amp + 1] end]
  182. e [linsert $testid end ARE] ${f} $re $err
  183. e [linsert $testid end BRE] ${f}b $re $err
  184. return
  185. }
  186. set cmd [concat [list testregexp -$ask] [flags $flags] [list $re]]
  187. set run "list [catch {$cmd}] [lindex $errorCode 1]"
  188. test $prefix.[tno $testid] [desc $testid] 
  189. {testregexp} $run [list 1 REG_$err]
  190. }
  191. # match failure expected
  192. proc f {testid flags re target args} {
  193. global prefix description ask
  194. # Tcl locale stuff doesn't do the ch/xy test fakery yet
  195. if {[string first "+" $flags] >= 0} {
  196.     # This will register as a skipped test
  197.     test $prefix.[tno $testid] [desc $testid] localeRegexp {} {}
  198.     return
  199. }
  200. # if &, test as both ARE and BRE
  201. set amp [string first "&" $flags]
  202. if {$amp >= 0} {
  203. set f [string range $flags 0 [expr $amp - 1]]
  204. append f [string range $flags [expr $amp + 1] end]
  205. eval [linsert $args 0 f [linsert $testid end ARE] ${f} $re 
  206. $target]
  207. eval [linsert $args 0 f [linsert $testid end BRE] ${f}b $re 
  208. $target]
  209. return
  210. }
  211. set f [flags $flags]
  212. set infoflags [infoflags $flags]
  213. set ccmd [concat [list testregexp -$ask] $f [list $re]]
  214. set nsub [expr [llength $args] - 1]
  215. if {$nsub == -1} {
  216. # didn't tell us number of subexps
  217. set ccmd "lreplace [$ccmd] 0 0"
  218. set info [list $infoflags]
  219. } else {
  220. set info [list $nsub $infoflags]
  221. }
  222. lappend testid "compile"
  223. test $prefix.[tno $testid] [desc $testid] {testregexp} $ccmd $info
  224. set testid [lreplace $testid end end "execute"]
  225. set ecmd [concat [list testregexp] $f [list $re $target]]
  226. test $prefix.[tno $testid] [desc $testid] {testregexp} $ecmd 0
  227. }
  228. # match expected, internal routine that does the work
  229. # parameters like the "real" routines except they don't have "opts",
  230. #  which is a possibly-empty list of switches for the regexp match attempt
  231. # The ! flag is used to indicate expected match failure (for REG_EXPECT,
  232. #  which wants argument testing even in the event of failure).
  233. proc matchexpected {opts testid flags re target args} {
  234. global prefix description ask regBug
  235.     if {[info exists regBug] && $regBug} {
  236. # This will register as a skipped test
  237. test $prefix.[tno $testid] [desc $testid] knownBug {format 0} {1}
  238. return
  239.     }
  240. # Tcl locale stuff doesn't do the ch/xy test fakery yet
  241. if {[string first "+" $flags] >= 0} {
  242.     # This will register as a skipped test
  243.     test $prefix.[tno $testid] [desc $testid] localeRegexp {} {}
  244.     return
  245. }
  246. # if &, test as both BRE and ARE
  247. set amp [string first "&" $flags]
  248. if {$amp >= 0} {
  249. set f [string range $flags 0 [expr $amp - 1]]
  250. append f [string range $flags [expr $amp + 1] end]
  251. eval [concat [list matchexpected $opts 
  252. [linsert $testid end ARE] ${f} $re $target] $args]
  253. eval [concat [list matchexpected $opts 
  254. [linsert $testid end BRE] ${f}b $re $target] $args]
  255. return
  256. }
  257. set f [flags $flags]
  258. set infoflags [infoflags $flags]
  259. set ccmd [concat [list testregexp -$ask] $f [list $re]]
  260. set ecmd [concat [list testregexp] $opts $f [list $re $target]]
  261. set nsub [expr [llength $args] - 1]
  262. set names [list]
  263. set refs ""
  264. for {set i 0} {$i <= $nsub} {incr i} {
  265. if {$i == 0} {
  266. set name match
  267. } else {
  268. set name sub$i
  269. }
  270. lappend names $name
  271. append refs " $$name"
  272. set $name ""
  273. }
  274. if {[string first "o" $flags] >= 0} { ;# REG_NOSUB kludge
  275. set nsub 0 ;# unsigned value cannot be -1
  276. }
  277. if {[string first "t" $flags] >= 0} { ;# REG_EXPECT
  278. incr nsub -1 ;# the extra does not count
  279. }
  280. set ecmd [concat $ecmd $names]
  281. set erun "list [$ecmd] $refs"
  282. set retcode [list 1]
  283. if {[string first "!" $flags] >= 0} {
  284. set retcode [list 0]
  285. }
  286. set result [concat $retcode $args]
  287. set info [list $nsub $infoflags]
  288. lappend testid "compile"
  289. test $prefix.[tno $testid] [desc $testid] {testregexp} $ccmd $info
  290. set testid [lreplace $testid end end "execute"]
  291. test $prefix.[tno $testid] [desc $testid] {testregexp} $erun $result
  292. }
  293. # match expected (no missing, empty, or ambiguous submatches)
  294. # m testno flags re target mat submat ...
  295. proc m {args} {
  296. eval matchexpected [linsert $args 0 [list]]
  297. }
  298. # match expected (full fanciness)
  299. # i testno flags re target mat submat ...
  300. proc i {args} {
  301. eval matchexpected [linsert $args 0 [list "-indices"]]
  302. }
  303. # partial match expected
  304. # p testno flags re target mat "" ...
  305. # Quirk:  number of ""s must be one more than number of subREs.
  306. proc p {args} {
  307. set f [lindex $args 1] ;# add ! flag
  308. set args [lreplace $args 1 1 "!$f"]
  309. eval matchexpected [linsert $args 0 [list "-indices"]]
  310. }
  311. # test is a knownBug
  312. proc knownBug {args} {
  313.     set ::regBug 1
  314.     uplevel #0 $args
  315.     set ::regBug 0
  316. }
  317. # the tests themselves
  318. # support functions and preliminary misc.
  319. # This is sensitive to changes in message wording, but we really have to
  320. # test the code->message expansion at least once.
  321. test reg-0.1 "regexp error reporting" {
  322. list [catch {regexp (*) ign} msg] $msg
  323. } {1 {couldn't compile regular expression pattern: quantifier operand invalid}}
  324. doing 1 "basic sanity checks"
  325. m  1 & abc abc abc
  326. f  2 & abc def
  327. m  3 & abc xyabxabce abc
  328. doing 2 "invalid option combinations"
  329. e  1 qe a INVARG
  330. e  2 qa a INVARG
  331. e  3 qx a INVARG
  332. e  4 qn a INVARG
  333. e  5 ba a INVARG
  334. doing 3 "basic syntax"
  335. i  1 &NS "" a {0 -1}
  336. m  2 NS a| a a
  337. m  3 - a|b a a
  338. m  4 - a|b b b
  339. m  5 NS a||b b b
  340. m  6 & ab ab ab
  341. doing 4 "parentheses"
  342. m  1 - (a)e ae ae a
  343. m  2 o (a)e ae
  344. m  3 b {(a)b} ab ab a
  345. m  4 - a((b)c) abc abc bc b
  346. m  5 - a(b)(c) abc abc b c
  347. e  6 - a(b EPAREN
  348. e  7 b {a(b} EPAREN
  349. # sigh, we blew it on the specs here... someday this will be fixed in POSIX,
  350. #  but meanwhile, it's fixed in AREs
  351. m  8 eU a)b a)b a)b
  352. e  9 - a)b EPAREN
  353. e 10 b {a)b} EPAREN
  354. m 11 P a(?:b)c abc abc
  355. e 12 e a(?:b)c BADRPT
  356. i 13 S a()b ab {0 1} {1 0}
  357. m 14 SP a(?:)b ab ab
  358. i 15 S a(|b)c ac {0 1} {1 0}
  359. m 16 S a(b|)c abc abc b
  360. doing 5 "simple one-char matching"
  361. # general case of brackets done later
  362. m  1 & a.b axb axb
  363. f  2 &n "a.b" "anb"
  364. m  3 & {a[bc]d} abd abd
  365. m  4 & {a[bc]d} acd acd
  366. f  5 & {a[bc]d} aed
  367. f  6 & {a[^bc]d} abd
  368. m  7 & {a[^bc]d} aed aed
  369. f  8 &p "a[^bc]d" "and"
  370. doing 6 "context-dependent syntax"
  371. # plus odds and ends
  372. e  1 - * BADRPT
  373. m  2 b * * *
  374. m  3 b {(*)} * * *
  375. e  4 - (*) BADRPT
  376. m  5 b ^* * *
  377. e  6 - ^* BADRPT
  378. f  7 & ^b ^b
  379. m  8 b x^ x^ x^
  380. f  9 I x^ x
  381. m 10 n "n^" "xnb" "n"
  382. f 11 bS {(^b)} ^b
  383. m 12 - (^b) b b b
  384. m 13 & {x$} x x
  385. m 14 bS {(x$)} x x x
  386. m 15 - {(x$)} x x x
  387. m 16 b {x$y} "x$y" "x$y"
  388. f 17 I {x$y} xy
  389. m 18 n "x$n" "xn" "xn"
  390. e 19 - + BADRPT
  391. e 20 - ? BADRPT
  392. doing 7 "simple quantifiers"
  393. m  1 &N a* aa aa
  394. i  2 &N a* b {0 -1}
  395. m  3 - a+ aa aa
  396. m  4 - a?b ab ab
  397. m  5 - a?b b b
  398. e  6 - ** BADRPT
  399. m  7 bN ** *** ***
  400. e  8 & a** BADRPT
  401. e  9 & a**b BADRPT
  402. e 10 & *** BADRPT
  403. e 11 - a++ BADRPT
  404. e 12 - a?+ BADRPT
  405. e 13 - a?* BADRPT
  406. e 14 - a+* BADRPT
  407. e 15 - a*+ BADRPT
  408. doing 8 "braces"
  409. m  1 NQ "a{0,1}" "" ""
  410. m  2 NQ "a{0,1}" ac a
  411. e  3 - "a{1,0}" BADBR
  412. e  4 - "a{1,2,3}" BADBR
  413. e  5 - "a{257}" BADBR
  414. e  6 - "a{1000}" BADBR
  415. e  7 - "a{1" EBRACE
  416. e  8 - "a{1n}" BADBR
  417. m  9 BS "a{b" "a{b" "a{b"
  418. m 10 BS "a{" "a{" "a{"
  419. m 11 bQ "a\{0,1\}b" cb b
  420. e 12 b "a\{0,1" EBRACE
  421. e 13 - "a{0,1\" BADBR
  422. m 14 Q "a{0}b" ab b
  423. m 15 Q "a{0,0}b" ab b
  424. m 16 Q "a{0,1}b" ab ab
  425. m 17 Q "a{0,2}b" b b
  426. m 18 Q "a{0,2}b" aab aab
  427. m 19 Q "a{0,}b" aab aab
  428. m 20 Q "a{1,1}b" aab ab
  429. m 21 Q "a{1,3}b" aaaab aaab
  430. f 22 Q "a{1,3}b" b
  431. m 23 Q "a{1,}b" aab aab
  432. f 24 Q "a{2,3}b" ab
  433. m 25 Q "a{2,3}b" aaaab aaab
  434. f 26 Q "a{2,}b" ab
  435. m 27 Q "a{2,}b" aaaab aaaab
  436. doing 9 "brackets"
  437. m  1 & {a[bc]} ac ac
  438. m  2 & {a[-]} a- a-
  439. m  3 & {a[[.-.]]} a- a-
  440. m  4 &L {a[[.zero.]]} a0 a0
  441. m  5 &LM {a[[.zero.]-9]} a2 a2
  442. m  6 &M {a[0-[.9.]]} a2 a2
  443. m  7 &+L {a[[=x=]]} ax ax
  444. m  8 &+L {a[[=x=]]} ay ay
  445. f  9 &+L {a[[=x=]]} az
  446. e 10 & {a[0-[=x=]]} ERANGE
  447. m 11 &L {a[[:digit:]]} a0 a0
  448. e 12 & {a[[:woopsie:]]} ECTYPE
  449. f 13 &L {a[[:digit:]]} ab
  450. e 14 & {a[0-[:digit:]]} ERANGE
  451. m 15 &LP {[[:<:]]a} a a
  452. m 16 &LP {a[[:>:]]} a a
  453. e 17 & {a[[..]]b} ECOLLATE
  454. e 18 & {a[[==]]b} ECOLLATE
  455. e 19 & {a[[::]]b} ECTYPE
  456. e 20 & {a[[.a} EBRACK
  457. e 21 & {a[[=a} EBRACK
  458. e 22 & {a[[:a} EBRACK
  459. e 23 & {a[} EBRACK
  460. e 24 & {a[b} EBRACK
  461. e 25 & {a[b-} EBRACK
  462. e 26 & {a[b-c} EBRACK
  463. m 27 &M {a[b-c]} ab ab
  464. m 28 & {a[b-b]} ab ab
  465. m 29 &M {a[1-2]} a2 a2
  466. e 30 & {a[c-b]} ERANGE
  467. e 31 & {a[a-b-c]} ERANGE
  468. m 32 &M {a[--?]b} a?b a?b
  469. m 33 & {a[---]b} a-b a-b
  470. m 34 & {a[]b]c} a]c a]c
  471. m 35 EP {a[]]b} a]b a]b
  472. f 36 bE {a[]]b} a]b
  473. m 37 bE {a[]]b} "a\]b" "a\]b"
  474. m 38 eE {a[]]b} "a\]b" "a\]b"
  475. m 39 EP {a[\]b} "a\b" "a\b"
  476. m 40 eE {a[\]b} "a\b" "a\b"
  477. m 41 bE {a[\]b} "a\b" "a\b"
  478. e 42 - {a[Z]b} EESCAPE
  479. m 43 & {a[[b]c} "a[c" "a[c"
  480. m 44 EMP* {a[u00fe-u0507][u00ff-u0300]b} 
  481. "au0102u02ffb" "au0102u02ffb"
  482. doing 10 "anchors and newlines"
  483. m  1 & ^a a a
  484. f  2 &^ ^a a
  485. i  3 &N ^ a {0 -1}
  486. i  4 & {a$} aba {2 2}
  487. f  5 {&$} {a$} a
  488. i  6 &N {$} ab {2 1}
  489. m  7 &n ^a a a
  490. m  8 &n "^a" "bna" "a"
  491. i  9 &w "^a" "ana" {0 0}
  492. i 10 &n^ "^a" "ana" {2 2}
  493. m 11 &n {a$} a a
  494. m 12 &n "a$" "anb" "a"
  495. i 13 &n "a$" "ana" {0 0}
  496. i 14 N ^^ a {0 -1}
  497. m 15 b ^^ ^ ^
  498. i 16 N {$$} a {1 0}
  499. m 17 b {$$} "$" "$"
  500. m 18 &N {^$} "" ""
  501. f 19 &N {^$} a
  502. i 20 &nN "^$" "annb" {2 1}
  503. m 21 N {$^} "" ""
  504. m 22 b {$^} "$^" "$^"
  505. m 23 P {Aa} a a
  506. m 24 ^P {Aa} a a
  507. f 25 ^nP {Aa} "bna"
  508. m 26 P {aZ} a a
  509. m 27 {$P} {aZ} a a
  510. f 28 {$nP} {aZ} "anb"
  511. e 29 - ^* BADRPT
  512. e 30 - {$*} BADRPT
  513. e 31 - {A*} BADRPT
  514. e 32 - {Z*} BADRPT
  515. doing 11 "boundary constraints"
  516. m  1 &LP {[[:<:]]a} a a
  517. m  2 &LP {[[:<:]]a} -a a
  518. f  3 &LP {[[:<:]]a} ba
  519. m  4 &LP {a[[:>:]]} a a
  520. m  5 &LP {a[[:>:]]} a- a
  521. f  6 &LP {a[[:>:]]} ab
  522. m  7 bLP {<a} a a
  523. f  8 bLP {<a} ba
  524. m  9 bLP {a>} a a
  525. f 10 bLP {a>} ab
  526. m 11 LP {ya} a a
  527. f 12 LP {ya} ba
  528. m 13 LP {ay} a a
  529. f 14 LP {ay} ab
  530. m 15 LP {aY} ab a
  531. f 16 LP {aY} a-
  532. f 17 LP {aY} a
  533. f 18 LP {-Y} -a
  534. m 19 LP {-Y} -% -
  535. f 20 LP {Y-} a-
  536. e 21 - {[[:<:]]*} BADRPT
  537. e 22 - {[[:>:]]*} BADRPT
  538. e 23 b {<*} BADRPT
  539. e 24 b {>*} BADRPT
  540. e 25 - {y*} BADRPT
  541. e 26 - {Y*} BADRPT
  542. m 27 LP {ma} a a
  543. f 28 LP {ma} ba
  544. m 29 LP {aM} a a
  545. f 30 LP {aM} ab
  546. f 31 ILP {Ma} a
  547. f 32 ILP {am} a
  548. doing 12 "character classes"
  549. m  1 LP {adb} a0b a0b
  550. f  2 LP {adb} axb
  551. f  3 LP {aDb} a0b
  552. m  4 LP {aDb} axb axb
  553. m  5 LP "a\sb" "a b" "a b"
  554. m  6 LP "a\sb" "atb" "atb"
  555. m  7 LP "a\sb" "anb" "anb"
  556. f  8 LP {asb} axb
  557. m  9 LP {aSb} axb axb
  558. f 10 LP "a\Sb" "a b"
  559. m 11 LP {awb} axb axb
  560. f 12 LP {awb} a-b
  561. f 13 LP {aWb} axb
  562. m 14 LP {aWb} a-b a-b
  563. m 15 LP {yw+zy} adze-guz guz
  564. m 16 LPE {a[d]b} a1b a1b
  565. m 17 LPE "a[\s]b" "a b" "a b"
  566. m 18 LPE {a[w]b} axb axb
  567. doing 13 "escapes"
  568. e  1 & "a\" EESCAPE
  569. m  2 - {a<b} a<b a<b
  570. m  3 e {a<b} a<b a<b
  571. m  4 bAS {awb} awb awb
  572. m  5 eAS {awb} awb awb
  573. m  6 PL "a\ab" "a07b" "a07b"
  574. m  7 P "a\bb" "abb" "abb"
  575. m  8 P {aBb} "a\b" "a\b"
  576. m  9 MP "a\chb" "abb" "abb"
  577. m 10 MP "a\cHb" "abb" "abb"
  578. m 11 LMP "a\e" "a33" "a33"
  579. m 12 P "a\fb" "afb" "afb"
  580. m 13 P "a\nb" "anb" "anb"
  581. m 14 P "a\rb" "arb" "arb"
  582. m 15 P "a\tb" "atb" "atb"
  583. m 16 P "a\u0008x" "abx" "abx"
  584. e 17 - {au008x} EESCAPE
  585. m 18 P "a\u00088x" "ab8x" "ab8x"
  586. m 19 P "a\U00000008x" "abx" "abx"
  587. e 20 - {aU0000008x} EESCAPE
  588. m 21 P "a\vb" "avb" "avb"
  589. m 22 MP "a\x08x" "abx" "abx"
  590. e 23 - {axq} EESCAPE
  591. m 24 MP "a\x0008x" "abx" "abx"
  592. e 25 - {az} EESCAPE
  593. m 26 MP "a\010b" "abb" "abb"
  594. doing 14 "back references"
  595. # ugh
  596. m  1 RP {a(b*)c1} abbcbb abbcbb bb
  597. m  2 RP {a(b*)c1} ac ac ""
  598. f  3 RP {a(b*)c1} abbcb
  599. m  4 RP {a(b*)1} abbcbb abb b
  600. m  5 RP {a(b|bb)1} abbcbb abb b
  601. m  6 RP {a([bc])1} abb abb b
  602. f  7 RP {a([bc])1} abc
  603. m  8 RP {a([bc])1} abcabb abb b
  604. f  9 RP {a([bc])*1} abc
  605. f 10 RP {a([bc])1} abB
  606. m 11 iRP {a([bc])1} abB abB b
  607. m 12 RP {a([bc])1+} abbb abbb b
  608. m 13 QRP "a([bc])\1{3,4}" abbbb abbbb b
  609. f 14 QRP "a([bc])\1{3,4}" abbb
  610. m 15 RP {a([bc])1*} abbb abbb b
  611. m 16 RP {a([bc])1*} ab ab b
  612. m 17 RP {a([bc])(1*)} ab ab b ""
  613. e 18 - {a((b)1)} ESUBREG
  614. e 19 - {a(b)c2} ESUBREG
  615. m 20 bR {a(b*)c1} abbcbb abbcbb bb
  616. doing 15 "octal escapes vs back references"
  617. # initial zero is always octal
  618. m  1 MP "a\010b" "abb" "abb"
  619. m  2 MP "a\0070b" "a070b" "a070b"
  620. m  3 MP "a\07b" "a07b" "a07b"
  621. m  4 MP "a(b)(b)(b)(b)(b)(b)(b)(b)(b)(b)\07c" "abbbbbbbbbb07c" 
  622. "abbbbbbbbbb07c" "b" "b" "b" "b" "b" "b" 
  623. "b" "b" "b" "b"
  624. # a single digit is always a backref
  625. e  5 - {a7b} ESUBREG
  626. # otherwise it's a backref only if within range (barf!)
  627. m  6 MP "a\10b" "abb" "abb"
  628. m  7 MP {a101b} aAb aAb
  629. m  8 RP {a(b)(b)(b)(b)(b)(b)(b)(b)(b)(b)10c} abbbbbbbbbbbc 
  630. abbbbbbbbbbbc b b b b b b b 
  631. b b b
  632. # but we're fussy about border cases -- guys who want octal should use the zero
  633. e  9 - {a((((((((((b10))))))))))c} ESUBREG
  634. # BREs don't have octal, EREs don't have backrefs
  635. m 10 MP "a\12b" "anb" "anb"
  636. e 11 b {a12b} ESUBREG
  637. m 12 eAS {a12b} a12b a12b
  638. doing 16 "expanded syntax"
  639. m  1 xP "a b c" "abc" "abc"
  640. m  2 xP "a b #oopsnctd" "abcd" "abcd"
  641. m  3 x "a\ b\tc" "a btc" "a btc"
  642. m  4 xP "a b\#c" "ab#c" "ab#c"
  643. m  5 xP "a b[c d]e" "ab e" "ab e"
  644. m  6 xP "a b[c#d]e" "ab#e" "ab#e"
  645. m  7 xP "a b[c#d]e" "abde" "abde"
  646. m  8 xSPB "ab{ d" "ab{d" "ab{d"
  647. m  9 xPQ "ab{ 1 , 2 }c" "abc" "abc"
  648. doing 17 "misc syntax"
  649. m  1 P a(?#comment)b ab ab
  650. doing 18 "unmatchable REs"
  651. f  1 I a^b ab
  652. doing 19 "case independence"
  653. m  1 &i ab Ab Ab
  654. m  2 &i {a[bc]} aC aC
  655. f  3 &i {a[^bc]} aB
  656. m  4 &iM {a[b-d]} aC aC
  657. f  5 &iM {a[^b-d]} aC
  658. doing 20 "directors and embedded options"
  659. e  1 & ***? BADPAT
  660. m  2 q ***? ***? ***?
  661. m  3 &P ***=a*b a*b a*b
  662. m  4 q ***=a*b ***=a*b ***=a*b
  663. m  5 bLP {***:w+} ab ab
  664. m  6 eLP {***:w+} ab ab
  665. e  7 & ***:***=a*b BADRPT
  666. m  8 &P ***:(?b)a+b a+b a+b
  667. m  9 P (?b)a+b a+b a+b
  668. e 10 e {(?b)w+} BADRPT
  669. m 11 bAS {(?b)w+} (?b)w+ (?b)w+
  670. m 12 iP (?c)a a a
  671. f 13 iP (?c)a A
  672. m 14 APS {(?e)W+} WW WW
  673. m 15 P (?i)a+ Aa Aa
  674. f 16 P "(?m)a.b" "anb"
  675. m 17 P "(?m)^b" "anb" "b"
  676. f 18 P "(?n)a.b" "anb"
  677. m 19 P "(?n)^b" "anb" "b"
  678. f 20 P "(?p)a.b" "anb"
  679. f 21 P "(?p)^b" "anb"
  680. m 22 P (?q)a+b a+b a+b
  681. m 23 nP "(?s)a.b" "anb" "anb"
  682. m 24 xP "(?t)a b" "a b" "a b"
  683. m 25 P "(?w)a.b" "anb" "anb"
  684. m 26 P "(?w)^b" "anb" "b"
  685. m 27 P "(?x)a b" "ab" "ab"
  686. e 28 - (?z)ab BADOPT
  687. m 29 P (?ici)a+ Aa Aa
  688. e 30 P (?i)(?q)a+ BADRPT
  689. m 31 P (?q)(?i)a+ (?i)a+ (?i)a+
  690. m 32 P (?qe)a+ a a
  691. m 33 xP "(?q)a b" "a b" "a b"
  692. m 34 P "(?qx)a b" "a b" "a b"
  693. m 35 P (?qi)ab Ab Ab
  694. doing 21 "capturing"
  695. m  1 - a(b)c abc abc b
  696. m  2 P a(?:b)c xabc abc
  697. m  3 - a((b))c xabcy abc b b
  698. m  4 P a(?:(b))c abcy abc b
  699. m  5 P a((?:b))c abc abc b
  700. m  6 P a(?:(?:b))c abc abc
  701. i  7 Q "a(b){0}c" ac {0 1} {-1 -1}
  702. m  8 - a(b)c(d)e abcde abcde b d
  703. m  9 - (b)c(d)e bcde bcde b d
  704. m 10 - a(b)(d)e abde abde b d
  705. m 11 - a(b)c(d) abcd abcd b d
  706. m 12 - (ab)(cd) xabcdy abcd ab cd
  707. m 13 - a(b)?c xabcy abc b
  708. i 14 - a(b)?c xacy {1 2} {-1 -1}
  709. m 15 - a(b)?c(d)?e xabcdey abcde b d
  710. i 16 - a(b)?c(d)?e xacdey {1 4} {-1 -1} {3 3}
  711. i 17 - a(b)?c(d)?e xabcey {1 4} {2 2} {-1 -1}
  712. i 18 - a(b)?c(d)?e xacey {1 3} {-1 -1} {-1 -1}
  713. m 19 - a(b)*c xabcy abc b
  714. i 20 - a(b)*c xabbbcy {1 5} {4 4}
  715. i 21 - a(b)*c xacy {1 2} {-1 -1}
  716. m 22 - a(b*)c xabbbcy abbbc bbb
  717. m 23 - a(b*)c xacy ac ""
  718. f 24 - a(b)+c xacy
  719. m 25 - a(b)+c xabcy abc b
  720. i 26 - a(b)+c xabbbcy {1 5} {4 4}
  721. m 27 - a(b+)c xabbbcy abbbc bbb
  722. i 28 Q "a(b){2,3}c" xabbbcy {1 5} {4 4}
  723. i 29 Q "a(b){2,3}c" xabbcy {1 4} {3 3}
  724. f 30 Q "a(b){2,3}c" xabcy
  725. m 31 LP "\y(\w+)\y" "-- abc-" "abc" "abc"
  726. m 32 - a((b|c)d+)+ abacdbd acdbd bd b
  727. m 33 N (.*).* abc abc abc
  728. m 34 N (a*)* bc "" ""
  729. doing 22 "multicharacter collating elements"
  730. # again ugh
  731. m  1 &+L {a[c]e} ace ace
  732. f  2 &+IL {a[c]h} ach
  733. m  3 &+L {a[[.ch.]]} ach ach
  734. f  4 &+L {a[[.ch.]]} ace
  735. m  5 &+L {a[c[.ch.]]} ac ac
  736. m  6 &+L {a[c[.ch.]]} ace ac
  737. m  7 &+L {a[c[.ch.]]} ache ach
  738. f  8 &+L {a[^c]e} ace
  739. m  9 &+L {a[^c]e} abe abe
  740. m 10 &+L {a[^c]e} ache ache
  741. f 11 &+L {a[^[.ch.]]} ach
  742. m 12 &+L {a[^[.ch.]]} ace ac
  743. m 13 &+L {a[^[.ch.]]} ac ac
  744. m 14 &+L {a[^[.ch.]]} abe ab
  745. f 15 &+L {a[^c[.ch.]]} ach
  746. f 16 &+L {a[^c[.ch.]]} ace
  747. f 17 &+L {a[^c[.ch.]]} ac
  748. m 18 &+L {a[^c[.ch.]]} abe ab
  749. m 19 &+L {a[^b]} ac ac
  750. m 20 &+L {a[^b]} ace ac
  751. m 21 &+L {a[^b]} ach ach
  752. f 22 &+L {a[^b]} abe
  753. doing 23 "lookahead constraints"
  754. m  1 HP a(?=b)b* ab ab
  755. f  2 HP a(?=b)b* a
  756. m  3 HP a(?=b)b*(?=c)c* abc abc
  757. f  4 HP a(?=b)b*(?=c)c* ab
  758. f  5 HP a(?!b)b* ab
  759. m  6 HP a(?!b)b* a a
  760. m  7 HP (?=b)b b b
  761. f  8 HP (?=b)b a
  762. doing 24 "non-greedy quantifiers"
  763. m  1 PT ab+? abb ab
  764. m  2 PT ab+?c abbc abbc
  765. m  3 PT ab*? abb a
  766. m  4 PT ab*?c abbc abbc
  767. m  5 PT ab?? ab a
  768. m  6 PT ab??c abc abc
  769. m  7 PQT "ab{2,4}?" abbbb abb
  770. m  8 PQT "ab{2,4}?c" abbbbc abbbbc
  771. m  9 - 3z* 123zzzz456 3zzzz
  772. m 10 PT 3z*? 123zzzz456 3
  773. m 11 - z*4 123zzzz456 zzzz4
  774. m 12 PT z*?4 123zzzz456 zzzz4
  775. doing 25 "mixed quantifiers"
  776. # this is very incomplete as yet
  777. # should include |
  778. m  1 PNT {^(.*?)(a*)$} xyza xyza xyz a
  779. m  2 PNT {^(.*?)(a*)$} xyzaa xyzaa xyz aa
  780. m  3 PNT {^(.*?)(a*)$} xyz xyz xyz ""
  781. doing 26 "tricky cases"
  782. # attempts to trick the matcher into accepting a short match
  783. m  1 - (week|wee)(night|knights) weeknights weeknights 
  784. wee knights
  785. m  2 RP {a(bc*).*1} abccbccb abccbccb b
  786. m  3 - {a(b.[bc]*)+} abcbd abcbd bd
  787. doing 27 "implementation misc."
  788. # duplicate arcs are suppressed
  789. m  1 P a(?:b|b)c abc abc
  790. # make color/subcolor relationship go back and forth
  791. m  2 & {[ab][ab][ab]} aba aba
  792. m  3 & {[ab][ab][ab][ab][ab][ab][ab]} abababa abababa
  793. doing 28 "boundary busters etc."
  794. # color-descriptor allocation changes at 10
  795. m  1 & abcdefghijkl abcdefghijkl abcdefghijkl
  796. # so does arc allocation
  797. m  2 P a(?:b|c|d|e|f|g|h|i|j|k|l|m)n agn agn
  798. # subexpression tracking also at 10
  799. m  3 - a(((((((((((((b)))))))))))))c abc abc b b b b b b b b b b b b b
  800. # state-set handling changes slightly at unsigned size (might be 64...)
  801. # (also stresses arc allocation)
  802. m  4 Q "ab{1,100}c" abbc abbc
  803. m  5 Q "ab{1,100}c" abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc 
  804. abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc
  805. m  6 Q "ab{1,100}c" 
  806. abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc 
  807. abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc
  808. # force small cache and bust it, several ways
  809. m  7 LP {w+abcdefgh} xyzabcdefgh xyzabcdefgh
  810. m  8 %LP {w+abcdefgh} xyzabcdefgh xyzabcdefgh
  811. m  9 %LP {w+abcdefghijklmnopqrst} xyzabcdefghijklmnopqrst 
  812. xyzabcdefghijklmnopqrst
  813. i 10 %LP {w+(abcdefgh)?} xyz {0 2} {-1 -1}
  814. i 11 %LP {w+(abcdefgh)?} xyzabcdefg {0 9} {-1 -1}
  815. i 12 %LP {w+(abcdefghijklmnopqrst)?} xyzabcdefghijklmnopqrs 
  816. {0 21} {-1 -1}
  817. doing 29 "incomplete matches"
  818. p  1 t def abc {3 2} ""
  819. p  2 t bcd abc {1 2} ""
  820. p  3 t abc abab {0 3} ""
  821. p  4 t abc abdab {3 4} ""
  822. i  5 t abc abc {0 2} {0 2}
  823. i  6 t abc xyabc {2 4} {2 4}
  824. p  7 t abc+ xyab {2 3} ""
  825. i  8 t abc+ xyabc {2 4} {2 4}
  826. knownBug i  9 t abc+ xyabcd {2 4} {6 5}
  827. i  10 t abc+ xyabcdd {2 4} {7 6}
  828. p  11 tPT abc+? xyab {2 3} ""
  829. # the retain numbers in these two may look wrong, but they aren't
  830. i  12 tPT abc+? xyabc {2 4} {5 4}
  831. i  13 tPT abc+? xyabcc {2 4} {6 5}
  832. i  14 tPT abc+? xyabcd {2 4} {6 5}
  833. i  15 tPT abc+? xyabcdd {2 4} {7 6}
  834. i  16 t abcd|bc xyabc {3 4} {2 4}
  835. p  17 tn .*k "xxnyyy" {3 5} ""
  836. doing 30 "misc. oddities and old bugs"
  837. e  1 & *** BADRPT
  838. m  2 N a?b* abb abb
  839. m  3 N a?b* bb bb
  840. m  4 & a*b aab aab
  841. m  5 & ^a*b aaaab aaaab
  842. m  6 &M {[0-6][1-2][0-3][0-6][1-6][0-6]} 010010 010010
  843. # temporary REG_BOSONLY kludge
  844. m  7 s abc abcd abc
  845. f  8 s abc xabcd
  846. # back to normal stuff
  847. m  9 HLP {(?n)^(?![t#])S+} "tknn#n#nit0" it0
  848. # flush any leftover complaints
  849. doing 0 "flush"
  850. # Tests resulting from bugs reported by users
  851. test reg-31.1 {[[:xdigit:]] behaves correctly when followed by [[:space:]]} {
  852.     set str {2:::DebugWin32}
  853.     set re {([[:xdigit:]])([[:space:]]*)}
  854.     list [regexp $re $str match xdigit spaces] $match $xdigit $spaces
  855.     # Code used to produce {1 2:::DebugWin32 2 :::DebugWin32} !!!
  856. } {1 2 2 {}}
  857. test reg-32.1 {canmatch functionality -- at end} testregexp {
  858.     set pat {blah}
  859.     set line "asd asd"
  860.     # can match at the final d, if '%' follows
  861.     set res [testregexp -xflags -- c $pat $line resvar]
  862.     lappend res $resvar
  863. } {0 7}
  864. test reg-32.2 {canmatch functionality -- at end} testregexp {
  865.     set pat {s%$}
  866.     set line "asd asd"
  867.     # can only match after the end of the string
  868.     set res [testregexp -xflags -- c $pat $line resvar] 
  869.     lappend res $resvar
  870. } {0 7}
  871. test reg-32.3 {canmatch functionality -- not last char} testregexp {
  872.     set pat {[^d]%$}
  873.     set line "asd asd"
  874.     # can only match after the end of the string
  875.     set res [testregexp -xflags -- c $pat $line resvar]
  876.     lappend res $resvar
  877. } {0 7}
  878. test reg-32.3.1 {canmatch functionality -- no match} testregexp {
  879.     set pat {Zx}
  880.     set line "asd asd"
  881.     # can match the last char, if followed by x
  882.     set res [testregexp -xflags -- c $pat $line resvar]
  883.     lappend res $resvar
  884. } {0 -1}
  885. test reg-32.4 {canmatch functionality -- last char} {knownBug} {
  886.     set pat {.x}
  887.     set line "asd asd"
  888.     # can match the last char, if followed by x
  889.     set res [testregexp -xflags -- c $pat $line resvar]
  890.     lappend res $resvar
  891. } {0 6}
  892. test reg-32.4.1 {canmatch functionality -- last char} {knownBug} {
  893.     set pat {.x$}
  894.     set line "asd asd"
  895.     # can match the last char, if followed by x
  896.     set res [testregexp -xflags -- c $pat $line resvar]
  897.     lappend res $resvar
  898. } {0 6}
  899. test reg-32.5 {canmatch functionality -- last char} {knownBug} {
  900.     set pat {.[^d]x$}
  901.     set line "asd asd"
  902.     # can match the last char, if followed by not-d and x.
  903.     set res [testregexp -xflags -- c $pat $line resvar]
  904.     lappend res $resvar
  905. } {0 6}
  906. test reg-32.6 {canmatch functionality -- last char} {knownBug} {
  907.     set pat {[^a]%[^rn]*$}
  908.     set line "asd asd"
  909.     # can match at the final d, if '%' follows
  910.     set res [testregexp -xflags -- c $pat $line resvar]
  911.     lappend res $resvar
  912. } {0 6}
  913. test reg-32.7 {canmatch functionality -- last char} {knownBug} {
  914.     set pat {[^a]%$}
  915.     set line "asd asd"
  916.     # can match at the final d, if '%' follows
  917.     set res [testregexp -xflags -- c $pat $line resvar]
  918.     lappend res $resvar
  919. } {0 6}
  920. test reg-32.8 {canmatch functionality -- last char} {knownBug} {
  921.     set pat {[^x]%$}
  922.     set line "asd asd"
  923.     # can match at the final d, if '%' follows
  924.     set res [testregexp -xflags -- c $pat $line resvar]
  925.     lappend res $resvar
  926. } {0 6}
  927. test reg-32.9 {canmatch functionality -- more complex case} {knownBug} {
  928.     set pat {((BB|Bh+line)[ t]*|[^B]%[^rn]*)$}
  929.     set line "asd asd"
  930.     # can match at the final d, if '%' follows
  931.     set res [testregexp -xflags -- c $pat $line resvar]
  932.     lappend res $resvar
  933. } {0 6}
  934. # Tests reg-33.*: Checks for bug fixes
  935. test reg-33.1 {Bug 230589} {
  936.     regexp {[ ]*(^|[^%])%V} "*%V2" m s
  937. } 1
  938. test reg-33.2 {Bug 504785} {
  939.     regexp -inline {([^_.]*)([^.]*).(..)(.).*} bbcos_001_c01.q1la
  940. } {bbcos_001_c01.q1la bbcos _001_c01 q1 l}
  941. test reg-33.3 {Bug 505048} {
  942.     regexp {As*[^<]*s*<([^>]+)>} a<a>
  943. } 1
  944. test reg-33.4 {Bug 505048} {
  945.     regexp {As*([^b]*)b} ab
  946. } 1
  947. test reg-33.5 {Bug 505048} {
  948.     regexp {As*[^b]*(b)} ab
  949. } 1
  950. test reg-33.6 {Bug 505048} {
  951.     regexp {A(s*)[^b]*(b)} ab
  952. } 1
  953. test reg-33.7 {Bug 505048} {
  954.     regexp {As*[^b]*b} ab
  955. } 1
  956. test reg-33.8 {Bug 505048} {
  957.     regexp -inline {As*[^b]*b} ab
  958. } ab
  959. test reg-33.9 {Bug 505048} {
  960.     regexp -indices -inline {As*[^b]*b} ab
  961. } {{0 1}}
  962. test reg-33.10 {Bug 840258} {
  963.     regsub {(^|n)+.*b} n.b {} tmp
  964. } 1
  965. test reg-33.11 {Bug 840258} {
  966.     regsub {(^|[nr]+).*?<.*?(n|r)+} 
  967.             "TQrn.?<5000267>Test already stoppedrn" {} tmp
  968. } 1
  969. test reg-33.12 {Bug 1810264 - bad read} {
  970.     regexp {3161573148} {3161573148}
  971. } 0
  972. test reg-33.13 {Bug 1810264 - infinite loop} {
  973.     regexp {($|^)*} {x}
  974. } 1
  975. test reg-33.14 {Bug 1810264 - super-expensive expression} {
  976.     set start [clock seconds]
  977.     regexp {(x{200}){200}$y} {x}
  978.     set time [expr {[clock seconds] - $start}]
  979.     expr {$time < 5 ? "ok" : "Complex RE took $time seconds - bad!"}
  980. } ok
  981. # cleanup
  982. ::tcltest::cleanupTests
  983. return