1# -*-Tcl-*- 2#--------------------------------------------------------------------- 3# TITLE: 4# expander.test 5# 6# AUTHOR: 7# Will Duquette 8# 9# DESCRIPTION: 10# Test cases for expander.tcl. Uses the ::tcltest:: harness. 11 12# ------------------------------------------------------------------------- 13 14source [file join \ 15 [file dirname [file dirname [file join [pwd] [info script]]]] \ 16 devtools testutilities.tcl] 17 18testsNeedTcl 8.5 19testsNeedTcltest 1.0 20 21testing { 22 useLocal expander.tcl textutil::expander 23} 24 25#--------------------------------------------------------------------- 26# Test cases 1.x: Expander Accessors 27 28test expander-1.1 {initial expander settings} {} { 29 catch {::textutil::expander exp} 30 set result "[exp lb] [exp rb] [exp errmode]" 31} {[ ] fail} 32 33test expander-1.2 {setting/retrieving lbrack} {} { 34 catch {::textutil::expander exp} 35 set result "[exp lb FOO] [exp lb] [exp lb {[}]" 36} {FOO FOO [} 37 38test expander-1.3 {setting/retrieving rbrack} {} { 39 catch {::textutil::expander exp} 40 set result "[exp rb FOO] [exp rb] [exp rb {]}]" 41} {FOO FOO ]} 42 43test expander-1.4 {setting/retrieving errmode fail} {} { 44 catch {::textutil::expander exp} 45 list [exp errmode fail] [exp errmode] 46} {fail fail} 47 48test expander-1.5 {setting/retrieving errmode nothing} {} { 49 catch {::textutil::expander exp} 50 list [exp errmode nothing] [exp errmode] 51} {nothing nothing} 52 53test expander-1.6 {setting/retrieving errmode macro} {} { 54 catch {::textutil::expander exp} 55 list [exp errmode macro] [exp errmode] 56} {macro macro} 57 58test expander-1.7 {setting/retrieving errmode error} {} { 59 catch {::textutil::expander exp} 60 list [exp errmode error] [exp errmode] 61} {error error} 62 63test expander-1.8 {setting/retrieving errmode incorrectly} {} { 64 catch {::textutil::expander exp} 65 exp errmode nothing 66 catch {exp errmode FOO} result 67 list $result [exp errmode] 68} {{::exp errmode: Invalid error mode: FOO} nothing} 69 70test expander-1.9 {resetting the object} {} { 71 catch {::textutil::expander exp} 72 exp errmode macro 73 exp lb FOO 74 exp rb BAR 75 exp reset 76 set result "[exp lb] [exp rb] [exp errmode]" 77} {[ ] fail} 78 79#--------------------------------------------------------------------- 80# Test cases 2.x: The Context Stack 81 82test expander-2.1 {initial context stack settings} {} { 83 catch {::textutil::expander exp} 84 exp reset 85 list [exp cname] [exp cis [exp cname]] 86} {:0 1} 87 88test expander-2.2 {context stack underflow} {} { 89 catch {::textutil::expander exp} 90 exp reset 91 catch {exp cpop FOO} result 92 set result 93} {::exp cpop underflow on 'FOO'} 94 95test expander-2.3 {context push} {} { 96 catch {::textutil::expander exp} 97 exp reset 98 exp cpush FOO 99 list [exp cname] [exp cis [exp cname]] 100} {FOO 1} 101 102test expander-2.4 {cvar error} {} { 103 catch {::textutil::expander exp} 104 exp reset 105 exp cpush FOO 106 catch {exp cvar BAR} result 107 set result 108} {::exp cvar: BAR doesn't exist in this context} 109 110test expander-2.5 {cget error} {} { 111 catch {::textutil::expander exp} 112 exp reset 113 exp cpush FOO 114 catch {exp cget BAR} result 115 set result 116} {::exp cget: BAR doesn't exist in this context (1)} 117 118test expander-2.6 {cpop mismatch} {} { 119 catch {::textutil::expander exp} 120 exp reset 121 exp cpush FOO 122 catch {exp cpop BAR} result 123 set result 124} {::exp cpop context mismatch: expected FOO, got BAR} 125 126test expander-2.7 {cpush, cappend, cpop} {} { 127 catch {::textutil::expander exp} 128 exp reset 129 exp cpush FOO 130 exp cappend "Hello, " 131 exp cappend "World!" 132 set result [exp cpop FOO] 133 list $result [exp cname] 134} {{Hello, World!} :0} 135 136test expander-2.8 {two-stage cpush, cappend, cpop} {} { 137 catch {::textutil::expander exp} 138 exp reset 139 exp cpush FOO 140 exp cappend "Goodbye " 141 exp cpush BAR 142 exp where 143 exp cappend "Cruel " 144 exp cappend [exp cpop BAR] 145 exp cappend "World!" 146 set result [exp cpop FOO] 147 list $result [exp cname] 148} {{Goodbye Cruel World!} :0} 149 150test expander-2.9 {cset, cvar, cget} {} { 151 catch {::textutil::expander exp} 152 exp reset 153 exp cpush FOO 154 exp cset BAR QUUX 155 list [exp cget BAR] [set [exp cvar BAR]] 156} {QUUX QUUX} 157 158test expander-2.10 {two-stage cset, cvar, cget} {} { 159 catch {::textutil::expander exp} 160 exp reset 161 exp cpush ONE 162 exp cset FOO BAR 163 exp cpush TWO 164 exp cset FOO QUUX 165 set v2 [exp cget FOO] 166 exp cpop TWO 167 set v1 [exp cget FOO] 168 list $v1 $v2 169} {BAR QUUX} 170 171#--------------------------------------------------------------------- 172# Test cases 3.x: Successful Macro Expansion 173 174proc howdy {} {return "Howdy"} 175 176test expander-3.1 {expand the empty string} {} { 177 catch {::textutil::expander exp} 178 exp reset 179 exp expand "" 180} {} 181 182test expander-3.2 {expand a string with no macros} {} { 183 catch {::textutil::expander exp} 184 exp reset 185 exp expand {Hello, world!} 186} {Hello, world!} 187 188test expander-3.3 {expand a string consisting of a macro} {} { 189 catch {::textutil::expander exp} 190 exp reset 191 exp expand {[howdy]} 192} {Howdy} 193 194test expander-3.4 {expand a string beginning with a macro} {} { 195 catch {::textutil::expander exp} 196 exp reset 197 exp expand {[howdy], world!} 198} {Howdy, world!} 199 200test expander-3.5 {expand a string ending with a macro} {} { 201 catch {::textutil::expander exp} 202 exp reset 203 exp expand {Well, [howdy]} 204} {Well, Howdy} 205 206test expander-3.6 {expand a string with macro in middle} {} { 207 catch {::textutil::expander exp} 208 exp reset 209 exp expand {Well, [howdy]!} 210} {Well, Howdy!} 211 212test expander-3.7 {expand macro with changed default brackets} {} { 213 catch {::textutil::expander exp} 214 exp reset 215 exp lb "<<<" 216 exp rb ">>>" 217 exp expand {Well, <<<howdy>>>!} 218} {Well, Howdy!} 219 220test expander-3.8 {expand macro with changed user brackets} {} { 221 catch {::textutil::expander exp} 222 exp reset 223 exp expand {Well, <<<howdy>>>!} {<<< >>>} 224} {Well, Howdy!} 225 226test expander-3.9 {expand macro with changed user brackets} {} { 227 catch {::textutil::expander exp} 228 exp reset 229 set a [exp expand {[howdy]}] 230 set b [exp expand {Well, <<<howdy>>>!} {<<< >>>}] 231 list $a $b 232} {Howdy {Well, Howdy!}} 233 234test expander-3.10 {macros change brackets} {} { 235 catch {::textutil::expander exp} 236 exp reset 237 string trim [exp expand { 238 Well, [howdy]! 239 [exp setbrackets <<< >>>] 240 Well, <<<howdy>>>! 241 <<<exp setbrackets "\[" "\]">>> 242 Well, [howdy]! 243 }] 244} {Well, Howdy! 245 246 Well, Howdy! 247 248 Well, Howdy!} 249 250test expander-3.11 {brackets are restored correctly} {} { 251 catch {::textutil::expander exp} 252 exp reset 253 list [exp expand {<howdy>} "< >"] [exp expand {[howdy]}] 254} {Howdy Howdy} 255 256test expander-3.12 {nested expansion: one expander} {} { 257 catch {::textutil::expander exp} 258 exp reset 259 exp expand {[howdy] [exp expand {*[howdy]*}] [howdy]} 260} {Howdy *Howdy* Howdy} 261 262test expander-3.13 {nested expansion: two expanders} {} { 263 catch {::textutil::expander exp} 264 catch {::textutil::expander exp2} 265 exp reset 266 exp2 reset 267 exp expand {[howdy] [exp2 expand {*[howdy]*}] [howdy]} 268} {Howdy *Howdy* Howdy} 269 270#--------------------------------------------------------------------- 271# Test cases 4.x: Failed Macro Expansion 272 273test expander-4.1 {error mode fail} {} { 274 catch {::textutil::expander exp} 275 exp reset 276 exp errmode fail 277 catch {exp expand {+++[nop]+++}} result 278 set result 279} {Error in macro at line 1, column 3: 280[nop] 281--> invalid command name "nop"} 282 283test expander-4.2 {error mode error} {} { 284 catch {::textutil::expander exp} 285 exp reset 286 exp errmode error 287 catch {exp expand {+++[nop]+++}} result 288 set result 289} {+++ 290================================= 291*** Error in macro at line 1, column 3: 292*** [nop] 293--> invalid command name "nop" 294================================= 295+++} 296 297test expander-4.3 {error mode macro} {} { 298 catch {::textutil::expander exp} 299 exp reset 300 exp errmode macro 301 catch {exp expand {+++[nop]+++}} result 302 set result 303} {+++[nop]+++} 304 305test expander-4.4 {error mode nothing} {} { 306 catch {::textutil::expander exp} 307 exp reset 308 exp errmode nothing 309 catch {exp expand {+++[nop]+++}} result 310 set result 311} {++++++} 312 313test expander-4.5 {counting lines} {} { 314 catch {::textutil::expander exp} 315 exp reset 316 exp errmode error 317 catch {exp expand {+++ 318 319 320 [nop]+++}} result 321 set result 322} {+++ 323 324 325 326================================= 327*** Error in macro at line 4, column 2: 328*** [nop] 329--> invalid command name "nop" 330================================= 331+++} 332 333#--------------------------------------------------------------------- 334# Test cases 5.x: Replacing the evalcmd. 335 336proc identity {macro} { 337 return $macro 338} 339 340test expander-5.1 {new evalcmd} {} { 341 catch {::textutil::expander exp} 342 exp reset 343 set oldcmd [exp evalcmd] 344 exp evalcmd identity 345 list $oldcmd [exp evalcmd] [exp expand {+++[Bogus Macro]+++}] 346} {{uplevel #0} identity {+++Bogus Macro+++}} 347 348#--------------------------------------------------------------------- 349# Test cases 6.x: Replacing the textcmd. 350 351proc count {text} { 352 return [string length $text] 353} 354 355test expander-6.1 {new evalcmd} {} { 356 catch {::textutil::expander exp} 357 exp reset 358 set oldcmd [exp textcmd] 359 exp textcmd count 360 list $oldcmd [exp textcmd] [exp expand {++++++}] 361} {{} count 6} 362 363#--------------------------------------------------------------------- 364# Clean up 365 366testsuiteCleanup 367return 368 369