1# defer.test - Copyright (c) 2017 Roy Keene
2# -*- tcl -*-
3
4# -------------------------------------------------------------------------
5
6source [file join \
7	[file dirname [file dirname [file join [pwd] [info script]]]] \
8	devtools testutilities.tcl]
9
10testsNeedTcl     8.6
11testsNeedTcltest 2
12
13testing {
14	useLocal defer.tcl defer
15}
16
17# -------------------------------------------------------------------------
18
19# Series 1: defer::defer
20test defer-1.0 {defer::defer simple} -setup {
21	set deferTest FAIL
22} -body {
23	apply {{} {
24		defer::defer apply {{} {
25			uplevel 2 {set deferTest PASS}
26		}}
27	}}
28
29	set deferTest
30} -cleanup {
31	unset -nocomplain deferTest
32} -result {PASS}
33
34test defer-1.1 {defer::defer fd} -setup {
35	set fd [file tempfile]
36} -body {
37	apply {{fd} {
38		defer::defer close $fd
39	}} $fd
40
41	lsearch -exact [chan names] $fd
42} -cleanup {
43	catch {
44		close $fd
45	}
46	unset fd
47} -result {-1}
48
49# Series 2: defer::with
50test defer-2.0 {defer::with simple} -setup {
51	set deferTest FAIL
52} -body {
53	apply {{} {
54		set withCheck true
55		defer::with withCheck {
56			if {$withCheck} {
57				uplevel 1 {set deferTest PASS}
58			}
59		}
60	}}
61
62	set deferTest
63} -cleanup {
64	unset -nocomplain deferTest
65} -result {PASS}
66
67test defer-2.1 {defer::with fd} -setup {
68	set fd [file tempfile]
69} -body {
70	apply {{fd} {
71		defer::with fd {
72			close $fd
73		}
74	}} $fd
75
76	lsearch -exact [chan names] $fd
77} -cleanup {
78	catch {
79		close $fd
80	}
81	unset fd
82} -result {-1}
83
84# Series 3: defer::autowith
85test defer-3.0 {defer::autowith simple} -setup {
86	set deferTest FAIL
87} -body {
88	apply {{} {
89		set autoWithCheck true
90
91		defer::autowith {
92			if {$autoWithCheck} {
93				uplevel 1 {set deferTest PASS}
94			}
95		}
96	}}
97
98	set deferTest
99} -cleanup {
100	unset -nocomplain deferTest
101} -result {PASS}
102
103test defer-3.1 {defer::autowith fd} -setup {
104	set fd [file tempfile]
105} -body {
106	apply {{fd} {
107		defer::autowith {
108			close $fd
109		}
110	}} $fd
111
112	lsearch -exact [chan names] $fd
113} -cleanup {
114	catch {
115		close $fd
116	}
117	unset fd
118} -result {-1}
119
120# Series 4: defer::cancel
121test defer-4.0 {defer::cancel simple} -setup {
122	set deferTest FAIL-1
123} -body {
124	apply {{} {
125		set defId [defer::with "" {
126			uplevel 1 {set deferTest FAIL-2}
127		}]
128
129		defer::with "" {
130			uplevel 1 {set deferTest PASS}
131		}
132
133		defer::cancel $defId
134	}}
135
136	set deferTest
137} -cleanup {
138	unset -nocomplain deferTest
139} -result {PASS}
140
141# Series 5: Order is LIFO
142test defer-5.0 {defer is LIFO} -setup {
143	set deferTest "INVALID"
144} -body {
145	apply {{} {
146		for {set i 0} {$i < 10} {incr i} {
147			defer::defer uplevel 1 [list set deferTest "RESULT:$i"]
148		}
149	}}
150
151	set deferTest
152} -cleanup {
153	unset -nocomplain deferTest
154} -result {RESULT:0}
155
156# Series 6: Usage checks
157test defer-6.0 {defer::defer global fails} -body {
158	defer::defer info patchlevel
159} -returnCodes ERROR -result {defer may not be used from the global scope}
160
161test defer-6.1 {defer::defer with no args works} -body {
162	apply {{} {
163		defer::defer
164
165		return "PASS"
166	}}
167} -result {PASS}
168
169test defer-6.2 {defer::with syntax too few args} -body {
170	apply {{} {
171		defer::with
172	}}
173} -returnCodes ERROR -match glob -result {wrong # args: *}
174
175test defer-6.3 {defer::with syntax too many args} -body {
176	apply {{} {
177		defer::with [list] error BADARG
178	}}
179} -returnCodes ERROR -match glob -result {wrong # args: *}
180
181test defer-6.4 {defer::autowith syntax too few args} -body {
182	apply {{} {
183		defer::autowith
184	}}
185} -returnCodes ERROR -match glob -result {wrong # args: *}
186
187test defer-6.5 {defer::autowith syntax too many args} -body {
188	apply {{} {
189		defer::autowith error BADARG
190	}}
191} -returnCodes ERROR -match glob -result {wrong # args: *}
192
193test defer-6.6 {defer::cancel syntax too few args} -body {
194	apply {{} {
195		defer::cancel
196
197		return "PASS"
198	}}
199} -result {PASS}
200
201test defer-6.7 {defer::cancel syntax too many args} -body {
202	apply {{} {
203		defer::cancel A B
204
205		return "PASS"
206	}}
207} -result {PASS}
208
209# -------------------------------------------------------------------------
210testsuiteCleanup
211