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