1 # Commands covered: clock
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.
7 # Copyright (c) 1995-1998 Sun Microsystems, Inc.
8 # Copyright (c) 1998-1999 by Scriptics Corporation.
10 # See the file "license.terms" for information on usage and redistribution
11 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
15 set env(LC_TIME) POSIX
17 if {[lsearch [namespace children] ::tcltest] == -1} {
18 package require tcltest
19 namespace import -force ::tcltest::*
22 test clock-1.1 {clock tests} {
23 list [catch {clock} msg] $msg
24 } {1 {wrong # args: should be "clock option ?arg ...?"}}
25 test clock-1.2 {clock tests} {
26 list [catch {clock foo} msg] $msg
27 } {1 {bad option "foo": must be clicks, format, scan, or seconds}}
30 test clock-2.1 {clock clicks tests} {
34 test clock-2.2 {clock clicks tests} {
35 set start [clock clicks]
37 set end [clock clicks]
40 test clock-2.3 {clock clicks tests} {
41 list [catch {clock clicks foo} msg] $msg
42 } {1 {bad switch "foo": must be -milliseconds}}
43 test clock-2.4 {clock clicks tests} {
44 expr [clock clicks -milliseconds]+1
47 test clock-2.5 {clock clicks tests, millisecond timing test} {
48 set start [clock clicks -milli]
50 set end [clock clicks -milli]
51 # 60 msecs seems to be the max time slice under Windows 95/98
52 expr {($end > $start) && (($end - $start) <= 60)}
56 test clock-3.1 {clock format tests} {unixOnly} {
57 set clockval 657687766
58 clock format $clockval -format {%a %b %d %I:%M:%S %p %Y} -gmt true
59 } {Sun Nov 04 03:02:46 AM 1990}
60 test clock-3.2 {clock format tests} {
61 # TCL_USE_TIMEZONE_VAR
63 catch {set oldtz $env(TZ)}
66 append x [clock format 863800000 -format %Z -gmt 1]
67 append x [set env(TZ)]
68 catch {unset env(TZ); set env(TZ) $oldtz}
71 test clock-3.3 {clock format tests} {
72 # tzset() under Borland doesn't seem to set up tzname[] for local
73 # timezone, which caused "clock format" to think that %Z was an invalid
74 # string. Don't care about answer, just that test runs w/o error.
76 clock format 863800000 -format %Z
79 test clock-3.4 {clock format tests} {
80 # tzset() under Borland doesn't seem to set up tzname[] for gmt timezone.
81 # tzset() under MSVC has the following weird observed behavior:
82 # First time we call "clock format [clock seconds] -format %Z -gmt 1"
83 # we get "GMT", but on all subsequent calls we get the current time
84 # zone string, even though env(TZ) is GMT and the variable _timezone
88 append x [clock format 863800000 -format %Z -gmt 1]
89 append x [clock format 863800000 -format %Z -gmt 1]
91 test clock-3.5 {clock format tests} {
92 list [catch {clock format} msg] $msg
93 } {1 {wrong # args: should be "clock format clockval ?-format string? ?-gmt boolean?"}}
94 test clock-3.6 {clock format tests} {
95 list [catch {clock format foo} msg] $msg
96 } {1 {expected integer but got "foo"}}
97 test clock-3.7 {clock format tests} {unixOrPc} {
98 set clockval 657687766
99 clock format $clockval -format "%a %b %d %I:%M:%S %p %Y" -gmt true
100 } "Sun Nov 04 03:02:46 AM 1990"
101 test clock-3.8 {clock format tests} {
102 list [catch {clock format a b c d e g} msg] $msg
103 } {1 {wrong # args: should be "clock format clockval ?-format string? ?-gmt boolean?"}}
104 test clock-3.9 {clock format tests} {unixOrPc nonPortable} {
106 clock format $clockval -format "%a %b %d %I:%M:%S %p %Y" -gmt true
107 } "Wed Dec 31 11:59:59 PM 1969"
108 test clock-3.10 {clock format tests} {
109 list [catch {clock format 123 -bad arg} msg] $msg
110 } {1 {bad switch "-bad": must be -format or -gmt}}
111 test clock-3.11 {clock format tests} {
112 clock format 123 -format "x"
114 test clock-3.12 {clock format tests} {
115 clock format 123 -format ""
117 test clock-3.13 {clock format with non-ASCII character in the format string} {
118 set oldenc [encoding system]
119 encoding system iso8859-1
120 set res [clock format 0 -format \u00c4]
121 encoding system $oldenc
127 test clock-4.1 {clock scan tests} {
128 list [catch {clock scan} msg] $msg
129 } {1 {wrong # args: should be "clock scan dateString ?-base clockValue? ?-gmt boolean?"}}
130 test clock-4.2 {clock scan tests} {
131 list [catch {clock scan "bad-string"} msg] $msg
132 } {1 {unable to convert date-time string "bad-string"}}
133 test clock-4.3 {clock scan tests} {
134 clock format [clock scan "14 Feb 92" -gmt true] \
135 -format {%m/%d/%y %I:%M:%S %p} -gmt true
136 } {02/14/92 12:00:00 AM}
137 test clock-4.4 {clock scan tests} {
138 clock format [clock scan "Feb 14, 1992 12:20 PM" -gmt true] \
139 -format {%m/%d/%y %I:%M:%S %p} -gmt true
140 } {02/14/92 12:20:00 PM}
141 test clock-4.5 {clock scan tests} {
143 [clock scan "Feb 14, 1992 12:20 PM" -base 319363200 -gmt true] \
144 -format {%m/%d/%y %I:%M:%S %p} -gmt true
145 } {02/14/92 12:20:00 PM}
146 test clock-4.6 {clock scan tests} {
147 set time [clock scan "Oct 23,1992 15:00"]
148 clock format $time -format {%b %d,%Y %H:%M}
149 } {Oct 23,1992 15:00}
150 test clock-4.7 {clock scan tests} {
151 set time [clock scan "Oct 23,1992 15:00 GMT"]
152 clock format $time -format {%b %d,%Y %H:%M GMT} -gmt true
153 } {Oct 23,1992 15:00 GMT}
154 test clock-4.8 {clock scan tests} {
155 set time [clock scan "Oct 23,1992 15:00" -gmt true]
156 clock format $time -format {%b %d,%Y %H:%M GMT} -gmt true
157 } {Oct 23,1992 15:00 GMT}
158 test clock-4.9 {clock scan tests} {
159 list [catch {clock scan "Jan 12" -bad arg} msg] $msg
160 } {1 {bad switch "-bad": must be -base or -gmt}}
161 # The following two two tests test the two year date policy
162 test clock-4.10 {clock scan tests} {
163 set time [clock scan "1/1/71" -gmt true]
164 clock format $time -format {%b %d,%Y %H:%M GMT} -gmt true
165 } {Jan 01,1971 00:00 GMT}
166 test clock-4.11 {clock scan tests} {
167 set time [clock scan "1/1/37" -gmt true]
168 clock format $time -format {%b %d,%Y %H:%M GMT} -gmt true
169 } {Jan 01,2037 00:00 GMT}
171 test clock-4.12 {clock scan, relative times} {
172 set time [clock scan "Oct 23, 1992 -1 day"]
173 clock format $time -format {%b %d, %Y}
175 test clock-4.13 {clock scan, ISO 8601 base date format} {
176 set time [clock scan "19921023"]
177 clock format $time -format {%b %d, %Y}
179 test clock-4.14 {clock scan, ISO 8601 expanded date format} {
180 set time [clock scan "1992-10-23"]
181 clock format $time -format {%b %d, %Y}
183 test clock-4.15 {clock scan, DD-Mon-YYYY format} {
184 set time [clock scan "23-Oct-1992"]
185 clock format $time -format {%b %d, %Y}
187 test clock-4.16 {clock scan, ISO 8601 point in time format} {
188 set time [clock scan "19921023T235959"]
189 clock format $time -format {%b %d, %Y %H:%M:%S}
190 } "Oct 23, 1992 23:59:59"
191 test clock-4.17 {clock scan, ISO 8601 point in time format} {
192 set time [clock scan "19921023 235959"]
193 clock format $time -format {%b %d, %Y %H:%M:%S}
194 } "Oct 23, 1992 23:59:59"
195 test clock-4.18 {clock scan, ISO 8601 point in time format} {
196 set time [clock scan "19921023T000000"]
197 clock format $time -format {%b %d, %Y %H:%M:%S}
198 } "Oct 23, 1992 00:00:00"
200 # CLOCK SCAN REAL TESTS
201 # We use 5am PST, 31-12-1999 as the base for these scans because irrespective
202 # of your local timezone it should always give us times on December 31, 1999
204 test clock-4.18 {clock scan, number meridian} {
205 set t1 [clock scan "5 am" -base $5amPST -gmt true]
206 set t2 [clock scan "5 pm" -base $5amPST -gmt true]
207 set t3 [clock scan "5 a.m." -base $5amPST -gmt true]
208 set t4 [clock scan "5 p.m." -base $5amPST -gmt true]
210 [clock format $t1 -format {%b %d, %Y %H:%M:%S} -gmt true] \
211 [clock format $t2 -format {%b %d, %Y %H:%M:%S} -gmt true] \
212 [clock format $t3 -format {%b %d, %Y %H:%M:%S} -gmt true] \
213 [clock format $t4 -format {%b %d, %Y %H:%M:%S} -gmt true]
214 } [list "Dec 31, 1999 05:00:00" "Dec 31, 1999 17:00:00" \
215 "Dec 31, 1999 05:00:00" "Dec 31, 1999 17:00:00"]
216 test clock-4.19 {clock scan, number:number meridian} {
217 clock format [clock scan "5:30 pm" -base $5amPST -gmt true] \
218 -format {%b %d, %Y %H:%M:%S} -gmt true
219 } "Dec 31, 1999 17:30:00"
220 test clock-4.20 {clock scan, number:number-timezone} {
221 clock format [clock scan "00:00-0800" -gmt true -base $5amPST] \
222 -format {%b %d, %Y %H:%M:%S} -gmt true
223 } "Dec 31, 1999 08:00:00"
224 test clock-4.21 {clock scan, number:number:number o_merid} {
225 clock format [clock scan "8:00:00" -gmt true -base $5amPST] \
226 -format {%b %d, %Y %H:%M:%S} -gmt true
227 } "Dec 31, 1999 08:00:00"
228 test clock-4.22 {clock scan, number:number:number o_merid} {
229 clock format [clock scan "8:00:00 am" -gmt true -base $5amPST] \
230 -format {%b %d, %Y %H:%M:%S} -gmt true
231 } "Dec 31, 1999 08:00:00"
232 test clock-4.23 {clock scan, number:number:number o_merid} {
233 clock format [clock scan "8:00:00 pm" -gmt true -base $5amPST] \
234 -format {%b %d, %Y %H:%M:%S} -gmt true
235 } "Dec 31, 1999 20:00:00"
236 test clock-4.24 {clock scan, number:number:number-timezone} {
237 clock format [clock scan "00:00:30-0800" -gmt true -base $5amPST] \
238 -format {%b %d, %Y %H:%M:%S} -gmt true
239 } "Dec 31, 1999 08:00:30"
240 test clock-4.25 {clock scan, DST for days} {
241 clock scan "tomorrow" -base [clock scan "19991031 00:00:00"]
242 } [clock scan "19991101 00:00:00"]
243 test clock-4.26 {clock scan, DST for days} {
244 clock scan "yesterday" -base [clock scan "19991101 00:00:00"]
245 } [clock scan "19991031 00:00:00"]
246 test clock-4.27 {clock scan, day} knownBug {
247 clock format [clock scan "Monday" -gmt true -base 946627200] \
248 -format {%b %d, %Y %H:%M:%S} -gmt true
249 } "Jan 03, 2000 00:00:00"
250 test clock-4.28 {clock scan, number/number} {
251 clock format [clock scan "1/1" -gmt true -base 946627200] \
252 -format {%b %d, %Y %H:%M:%S} -gmt true
253 } "Jan 01, 1999 00:00:00"
254 test clock-4.28 {clock scan, number/number} {
255 clock format [clock scan "1/1/1999" -gmt true -base 946627200] \
256 -format {%b %d, %Y %H:%M:%S} -gmt true
257 } "Jan 01, 1999 00:00:00"
258 test clock-4.28 {clock scan, number/number} {
259 clock format [clock scan "19990101" -gmt true -base 946627200] \
260 -format {%b %d, %Y %H:%M:%S} -gmt true
261 } "Jan 01, 1999 00:00:00"
262 test clock-4.29 {clock scan, relative minutes} {
263 clock scan "now + 1 minute" -base 946627200
265 test clock-4.30 {clock scan, relative minutes} {
266 clock scan "now +1 minute" -base 946627200
268 test clock-4.31 {clock scan, relative minutes} {
269 clock scan "now 1 minute" -base 946627200
271 test clock-4.32 {clock scan, relative minutes} {
272 clock scan "now - 1 minute" -base 946627200
274 test clock-4.33 {clock scan, relative minutes} {
275 clock scan "now -1 minute" -base 946627200
277 test clock-4.34 {clock scan, day of week} {
278 clock format [clock scan "wednesday" -base [clock scan 20000112]] \
281 test clock-4.35 {clock scan, next day of week} {
282 clock format [clock scan "next wednesday" -base [clock scan 20000112]] \
285 test clock-4.36 {clock scan, day of week} {
286 clock format [clock scan "thursday" -base [clock scan 20000112]] \
289 test clock-4.37 {clock scan, next day of week} {
290 clock format [clock scan "next thursday" -base [clock scan 20000112]] \
294 # weekday specification and base.
295 test clock-4.38 {2nd monday in november} {
297 foreach i {91 92 93 94 95 96} {
298 set nov8th [clock scan 11/8/$i]
299 set monday [clock scan monday -base $nov8th]
300 lappend res [clock format $monday -format %Y-%m-%d]
303 } {1991-11-11 1992-11-09 1993-11-08 1994-11-14 1995-11-13 1996-11-11}
304 test clock-4.39 {2nd monday in november (2nd try)} {
306 foreach i {91 92 93 94 95 96} {
307 set nov1th [clock scan 11/1/$i]
308 set monday [clock scan "2 monday" -base $nov1th]
309 lappend res [clock format $monday -format %Y-%m-%d]
312 } {1991-11-11 1992-11-09 1993-11-08 1994-11-14 1995-11-13 1996-11-11}
313 test clock-4.40 {last monday in november} {
315 foreach i {91 92 93 94 95 96} {
316 set dec1th [clock scan 12/1/$i]
317 set monday [clock scan "monday 1 week ago" -base $dec1th]
318 lappend res [clock format $monday -format %Y-%m-%d]
321 } {1991-11-25 1992-11-30 1993-11-29 1994-11-28 1995-11-27 1996-11-25}
323 test clock-4.40 {2nd monday in november} knownBug {
325 foreach i {91 92 93 94 95 96} {
326 set nov8th [clock scan 11/8/$i -gmt 1]
327 set monday [clock scan monday -base $nov8th -gmt 1]
328 lappend res [clock format $monday -format %Y-%m-%d -gmt 1]
331 } {1991-11-11 1992-11-09 1993-11-08 1994-11-14 1995-11-13 1996-11-11}
332 test clock-4.41 {2nd monday in november (2nd try)} knownBug {
334 foreach i {91 92 93 94 95 96} {
335 set nov1th [clock scan 11/1/$i -gmt 1]
336 set monday [clock scan "2 monday" -base $nov1th -gmt 1]
337 lappend res [clock format $monday -format %Y-%m-%d -gmt 1]
340 } {1991-11-11 1992-11-09 1993-11-08 1994-11-14 1995-11-13 1996-11-11}
341 test clock-4.40 {last monday in november} knownBug {
343 foreach i {91 92 93 94 95 96} {
344 set dec1th [clock scan 12/1/$i -gmt 1]
345 set monday [clock scan "monday 1 week ago" -base $dec1th -gmt 1]
346 lappend res [clock format $monday -format %Y-%m-%d -gmt 1]
349 } {1991-11-25 1992-11-30 1993-11-29 1994-11-28 1995-11-27 1996-11-25}
350 test clock-4.41 {ago with multiple relative units} {
351 set base [clock scan "12/31/1999 00:00:00"]
352 set res [clock scan "2 days 2 hours ago" -base $base]
357 test clock-5.1 {clock seconds tests} {
358 expr [clock seconds]+1
361 test clock-5.2 {clock seconds tests} {
362 list [catch {clock seconds foo} msg] $msg
363 } {1 {wrong # args: should be "clock seconds"}}
364 test clock-5.3 {clock seconds tests} {
365 set start [clock seconds]
367 set end [clock seconds]
371 # The following dates check certain roll over dates
372 set day [expr 24 * 60 * 60]
373 test clock-6.1 {clock roll over dates} {
374 set time [clock scan "12/31/1998" -gmt true]
375 clock format [expr $time + $day] -format {%b %d,%Y %H:%M GMT} -gmt true
376 } {Jan 01,1999 00:00 GMT}
377 test clock-6.2 {clock roll over dates} {
378 set time [clock scan "12/31/1999" -gmt true]
379 clock format [expr $time + $day] -format {%b %d,%Y %H:%M GMT} -gmt true
380 } {Jan 01,2000 00:00 GMT}
381 test clock-6.3 {clock roll over dates} {
382 set time [clock scan "2/28/2000" -gmt true]
383 clock format [expr $time + $day] -format {%b %d,%Y %H:%M GMT} -gmt true
384 } {Feb 29,2000 00:00 GMT}
385 test clock-6.4 {clock roll over dates} {
386 set time [clock scan "2/29/2000" -gmt true]
387 clock format [expr $time + $day] -format {%b %d,%Y %H:%M GMT} -gmt true
388 } {Mar 01,2000 00:00 GMT}
389 test clock-6.5 {clock roll over dates} {
390 set time [clock scan "January 1, 2000" -gmt true]
391 clock format $time -format %A -gmt true
393 test clock-6.6 {clock roll over dates} {
394 set time [clock scan "January 1, 2000" -gmt true]
395 clock format $time -format %j -gmt true
397 test clock-6.7 {clock roll over dates} {
398 set time [clock scan "February 29, 2000" -gmt true]
399 clock format $time -format %A -gmt true
401 test clock-6.8 {clock roll over dates} {
402 set time [clock scan "February 29, 2000" -gmt true]
403 clock format $time -format %j -gmt true
405 test clock-6.9 {clock roll over dates} {
406 set time [clock scan "March 1, 2000" -gmt true]
407 clock format $time -format %A -gmt true
409 test clock-6.10 {clock roll over dates} {
410 set time [clock scan "March 1, 2000" -gmt true]
411 clock format $time -format %j -gmt true
413 test clock-6.11 {clock roll over dates} {
414 set time [clock scan "March 1, 2001" -gmt true]
415 clock format $time -format %j -gmt true
418 test clock-7.1 {clock scan next monthname} {
419 clock format [clock scan "next june" -base [clock scan "june 1, 2000"]] \
422 test clock-7.2 {clock scan next monthname} {
423 clock format [clock scan "next july" -base [clock scan "june 1, 2000"]] \
426 test clock-7.3 {clock scan next monthname} {
427 clock format [clock scan "next may" -base [clock scan "june 1, 2000"]] \
431 # We use 5am PST, 31-12-1999 as the base for these scans because irrespective
432 # of your local timezone it should always give us times on December 31
434 test clock-8.1 {clock scan midnight/gmt range bug 413397} {
436 list [clock format [clock scan year -base $5amPST -gmt 0] -format $fmt] \
437 [clock format [clock scan year -base $5amPST -gmt 1] -format $fmt]
440 set ::tcltest::testConstraints(needPST) [expr {
441 [regexp {^(Pacific.*|P[DS]T)$} [clock format 1 -format %Z]]
442 && ([clock format 1 -format %s] != "%s")
444 test clock-9.1 {%s gmt testing} {needPST} {
445 # We need PST to guarantee the difference value below, and %s isn't
446 # valid on all OSes (like Solaris).
448 set a [clock format $s -format %s -gmt 0]
449 set b [clock format $s -format %s -gmt 1]
450 # This should be the offset in seconds between current locale and GMT.
451 # This didn't seem to be correctly on Windows until the fix for
452 # Bug #559376, which fiddled with env(TZ) when -gmt 1 was used.
453 # It's hard-coded to check P[SD]T now. (8 hours)
458 ::tcltest::cleanupTests