rhodes 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. data/.gitignore +2 -0
  2. data/History.txt +4 -0
  3. data/Manifest.txt +52 -0
  4. data/README.rdoc +2 -0
  5. data/Rakefile +33 -0
  6. data/bin/rhogen +8 -0
  7. data/generators/rhogen.rb +99 -0
  8. data/generators/templates/application/application.rb +4 -0
  9. data/generators/templates/application/index.html +25 -0
  10. data/generators/templates/model/config.rb +3 -0
  11. data/generators/templates/model/controller.rb +48 -0
  12. data/generators/templates/model/edit.erb +21 -0
  13. data/generators/templates/model/index.erb +10 -0
  14. data/generators/templates/model/new.erb +16 -0
  15. data/lib/ServeME.rb +7 -0
  16. data/lib/TestServe.rb +9 -0
  17. data/lib/builtinME.rb +481 -0
  18. data/lib/date.rb +1781 -0
  19. data/lib/date/format.rb +1313 -0
  20. data/lib/erb.rb +896 -0
  21. data/lib/find.rb +81 -0
  22. data/lib/rational.rb +19 -0
  23. data/lib/rho.rb +1 -0
  24. data/lib/rho/render.rb +9 -0
  25. data/lib/rho/renderME.rb +8 -0
  26. data/lib/rho/rho.rb +173 -0
  27. data/lib/rho/rhoapplication.rb +36 -0
  28. data/lib/rho/rhocontroller.rb +51 -0
  29. data/lib/rho/rhofsconnector.rb +39 -0
  30. data/lib/rho/rhofsconnectorME.rb +36 -0
  31. data/lib/rho/rhosupport.rb +139 -0
  32. data/lib/rhodes.rb +5 -0
  33. data/lib/rhofsconnector.rb +5 -0
  34. data/lib/rhom.rb +1 -0
  35. data/lib/rhom/rhom.rb +41 -0
  36. data/lib/rhom/rhom_db_adapter.rb +183 -0
  37. data/lib/rhom/rhom_db_adapterME.rb +91 -0
  38. data/lib/rhom/rhom_object.rb +53 -0
  39. data/lib/rhom/rhom_object_factory.rb +246 -0
  40. data/lib/singleton.rb +313 -0
  41. data/lib/time.rb +839 -0
  42. data/rhodes.gemspec +18 -0
  43. data/spec/app_generator_spec.rb +27 -0
  44. data/spec/generator_spec_helper.rb +12 -0
  45. data/spec/model_generator_spec.rb +28 -0
  46. data/spec/rho_spec.rb +28 -0
  47. data/spec/rhom_object_factory_spec.rb +147 -0
  48. data/spec/spec.opts +1 -0
  49. data/spec/spec_helper.rb +14 -0
  50. data/spec/stubs.rb +17 -0
  51. data/spec/syncdbtest.sqlite +0 -0
  52. data/tasks/rspec.rake +34 -0
  53. metadata +157 -0
