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