| 1 | # TODO - When integrating this with the Core, path names will need to be | 
|---|
| 2 | # swizzled here. | 
|---|
| 3 |  | 
|---|
| 4 | package require msgcat | 
|---|
| 5 | set d [file dirname [file dirname [info script]]] | 
|---|
| 6 | puts "getting transition data from [file join $d library tzdata America Detroit]" | 
|---|
| 7 | source [file join $d library/tzdata/America/Detroit] | 
|---|
| 8 |  | 
|---|
| 9 | namespace eval ::tcl::clock { | 
|---|
| 10 |     ::msgcat::mcmset en_US_roman { | 
|---|
| 11 |         LOCALE_ERAS { | 
|---|
| 12 |             {-62164627200 {} 0} | 
|---|
| 13 |             {-59008867200 c 100} | 
|---|
| 14 |             {-55853107200 cc 200} | 
|---|
| 15 |             {-52697347200 ccc 300} | 
|---|
| 16 |             {-49541587200 cd 400} | 
|---|
| 17 |             {-46385827200 d 500} | 
|---|
| 18 |             {-43230067200 dc 600} | 
|---|
| 19 |             {-40074307200 dcc 700} | 
|---|
| 20 |             {-36918547200 dccc 800} | 
|---|
| 21 |             {-33762787200 cm 900} | 
|---|
| 22 |             {-30607027200 m 1000} | 
|---|
| 23 |             {-27451267200 mc 1100} | 
|---|
| 24 |             {-24295507200 mcc 1200} | 
|---|
| 25 |             {-21139747200 mccc 1300} | 
|---|
| 26 |             {-17983987200 mcd 1400} | 
|---|
| 27 |             {-14828227200 md 1500} | 
|---|
| 28 |             {-11672467200 mdc 1600} | 
|---|
| 29 |             {-8516707200 mdcc 1700} | 
|---|
| 30 |             {-5364662400 mdccc 1800} | 
|---|
| 31 |             {-2208988800 mcm 1900} | 
|---|
| 32 |             {946684800 mm 2000} | 
|---|
| 33 |         } | 
|---|
| 34 |         LOCALE_NUMERALS { | 
|---|
| 35 |             ? i ii iii iv v vi vii viii ix | 
|---|
| 36 |             x xi xii xiii xiv xv xvi xvii xviii xix | 
|---|
| 37 |             xx xxi xxii xxiii xxiv xxv xxvi xxvii xxviii xxix | 
|---|
| 38 |             xxx xxxi xxxii xxxiii xxxiv xxxv xxxvi xxxvii xxxviii xxxix | 
|---|
| 39 |             xl xli xlii xliii xliv xlv xlvi xlvii xlviii xlix | 
|---|
| 40 |             l li lii liii liv lv lvi lvii lviii lix | 
|---|
| 41 |             lx lxi lxii lxiii lxiv lxv lxvi lxvii lxviii lxix | 
|---|
| 42 |             lxx lxxi lxxii lxxiii lxxiv lxxv lxxvi lxxvii lxxviii lxxix | 
|---|
| 43 |             lxxx lxxxi lxxxii lxxxiii lxxxiv lxxxv lxxxvi lxxxvii lxxxviii  | 
|---|
| 44 |             lxxxix | 
|---|
| 45 |             xc xci xcii xciii xciv xcv xcvi xcvii xcviii xcix | 
|---|
| 46 |             c | 
|---|
| 47 |         } | 
|---|
| 48 |         DATE_FORMAT {%m/%d/%Y} | 
|---|
| 49 |         TIME_FORMAT {%H:%M:%S} | 
|---|
| 50 |         DATE_TIME_FORMAT {%x %X} | 
|---|
| 51 |         LOCALE_DATE_FORMAT {die %Od mensis %Om annoque %EY} | 
|---|
| 52 |         LOCALE_TIME_FORMAT {%OH h %OM m %OS s} | 
|---|
| 53 |         LOCALE_DATE_TIME_FORMAT {%Ex %EX} | 
|---|
| 54 |     } | 
|---|
| 55 | } | 
|---|
| 56 |  | 
|---|
| 57 | #---------------------------------------------------------------------- | 
|---|
| 58 | # | 
|---|
| 59 | # listYears -- | 
|---|
| 60 | # | 
|---|
| 61 | #       List the years to test in the common clock test cases. | 
|---|
| 62 | # | 
|---|
| 63 | # Parameters: | 
|---|
| 64 | #       startOfYearArray - Name of an array in caller's scope that will | 
|---|
| 65 | #                          be initialized as  | 
|---|
| 66 | # Results: | 
|---|
| 67 | #       None | 
|---|
| 68 | # | 
|---|
| 69 | # Side effects: | 
|---|
| 70 | #       Determines the year numbers of one common year, one leap year, one year | 
|---|
| 71 | #       following a common year, and one year following a leap year -- starting | 
|---|
| 72 | #       on each day of the week -- in the XIXth, XXth and XXIth centuries. | 
|---|
| 73 | #       Initializes the given array to have keys equal to the year numbers and | 
|---|
| 74 | #       values equal to [clock seconds] at the start of the corresponding | 
|---|
| 75 | #       years. | 
|---|
| 76 | # | 
|---|
| 77 | #---------------------------------------------------------------------- | 
|---|
| 78 |  | 
|---|
| 79 | proc listYears { startOfYearArray } { | 
|---|
| 80 |  | 
|---|
| 81 |     upvar 1 $startOfYearArray startOfYear | 
|---|
| 82 |  | 
|---|
| 83 |     # List years after 1970 | 
|---|
| 84 |  | 
|---|
| 85 |     set y 1970 | 
|---|
| 86 |     set s 0 | 
|---|
| 87 |     set dw 4 ;# Thursday | 
|---|
| 88 |     while { $y < 2100 } { | 
|---|
| 89 |         if { $y % 4 == 0 && $y % 100 != 0 || $y % 400 == 0 } { | 
|---|
| 90 |             set l 1 | 
|---|
| 91 |             incr dw 366 | 
|---|
| 92 |             set s2 [expr { $s + wide( 366 * 86400 ) }] | 
|---|
| 93 |         } else { | 
|---|
| 94 |             set l 0 | 
|---|
| 95 |             incr dw 365 | 
|---|
| 96 |             set s2 [expr { $s + wide( 365 * 86400 ) }] | 
|---|
| 97 |         } | 
|---|
| 98 |         set x [expr { $y >= 2037 }] | 
|---|
| 99 |         set dw [expr {$dw % 7}] | 
|---|
| 100 |         set c [expr { $y / 100 }] | 
|---|
| 101 |         if { ![info exists do($x$c$dw$l)] } { | 
|---|
| 102 |             set do($x$c$dw$l) $y | 
|---|
| 103 |             set startOfYear($y) $s | 
|---|
| 104 |             set startOfYear([expr {$y + 1}]) $s2 | 
|---|
| 105 |         } | 
|---|
| 106 |         set s $s2 | 
|---|
| 107 |         incr y | 
|---|
| 108 |     } | 
|---|
| 109 |      | 
|---|
| 110 |     # List years before 1970 | 
|---|
| 111 |  | 
|---|
| 112 |     set y 1970 | 
|---|
| 113 |     set s 0 | 
|---|
| 114 |     set dw 4; # Thursday | 
|---|
| 115 |     while { $y >= 1801 } { | 
|---|
| 116 |         set s0 $s | 
|---|
| 117 |         incr dw 371 | 
|---|
| 118 |         incr y -1 | 
|---|
| 119 |         if { $y % 4 == 0 && $y % 100 != 0 || $y % 400 == 0 } { | 
|---|
| 120 |             set l 1 | 
|---|
| 121 |             incr dw -366 | 
|---|
| 122 |             set s [expr { $s - wide(366 * 86400) }] | 
|---|
| 123 |         } else { | 
|---|
| 124 |             set l 0 | 
|---|
| 125 |             incr dw -365 | 
|---|
| 126 |             set s [expr { $s - wide(365 * 86400) }] | 
|---|
| 127 |         } | 
|---|
| 128 |         set dw [expr {$dw % 7}] | 
|---|
| 129 |         set c [expr { $y / 100 }] | 
|---|
| 130 |         if { ![info exists do($c$dw$l)] } { | 
|---|
| 131 |             set do($c$dw$l) $y | 
|---|
| 132 |             set startOfYear($y) $s | 
|---|
| 133 |             set startOfYear([expr {$y + 1}]) $s0 | 
|---|
| 134 |         } | 
|---|
| 135 |     } | 
|---|
| 136 |  | 
|---|
| 137 | } | 
|---|
| 138 |  | 
|---|
| 139 | #---------------------------------------------------------------------- | 
|---|
| 140 | # | 
|---|
| 141 | # processFile -  | 
|---|
| 142 | # | 
|---|
| 143 | #       Processes the 'clock.test' file, updating the test cases in it. | 
|---|
| 144 | # | 
|---|
| 145 | # Parameters: | 
|---|
| 146 | #       None. | 
|---|
| 147 | # | 
|---|
| 148 | # Side effects: | 
|---|
| 149 | #       Replaces the file with a new copy, constructing needed test cases. | 
|---|
| 150 | # | 
|---|
| 151 | #---------------------------------------------------------------------- | 
|---|
| 152 |  | 
|---|
| 153 | proc processFile {d} { | 
|---|
| 154 |  | 
|---|
| 155 |     # Open two files | 
|---|
| 156 |      | 
|---|
| 157 |     set f1 [open [file join $d tests/clock.test] r] | 
|---|
| 158 |     set f2 [open [file join $d tests/clock.new] w] | 
|---|
| 159 |  | 
|---|
| 160 |     # Copy leading portion of the test file | 
|---|
| 161 |  | 
|---|
| 162 |     set state {} | 
|---|
| 163 |     while { [gets $f1 line] >= 0 } { | 
|---|
| 164 |         switch -exact -- $state { | 
|---|
| 165 |             {} { | 
|---|
| 166 |                 puts $f2 $line | 
|---|
| 167 |                 if { [regexp "^\# BEGIN (.*)" $line -> cases]  | 
|---|
| 168 |                      && [string compare {} [info commands $cases]] } { | 
|---|
| 169 |                     set state inCaseSet | 
|---|
| 170 |                     $cases $f2 | 
|---|
| 171 |                 } | 
|---|
| 172 |             } | 
|---|
| 173 |             inCaseSet { | 
|---|
| 174 |                 if { [regexp "^\#\ END $cases\$" $line] } { | 
|---|
| 175 |                     puts $f2 $line | 
|---|
| 176 |                     set state {} | 
|---|
| 177 |                 } | 
|---|
| 178 |             } | 
|---|
| 179 |         } | 
|---|
| 180 |     } | 
|---|
| 181 |  | 
|---|
| 182 |     # Rotate the files | 
|---|
| 183 |  | 
|---|
| 184 |     close $f1 | 
|---|
| 185 |     close $f2 | 
|---|
| 186 |     file delete -force [file join $d tests/clock.bak] | 
|---|
| 187 |     file rename -force [file join $d tests/clock.test] \ | 
|---|
| 188 |         [file join $d tests/clock.bak] | 
|---|
| 189 |     file rename [file join $d tests/clock.new] [file join $d tests/clock.test] | 
|---|
| 190 |  | 
|---|
| 191 | } | 
|---|
| 192 |  | 
|---|
| 193 | #---------------------------------------------------------------------- | 
|---|
| 194 | # | 
|---|
| 195 | # testcases2 -- | 
|---|
| 196 | # | 
|---|
| 197 | #       Outputs the 'clock-2.x' test cases. | 
|---|
| 198 | # | 
|---|
| 199 | # Parameters: | 
|---|
| 200 | #       f2 -- Channel handle to the output file | 
|---|
| 201 | # | 
|---|
| 202 | # Results: | 
|---|
| 203 | #       None. | 
|---|
| 204 | # | 
|---|
| 205 | # Side effects: | 
|---|
| 206 | #       Test cases for formatting in Gregorian calendar are written to the | 
|---|
| 207 | #       output file. | 
|---|
| 208 | # | 
|---|
| 209 | #---------------------------------------------------------------------- | 
|---|
| 210 |  | 
|---|
| 211 | proc testcases2 { f2 } { | 
|---|
| 212 |  | 
|---|
| 213 |     listYears startOfYear | 
|---|
| 214 |  | 
|---|
| 215 |     # Define the roman numerals | 
|---|
| 216 |      | 
|---|
| 217 |     set roman { | 
|---|
| 218 |         ? i ii iii iv v vi vii viii ix | 
|---|
| 219 |         x xi xii xiii xiv xv xvi xvii xviii xix | 
|---|
| 220 |         xx xxi xxii xxiii xxiv xxv xxvi xxvii xxviii xxix | 
|---|
| 221 |         xxx xxxi xxxii xxxiii xxxiv xxxv xxxvi xxxvii xxxviii xxxix | 
|---|
| 222 |         xl xli xlii xliii xliv xlv xlvi xlvii xlviii xlix | 
|---|
| 223 |         l li lii liii liv lv lvi lvii lviii lix | 
|---|
| 224 |         lx lxi lxii lxiii lxiv lxv lxvi lxvii lxviii lxix | 
|---|
| 225 |         lxx lxxi lxxii lxxiii lxxiv lxxv lxxvi lxxvii lxxviii lxxix | 
|---|
| 226 |         lxxx lxxxi lxxxii lxxxiii lxxxiv lxxxv lxxxvi lxxxvii lxxxviii lxxxix | 
|---|
| 227 |         xc xci xcii xciii xciv xcv xcvi xcvii xcviii xcix | 
|---|
| 228 |         c | 
|---|
| 229 |     } | 
|---|
| 230 |     set romanc { | 
|---|
| 231 |         ? c cc ccc cd d dc dcc dccc cm | 
|---|
| 232 |         m mc mcc mccc mcd md mdc mdcc mdccc mcm | 
|---|
| 233 |         mm mmc mmcc mmccc mmcd mmd mmdc mmdcc mmdccc mmcm | 
|---|
| 234 |         mmm mmmc mmmcc mmmccc mmmcd mmmd mmmdc mmmdcc mmmdccc mmmcm | 
|---|
| 235 |     } | 
|---|
| 236 |  | 
|---|
| 237 |     # Names of the months | 
|---|
| 238 |      | 
|---|
| 239 |     set short {{} Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec} | 
|---|
| 240 |     set long { | 
|---|
| 241 |         {} January February March April May June July August September | 
|---|
| 242 |         October November December | 
|---|
| 243 |     } | 
|---|
| 244 |      | 
|---|
| 245 |     # Put out a header describing the tests | 
|---|
| 246 |      | 
|---|
| 247 |     puts $f2 "" | 
|---|
| 248 |     puts $f2 "\# Test formatting of Gregorian year, month, day, all formats" | 
|---|
| 249 |     puts $f2 "\# Formats tested: %b %B %c %Ec %C %EC %d %Od %e %Oe %h %j %J %m %Om %N %x %Ex %y %Oy %Y %EY" | 
|---|
| 250 |     puts $f2 "" | 
|---|
| 251 |      | 
|---|
| 252 |     # Generate the test cases for the first and last day of every month | 
|---|
| 253 |     # from 1896 to 2045 | 
|---|
| 254 |  | 
|---|
| 255 |     set n 0 | 
|---|
| 256 |     foreach { y } [lsort -integer [array names startOfYear]] { | 
|---|
| 257 |         set s [expr { $startOfYear($y) + wide(12*3600 + 34*60 + 56) }] | 
|---|
| 258 |         set m 0 | 
|---|
| 259 |         set yd 1 | 
|---|
| 260 |         foreach hath { 31 28 31 30 31 30 31 31 30 31 30 31 } { | 
|---|
| 261 |             incr m | 
|---|
| 262 |             if { $m == 2 && ( $y%4 == 0 && $y%100 != 0 || $y%400 == 0 ) } { | 
|---|
| 263 |                 incr hath | 
|---|
| 264 |             } | 
|---|
| 265 |              | 
|---|
| 266 |             set b [lindex $short $m] | 
|---|
| 267 |             set B [lindex $long $m] | 
|---|
| 268 |             set C [format %02d [expr { $y / 100 }]] | 
|---|
| 269 |             set h $b | 
|---|
| 270 |             set j [format %03d $yd] | 
|---|
| 271 |             set mm [format %02d $m] | 
|---|
| 272 |             set N [format %2d $m] | 
|---|
| 273 |             set yy [format %02d [expr { $y % 100 }]] | 
|---|
| 274 |              | 
|---|
| 275 |             set J [expr { ( $s / 86400 ) + 2440588 }] | 
|---|
| 276 |              | 
|---|
| 277 |             set dt $y-$mm-01 | 
|---|
| 278 |             set result "" | 
|---|
| 279 |             append result $b " " $B " " \ | 
|---|
| 280 |                 $mm /01/ $y " 12:34:56 " \ | 
|---|
| 281 |                 "die i mensis " [lindex $roman $m] " annoque " \ | 
|---|
| 282 |                 [lindex $romanc [expr { $y / 100 }]] \ | 
|---|
| 283 |                 [lindex $roman [expr { $y % 100 }]] " " \ | 
|---|
| 284 |                 [lindex $roman 12] " h " [lindex $roman 34] " m " \ | 
|---|
| 285 |                 [lindex $roman 56] " s " \ | 
|---|
| 286 |                 $C " " [lindex $romanc [expr { $y / 100 }]] \ | 
|---|
| 287 |                 " 01 i  1 i " \ | 
|---|
| 288 |                 $h " " $j " " $J " " $mm " " [lindex $roman $m] " " $N \ | 
|---|
| 289 |                 " " $mm "/01/" $y \ | 
|---|
| 290 |                 " die i mensis " [lindex $roman $m] " annoque " \ | 
|---|
| 291 |                 [lindex $romanc [expr { $y / 100 }]] \ | 
|---|
| 292 |                 [lindex $roman [expr { $y % 100 }]]     \ | 
|---|
| 293 |                 " " $yy " " [lindex $roman [expr { $y % 100 }]] " " $y | 
|---|
| 294 |             puts $f2 "test clock-2.[incr n] {conversion of $dt} {" | 
|---|
| 295 |             puts $f2 "    clock format $s \\" | 
|---|
| 296 |             puts $f2 "\t-format {%b %B %c %Ec %C %EC %d %Od %e %Oe %h %j %J %m %Om %N %x %Ex %y %Oy %Y} \\" | 
|---|
| 297 |             puts $f2 "\t-gmt true -locale en_US_roman" | 
|---|
| 298 |             puts $f2 "} {$result}" | 
|---|
| 299 |              | 
|---|
| 300 |             set hm1 [expr { $hath - 1 }] | 
|---|
| 301 |             incr s [expr { 86400 * ( $hath - 1 ) }] | 
|---|
| 302 |             incr yd $hm1 | 
|---|
| 303 |              | 
|---|
| 304 |             set dd [format %02d $hath] | 
|---|
| 305 |             set ee [format %2d $hath] | 
|---|
| 306 |             set j [format %03d $yd] | 
|---|
| 307 |              | 
|---|
| 308 |             set J [expr { ( $s / 86400 ) + 2440588 }] | 
|---|
| 309 |              | 
|---|
| 310 |             set dt $y-$mm-$dd | 
|---|
| 311 |             set result "" | 
|---|
| 312 |             append result $b " " $B " " \ | 
|---|
| 313 |                 $mm / $dd / $y " 12:34:56 " \ | 
|---|
| 314 |                 "die " [lindex $roman $hath] " mensis " [lindex $roman $m] \ | 
|---|
| 315 |                 " annoque " \ | 
|---|
| 316 |                 [lindex $romanc [expr { $y / 100 }]] \ | 
|---|
| 317 |                 [lindex $roman [expr { $y % 100 }]] " " \ | 
|---|
| 318 |                 [lindex $roman 12] " h " [lindex $roman 34] " m " \ | 
|---|
| 319 |                 [lindex $roman 56] " s " \ | 
|---|
| 320 |                 $C " " [lindex $romanc [expr { $y / 100 }]] \ | 
|---|
| 321 |                 " " $dd " " [lindex $roman $hath] " " \ | 
|---|
| 322 |                 $ee " " [lindex $roman $hath] " "\ | 
|---|
| 323 |                 $h " " $j " " $J " " $mm " " [lindex $roman $m] " " $N \ | 
|---|
| 324 |                 " " $mm "/" $dd "/" $y \ | 
|---|
| 325 |                 " die " [lindex $roman $hath] " mensis " [lindex $roman $m] \ | 
|---|
| 326 |                 " annoque " \ | 
|---|
| 327 |                 [lindex $romanc [expr { $y / 100 }]] \ | 
|---|
| 328 |                 [lindex $roman [expr { $y % 100 }]]     \ | 
|---|
| 329 |                 " " $yy " " [lindex $roman [expr { $y % 100 }]] " " $y | 
|---|
| 330 |             puts $f2 "test clock-2.[incr n] {conversion of $dt} {" | 
|---|
| 331 |             puts $f2 "    clock format $s \\" | 
|---|
| 332 |             puts $f2 "\t-format {%b %B %c %Ec %C %EC %d %Od %e %Oe %h %j %J %m %Om %N %x %Ex %y %Oy %Y} \\" | 
|---|
| 333 |             puts $f2 "\t-gmt true -locale en_US_roman" | 
|---|
| 334 |             puts $f2 "} {$result}" | 
|---|
| 335 |              | 
|---|
| 336 |             incr s 86400 | 
|---|
| 337 |             incr yd | 
|---|
| 338 |         } | 
|---|
| 339 |     } | 
|---|
| 340 |     puts "testcases2: $n test cases" | 
|---|
| 341 | } | 
|---|
| 342 |  | 
|---|
| 343 | #---------------------------------------------------------------------- | 
|---|
| 344 | # | 
|---|
| 345 | # testcases3 -- | 
|---|
| 346 | # | 
|---|
| 347 | #       Generate test cases for ISO8601 calendar. | 
|---|
| 348 | # | 
|---|
| 349 | # Parameters: | 
|---|
| 350 | #       f2 - Channel handle to the output file | 
|---|
| 351 | # | 
|---|
| 352 | # Results: | 
|---|
| 353 | #       None | 
|---|
| 354 | # | 
|---|
| 355 | # Side effects: | 
|---|
| 356 | #       Makes a test case for the first and last day of weeks 51, 52, and 1 | 
|---|
| 357 | #       plus the first and last day of a year.  Does so for each possible | 
|---|
| 358 | #       weekday on which a Common Year or Leap Year can begin. | 
|---|
| 359 | # | 
|---|
| 360 | #---------------------------------------------------------------------- | 
|---|
| 361 |  | 
|---|
| 362 | proc testcases3 { f2 } { | 
|---|
| 363 |  | 
|---|
| 364 |     listYears startOfYear | 
|---|
| 365 |  | 
|---|
| 366 |     set case 0 | 
|---|
| 367 |     foreach { y } [lsort -integer [array names startOfYear]] { | 
|---|
| 368 |         set secs $startOfYear($y) | 
|---|
| 369 |         set ym1 [expr { $y - 1 }] | 
|---|
| 370 |         set dow [expr { ( $secs / 86400  + 4 ) % 7}] | 
|---|
| 371 |         switch -exact $dow { | 
|---|
| 372 |             0 { | 
|---|
| 373 |                 # Year starts on a Sunday. | 
|---|
| 374 |                 # Prior year started on a Friday or Saturday, and was | 
|---|
| 375 |                 # a 52-week year. | 
|---|
| 376 |                 # 1 January is ISO week 52 of the prior year. 2 January | 
|---|
| 377 |                 # begins ISO week 1 of the current year. | 
|---|
| 378 |                 # 1 January is week 1 according to %U. According to %W, | 
|---|
| 379 |                 # week 1 begins on 2 January | 
|---|
| 380 |                 testISO $f2 $ym1 52 1 [expr { $secs - 6*86400 }] | 
|---|
| 381 |                 testISO $f2 $ym1 52 6 [expr { $secs - 86400 }] | 
|---|
| 382 |                 testISO $f2 $ym1 52 7 $secs | 
|---|
| 383 |                 testISO $f2 $y 1 1 [expr { $secs + 86400 }] | 
|---|
| 384 |                 testISO $f2 $y 1 6 [expr { $secs + 6*86400}] | 
|---|
| 385 |                 testISO $f2 $y 1 7 [expr { $secs + 7*86400 }] | 
|---|
| 386 |                 testISO $f2 $y 2 1 [expr { $secs + 8*86400 }] | 
|---|
| 387 |             } | 
|---|
| 388 |             1 { | 
|---|
| 389 |                 # Year starts on a Monday. | 
|---|
| 390 |                 # Previous year started on a Saturday or Sunday, and was | 
|---|
| 391 |                 # a 52-week year. | 
|---|
| 392 |                 # 1 January is ISO week 1 of the current year | 
|---|
| 393 |                 # According to %U, it's week 0 until 7 January | 
|---|
| 394 |                 # 1 January is week 1 according to %W | 
|---|
| 395 |                 testISO $f2 $ym1 52 1 [expr { $secs - 7*86400 }] | 
|---|
| 396 |                 testISO $f2 $ym1 52 6 [expr {$secs - 2*86400}] | 
|---|
| 397 |                 testISO $f2 $ym1 52 7 [expr { $secs - 86400 }] | 
|---|
| 398 |                 testISO $f2 $y 1 1 $secs | 
|---|
| 399 |                 testISO $f2 $y 1 6 [expr {$secs + 5*86400}] | 
|---|
| 400 |                 testISO $f2 $y 1 7 [expr { $secs + 6*86400 }] | 
|---|
| 401 |                 testISO $f2 $y 2 1 [expr { $secs + 7*86400 }] | 
|---|
| 402 |             } | 
|---|
| 403 |             2 { | 
|---|
| 404 |                 # Year starts on a Tuesday. | 
|---|
| 405 |                 testISO $f2 $ym1 52 1 [expr { $secs - 8*86400 }] | 
|---|
| 406 |                 testISO $f2 $ym1 52 6 [expr {$secs - 3*86400}] | 
|---|
| 407 |                 testISO $f2 $ym1 52 7 [expr { $secs - 2*86400 }] | 
|---|
| 408 |                 testISO $f2 $y 1 1 [expr { $secs - 86400 }] | 
|---|
| 409 |                 testISO $f2 $y 1 2 $secs | 
|---|
| 410 |                 testISO $f2 $y 1 6 [expr {$secs + 4*86400}] | 
|---|
| 411 |                 testISO $f2 $y 1 7 [expr { $secs + 5*86400 }] | 
|---|
| 412 |                 testISO $f2 $y 2 1 [expr { $secs + 6*86400 }] | 
|---|
| 413 |             } | 
|---|
| 414 |             3 { | 
|---|
| 415 |                 testISO $f2 $ym1 52 1 [expr { $secs - 9*86400 }] | 
|---|
| 416 |                 testISO $f2 $ym1 52 6 [expr {$secs - 4*86400}] | 
|---|
| 417 |                 testISO $f2 $ym1 52 7 [expr { $secs - 3*86400 }] | 
|---|
| 418 |                 testISO $f2 $y 1 1 [expr { $secs - 2*86400 }] | 
|---|
| 419 |                 testISO $f2 $y 1 3 $secs | 
|---|
| 420 |                 testISO $f2 $y 1 6 [expr {$secs + 3*86400}] | 
|---|
| 421 |                 testISO $f2 $y 1 7 [expr { $secs + 4*86400 }] | 
|---|
| 422 |                 testISO $f2 $y 2 1 [expr { $secs + 5*86400 }] | 
|---|
| 423 |             } | 
|---|
| 424 |             4 { | 
|---|
| 425 |                 testISO $f2 $ym1 52 1 [expr { $secs - 10*86400 }] | 
|---|
| 426 |                 testISO $f2 $ym1 52 6 [expr {$secs - 5*86400}] | 
|---|
| 427 |                 testISO $f2 $ym1 52 7 [expr { $secs - 4*86400 }] | 
|---|
| 428 |                 testISO $f2 $y 1 1 [expr { $secs - 3*86400 }] | 
|---|
| 429 |                 testISO $f2 $y 1 4 $secs | 
|---|
| 430 |                 testISO $f2 $y 1 6 [expr {$secs + 2*86400}] | 
|---|
| 431 |                 testISO $f2 $y 1 7 [expr { $secs + 3*86400 }] | 
|---|
| 432 |                 testISO $f2 $y 2 1 [expr { $secs + 4*86400 }] | 
|---|
| 433 |             } | 
|---|
| 434 |             5 { | 
|---|
| 435 |                 testISO $f2 $ym1 53 1 [expr { $secs - 4*86400 }] | 
|---|
| 436 |                 testISO $f2 $ym1 53 5 $secs | 
|---|
| 437 |                 testISO $f2 $ym1 53 6 [expr {$secs + 86400}] | 
|---|
| 438 |                 testISO $f2 $ym1 53 7 [expr { $secs + 2*86400 }] | 
|---|
| 439 |                 testISO $f2 $y 1 1 [expr { $secs + 3*86400 }] | 
|---|
| 440 |                 testISO $f2 $y 1 6 [expr {$secs + 8*86400}] | 
|---|
| 441 |                 testISO $f2 $y 1 7 [expr { $secs + 9*86400 }] | 
|---|
| 442 |                 testISO $f2 $y 2 1 [expr { $secs + 10*86400 }] | 
|---|
| 443 |             } | 
|---|
| 444 |             6 { | 
|---|
| 445 |                 # messy case because previous year may have had 52 or 53 weeks | 
|---|
| 446 |                 if { $y%4 == 1 } { | 
|---|
| 447 |                     testISO $f2 $ym1 53 1 [expr { $secs - 5*86400 }] | 
|---|
| 448 |                     testISO $f2 $ym1 53 6 $secs | 
|---|
| 449 |                     testISO $f2 $ym1 53 7 [expr { $secs + 86400 }] | 
|---|
| 450 |                 } else { | 
|---|
| 451 |                     testISO $f2 $ym1 52 1 [expr { $secs - 5*86400 }] | 
|---|
| 452 |                     testISO $f2 $ym1 52 6 $secs | 
|---|
| 453 |                     testISO $f2 $ym1 52 7 [expr { $secs + 86400 }] | 
|---|
| 454 |                 }                    | 
|---|
| 455 |                 testISO $f2 $y 1 1 [expr { $secs + 2*86400 }] | 
|---|
| 456 |                 testISO $f2 $y 1 6 [expr { $secs + 7*86400 }] | 
|---|
| 457 |                 testISO $f2 $y 1 7 [expr { $secs + 8*86400 }] | 
|---|
| 458 |                 testISO $f2 $y 2 1 [expr { $secs + 9*86400 }] | 
|---|
| 459 |             } | 
|---|
| 460 |         } | 
|---|
| 461 |     } | 
|---|
| 462 |     puts "testcases3: $case test cases." | 
|---|
| 463 |  | 
|---|
| 464 | } | 
|---|
| 465 |  | 
|---|
| 466 | proc testISO { f2 G V u secs } { | 
|---|
| 467 |  | 
|---|
| 468 |     upvar 1 case case | 
|---|
| 469 |      | 
|---|
| 470 |     set longdays {Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday} | 
|---|
| 471 |     set shortdays {Sun Mon Tue Wed Thu Fri Sat Sun} | 
|---|
| 472 |      | 
|---|
| 473 |     puts $f2 "test clock-3.[incr case] {ISO week-based calendar [format %04d-W%02d-%d $G $V $u]} {" | 
|---|
| 474 |     puts $f2 "    clock format $secs -format {%a %A %g %G %u %U %V %w %W} -gmt true; \# $G-W[format %02d $V]-$u" | 
|---|
| 475 |     puts $f2 "} {[lindex $shortdays $u] [lindex $longdays $u]\ | 
|---|
| 476 |              [format %02d [expr { $G % 100 }]] $G\ | 
|---|
| 477 |              $u\ | 
|---|
| 478 |              [clock format $secs -format %U -gmt true]\ | 
|---|
| 479 |              [format %02d $V] [expr { $u % 7 }]\ | 
|---|
| 480 |              [clock format $secs -format %W -gmt true]}" | 
|---|
| 481 |      | 
|---|
| 482 | } | 
|---|
| 483 |  | 
|---|
| 484 | #---------------------------------------------------------------------- | 
|---|
| 485 | # | 
|---|
| 486 | # testcases4 -- | 
|---|
| 487 | # | 
|---|
| 488 | #       Makes the test cases that test formatting of time of day. | 
|---|
| 489 | # | 
|---|
| 490 | # Parameters: | 
|---|
| 491 | #       f2 - Channel handle to the output file | 
|---|
| 492 | # | 
|---|
| 493 | # Results: | 
|---|
| 494 | #       None. | 
|---|
| 495 | # | 
|---|
| 496 | # Side effects: | 
|---|
| 497 | #       Writes test cases to the output. | 
|---|
| 498 | # | 
|---|
| 499 | #---------------------------------------------------------------------- | 
|---|
| 500 |  | 
|---|
| 501 | proc testcases4 { f2 } { | 
|---|
| 502 |  | 
|---|
| 503 |     puts $f2 {} | 
|---|
| 504 |     puts $f2 "\# Test formatting of time of day" | 
|---|
| 505 |     puts $f2 "\# Format groups tested: %H %OH %I %OI %k %Ok %l %Ol %M %OM %p %P %r %R %S %OS %T %X %EX %+" | 
|---|
| 506 |     puts $f2 {} | 
|---|
| 507 |      | 
|---|
| 508 |     set i 0 | 
|---|
| 509 |     set fmt "%H %OH %I %OI %k %Ok %l %Ol %M %OM %p %P %r %R %S %OS %T %X %EX %+" | 
|---|
| 510 |     foreach { h romanH I romanI am } {  | 
|---|
| 511 |         0 ? 12 xii AM  | 
|---|
| 512 |         1 i 1 i AM  | 
|---|
| 513 |         11 xi 11 xi AM  | 
|---|
| 514 |         12 xii 12 xii PM  | 
|---|
| 515 |         13 xiii 1 i PM  | 
|---|
| 516 |         23 xxiii 11 xi PM | 
|---|
| 517 |     } { | 
|---|
| 518 |         set hh [format %02d $h] | 
|---|
| 519 |         set II [format %02d $I] | 
|---|
| 520 |         set hs [format %2d $h] | 
|---|
| 521 |         set Is [format %2d $I] | 
|---|
| 522 |         foreach { m romanM } { 0 ? 1 i 58 lviii 59 lix } { | 
|---|
| 523 |             set mm [format %02d $m] | 
|---|
| 524 |             foreach { s romanS } { 0 ? 1 i 58 lviii 59 lix } { | 
|---|
| 525 |                 set ss [format %02d $s] | 
|---|
| 526 |                 set x [expr { ( $h * 60 + $m ) * 60 + $s }] | 
|---|
| 527 |                 set result "" | 
|---|
| 528 |                 append result $hh " " $romanH " " $II " " $romanI " " \ | 
|---|
| 529 |                     $hs " " $romanH " " $Is " " $romanI " " $mm " " $romanM " " \ | 
|---|
| 530 |                     $am " " [string tolower $am] " " \ | 
|---|
| 531 |                     $II ":" $mm ":" $ss " " [string tolower $am] " " \ | 
|---|
| 532 |                     $hh ":" $mm " " \ | 
|---|
| 533 |                     $ss " " $romanS " " \ | 
|---|
| 534 |                     $hh ":" $mm ":" $ss " " \ | 
|---|
| 535 |                     $hh ":" $mm ":" $ss " " \ | 
|---|
| 536 |                     $romanH " h " $romanM " m " $romanS " s " \ | 
|---|
| 537 |                     "Thu Jan  1 " $hh : $mm : $ss " GMT 1970" | 
|---|
| 538 |                 puts $f2 "test clock-4.[incr i] { format time of day $hh:$mm:$ss } {" | 
|---|
| 539 |                 puts $f2 "    clock format $x \\" | 
|---|
| 540 |                 puts $f2 "        -format [list $fmt] \\" | 
|---|
| 541 |                 puts $f2 "        -locale en_US_roman \\" | 
|---|
| 542 |                 puts $f2 "        -gmt true" | 
|---|
| 543 |                 puts $f2 "} {$result}" | 
|---|
| 544 |             } | 
|---|
| 545 |         } | 
|---|
| 546 |     } | 
|---|
| 547 |  | 
|---|
| 548 |     puts "testcases4: $i test cases." | 
|---|
| 549 | } | 
|---|
| 550 |      | 
|---|
| 551 | #---------------------------------------------------------------------- | 
|---|
| 552 | # | 
|---|
| 553 | # testcases5 -- | 
|---|
| 554 | # | 
|---|
| 555 | #       Generates the test cases for Daylight Saving Time | 
|---|
| 556 | # | 
|---|
| 557 | # Parameters: | 
|---|
| 558 | #       f2 - Channel handle for the input file | 
|---|
| 559 | # | 
|---|
| 560 | # Results: | 
|---|
| 561 | #       None. | 
|---|
| 562 | # | 
|---|
| 563 | # Side effects: | 
|---|
| 564 | #       Makes test cases for each known or anticipated time change | 
|---|
| 565 | #       in Detroit. | 
|---|
| 566 | # | 
|---|
| 567 | #---------------------------------------------------------------------- | 
|---|
| 568 |  | 
|---|
| 569 | proc testcases5 { f2 } { | 
|---|
| 570 |     variable TZData | 
|---|
| 571 |  | 
|---|
| 572 |     puts $f2 {} | 
|---|
| 573 |     puts $f2 "\# Test formatting of Daylight Saving Time" | 
|---|
| 574 |     puts $f2 {} | 
|---|
| 575 |      | 
|---|
| 576 |     set fmt {%H:%M:%S %z %Z} | 
|---|
| 577 |      | 
|---|
| 578 |     set i 0 | 
|---|
| 579 |     puts $f2 "test clock-5.[incr i] {does Detroit exist} {" | 
|---|
| 580 |     puts $f2 "    clock format 0 -format {} -timezone :America/Detroit" | 
|---|
| 581 |     puts $f2 "    concat" | 
|---|
| 582 |     puts $f2 "} {}" | 
|---|
| 583 |     puts $f2 "test clock-5.[incr i] {does Detroit have a Y2038 problem} detroit {" | 
|---|
| 584 |     puts $f2 "    if { \[clock format 2158894800 -format %z -timezone :America/Detroit\] ne {-0400} } {" | 
|---|
| 585 |     puts $f2 "        concat {y2038 problem}" | 
|---|
| 586 |     puts $f2 "    } else {" | 
|---|
| 587 |     puts $f2 "        concat {ok}" | 
|---|
| 588 |     puts $f2 "    }" | 
|---|
| 589 |     puts $f2 "} ok" | 
|---|
| 590 |    | 
|---|
| 591 |     foreach row $TZData(:America/Detroit) { | 
|---|
| 592 |         foreach { t offset isdst tzname } $row break | 
|---|
| 593 |         if { $t > -4000000000000 } { | 
|---|
| 594 |             set conds [list detroit] | 
|---|
| 595 |             if { $t > wide(0x7fffffff) } { | 
|---|
| 596 |                 set conds [list detroit y2038] | 
|---|
| 597 |             } | 
|---|
| 598 |             incr t -1 | 
|---|
| 599 |             set x [clock format $t -format {%Y-%m-%d %H:%M:%S} \ | 
|---|
| 600 |                        -timezone :America/Detroit] | 
|---|
| 601 |             set r [clock format $t -format $fmt \ | 
|---|
| 602 |                        -timezone :America/Detroit] | 
|---|
| 603 |             puts $f2 "test clock-5.[incr i] {time zone boundary case $x} [list $conds] {" | 
|---|
| 604 |             puts $f2 "    clock format $t -format [list $fmt] \\" | 
|---|
| 605 |             puts $f2 "        -timezone :America/Detroit" | 
|---|
| 606 |             puts $f2 "} [list $r]" | 
|---|
| 607 |             incr t | 
|---|
| 608 |             set x [clock format $t -format {%Y-%m-%d %H:%M:%S} \ | 
|---|
| 609 |                        -timezone :America/Detroit] | 
|---|
| 610 |             set r [clock format $t -format $fmt \ | 
|---|
| 611 |                        -timezone :America/Detroit] | 
|---|
| 612 |             puts $f2 "test clock-5.[incr i] {time zone boundary case $x} [list $conds] {" | 
|---|
| 613 |             puts $f2 "    clock format $t -format [list $fmt] \\" | 
|---|
| 614 |             puts $f2 "        -timezone :America/Detroit" | 
|---|
| 615 |             puts $f2 "} [list $r]" | 
|---|
| 616 |             incr t | 
|---|
| 617 |             set x [clock format $t -format {%Y-%m-%d %H:%M:%S} \ | 
|---|
| 618 |                        -timezone :America/Detroit] | 
|---|
| 619 |             set r [clock format $t -format $fmt \ | 
|---|
| 620 |                        -timezone :America/Detroit] | 
|---|
| 621 |             puts $f2 "test clock-5.[incr i] {time zone boundary case $x} [list $conds] {" | 
|---|
| 622 |             puts $f2 "    clock format $t -format [list $fmt] \\" | 
|---|
| 623 |             puts $f2 "        -timezone :America/Detroit" | 
|---|
| 624 |             puts $f2 "} [list $r]" | 
|---|
| 625 |         } | 
|---|
| 626 |     } | 
|---|
| 627 |     puts "testcases5: $i test cases" | 
|---|
| 628 | } | 
|---|
| 629 |  | 
|---|
| 630 | #---------------------------------------------------------------------- | 
|---|
| 631 | # | 
|---|
| 632 | # testcases8 -- | 
|---|
| 633 | # | 
|---|
| 634 | #       Outputs the 'clock-8.x' test cases. | 
|---|
| 635 | # | 
|---|
| 636 | # Parameters: | 
|---|
| 637 | #       f2 -- Channel handle to the output file | 
|---|
| 638 | # | 
|---|
| 639 | # Results: | 
|---|
| 640 | #       None. | 
|---|
| 641 | # | 
|---|
| 642 | # Side effects: | 
|---|
| 643 | #       Test cases for parsing dates in ccyymmdd format are written to the | 
|---|
| 644 | #       output file. | 
|---|
| 645 | # | 
|---|
| 646 | #---------------------------------------------------------------------- | 
|---|
| 647 |  | 
|---|
| 648 | proc testcases8 { f2 } { | 
|---|
| 649 |  | 
|---|
| 650 |     # Put out a header describing the tests | 
|---|
| 651 |      | 
|---|
| 652 |     puts $f2 "" | 
|---|
| 653 |     puts $f2 "\# Test parsing of ccyymmdd" | 
|---|
| 654 |     puts $f2 "" | 
|---|
| 655 |      | 
|---|
| 656 |     set n 0  | 
|---|
| 657 |     foreach year {1970 1971 2000 2001} { | 
|---|
| 658 |         foreach month {01 12} { | 
|---|
| 659 |             foreach day {02 31} { | 
|---|
| 660 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 661 |                 foreach ccyy {%C%y %Y} { | 
|---|
| 662 |                     foreach mm {%b %B %h %m %Om %N} { | 
|---|
| 663 |                         foreach dd {%d %Od %e %Oe} { | 
|---|
| 664 |                             set string [clock format $scanned \ | 
|---|
| 665 |                                             -format "$ccyy $mm $dd" \ | 
|---|
| 666 |                                             -locale en_US_roman \ | 
|---|
| 667 |                                             -gmt true] | 
|---|
| 668 |                             puts $f2 "test clock-8.[incr n] {parse ccyymmdd} {" | 
|---|
| 669 |                             puts $f2 "    [list clock scan $string -format [list $ccyy $mm $dd] -locale en_US_roman -gmt 1]" | 
|---|
| 670 |                             puts $f2 "} $scanned" | 
|---|
| 671 |                         } | 
|---|
| 672 |                     } | 
|---|
| 673 |                 }        | 
|---|
| 674 |                 foreach fmt {%x %D} { | 
|---|
| 675 |                     set string [clock format $scanned \ | 
|---|
| 676 |                                     -format $fmt \ | 
|---|
| 677 |                                     -locale en_US_roman \ | 
|---|
| 678 |                                     -gmt true] | 
|---|
| 679 |                     puts $f2 "test clock-8.[incr n] {parse ccyymmdd} {" | 
|---|
| 680 |                     puts $f2 "    [list clock scan $string -format $fmt -locale en_US_roman -gmt 1]" | 
|---|
| 681 |                     puts $f2 "} $scanned" | 
|---|
| 682 |                 } | 
|---|
| 683 |             } | 
|---|
| 684 |         } | 
|---|
| 685 |     } | 
|---|
| 686 |  | 
|---|
| 687 |     puts "testcases8: $n test cases" | 
|---|
| 688 | } | 
|---|
| 689 |  | 
|---|
| 690 | #---------------------------------------------------------------------- | 
|---|
| 691 | # | 
|---|
| 692 | # testcases11 -- | 
|---|
| 693 | # | 
|---|
| 694 | #       Outputs the 'clock-11.x' test cases. | 
|---|
| 695 | # | 
|---|
| 696 | # Parameters: | 
|---|
| 697 | #       f2 -- Channel handle to the output file | 
|---|
| 698 | # | 
|---|
| 699 | # Results: | 
|---|
| 700 | #       None. | 
|---|
| 701 | # | 
|---|
| 702 | # Side effects: | 
|---|
| 703 | #       Test cases for precedence among YYYYMMDD and YYYYDDD are written | 
|---|
| 704 | #       to f2. | 
|---|
| 705 | # | 
|---|
| 706 | #---------------------------------------------------------------------- | 
|---|
| 707 |  | 
|---|
| 708 | proc testcases11 { f2 } { | 
|---|
| 709 |  | 
|---|
| 710 |     # Put out a header describing the tests | 
|---|
| 711 |      | 
|---|
| 712 |     puts $f2 "" | 
|---|
| 713 |     puts $f2 "\# Test precedence among yyyymmdd and yyyyddd" | 
|---|
| 714 |     puts $f2 "" | 
|---|
| 715 |      | 
|---|
| 716 |     array set v { | 
|---|
| 717 |         Y 1970 | 
|---|
| 718 |         m 01 | 
|---|
| 719 |         d 01 | 
|---|
| 720 |         j 002 | 
|---|
| 721 |     } | 
|---|
| 722 |  | 
|---|
| 723 |     set n 0 | 
|---|
| 724 |  | 
|---|
| 725 |     foreach {a b c d} { | 
|---|
| 726 |         Y m d j         m Y d j         d Y m j         j Y m d | 
|---|
| 727 |         Y m j d         m Y j d         d Y j m         j Y d m | 
|---|
| 728 |         Y d m j         m d Y j         d m Y j         j m Y d | 
|---|
| 729 |         Y d j m         m d j Y         d m j Y         j m d Y | 
|---|
| 730 |         Y j m d         m j Y d         d j Y m         j d Y m | 
|---|
| 731 |         Y j d m         m j d Y         d j m Y         j d m Y | 
|---|
| 732 |     } { | 
|---|
| 733 |         foreach x [list $a $b $c $d] { | 
|---|
| 734 |             switch -exact -- $x { | 
|---|
| 735 |                 m - d { | 
|---|
| 736 |                     set value 0 | 
|---|
| 737 |                 } | 
|---|
| 738 |                 j { | 
|---|
| 739 |                     set value 86400 | 
|---|
| 740 |                 } | 
|---|
| 741 |             } | 
|---|
| 742 |         } | 
|---|
| 743 |         set format "%$a%$b%$c%$d" | 
|---|
| 744 |         set string "$v($a)$v($b)$v($c)$v($d)" | 
|---|
| 745 |         puts $f2 "test clock-11.[incr n] {precedence of ccyyddd and ccyymmdd} {" | 
|---|
| 746 |         puts $f2 "    [list clock scan $string -format $format -gmt 1]" | 
|---|
| 747 |         puts $f2 "} $value" | 
|---|
| 748 |     } | 
|---|
| 749 |  | 
|---|
| 750 |     puts "testcases11: $n test cases" | 
|---|
| 751 | } | 
|---|
| 752 |  | 
|---|
| 753 | #---------------------------------------------------------------------- | 
|---|
| 754 | # | 
|---|
| 755 | # testcases12 -- | 
|---|
| 756 | # | 
|---|
| 757 | #       Outputs the 'clock-12.x' test cases, parsing CCyyWwwd | 
|---|
| 758 | # | 
|---|
| 759 | # Parameters: | 
|---|
| 760 | #       f2 -- Channel handle to the output file | 
|---|
| 761 | # | 
|---|
| 762 | # Results: | 
|---|
| 763 | #       None. | 
|---|
| 764 | # | 
|---|
| 765 | # Side effects: | 
|---|
| 766 | #       Test cases for parsing dates in Gregorian calendar are written to the | 
|---|
| 767 | #       output file. | 
|---|
| 768 | # | 
|---|
| 769 | #---------------------------------------------------------------------- | 
|---|
| 770 |  | 
|---|
| 771 | proc testcases12 { f2 } { | 
|---|
| 772 |  | 
|---|
| 773 |     # Put out a header describing the tests | 
|---|
| 774 |      | 
|---|
| 775 |     puts $f2 "" | 
|---|
| 776 |     puts $f2 "\# Test parsing of ccyyWwwd" | 
|---|
| 777 |     puts $f2 "" | 
|---|
| 778 |      | 
|---|
| 779 |     set n 0  | 
|---|
| 780 |     foreach year {1970 1971 2000 2001} { | 
|---|
| 781 |         foreach month {01 12} { | 
|---|
| 782 |             foreach day {02 31} { | 
|---|
| 783 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 784 |                 foreach d {%a %A %u %w %Ou %Ow} { | 
|---|
| 785 |                     set string [clock format $scanned \ | 
|---|
| 786 |                                     -format "%G W%V $d" \ | 
|---|
| 787 |                                     -locale en_US_roman \ | 
|---|
| 788 |                                     -gmt true] | 
|---|
| 789 |                     puts $f2 "test clock-12.[incr n] {parse ccyyWwwd} {" | 
|---|
| 790 |                     puts $f2 "    [list clock scan $string -format [list %G W%V $d] -locale en_US_roman -gmt 1]" | 
|---|
| 791 |                     puts $f2 "} $scanned" | 
|---|
| 792 |                 } | 
|---|
| 793 |             } | 
|---|
| 794 |         } | 
|---|
| 795 |     } | 
|---|
| 796 |  | 
|---|
| 797 |     puts "testcases12: $n test cases" | 
|---|
| 798 | } | 
|---|
| 799 |  | 
|---|
| 800 | #---------------------------------------------------------------------- | 
|---|
| 801 | # | 
|---|
| 802 | # testcases14 -- | 
|---|
| 803 | # | 
|---|
| 804 | #       Outputs the 'clock-14.x' test cases. | 
|---|
| 805 | # | 
|---|
| 806 | # Parameters: | 
|---|
| 807 | #       f2 -- Channel handle to the output file | 
|---|
| 808 | # | 
|---|
| 809 | # Results: | 
|---|
| 810 | #       None. | 
|---|
| 811 | # | 
|---|
| 812 | # Side effects: | 
|---|
| 813 | #       Test cases for parsing yymmdd dates are output. | 
|---|
| 814 | # | 
|---|
| 815 | #---------------------------------------------------------------------- | 
|---|
| 816 |  | 
|---|
| 817 | proc testcases14 { f2 } { | 
|---|
| 818 |  | 
|---|
| 819 |     # Put out a header describing the tests | 
|---|
| 820 |      | 
|---|
| 821 |     puts $f2 "" | 
|---|
| 822 |     puts $f2 "\# Test parsing of yymmdd" | 
|---|
| 823 |     puts $f2 "" | 
|---|
| 824 |      | 
|---|
| 825 |     set n 0  | 
|---|
| 826 |     foreach year {1938 1970 2000 2037} { | 
|---|
| 827 |         foreach month {01 12} { | 
|---|
| 828 |             foreach day {02 31} { | 
|---|
| 829 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 830 |                 foreach yy {%y %Oy} { | 
|---|
| 831 |                     foreach mm {%b %B %h %m %Om %N} { | 
|---|
| 832 |                         foreach dd {%d %Od %e %Oe} { | 
|---|
| 833 |                             set string [clock format $scanned \ | 
|---|
| 834 |                                             -format "$yy $mm $dd" \ | 
|---|
| 835 |                                             -locale en_US_roman \ | 
|---|
| 836 |                                             -gmt true] | 
|---|
| 837 |                             puts $f2 "test clock-14.[incr n] {parse yymmdd} {" | 
|---|
| 838 |                             puts $f2 "    [list clock scan $string -format [list $yy $mm $dd] -locale en_US_roman -gmt 1]" | 
|---|
| 839 |                             puts $f2 "} $scanned" | 
|---|
| 840 |                         } | 
|---|
| 841 |                     } | 
|---|
| 842 |                 }        | 
|---|
| 843 |             } | 
|---|
| 844 |         } | 
|---|
| 845 |     } | 
|---|
| 846 |  | 
|---|
| 847 |     puts "testcases14: $n test cases" | 
|---|
| 848 | } | 
|---|
| 849 |  | 
|---|
| 850 | #---------------------------------------------------------------------- | 
|---|
| 851 | # | 
|---|
| 852 | # testcases17 -- | 
|---|
| 853 | # | 
|---|
| 854 | #       Outputs the 'clock-17.x' test cases, parsing yyWwwd | 
|---|
| 855 | # | 
|---|
| 856 | # Parameters: | 
|---|
| 857 | #       f2 -- Channel handle to the output file | 
|---|
| 858 | # | 
|---|
| 859 | # Results: | 
|---|
| 860 | #       None. | 
|---|
| 861 | # | 
|---|
| 862 | # Side effects: | 
|---|
| 863 | #       Test cases for parsing dates in Gregorian calendar are written to the | 
|---|
| 864 | #       output file. | 
|---|
| 865 | # | 
|---|
| 866 | #---------------------------------------------------------------------- | 
|---|
| 867 |  | 
|---|
| 868 | proc testcases17 { f2 } { | 
|---|
| 869 |  | 
|---|
| 870 |     # Put out a header describing the tests | 
|---|
| 871 |      | 
|---|
| 872 |     puts $f2 "" | 
|---|
| 873 |     puts $f2 "\# Test parsing of yyWwwd" | 
|---|
| 874 |     puts $f2 "" | 
|---|
| 875 |      | 
|---|
| 876 |     set n 0  | 
|---|
| 877 |     foreach year {1970 1971 2000 2001} { | 
|---|
| 878 |         foreach month {01 12} { | 
|---|
| 879 |             foreach day {02 31} { | 
|---|
| 880 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 881 |                 foreach d {%a %A %u %w %Ou %Ow} { | 
|---|
| 882 |                     set string [clock format $scanned \ | 
|---|
| 883 |                                     -format "%g W%V $d" \ | 
|---|
| 884 |                                     -locale en_US_roman \ | 
|---|
| 885 |                                     -gmt true] | 
|---|
| 886 |                     puts $f2 "test clock-17.[incr n] {parse yyWwwd} {" | 
|---|
| 887 |                     puts $f2 "    [list clock scan $string -format [list %g W%V $d] -locale en_US_roman -gmt 1]" | 
|---|
| 888 |                     puts $f2 "} $scanned" | 
|---|
| 889 |                 } | 
|---|
| 890 |             } | 
|---|
| 891 |         } | 
|---|
| 892 |     } | 
|---|
| 893 |  | 
|---|
| 894 |     puts "testcases17: $n test cases" | 
|---|
| 895 | } | 
|---|
| 896 |  | 
|---|
| 897 | #---------------------------------------------------------------------- | 
|---|
| 898 | # | 
|---|
| 899 | # testcases19 -- | 
|---|
| 900 | # | 
|---|
| 901 | #       Outputs the 'clock-19.x' test cases. | 
|---|
| 902 | # | 
|---|
| 903 | # Parameters: | 
|---|
| 904 | #       f2 -- Channel handle to the output file | 
|---|
| 905 | # | 
|---|
| 906 | # Results: | 
|---|
| 907 | #       None. | 
|---|
| 908 | # | 
|---|
| 909 | # Side effects: | 
|---|
| 910 | #       Test cases for parsing mmdd dates are output. | 
|---|
| 911 | # | 
|---|
| 912 | #---------------------------------------------------------------------- | 
|---|
| 913 |  | 
|---|
| 914 | proc testcases19 { f2 } { | 
|---|
| 915 |  | 
|---|
| 916 |     # Put out a header describing the tests | 
|---|
| 917 |      | 
|---|
| 918 |     puts $f2 "" | 
|---|
| 919 |     puts $f2 "\# Test parsing of mmdd" | 
|---|
| 920 |     puts $f2 "" | 
|---|
| 921 |      | 
|---|
| 922 |     set n 0  | 
|---|
| 923 |     foreach year {1938 1970 2000 2037} { | 
|---|
| 924 |         set base [clock scan ${year}0101 -gmt true] | 
|---|
| 925 |         foreach month {01 12} { | 
|---|
| 926 |             foreach day {02 31} { | 
|---|
| 927 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 928 |                 foreach mm {%b %B %h %m %Om %N} { | 
|---|
| 929 |                     foreach dd {%d %Od %e %Oe} { | 
|---|
| 930 |                         set string [clock format $scanned \ | 
|---|
| 931 |                                         -format "$mm $dd" \ | 
|---|
| 932 |                                         -locale en_US_roman \ | 
|---|
| 933 |                                         -gmt true] | 
|---|
| 934 |                         puts $f2 "test clock-19.[incr n] {parse mmdd} {" | 
|---|
| 935 |                         puts $f2 "    [list clock scan $string -format [list $mm $dd] -locale en_US_roman -base $base -gmt 1]" | 
|---|
| 936 |                         puts $f2 "} $scanned" | 
|---|
| 937 |                     } | 
|---|
| 938 |                 }        | 
|---|
| 939 |             } | 
|---|
| 940 |         } | 
|---|
| 941 |     } | 
|---|
| 942 |  | 
|---|
| 943 |     puts "testcases19: $n test cases" | 
|---|
| 944 | } | 
|---|
| 945 |  | 
|---|
| 946 | #---------------------------------------------------------------------- | 
|---|
| 947 | # | 
|---|
| 948 | # testcases21 -- | 
|---|
| 949 | # | 
|---|
| 950 | #       Outputs the 'clock-21.x' test cases, parsing Wwwd | 
|---|
| 951 | # | 
|---|
| 952 | # Parameters: | 
|---|
| 953 | #       f2 -- Channel handle to the output file | 
|---|
| 954 | # | 
|---|
| 955 | # Results: | 
|---|
| 956 | #       None. | 
|---|
| 957 | # | 
|---|
| 958 | # Side effects: | 
|---|
| 959 | #       Test cases for parsing dates in Gregorian calendar are written to the | 
|---|
| 960 | #       output file. | 
|---|
| 961 | # | 
|---|
| 962 | #---------------------------------------------------------------------- | 
|---|
| 963 |  | 
|---|
| 964 | proc testcases22 { f2 } { | 
|---|
| 965 |  | 
|---|
| 966 |     # Put out a header describing the tests | 
|---|
| 967 |      | 
|---|
| 968 |     puts $f2 "" | 
|---|
| 969 |     puts $f2 "\# Test parsing of Wwwd" | 
|---|
| 970 |     puts $f2 "" | 
|---|
| 971 |      | 
|---|
| 972 |     set n 0  | 
|---|
| 973 |     foreach year {1970 1971 2000 2001} { | 
|---|
| 974 |         set base [clock scan ${year}0104 -gmt true] | 
|---|
| 975 |         foreach month {03 10} { | 
|---|
| 976 |             foreach day {01 31} { | 
|---|
| 977 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 978 |                 foreach d {%a %A %u %w %Ou %Ow} { | 
|---|
| 979 |                     set string [clock format $scanned \ | 
|---|
| 980 |                                     -format "W%V $d" \ | 
|---|
| 981 |                                     -locale en_US_roman \ | 
|---|
| 982 |                                     -gmt true] | 
|---|
| 983 |                     puts $f2 "test clock-22.[incr n] {parse Wwwd} {" | 
|---|
| 984 |                     puts $f2 "    [list clock scan $string -format [list W%V $d] -locale en_US_roman -gmt 1] -base $base" | 
|---|
| 985 |                     puts $f2 "} $scanned" | 
|---|
| 986 |                 } | 
|---|
| 987 |             } | 
|---|
| 988 |         } | 
|---|
| 989 |     } | 
|---|
| 990 |  | 
|---|
| 991 |     puts "testcases22: $n test cases" | 
|---|
| 992 | } | 
|---|
| 993 |  | 
|---|
| 994 | #---------------------------------------------------------------------- | 
|---|
| 995 | # | 
|---|
| 996 | # testcases24 -- | 
|---|
| 997 | # | 
|---|
| 998 | #       Outputs the 'clock-24.x' test cases. | 
|---|
| 999 | # | 
|---|
| 1000 | # Parameters: | 
|---|
| 1001 | #       f2 -- Channel handle to the output file | 
|---|
| 1002 | # | 
|---|
| 1003 | # Results: | 
|---|
| 1004 | #       None. | 
|---|
| 1005 | # | 
|---|
| 1006 | # Side effects: | 
|---|
| 1007 | #       Test cases for parsing naked day of the month are output. | 
|---|
| 1008 | # | 
|---|
| 1009 | #---------------------------------------------------------------------- | 
|---|
| 1010 |  | 
|---|
| 1011 | proc testcases24 { f2 } { | 
|---|
| 1012 |  | 
|---|
| 1013 |     # Put out a header describing the tests | 
|---|
| 1014 |      | 
|---|
| 1015 |     puts $f2 "" | 
|---|
| 1016 |     puts $f2 "\# Test parsing of naked day-of-month" | 
|---|
| 1017 |     puts $f2 "" | 
|---|
| 1018 |      | 
|---|
| 1019 |     set n 0  | 
|---|
| 1020 |     foreach year {1970 2000} { | 
|---|
| 1021 |         foreach month {01 12} { | 
|---|
| 1022 |             set base [clock scan ${year}${month}01 -gmt true] | 
|---|
| 1023 |             foreach day {02 28} { | 
|---|
| 1024 |                 set scanned [clock scan $year$month$day -gmt true] | 
|---|
| 1025 |                 foreach dd {%d %Od %e %Oe} { | 
|---|
| 1026 |                     set string [clock format $scanned \ | 
|---|
| 1027 |                                     -format "$dd" \ | 
|---|
| 1028 |                                     -locale en_US_roman \ | 
|---|
| 1029 |                                     -gmt true] | 
|---|
| 1030 |                     puts $f2 "test clock-24.[incr n] {parse naked day of month} {" | 
|---|
| 1031 |                     puts $f2 "    [list clock scan $string -format $dd -locale en_US_roman -base $base -gmt 1]" | 
|---|
| 1032 |                     puts $f2 "} $scanned" | 
|---|
| 1033 |                 }        | 
|---|
| 1034 |             } | 
|---|
| 1035 |         } | 
|---|
| 1036 |     } | 
|---|
| 1037 |  | 
|---|
| 1038 |     puts "testcases24: $n test cases" | 
|---|
| 1039 | } | 
|---|
| 1040 |  | 
|---|
| 1041 | #---------------------------------------------------------------------- | 
|---|
| 1042 | # | 
|---|
| 1043 | # testcases26 -- | 
|---|
| 1044 | # | 
|---|
| 1045 | #       Outputs the 'clock-26.x' test cases, parsing naked day of week | 
|---|
| 1046 | # | 
|---|
| 1047 | # Parameters: | 
|---|
| 1048 | #       f2 -- Channel handle to the output file | 
|---|
| 1049 | # | 
|---|
| 1050 | # Results: | 
|---|
| 1051 | #       None. | 
|---|
| 1052 | # | 
|---|
| 1053 | # Side effects: | 
|---|
| 1054 | #       Test cases for parsing dates in Gregorian calendar are written to the | 
|---|
| 1055 | #       output file. | 
|---|
| 1056 | # | 
|---|
| 1057 | #---------------------------------------------------------------------- | 
|---|
| 1058 |  | 
|---|
| 1059 | proc testcases26 { f2 } { | 
|---|
| 1060 |  | 
|---|
| 1061 |     # Put out a header describing the tests | 
|---|
| 1062 |      | 
|---|
| 1063 |     puts $f2 "" | 
|---|
| 1064 |     puts $f2 "\# Test parsing of naked day of week" | 
|---|
| 1065 |     puts $f2 "" | 
|---|
| 1066 |      | 
|---|
| 1067 |     set n 0  | 
|---|
| 1068 |     foreach year {1970 2001} { | 
|---|
| 1069 |         foreach week {01 52} { | 
|---|
| 1070 |             set base [clock scan ${year}W${week}4 \ | 
|---|
| 1071 |                           -format %GW%V%u -gmt true] | 
|---|
| 1072 |             foreach day {1 7} { | 
|---|
| 1073 |                 set scanned [clock scan ${year}W${week}${day} \ | 
|---|
| 1074 |                                  -format %GW%V%u -gmt true] | 
|---|
| 1075 |                 foreach d {%a %A %u %w %Ou %Ow} { | 
|---|
| 1076 |                     set string [clock format $scanned \ | 
|---|
| 1077 |                                     -format "$d" \ | 
|---|
| 1078 |                                     -locale en_US_roman \ | 
|---|
| 1079 |                                     -gmt true] | 
|---|
| 1080 |                     puts $f2 "test clock-26.[incr n] {parse naked day of week} {" | 
|---|
| 1081 |                     puts $f2 "    [list clock scan $string -format $d -locale en_US_roman -gmt 1] -base $base" | 
|---|
| 1082 |                     puts $f2 "} $scanned" | 
|---|
| 1083 |                 } | 
|---|
| 1084 |             } | 
|---|
| 1085 |         } | 
|---|
| 1086 |     } | 
|---|
| 1087 |  | 
|---|
| 1088 |     puts "testcases26: $n test cases" | 
|---|
| 1089 | } | 
|---|
| 1090 |  | 
|---|
| 1091 | #---------------------------------------------------------------------- | 
|---|
| 1092 | # | 
|---|
| 1093 | # testcases29 -- | 
|---|
| 1094 | # | 
|---|
| 1095 | #       Makes test cases for parsing of time of day. | 
|---|
| 1096 | # | 
|---|
| 1097 | # Parameters: | 
|---|
| 1098 | #       f2 -- Channel where tests are to be written | 
|---|
| 1099 | # | 
|---|
| 1100 | # Results: | 
|---|
| 1101 | #       None. | 
|---|
| 1102 | # | 
|---|
| 1103 | # Side effects: | 
|---|
| 1104 | #       Writes the tests. | 
|---|
| 1105 | # | 
|---|
| 1106 | #---------------------------------------------------------------------- | 
|---|
| 1107 |  | 
|---|
| 1108 | proc testcases29 { f2 } { | 
|---|
| 1109 |  | 
|---|
| 1110 |     # Put out a header describing the tests | 
|---|
| 1111 |      | 
|---|
| 1112 |     puts $f2 "" | 
|---|
| 1113 |     puts $f2 "\# Test parsing of time of day" | 
|---|
| 1114 |     puts $f2 "" | 
|---|
| 1115 |  | 
|---|
| 1116 |     set n 0 | 
|---|
| 1117 |     foreach hour {0 1 11 12 13 23} \ | 
|---|
| 1118 |         hampm {12 1 11 12 1 11} \ | 
|---|
| 1119 |         lhour {? i xi xii xiii xxiii} \ | 
|---|
| 1120 |         lhampm {xii i xi xii i xi} \ | 
|---|
| 1121 |         ampmind {am am am pm pm pm} { | 
|---|
| 1122 |             set sphr [format %2d $hour] | 
|---|
| 1123 |             set 2dhr [format %02d $hour] | 
|---|
| 1124 |             set sphampm [format %2d $hampm] | 
|---|
| 1125 |             set 2dhampm [format %02d $hampm] | 
|---|
| 1126 |             set AMPMind [string toupper $ampmind] | 
|---|
| 1127 |             foreach minute {00 01 59} lminute {? i lix} { | 
|---|
| 1128 |                 foreach second {00 01 59} lsecond {? i lix} { | 
|---|
| 1129 |                     set time [expr { ( 60 * $hour + $minute ) * 60 + $second }] | 
|---|
| 1130 |                     foreach {hfmt afmt} [list \ | 
|---|
| 1131 |                                              %H {} %k {} %OH {} %Ok {} \ | 
|---|
| 1132 |                                              %I %p %l %p \ | 
|---|
| 1133 |                                              %OI %p %Ol %p \ | 
|---|
| 1134 |                                              %I %P %l %P \ | 
|---|
| 1135 |                                              %OI %P %Ol %P] \ | 
|---|
| 1136 |                         {hfld afld} [list \ | 
|---|
| 1137 |                                          $2dhr {} $sphr {} $lhour {} $lhour {} \ | 
|---|
| 1138 |                                          $2dhampm $AMPMind $sphampm $AMPMind \ | 
|---|
| 1139 |                                          $lhampm $AMPMind $lhampm $AMPMind \ | 
|---|
| 1140 |                                          $2dhampm $ampmind $sphampm $ampmind \ | 
|---|
| 1141 |                                          $lhampm $ampmind $lhampm $ampmind] \ | 
|---|
| 1142 |                         { | 
|---|
| 1143 |                             if { $second eq "00" } { | 
|---|
| 1144 |                                 if { $minute eq "00" } { | 
|---|
| 1145 |                                     puts $f2 "test clock-29.[incr n] {time parsing} {" | 
|---|
| 1146 |                                     puts $f2 "    clock scan {2440588 $hfld $afld} \\" | 
|---|
| 1147 |                                     puts $f2 "        -gmt true -locale en_US_roman \\" | 
|---|
| 1148 |                                     puts $f2 "        -format {%J $hfmt $afmt}" | 
|---|
| 1149 |                                     puts $f2 "} $time" | 
|---|
| 1150 |                                 } | 
|---|
| 1151 |                                 puts $f2 "test clock-29.[incr n] {time parsing} {" | 
|---|
| 1152 |                                 puts $f2 "    clock scan {2440588 $hfld:$minute $afld} \\" | 
|---|
| 1153 |                                 puts $f2 "        -gmt true -locale en_US_roman \\" | 
|---|
| 1154 |                                 puts $f2 "        -format {%J $hfmt:%M $afmt}" | 
|---|
| 1155 |                                 puts $f2 "} $time" | 
|---|
| 1156 |                                 puts $f2 "test clock-29.[incr n] {time parsing} {" | 
|---|
| 1157 |                                 puts $f2 "    clock scan {2440588 $hfld:$lminute $afld} \\" | 
|---|
| 1158 |                                 puts $f2 "        -gmt true -locale en_US_roman \\" | 
|---|
| 1159 |                                 puts $f2 "        -format {%J $hfmt:%OM $afmt}" | 
|---|
| 1160 |                                 puts $f2 "} $time" | 
|---|
| 1161 |                             } | 
|---|
| 1162 |                             puts $f2 "test clock-29.[incr n] {time parsing} {" | 
|---|
| 1163 |                             puts $f2 "    clock scan {2440588 $hfld:$minute:$second $afld} \\" | 
|---|
| 1164 |                             puts $f2 "        -gmt true -locale en_US_roman \\" | 
|---|
| 1165 |                             puts $f2 "        -format {%J $hfmt:%M:%S $afmt}" | 
|---|
| 1166 |                             puts $f2 "} $time" | 
|---|
| 1167 |                             puts $f2 "test clock-29.[incr n] {time parsing} {" | 
|---|
| 1168 |                             puts $f2 "    clock scan {2440588 $hfld:$lminute:$lsecond $afld} \\" | 
|---|
| 1169 |                             puts $f2 "        -gmt true -locale en_US_roman \\" | 
|---|
| 1170 |                             puts $f2 "        -format {%J $hfmt:%OM:%OS $afmt}" | 
|---|
| 1171 |                             puts $f2 "} $time" | 
|---|
| 1172 |                         } | 
|---|
| 1173 |                 } | 
|---|
| 1174 |             } | 
|---|
| 1175 |              | 
|---|
| 1176 |         } | 
|---|
| 1177 |     puts "testcases29: $n test cases" | 
|---|
| 1178 | } | 
|---|
| 1179 |  | 
|---|
| 1180 | processFile $d | 
|---|