data/lib/time.rb ADDED
@@ -0,0 +1,839 @@
1
+
2
+ #
3
+ # == Introduction
4
+ #
5
+ # This library extends the Time class:
6
+ # * conversion between date string and time object.
7
+ # * date-time defined by RFC 2822
8
+ # * HTTP-date defined by RFC 2616
9
+ # * dateTime defined by XML Schema Part 2: Datatypes (ISO 8601)
10
+ # * various formats handled by Date._parse (string to time only)
11
+ #
12
+ # == Design Issues
13
+ #
14
+ # === Specialized interface
15
+ #
16
+ # This library provides methods dedicated to special purposes:
17
+ # * RFC 2822, RFC 2616 and XML Schema.
18
+ # * They makes usual life easier.
19
+ #
20
+ # === Doesn't depend on strftime
21
+ #
22
+ # This library doesn't use +strftime+. Especially #rfc2822 doesn't depend
23
+ # on +strftime+ because:
24
+ #
25
+ # * %a and %b are locale sensitive
26
+ #
27
+ # Since they are locale sensitive, they may be replaced to
28
+ # invalid weekday/month name in some locales.
29
+ # Since ruby-1.6 doesn't invoke setlocale by default,
30
+ # the problem doesn't arise until some external library invokes setlocale.
31
+ # Ruby/GTK is the example of such library.
32
+ #
33
+ # * %z is not portable
34
+ #
35
+ # %z is required to generate zone in date-time of RFC 2822
36
+ # but it is not portable.
37
+ #
38
+ # == Revision Information
39
+ #
40
+ # $Id$
41
+ #
42
+
43
+ require 'date/format'
44
+
45
+ #
46
+ # Implements the extensions to the Time class that are described in the
47
+ # documentation for the time.rb library.
48
+ #
49
+ class Time
50
+ class << Time
51
+
52
+ ZoneOffset = {
53
+ 'UTC' => 0,
54
+ # ISO 8601
55
+ 'Z' => 0,
56
+ # RFC 822
57
+ 'UT' => 0, 'GMT' => 0,
58
+ 'EST' => -5, 'EDT' => -4,
59
+ 'CST' => -6, 'CDT' => -5,
60
+ 'MST' => -7, 'MDT' => -6,
61
+ 'PST' => -8, 'PDT' => -7,
62
+ # Following definition of military zones is original one.
63
+ # See RFC 1123 and RFC 2822 for the error in RFC 822.
64
+ 'A' => +1, 'B' => +2, 'C' => +3, 'D' => +4, 'E' => +5, 'F' => +6,
65
+ 'G' => +7, 'H' => +8, 'I' => +9, 'K' => +10, 'L' => +11, 'M' => +12,
66
+ 'N' => -1, 'O' => -2, 'P' => -3, 'Q' => -4, 'R' => -5, 'S' => -6,
67
+ 'T' => -7, 'U' => -8, 'V' => -9, 'W' => -10, 'X' => -11, 'Y' => -12,
68
+ }
69
+ def zone_offset(zone, year=self.now.year)
70
+ off = nil
71
+ zone = zone.upcase
72
+ if /\A([+-])(\d\d):?(\d\d)\z/ =~ zone
73
+ off = ($1 == '-' ? -1 : 1) * ($2.to_i * 60 + $3.to_i) * 60
74
+ elsif /\A[+-]\d\d\z/ =~ zone
75
+ off = zone.to_i * 3600
76
+ elsif ZoneOffset.include?(zone)
77
+ off = ZoneOffset[zone] * 3600
78
+ elsif ((t = self.local(year, 1, 1)).zone.upcase == zone rescue false)
79
+ off = t.utc_offset
80
+ elsif ((t = self.local(year, 7, 1)).zone.upcase == zone rescue false)
81
+ off = t.utc_offset
82
+ end
83
+ off
84
+ end
85
+
86
+ def zone_utc?(zone)
87
+ # * +0000 means localtime. [RFC 2822]
88
+ # * GMT is a localtime abbreviation in Europe/London, etc.
89
+ if /\A(?:-00:00|-0000|-00|UTC|Z|UT)\z/i =~ zone
90
+ true
91
+ else
92
+ false
93
+ end
94
+ end
95
+ private :zone_utc?
96
+
97
+ LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
98
+ CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
99
+ def month_days(y, m)
100
+ if ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)
101
+ LeapYearMonthDays[m-1]
102
+ else
103
+ CommonYearMonthDays[m-1]
104
+ end
105
+ end
106
+ private :month_days
107
+
108
+ def apply_offset(year, mon, day, hour, min, sec, off)
109
+ if off < 0
110
+ off = -off
111
+ off, o = off.divmod(60)
112
+ if o != 0 then sec += o; o, sec = sec.divmod(60); off += o end
113
+ off, o = off.divmod(60)
114
+ if o != 0 then min += o; o, min = min.divmod(60); off += o end
115
+ off, o = off.divmod(24)
116
+ if o != 0 then hour += o; o, hour = hour.divmod(24); off += o end
117
+ if off != 0
118
+ day += off
119
+ if month_days(year, mon) < day
120
+ mon += 1
121
+ if 12 < mon
122
+ mon = 1
123
+ year += 1
124
+ end
125
+ day = 1
126
+ end
127
+ end
128
+ elsif 0 < off
129
+ off, o = off.divmod(60)
130
+ if o != 0 then sec -= o; o, sec = sec.divmod(60); off -= o end
131
+ off, o = off.divmod(60)
132
+ if o != 0 then min -= o; o, min = min.divmod(60); off -= o end
133
+ off, o = off.divmod(24)
134
+ if o != 0 then hour -= o; o, hour = hour.divmod(24); off -= o end
135
+ if off != 0 then
136
+ day -= off
137
+ if day < 1
138
+ mon -= 1
139
+ if mon < 1
140
+ year -= 1
141
+ mon = 12
142
+ end
143
+ day = month_days(year, mon)
144
+ end
145
+ end
146
+ end
147
+ return year, mon, day, hour, min, sec
148
+ end
149
+ private :apply_offset
150
+
151
+ def make_time(year, mon, day, hour, min, sec, sec_fraction, zone, now)
152
+ usec = nil
153
+ usec = sec_fraction * 1000000 if sec_fraction
154
+ if now
155
+ begin
156
+ break if year; year = now.year
157
+ break if mon; mon = now.mon
158
+ break if day; day = now.day
159
+ break if hour; hour = now.hour
160
+ break if min; min = now.min
161
+ break if sec; sec = now.sec
162
+ break if sec_fraction; usec = now.tv_usec
163
+ end until true
164
+ end
165
+
166
+ year ||= 1970
167
+ mon ||= 1
168
+ day ||= 1
169
+ hour ||= 0
170
+ min ||= 0
171
+ sec ||= 0
172
+ usec ||= 0
173
+
174
+ off = nil
175
+ off = zone_offset(zone, year) if zone
176
+
177
+ if off
178
+ year, mon, day, hour, min, sec =
179
+ apply_offset(year, mon, day, hour, min, sec, off)
180
+ t = self.utc(year, mon, day, hour, min, sec, usec)
181
+ t.localtime if !zone_utc?(zone)
182
+ t
183
+ else
184
+ self.local(year, mon, day, hour, min, sec, usec)
185
+ end
186
+ end
187
+ private :make_time
188
+
189
+ #
190
+ # Parses +date+ using Date._parse and converts it to a Time object.
191
+ #
192
+ # If a block is given, the year described in +date+ is converted by the
193
+ # block. For example:
194
+ #
195
+ # Time.parse(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
196
+ #
197
+ # If the upper components of the given time are broken or missing, they are
198
+ # supplied with those of +now+. For the lower components, the minimum
199
+ # values (1 or 0) are assumed if broken or missing. For example:
200
+ #
201
+ # # Suppose it is "Thu Nov 29 14:33:20 GMT 2001" now and
202
+ # # your timezone is GMT:
203
+ # Time.parse("16:30") #=> Thu Nov 29 16:30:00 GMT 2001
204
+ # Time.parse("7/23") #=> Mon Jul 23 00:00:00 GMT 2001
205
+ # Time.parse("Aug 31") #=> Fri Aug 31 00:00:00 GMT 2001
206
+ #
207
+ # Since there are numerous conflicts among locally defined timezone
208
+ # abbreviations all over the world, this method is not made to
209
+ # understand all of them. For example, the abbreviation "CST" is
210
+ # used variously as:
211
+ #
212
+ # -06:00 in America/Chicago,
213
+ # -05:00 in America/Havana,
214
+ # +08:00 in Asia/Harbin,
215
+ # +09:30 in Australia/Darwin,
216
+ # +10:30 in Australia/Adelaide,
217
+ # etc.
218
+ #
219
+ # Based on the fact, this method only understands the timezone
220
+ # abbreviations described in RFC 822 and the system timezone, in the
221
+ # order named. (i.e. a definition in RFC 822 overrides the system
222
+ # timezone definition.) The system timezone is taken from
223
+ # <tt>Time.local(year, 1, 1).zone</tt> and
224
+ # <tt>Time.local(year, 7, 1).zone</tt>.
225
+ # If the extracted timezone abbreviation does not match any of them,
226
+ # it is ignored and the given time is regarded as a local time.
227
+ #
228
+ # ArgumentError is raised if Date._parse cannot extract information from
229
+ # +date+ or Time class cannot represent specified date.
230
+ #
231
+ # This method can be used as fail-safe for other parsing methods as:
232
+ #
233
+ # Time.rfc2822(date) rescue Time.parse(date)
234
+ # Time.httpdate(date) rescue Time.parse(date)
235
+ # Time.xmlschema(date) rescue Time.parse(date)
236
+ #
237
+ # A failure for Time.parse should be checked, though.
238
+ #
239
+ def parse(date, now=self.now)
240
+ d = Date._parse(date, false)
241
+ year = d[:year]
242
+ year = yield(year) if year && block_given?
243
+ make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
244
+ end
245
+
246
+ #
247
+ # Parses +date+ using Date._strptime and converts it to a Time object.
248
+ #
249
+ # If a block is given, the year described in +date+ is converted by the
250
+ # block. For example:
251
+ #
252
+ # Time.strptime(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}
253
+ def strptime(date, format, now=self.now)
254
+ d = Date._strptime(date, format)
255
+ raise ArgumentError, "invalid strptime format - `#{format}'" unless d
256
+ year = d[:year]
257
+ year = yield(year) if year && block_given?
258
+ make_time(year, d[:mon], d[:mday], d[:hour], d[:min], d[:sec], d[:sec_fraction], d[:zone], now)
259
+ end
260
+
261
+ MonthValue = {
262
+ 'JAN' => 1, 'FEB' => 2, 'MAR' => 3, 'APR' => 4, 'MAY' => 5, 'JUN' => 6,
263
+ 'JUL' => 7, 'AUG' => 8, 'SEP' => 9, 'OCT' =>10, 'NOV' =>11, 'DEC' =>12
264
+ }
265
+
266
+ #
267
+ # Parses +date+ as date-time defined by RFC 2822 and converts it to a Time
268
+ # object. The format is identical to the date format defined by RFC 822 and
269
+ # updated by RFC 1123.
270
+ #
271
+ # ArgumentError is raised if +date+ is not compliant with RFC 2822
272
+ # or Time class cannot represent specified date.
273
+ #
274
+ # See #rfc2822 for more information on this format.
275
+ #
276
+ def rfc2822(date)
277
+ if /\A\s*
278
+ (?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\s*,\s*)?
279
+ (\d{1,2})\s+
280
+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
281
+ (\d{2,})\s+
282
+ (\d{2})\s*
283
+ :\s*(\d{2})\s*
284
+ (?::\s*(\d{2}))?\s+
285
+ ([+-]\d{4}|
286
+ UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
287
+ # Since RFC 2822 permit comments, the regexp has no right anchor.
288
+ day = $1.to_i
289
+ mon = MonthValue[$2.upcase]
290
+ year = $3.to_i
291
+ hour = $4.to_i
292
+ min = $5.to_i
293
+ sec = $6 ? $6.to_i : 0
294
+ zone = $7
295
+
296
+ # following year completion is compliant with RFC 2822.
297
+ year = if year < 50
298
+ 2000 + year
299
+ elsif year < 1000
300
+ 1900 + year
301
+ else
302
+ year
303
+ end
304
+
305
+ year, mon, day, hour, min, sec =
306
+ apply_offset(year, mon, day, hour, min, sec, zone_offset(zone))
307
+ t = self.utc(year, mon, day, hour, min, sec)
308
+ t.localtime if !zone_utc?(zone)
309
+ t
310
+ else
311
+ raise ArgumentError.new("not RFC 2822 compliant date: #{date.inspect}")
312
+ end
313
+ end
314
+ alias rfc822 rfc2822
315
+
316
+ #
317
+ # Parses +date+ as HTTP-date defined by RFC 2616 and converts it to a Time
318
+ # object.
319
+ #
320
+ # ArgumentError is raised if +date+ is not compliant with RFC 2616 or Time
321
+ # class cannot represent specified date.
322
+ #
323
+ # See #httpdate for more information on this format.
324
+ #
325
+ def httpdate(date)
326
+ if /\A\s*
327
+ (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\x20
328
+ (\d{2})\x20
329
+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
330
+ (\d{4})\x20
331
+ (\d{2}):(\d{2}):(\d{2})\x20
332
+ GMT
333
+ \s*\z/ix =~ date
334
+ self.rfc2822(date)
335
+ elsif /\A\s*
336
+ (?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\x20
337
+ (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d)\x20
338
+ (\d\d):(\d\d):(\d\d)\x20
339
+ GMT
340
+ \s*\z/ix =~ date
341
+ year = $3.to_i
342
+ if year < 50
343
+ year += 2000
344
+ else
345
+ year += 1900
346
+ end
347
+ self.utc(year, $2, $1.to_i, $4.to_i, $5.to_i, $6.to_i)
348
+ elsif /\A\s*
349
+ (?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)\x20
350
+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\x20
351
+ (\d\d|\x20\d)\x20
352
+ (\d\d):(\d\d):(\d\d)\x20
353
+ (\d{4})
354
+ \s*\z/ix =~ date
355
+ self.utc($6.to_i, MonthValue[$1.upcase], $2.to_i,
356
+ $3.to_i, $4.to_i, $5.to_i)
357
+ else
358
+ raise ArgumentError.new("not RFC 2616 compliant date: #{date.inspect}")
359
+ end
360
+ end
361
+
362
+ #
363
+ # Parses +date+ as dateTime defined by XML Schema and converts it to a Time
364
+ # object. The format is restricted version of the format defined by ISO
365
+ # 8601.
366
+ #
367
+ # ArgumentError is raised if +date+ is not compliant with the format or Time
368
+ # class cannot represent specified date.
369
+ #
370
+ # See #xmlschema for more information on this format.
371
+ #
372
+ def xmlschema(date)
373
+ if /\A\s*
374
+ (-?\d+)-(\d\d)-(\d\d)
375
+ T
376
+ (\d\d):(\d\d):(\d\d)
377
+ (\.\d+)?
378
+ (Z|[+-]\d\d:\d\d)?
379
+ \s*\z/ix =~ date
380
+ year = $1.to_i
381
+ mon = $2.to_i
382
+ day = $3.to_i
383
+ hour = $4.to_i
384
+ min = $5.to_i
385
+ sec = $6.to_i
386
+ usec = 0
387
+ if $7
388
+ usec = Rational($7) * 1000000
389
+ end
390
+ if $8
391
+ zone = $8
392
+ year, mon, day, hour, min, sec =
393
+ apply_offset(year, mon, day, hour, min, sec, zone_offset(zone))
394
+ self.utc(year, mon, day, hour, min, sec, usec)
395
+ else
396
+ self.local(year, mon, day, hour, min, sec, usec)
397
+ end
398
+ else
399
+ raise ArgumentError.new("invalid date: #{date.inspect}")
400
+ end
401
+ end
402
+ alias iso8601 xmlschema
403
+ end # class << self
404
+
405
+ #
406
+ # Returns a string which represents the time as date-time defined by RFC 2822:
407
+ #
408
+ # day-of-week, DD month-name CCYY hh:mm:ss zone
409
+ #
410
+ # where zone is [+-]hhmm.
411
+ #
412
+ # If +self+ is a UTC time, -0000 is used as zone.
413
+ #
414
+ def rfc2822
415
+ sprintf('%s, %02d %s %d %02d:%02d:%02d ',
416
+ RFC2822_DAY_NAME[wday],
417
+ day, RFC2822_MONTH_NAME[mon-1], year,
418
+ hour, min, sec) +
419
+ if utc?
420
+ '-0000'
421
+ else
422
+ off = utc_offset
423
+ sign = off < 0 ? '-' : '+'
424
+ sprintf('%s%02d%02d', sign, *(off.abs / 60).divmod(60))
425
+ end
426
+ end
427
+ alias rfc822 rfc2822
428
+
429
+ RFC2822_DAY_NAME = [
430
+ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'
431
+ ]
432
+ RFC2822_MONTH_NAME = [
433
+ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
434
+ 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
435
+ ]
436
+
437
+ #
438
+ # Returns a string which represents the time as rfc1123-date of HTTP-date
439
+ # defined by RFC 2616:
440
+ #
441
+ # day-of-week, DD month-name CCYY hh:mm:ss GMT
442
+ #
443
+ # Note that the result is always UTC (GMT).
444
+ #
445
+ def httpdate
446
+ t = dup.utc
447
+ sprintf('%s, %02d %s %d %02d:%02d:%02d GMT',
448
+ RFC2822_DAY_NAME[t.wday],
449
+ t.day, RFC2822_MONTH_NAME[t.mon-1], t.year,
450
+ t.hour, t.min, t.sec)
451
+ end
452
+
453
+ #
454
+ # Returns a string which represents the time as dateTime defined by XML
455
+ # Schema:
456
+ #
457
+ # CCYY-MM-DDThh:mm:ssTZD
458
+ # CCYY-MM-DDThh:mm:ss.sssTZD
459
+ #
460
+ # where TZD is Z or [+-]hh:mm.
461
+ #
462
+ # If self is a UTC time, Z is used as TZD. [+-]hh:mm is used otherwise.
463
+ #
464
+ # +fractional_seconds+ specifies a number of digits of fractional seconds.
465
+ # Its default value is 0.
466
+ #
467
+ def xmlschema(fraction_digits=0)
468
+ sprintf('%d-%02d-%02dT%02d:%02d:%02d',
469
+ year, mon, day, hour, min, sec) +
470
+ if fraction_digits == 0
471
+ ''
472
+ elsif fraction_digits <= 9
473
+ '.' + sprintf('%09d', nsec)[0, fraction_digits]
474
+ else
475
+ '.' + sprintf('%09d', nsec) + '0' * (fraction_digits - 9)
476
+ end +
477
+ if utc?
478
+ 'Z'
479
+ else
480
+ off = utc_offset
481
+ sign = off < 0 ? '-' : '+'
482
+ sprintf('%s%02d:%02d', sign, *(off.abs / 60).divmod(60))
483
+ end
484
+ end
485
+ alias iso8601 xmlschema
486
+ end
487
+
488
+ if __FILE__ == $0
489
+ require 'test/unit'
490
+
491
+ class TimeExtentionTest < Test::Unit::TestCase # :nodoc:
492
+ def test_rfc822
493
+ assert_equal(Time.utc(1976, 8, 26, 14, 30) + 4 * 3600,
494
+ Time.rfc2822("26 Aug 76 14:30 EDT"))
495
+ assert_equal(Time.utc(1976, 8, 27, 9, 32) + 7 * 3600,
496
+ Time.rfc2822("27 Aug 76 09:32 PDT"))
497
+ end
498
+
499
+ def test_rfc2822
500
+ assert_equal(Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600,
501
+ Time.rfc2822("Fri, 21 Nov 1997 09:55:06 -0600"))
502
+ assert_equal(Time.utc(2003, 7, 1, 10, 52, 37) - 2 * 3600,
503
+ Time.rfc2822("Tue, 1 Jul 2003 10:52:37 +0200"))
504
+ assert_equal(Time.utc(1997, 11, 21, 10, 1, 10) + 6 * 3600,
505
+ Time.rfc2822("Fri, 21 Nov 1997 10:01:10 -0600"))
506
+ assert_equal(Time.utc(1997, 11, 21, 11, 0, 0) + 6 * 3600,
507
+ Time.rfc2822("Fri, 21 Nov 1997 11:00:00 -0600"))
508
+ assert_equal(Time.utc(1997, 11, 24, 14, 22, 1) + 8 * 3600,
509
+ Time.rfc2822("Mon, 24 Nov 1997 14:22:01 -0800"))
510
+ begin
511
+ Time.at(-1)
512
+ rescue ArgumentError
513
+ # ignore
514
+ else
515
+ assert_equal(Time.utc(1969, 2, 13, 23, 32, 54) + 3 * 3600 + 30 * 60,
516
+ Time.rfc2822("Thu, 13 Feb 1969 23:32:54 -0330"))
517
+ assert_equal(Time.utc(1969, 2, 13, 23, 32, 0) + 3 * 3600 + 30 * 60,
518
+ Time.rfc2822(" Thu,
519
+ 13
520
+ Feb
521
+ 1969
522
+ 23:32
523
+ -0330 (Newfoundland Time)"))
524
+ end
525
+ assert_equal(Time.utc(1997, 11, 21, 9, 55, 6),
526
+ Time.rfc2822("21 Nov 97 09:55:06 GMT"))
527
+ assert_equal(Time.utc(1997, 11, 21, 9, 55, 6) + 6 * 3600,
528
+ Time.rfc2822("Fri, 21 Nov 1997 09 : 55 : 06 -0600"))
529
+ assert_raise(ArgumentError) {
530
+ # inner comment is not supported.
531
+ Time.rfc2822("Fri, 21 Nov 1997 09(comment): 55 : 06 -0600")
532
+ }
533
+ end
534
+
535
+ def test_rfc2616
536
+ t = Time.utc(1994, 11, 6, 8, 49, 37)
537
+ assert_equal(t, Time.httpdate("Sun, 06 Nov 1994 08:49:37 GMT"))
538
+ assert_equal(t, Time.httpdate("Sunday, 06-Nov-94 08:49:37 GMT"))
539
+ assert_equal(t, Time.httpdate("Sun Nov 6 08:49:37 1994"))
540
+ assert_equal(Time.utc(1995, 11, 15, 6, 25, 24),
541
+ Time.httpdate("Wed, 15 Nov 1995 06:25:24 GMT"))
542
+ assert_equal(Time.utc(1995, 11, 15, 4, 58, 8),
543
+ Time.httpdate("Wed, 15 Nov 1995 04:58:08 GMT"))
544
+ assert_equal(Time.utc(1994, 11, 15, 8, 12, 31),
545
+ Time.httpdate("Tue, 15 Nov 1994 08:12:31 GMT"))
546
+ assert_equal(Time.utc(1994, 12, 1, 16, 0, 0),
547
+ Time.httpdate("Thu, 01 Dec 1994 16:00:00 GMT"))
548
+ assert_equal(Time.utc(1994, 10, 29, 19, 43, 31),
549
+ Time.httpdate("Sat, 29 Oct 1994 19:43:31 GMT"))
550
+ assert_equal(Time.utc(1994, 11, 15, 12, 45, 26),
551
+ Time.httpdate("Tue, 15 Nov 1994 12:45:26 GMT"))
552
+ assert_equal(Time.utc(1999, 12, 31, 23, 59, 59),
553
+ Time.httpdate("Fri, 31 Dec 1999 23:59:59 GMT"))
554
+
555
+ assert_equal(Time.utc(2007, 12, 23, 11, 22, 33),
556
+ Time.httpdate('Sunday, 23-Dec-07 11:22:33 GMT'))
557
+ end
558
+
559
+ def test_rfc3339
560
+ t = Time.utc(1985, 4, 12, 23, 20, 50, 520000)
561
+ s = "1985-04-12T23:20:50.52Z"
562
+ assert_equal(t, Time.iso8601(s))
563
+ assert_equal(s, t.iso8601(2))
564
+
565
+ t = Time.utc(1996, 12, 20, 0, 39, 57)
566
+ s = "1996-12-19T16:39:57-08:00"
567
+ assert_equal(t, Time.iso8601(s))
568
+ # There is no way to generate time string with arbitrary timezone.
569
+ s = "1996-12-20T00:39:57Z"
570
+ assert_equal(t, Time.iso8601(s))
571
+ assert_equal(s, t.iso8601)
572
+
573
+ t = Time.utc(1990, 12, 31, 23, 59, 60)
574
+ s = "1990-12-31T23:59:60Z"
575
+ assert_equal(t, Time.iso8601(s))
576
+ # leap second is representable only if timezone file has it.
577
+ s = "1990-12-31T15:59:60-08:00"
578
+ assert_equal(t, Time.iso8601(s))
579
+
580
+ begin
581
+ Time.at(-1)
582
+ rescue ArgumentError
583
+ # ignore
584
+ else
585
+ t = Time.utc(1937, 1, 1, 11, 40, 27, 870000)
586
+ s = "1937-01-01T12:00:27.87+00:20"
587
+ assert_equal(t, Time.iso8601(s))
588
+ end
589
+ end
590
+
591
+ # http://www.w3.org/TR/xmlschema-2/
592
+ def test_xmlschema
593
+ assert_equal(Time.utc(1999, 5, 31, 13, 20, 0) + 5 * 3600,
594
+ Time.xmlschema("1999-05-31T13:20:00-05:00"))
595
+ assert_equal(Time.local(2000, 1, 20, 12, 0, 0),
596
+ Time.xmlschema("2000-01-20T12:00:00"))
597
+ assert_equal(Time.utc(2000, 1, 20, 12, 0, 0),
598
+ Time.xmlschema("2000-01-20T12:00:00Z"))
599
+ assert_equal(Time.utc(2000, 1, 20, 12, 0, 0) - 12 * 3600,
600
+ Time.xmlschema("2000-01-20T12:00:00+12:00"))
601
+ assert_equal(Time.utc(2000, 1, 20, 12, 0, 0) + 13 * 3600,
602
+ Time.xmlschema("2000-01-20T12:00:00-13:00"))
603
+ assert_equal(Time.utc(2000, 3, 4, 23, 0, 0) - 3 * 3600,
604
+ Time.xmlschema("2000-03-04T23:00:00+03:00"))
605
+ assert_equal(Time.utc(2000, 3, 4, 20, 0, 0),
606
+ Time.xmlschema("2000-03-04T20:00:00Z"))
607
+ assert_equal(Time.local(2000, 1, 15, 0, 0, 0),
608
+ Time.xmlschema("2000-01-15T00:00:00"))
609
+ assert_equal(Time.local(2000, 2, 15, 0, 0, 0),
610
+ Time.xmlschema("2000-02-15T00:00:00"))
611
+ assert_equal(Time.local(2000, 1, 15, 12, 0, 0),
612
+ Time.xmlschema("2000-01-15T12:00:00"))
613
+ assert_equal(Time.utc(2000, 1, 16, 12, 0, 0),
614
+ Time.xmlschema("2000-01-16T12:00:00Z"))
615
+ assert_equal(Time.local(2000, 1, 1, 12, 0, 0),
616
+ Time.xmlschema("2000-01-01T12:00:00"))
617
+ assert_equal(Time.utc(1999, 12, 31, 23, 0, 0),
618
+ Time.xmlschema("1999-12-31T23:00:00Z"))
619
+ assert_equal(Time.local(2000, 1, 16, 12, 0, 0),
620
+ Time.xmlschema("2000-01-16T12:00:00"))
621
+ assert_equal(Time.local(2000, 1, 16, 0, 0, 0),
622
+ Time.xmlschema("2000-01-16T00:00:00"))
623
+ assert_equal(Time.utc(2000, 1, 12, 12, 13, 14),
624
+ Time.xmlschema("2000-01-12T12:13:14Z"))
625
+ assert_equal(Time.utc(2001, 4, 17, 19, 23, 17, 300000),
626
+ Time.xmlschema("2001-04-17T19:23:17.3Z"))
627
+ assert_raise(ArgumentError) { Time.xmlschema("2000-01-01T00:00:00.+00:00") }
628
+ end
629
+
630
+ def test_encode_xmlschema
631
+ t = Time.utc(2001, 4, 17, 19, 23, 17, 300000)
632
+ assert_equal("2001-04-17T19:23:17Z", t.xmlschema)
633
+ assert_equal("2001-04-17T19:23:17.3Z", t.xmlschema(1))
634
+ assert_equal("2001-04-17T19:23:17.300000Z", t.xmlschema(6))
635
+ assert_equal("2001-04-17T19:23:17.3000000Z", t.xmlschema(7))
636
+
637
+ t = Time.utc(2001, 4, 17, 19, 23, 17, 123456)
638
+ assert_equal("2001-04-17T19:23:17.1234560Z", t.xmlschema(7))
639
+ assert_equal("2001-04-17T19:23:17.123456Z", t.xmlschema(6))
640
+ assert_equal("2001-04-17T19:23:17.12345Z", t.xmlschema(5))
641
+ assert_equal("2001-04-17T19:23:17.1Z", t.xmlschema(1))
642
+
643
+ begin
644
+ Time.at(-1)
645
+ rescue ArgumentError
646
+ # ignore
647
+ else
648
+ t = Time.utc(1960, 12, 31, 23, 0, 0, 123456)
649
+ assert_equal("1960-12-31T23:00:00.123456Z", t.xmlschema(6))
650
+ end
651
+
652
+ assert_equal(249, Time.xmlschema("2008-06-05T23:49:23.000249+09:00").usec)
653
+ end
654
+
655
+ def test_completion
656
+ now = Time.local(2001,11,29,21,26,35)
657
+ assert_equal(Time.local( 2001,11,29,21,12),
658
+ Time.parse("2001/11/29 21:12", now))
659
+ assert_equal(Time.local( 2001,11,29),
660
+ Time.parse("2001/11/29", now))
661
+ assert_equal(Time.local( 2001,11,29),
662
+ Time.parse( "11/29", now))
663
+ #assert_equal(Time.local(2001,11,1), Time.parse("Nov", now))
664
+ assert_equal(Time.local( 2001,11,29,10,22),
665
+ Time.parse( "10:22", now))
666
+ end
667
+
668
+ def test_invalid
669
+ # They were actually used in some web sites.
670
+ assert_raise(ArgumentError) { Time.httpdate("1 Dec 2001 10:23:57 GMT") }
671
+ assert_raise(ArgumentError) { Time.httpdate("Sat, 1 Dec 2001 10:25:42 GMT") }
672
+ assert_raise(ArgumentError) { Time.httpdate("Sat, 1-Dec-2001 10:53:55 GMT") }
673
+ assert_raise(ArgumentError) { Time.httpdate("Saturday, 01-Dec-2001 10:15:34 GMT") }
674
+ assert_raise(ArgumentError) { Time.httpdate("Saturday, 01-Dec-101 11:10:07 GMT") }
675
+ assert_raise(ArgumentError) { Time.httpdate("Fri, 30 Nov 2001 21:30:00 JST") }
676
+
677
+ # They were actually used in some mails.
678
+ assert_raise(ArgumentError) { Time.rfc2822("01-5-20") }
679
+ assert_raise(ArgumentError) { Time.rfc2822("7/21/00") }
680
+ assert_raise(ArgumentError) { Time.rfc2822("2001-8-28") }
681
+ assert_raise(ArgumentError) { Time.rfc2822("00-5-6 1:13:06") }
682
+ assert_raise(ArgumentError) { Time.rfc2822("2001-9-27 9:36:49") }
683
+ assert_raise(ArgumentError) { Time.rfc2822("2000-12-13 11:01:11") }
684
+ assert_raise(ArgumentError) { Time.rfc2822("2001/10/17 04:29:55") }
685
+ assert_raise(ArgumentError) { Time.rfc2822("9/4/2001 9:23:19 PM") }
686
+ assert_raise(ArgumentError) { Time.rfc2822("01 Nov 2001 09:04:31") }
687
+ assert_raise(ArgumentError) { Time.rfc2822("13 Feb 2001 16:4 GMT") }
688
+ assert_raise(ArgumentError) { Time.rfc2822("01 Oct 00 5:41:19 PM") }
689
+ assert_raise(ArgumentError) { Time.rfc2822("2 Jul 00 00:51:37 JST") }
690
+ assert_raise(ArgumentError) { Time.rfc2822("01 11 2001 06:55:57 -0500") }
691
+ assert_raise(ArgumentError) { Time.rfc2822("18 \343\366\356\341\370 2000") }
692
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, Oct 2001 18:53:32") }
693
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 2 Nov 2001 03:47:54") }
694
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 27 Jul 2001 11.14.14 +0200") }
695
+ assert_raise(ArgumentError) { Time.rfc2822("Thu, 2 Nov 2000 04:13:53 -600") }
696
+ assert_raise(ArgumentError) { Time.rfc2822("Wed, 5 Apr 2000 22:57:09 JST") }
697
+ assert_raise(ArgumentError) { Time.rfc2822("Mon, 11 Sep 2000 19:47:33 00000") }
698
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 28 Apr 2000 20:40:47 +-900") }
699
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 19 Jan 2001 8:15:36 AM -0500") }
700
+ assert_raise(ArgumentError) { Time.rfc2822("Thursday, Sep 27 2001 7:42:35 AM EST") }
701
+ assert_raise(ArgumentError) { Time.rfc2822("3/11/2001 1:31:57 PM Pacific Daylight Time") }
702
+ assert_raise(ArgumentError) { Time.rfc2822("Mi, 28 Mrz 2001 11:51:36") }
703
+ assert_raise(ArgumentError) { Time.rfc2822("P, 30 sept 2001 23:03:14") }
704
+ assert_raise(ArgumentError) { Time.rfc2822("fr, 11 aug 2000 18:39:22") }
705
+ assert_raise(ArgumentError) { Time.rfc2822("Fr, 21 Sep 2001 17:44:03 -1000") }
706
+ assert_raise(ArgumentError) { Time.rfc2822("Mo, 18 Jun 2001 19:21:40 -1000") }
707
+ assert_raise(ArgumentError) { Time.rfc2822("l\366, 12 aug 2000 18:53:20") }
708
+ assert_raise(ArgumentError) { Time.rfc2822("l\366, 26 maj 2001 00:15:58") }
709
+ assert_raise(ArgumentError) { Time.rfc2822("Dom, 30 Sep 2001 17:36:30") }
710
+ assert_raise(ArgumentError) { Time.rfc2822("%&, 31 %2/ 2000 15:44:47 -0500") }
711
+ assert_raise(ArgumentError) { Time.rfc2822("dom, 26 ago 2001 03:57:07 -0300") }
712
+ assert_raise(ArgumentError) { Time.rfc2822("ter, 04 set 2001 16:27:58 -0300") }
713
+ assert_raise(ArgumentError) { Time.rfc2822("Wen, 3 oct 2001 23:17:49 -0400") }
714
+ assert_raise(ArgumentError) { Time.rfc2822("Wen, 3 oct 2001 23:17:49 -0400") }
715
+ assert_raise(ArgumentError) { Time.rfc2822("ele, 11 h: 2000 12:42:15 -0500") }
716
+ assert_raise(ArgumentError) { Time.rfc2822("Tue, 14 Aug 2001 3:55:3 +0200") }
717
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 25 Aug 2000 9:3:48 +0800") }
718
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 1 Dec 2000 0:57:50 EST") }
719
+ assert_raise(ArgumentError) { Time.rfc2822("Mon, 7 May 2001 9:39:51 +0200") }
720
+ assert_raise(ArgumentError) { Time.rfc2822("Wed, 1 Aug 2001 16:9:15 +0200") }
721
+ assert_raise(ArgumentError) { Time.rfc2822("Wed, 23 Aug 2000 9:17:36 +0800") }
722
+ assert_raise(ArgumentError) { Time.rfc2822("Fri, 11 Aug 2000 10:4:42 +0800") }
723
+ assert_raise(ArgumentError) { Time.rfc2822("Sat, 15 Sep 2001 13:22:2 +0300") }
724
+ assert_raise(ArgumentError) { Time.rfc2822("Wed,16 \276\305\324\302 2001 20:06:25 +0800") }
725
+ assert_raise(ArgumentError) { Time.rfc2822("Wed,7 \312\256\322\273\324\302 2001 23:47:22 +0800") }
726
+ assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=C5=DA),?= 10 2 2001 23:32:26 +0900 (JST)") }
727
+ assert_raise(ArgumentError) { Time.rfc2822("\307\341\314\343\332\311, 30 \344\346\335\343\310\321 2001 10:01:06") }
728
+ assert_raise(ArgumentError) { Time.rfc2822("=?iso-8859-1?Q?(=BF=E5),?= 12 =?iso-8859-1?Q?9=B7=EE?= 2001 14:52:41\n+0900 (JST)") }
729
+ end
730
+
731
+ def test_zone_0000
732
+ assert_equal(true, Time.parse("2000-01-01T00:00:00Z").utc?)
733
+ assert_equal(true, Time.parse("2000-01-01T00:00:00-00:00").utc?)
734
+ assert_equal(false, Time.parse("2000-01-01T00:00:00+00:00").utc?)
735
+ assert_equal(false, Time.parse("Sat, 01 Jan 2000 00:00:00 GMT").utc?)
736
+ assert_equal(true, Time.parse("Sat, 01 Jan 2000 00:00:00 -0000").utc?)
737
+ assert_equal(false, Time.parse("Sat, 01 Jan 2000 00:00:00 +0000").utc?)
738
+ assert_equal(false, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 GMT").utc?)
739
+ assert_equal(true, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 -0000").utc?)
740
+ assert_equal(false, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 +0000").utc?)
741
+ assert_equal(true, Time.rfc2822("Sat, 01 Jan 2000 00:00:00 UTC").utc?)
742
+ end
743
+
744
+ def test_parse_leap_second
745
+ t = Time.utc(1998,12,31,23,59,59)
746
+ assert_equal(t, Time.parse("Thu Dec 31 23:59:59 UTC 1998"))
747
+ assert_equal(t, Time.parse("Fri Dec 31 23:59:59 -0000 1998"));t.localtime
748
+ assert_equal(t, Time.parse("Fri Jan 1 08:59:59 +0900 1999"))
749
+ assert_equal(t, Time.parse("Fri Jan 1 00:59:59 +0100 1999"))
750
+ assert_equal(t, Time.parse("Fri Dec 31 23:59:59 +0000 1998"))
751
+ assert_equal(t, Time.parse("Fri Dec 31 22:59:59 -0100 1998"));t.utc
752
+ t += 1
753
+ assert_equal(t, Time.parse("Thu Dec 31 23:59:60 UTC 1998"))
754
+ assert_equal(t, Time.parse("Fri Dec 31 23:59:60 -0000 1998"));t.localtime
755
+ assert_equal(t, Time.parse("Fri Jan 1 08:59:60 +0900 1999"))
756
+ assert_equal(t, Time.parse("Fri Jan 1 00:59:60 +0100 1999"))
757
+ assert_equal(t, Time.parse("Fri Dec 31 23:59:60 +0000 1998"))
758
+ assert_equal(t, Time.parse("Fri Dec 31 22:59:60 -0100 1998"));t.utc
759
+ t += 1 if t.sec == 60
760
+ assert_equal(t, Time.parse("Thu Jan 1 00:00:00 UTC 1999"))
761
+ assert_equal(t, Time.parse("Fri Jan 1 00:00:00 -0000 1999"));t.localtime
762
+ assert_equal(t, Time.parse("Fri Jan 1 09:00:00 +0900 1999"))
763
+ assert_equal(t, Time.parse("Fri Jan 1 01:00:00 +0100 1999"))
764
+ assert_equal(t, Time.parse("Fri Jan 1 00:00:00 +0000 1999"))
765
+ assert_equal(t, Time.parse("Fri Dec 31 23:00:00 -0100 1998"))
766
+ end
767
+
768
+ def test_rfc2822_leap_second
769
+ t = Time.utc(1998,12,31,23,59,59)
770
+ assert_equal(t, Time.rfc2822("Thu, 31 Dec 1998 23:59:59 UTC"))
771
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:59 -0000"));t.localtime
772
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 08:59:59 +0900"))
773
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:59:59 +0100"))
774
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:59 +0000"))
775
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 22:59:59 -0100"));t.utc
776
+ t += 1
777
+ assert_equal(t, Time.rfc2822("Thu, 31 Dec 1998 23:59:60 UTC"))
778
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:60 -0000"));t.localtime
779
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 08:59:60 +0900"))
780
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:59:60 +0100"))
781
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:59:60 +0000"))
782
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 22:59:60 -0100"));t.utc
783
+ t += 1 if t.sec == 60
784
+ assert_equal(t, Time.rfc2822("Thu, 1 Jan 1999 00:00:00 UTC"))
785
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:00:00 -0000"));t.localtime
786
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 09:00:00 +0900"))
787
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 01:00:00 +0100"))
788
+ assert_equal(t, Time.rfc2822("Fri, 1 Jan 1999 00:00:00 +0000"))
789
+ assert_equal(t, Time.rfc2822("Fri, 31 Dec 1998 23:00:00 -0100"))
790
+ end
791
+
792
+ def test_xmlschema_leap_second
793
+ t = Time.utc(1998,12,31,23,59,59)
794
+ assert_equal(t, Time.xmlschema("1998-12-31T23:59:59Z"))
795
+ assert_equal(t, Time.xmlschema("1998-12-31T23:59:59-00:00"));t.localtime
796
+ assert_equal(t, Time.xmlschema("1999-01-01T08:59:59+09:00"))
797
+ assert_equal(t, Time.xmlschema("1999-01-01T00:59:59+01:00"))
798
+ assert_equal(t, Time.xmlschema("1998-12-31T23:59:59+00:00"))
799
+ assert_equal(t, Time.xmlschema("1998-12-31T22:59:59-01:00"));t.utc
800
+ t += 1
801
+ assert_equal(t, Time.xmlschema("1998-12-31T23:59:60Z"))
802
+ assert_equal(t, Time.xmlschema("1998-12-31T23:59:60-00:00"));t.localtime
803
+ assert_equal(t, Time.xmlschema("1999-01-01T08:59:60+09:00"))
804
+ assert_equal(t, Time.xmlschema("1999-01-01T00:59:60+01:00"))
805
+ assert_equal(t, Time.xmlschema("1998-12-31T23:59:60+00:00"))
806
+ assert_equal(t, Time.xmlschema("1998-12-31T22:59:60-01:00"));t.utc
807
+ t += 1 if t.sec == 60
808
+ assert_equal(t, Time.xmlschema("1999-01-01T00:00:00Z"))
809
+ assert_equal(t, Time.xmlschema("1999-01-01T00:00:00-00:00"));t.localtime
810
+ assert_equal(t, Time.xmlschema("1999-01-01T09:00:00+09:00"))
811
+ assert_equal(t, Time.xmlschema("1999-01-01T01:00:00+01:00"))
812
+ assert_equal(t, Time.xmlschema("1999-01-01T00:00:00+00:00"))
813
+ assert_equal(t, Time.xmlschema("1998-12-31T23:00:00-01:00"))
814
+ end
815
+
816
+ def test_xmlschema_fraction
817
+ assert_equal(500000, Time.xmlschema("2000-01-01T00:00:00.5+00:00").tv_usec)
818
+ end
819
+
820
+ def test_ruby_talk_152866
821
+ t = Time::xmlschema('2005-08-30T22:48:00-07:00')
822
+ assert_equal(31, t.day)
823
+ assert_equal(8, t.mon)
824
+ end
825
+
826
+ def test_parse_fraction
827
+ assert_equal(500000, Time.parse("2000-01-01T00:00:00.5+00:00").tv_usec)
828
+ end
829
+
830
+ def test_strptime
831
+ assert_equal(Time.utc(2005, 8, 28, 06, 54, 20), Time.strptime("28/Aug/2005:06:54:20 +0000", "%d/%b/%Y:%T %z"))
832
+ end
833
+
834
+ def test_nsec
835
+ assert_equal(123456789, Time.xmlschema("2000-01-01T00:00:00.123456789+00:00").tv_nsec)
836
+ assert_equal(123456789, Time.parse("2000-01-01T00:00:00.123456789+00:00").tv_nsec)
837
+ end
838
+ end
839
+ end