tzinfo 1.2.7 → 2.0.2

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 (145) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.yardopts +3 -0
  5. data/CHANGES.md +489 -382
  6. data/LICENSE +12 -12
  7. data/README.md +368 -114
  8. data/lib/tzinfo.rb +59 -29
  9. data/lib/tzinfo/country.rb +141 -129
  10. data/lib/tzinfo/country_timezone.rb +70 -112
  11. data/lib/tzinfo/data_source.rb +389 -144
  12. data/lib/tzinfo/data_sources.rb +8 -0
  13. data/lib/tzinfo/data_sources/constant_offset_data_timezone_info.rb +56 -0
  14. data/lib/tzinfo/data_sources/country_info.rb +42 -0
  15. data/lib/tzinfo/data_sources/data_timezone_info.rb +91 -0
  16. data/lib/tzinfo/data_sources/linked_timezone_info.rb +33 -0
  17. data/lib/tzinfo/data_sources/ruby_data_source.rb +145 -0
  18. data/lib/tzinfo/data_sources/timezone_info.rb +47 -0
  19. data/lib/tzinfo/data_sources/transitions_data_timezone_info.rb +214 -0
  20. data/lib/tzinfo/data_sources/zoneinfo_data_source.rb +577 -0
  21. data/lib/tzinfo/data_sources/zoneinfo_reader.rb +288 -0
  22. data/lib/tzinfo/data_timezone.rb +33 -47
  23. data/lib/tzinfo/datetime_with_offset.rb +153 -0
  24. data/lib/tzinfo/format1.rb +10 -0
  25. data/lib/tzinfo/format1/country_definer.rb +17 -0
  26. data/lib/tzinfo/format1/country_index_definition.rb +64 -0
  27. data/lib/tzinfo/format1/timezone_definer.rb +64 -0
  28. data/lib/tzinfo/format1/timezone_definition.rb +39 -0
  29. data/lib/tzinfo/format1/timezone_index_definition.rb +77 -0
  30. data/lib/tzinfo/format2.rb +10 -0
  31. data/lib/tzinfo/format2/country_definer.rb +68 -0
  32. data/lib/tzinfo/format2/country_index_definer.rb +68 -0
  33. data/lib/tzinfo/format2/country_index_definition.rb +46 -0
  34. data/lib/tzinfo/format2/timezone_definer.rb +94 -0
  35. data/lib/tzinfo/format2/timezone_definition.rb +73 -0
  36. data/lib/tzinfo/format2/timezone_index_definer.rb +45 -0
  37. data/lib/tzinfo/format2/timezone_index_definition.rb +55 -0
  38. data/lib/tzinfo/info_timezone.rb +26 -21
  39. data/lib/tzinfo/linked_timezone.rb +33 -52
  40. data/lib/tzinfo/offset_timezone_period.rb +42 -0
  41. data/lib/tzinfo/string_deduper.rb +118 -0
  42. data/lib/tzinfo/time_with_offset.rb +128 -0
  43. data/lib/tzinfo/timestamp.rb +548 -0
  44. data/lib/tzinfo/timestamp_with_offset.rb +85 -0
  45. data/lib/tzinfo/timezone.rb +989 -502
  46. data/lib/tzinfo/timezone_offset.rb +84 -74
  47. data/lib/tzinfo/timezone_period.rb +151 -217
  48. data/lib/tzinfo/timezone_proxy.rb +70 -79
  49. data/lib/tzinfo/timezone_transition.rb +77 -109
  50. data/lib/tzinfo/transitions_timezone_period.rb +63 -0
  51. data/lib/tzinfo/untaint_ext.rb +18 -0
  52. data/lib/tzinfo/version.rb +7 -0
  53. data/lib/tzinfo/with_offset.rb +61 -0
  54. metadata +42 -98
  55. metadata.gz.sig +0 -0
  56. data/Rakefile +0 -107
  57. data/lib/tzinfo/country_index_definition.rb +0 -31
  58. data/lib/tzinfo/country_info.rb +0 -42
  59. data/lib/tzinfo/data_timezone_info.rb +0 -55
  60. data/lib/tzinfo/linked_timezone_info.rb +0 -26
  61. data/lib/tzinfo/offset_rationals.rb +0 -77
  62. data/lib/tzinfo/ruby_core_support.rb +0 -169
  63. data/lib/tzinfo/ruby_country_info.rb +0 -74
  64. data/lib/tzinfo/ruby_data_source.rb +0 -140
  65. data/lib/tzinfo/time_or_datetime.rb +0 -340
  66. data/lib/tzinfo/timezone_definition.rb +0 -36
  67. data/lib/tzinfo/timezone_index_definition.rb +0 -54
  68. data/lib/tzinfo/timezone_info.rb +0 -30
  69. data/lib/tzinfo/timezone_transition_definition.rb +0 -104
  70. data/lib/tzinfo/transition_data_timezone_info.rb +0 -274
  71. data/lib/tzinfo/zoneinfo_country_info.rb +0 -37
  72. data/lib/tzinfo/zoneinfo_data_source.rb +0 -496
  73. data/lib/tzinfo/zoneinfo_timezone_info.rb +0 -300
  74. data/test/tc_country.rb +0 -238
  75. data/test/tc_country_index_definition.rb +0 -69
  76. data/test/tc_country_info.rb +0 -16
  77. data/test/tc_country_timezone.rb +0 -173
  78. data/test/tc_data_source.rb +0 -218
  79. data/test/tc_data_timezone.rb +0 -99
  80. data/test/tc_data_timezone_info.rb +0 -18
  81. data/test/tc_info_timezone.rb +0 -34
  82. data/test/tc_linked_timezone.rb +0 -155
  83. data/test/tc_linked_timezone_info.rb +0 -23
  84. data/test/tc_offset_rationals.rb +0 -23
  85. data/test/tc_ruby_core_support.rb +0 -168
  86. data/test/tc_ruby_country_info.rb +0 -110
  87. data/test/tc_ruby_data_source.rb +0 -167
  88. data/test/tc_time_or_datetime.rb +0 -660
  89. data/test/tc_timezone.rb +0 -1361
  90. data/test/tc_timezone_definition.rb +0 -113
  91. data/test/tc_timezone_index_definition.rb +0 -73
  92. data/test/tc_timezone_info.rb +0 -11
  93. data/test/tc_timezone_london.rb +0 -143
  94. data/test/tc_timezone_melbourne.rb +0 -142
  95. data/test/tc_timezone_new_york.rb +0 -142
  96. data/test/tc_timezone_offset.rb +0 -126
  97. data/test/tc_timezone_period.rb +0 -555
  98. data/test/tc_timezone_proxy.rb +0 -136
  99. data/test/tc_timezone_transition.rb +0 -366
  100. data/test/tc_timezone_transition_definition.rb +0 -295
  101. data/test/tc_timezone_utc.rb +0 -27
  102. data/test/tc_transition_data_timezone_info.rb +0 -433
  103. data/test/tc_zoneinfo_country_info.rb +0 -78
  104. data/test/tc_zoneinfo_data_source.rb +0 -1204
  105. data/test/tc_zoneinfo_timezone_info.rb +0 -1236
  106. data/test/test_utils.rb +0 -192
  107. data/test/ts_all.rb +0 -7
  108. data/test/ts_all_ruby.rb +0 -5
  109. data/test/ts_all_zoneinfo.rb +0 -9
  110. data/test/tzinfo-data/tzinfo/data.rb +0 -8
  111. data/test/tzinfo-data/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb +0 -89
  112. data/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb +0 -315
  113. data/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb +0 -218
  114. data/test/tzinfo-data/tzinfo/data/definitions/EST.rb +0 -19
  115. data/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__m__1.rb +0 -21
  116. data/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__p__1.rb +0 -21
  117. data/test/tzinfo-data/tzinfo/data/definitions/Etc/UTC.rb +0 -21
  118. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Amsterdam.rb +0 -261
  119. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb +0 -186
  120. data/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb +0 -321
  121. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb +0 -265
  122. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb +0 -220
  123. data/test/tzinfo-data/tzinfo/data/definitions/UTC.rb +0 -16
  124. data/test/tzinfo-data/tzinfo/data/indexes/countries.rb +0 -927
  125. data/test/tzinfo-data/tzinfo/data/indexes/timezones.rb +0 -596
  126. data/test/tzinfo-data/tzinfo/data/version.rb +0 -14
  127. data/test/zoneinfo/America/Argentina/Buenos_Aires +0 -0
  128. data/test/zoneinfo/America/New_York +0 -0
  129. data/test/zoneinfo/Australia/Melbourne +0 -0
  130. data/test/zoneinfo/EST +0 -0
  131. data/test/zoneinfo/Etc/UTC +0 -0
  132. data/test/zoneinfo/Europe/Amsterdam +0 -0
  133. data/test/zoneinfo/Europe/Andorra +0 -0
  134. data/test/zoneinfo/Europe/London +0 -0
  135. data/test/zoneinfo/Europe/Paris +0 -0
  136. data/test/zoneinfo/Europe/Prague +0 -0
  137. data/test/zoneinfo/Factory +0 -0
  138. data/test/zoneinfo/iso3166.tab +0 -275
  139. data/test/zoneinfo/leapseconds +0 -61
  140. data/test/zoneinfo/posix/Europe/London +0 -0
  141. data/test/zoneinfo/posixrules +0 -0
  142. data/test/zoneinfo/right/Europe/London +0 -0
  143. data/test/zoneinfo/zone.tab +0 -439
  144. data/test/zoneinfo/zone1970.tab +0 -369
  145. data/tzinfo.gemspec +0 -21
@@ -1,1361 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils')
2
-
3
- include TZInfo
4
-
5
- # Use send as a workaround for erroneous 'wrong number of arguments' errors with
6
- # JRuby 9.0.5.0 when calling methods with Java implementations. See #114.
7
- send(:using, TaintExt) if Module.const_defined?(:TaintExt)
8
-
9
- class TCTimezone < Minitest::Test
10
-
11
- class BlockCalled < StandardError
12
- end
13
-
14
- class TestTimezone < Timezone
15
- def self.new(identifier, period_for_utc = nil, periods_for_local = nil, expected = nil)
16
- t = super()
17
- t.send(:setup, identifier, period_for_utc, periods_for_local, expected)
18
- t
19
- end
20
-
21
- def identifier
22
- @identifier
23
- end
24
-
25
- def period_for_utc(utc)
26
- utc = TimeOrDateTime.wrap(utc)
27
- raise "Unexpected utc #{utc} in period_for_utc" unless @expected.eql?(utc)
28
- @period_for_utc
29
- end
30
-
31
- def periods_for_local(local)
32
- local = TimeOrDateTime.wrap(local)
33
- raise "Unexpected local #{local} in periods_for_local" unless @expected.eql?(local)
34
- @periods_for_local.clone
35
- end
36
-
37
- def transitions_up_to(utc_to, utc_from = nil)
38
- raise 'transitions_up_to called'
39
- end
40
-
41
- private
42
- def setup(identifier, period_for_utc, periods_for_local, expected)
43
- @identifier = identifier
44
- @period_for_utc = period_for_utc
45
- @periods_for_local = periods_for_local || []
46
- @expected = TimeOrDateTime.wrap(expected)
47
- end
48
- end
49
-
50
- class OffsetsUpToTestTimezone < Timezone
51
- def self.new(identifier, expected_utc_to, expected_utc_from, transitions_up_to)
52
- t = super()
53
- t.send(:setup, identifier, expected_utc_to, expected_utc_from, transitions_up_to)
54
- t
55
- end
56
-
57
- def identifier
58
- @identifier
59
- end
60
-
61
- def period_for_utc(utc)
62
- raise 'period_for_utc called'
63
- end
64
-
65
- def periods_for_local(local)
66
- raise 'periods_for_local called'
67
- end
68
-
69
- def transitions_up_to(utc_to, utc_from = nil)
70
- utc_to = TimeOrDateTime.wrap(utc_to)
71
- raise "Unexpected utc_to #{utc_to || 'nil'} in transitions_up_to" unless @expected_utc_to.eql?(utc_to)
72
-
73
- utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil
74
- raise "Unexpected utc_from #{utc_from || 'nil'} in transitions_up_to" unless @expected_utc_from.eql?(utc_from)
75
-
76
- if utc_from && utc_to <= utc_from
77
- raise ArgumentError, 'utc_to must be greater than utc_from'
78
- end
79
-
80
- @transitions_up_to
81
- end
82
-
83
- private
84
-
85
- def setup(identifier, expected_utc_to, expected_utc_from, transitions_up_to)
86
- @identifier = identifier
87
- @expected_utc_to = TimeOrDateTime.wrap(expected_utc_to)
88
- @expected_utc_from = expected_utc_from ? TimeOrDateTime.wrap(expected_utc_from) : nil
89
- @transitions_up_to = transitions_up_to
90
- end
91
- end
92
-
93
- class OffsetsUpToNoTransitionsTestTimezone < Timezone
94
- def self.new(identifier, expected_utc_to, expected_utc_from, period_for_utc)
95
- t = super()
96
- t.send(:setup, identifier, expected_utc_to, expected_utc_from, period_for_utc)
97
- t
98
- end
99
-
100
- def identifier
101
- @identifier
102
- end
103
-
104
- def period_for_utc(utc)
105
- utc = TimeOrDateTime.wrap(utc)
106
-
107
- raise "Unexpected utc #{utc} in period_for_utc (should be utc_from)" if @expected_utc_from && !@expected_utc_from.eql?(utc)
108
- raise "Unexpected utc #{utc} in period_for_utc (should be < utc_to)" if !@expected_utc_from && @expected_utc_to <= utc
109
-
110
- @period_for_utc
111
- end
112
-
113
- def periods_for_local(local)
114
- raise 'periods_for_local called'
115
- end
116
-
117
- def transitions_up_to(utc_to, utc_from = nil)
118
- utc_to = TimeOrDateTime.wrap(utc_to)
119
- raise "Unexpected utc_to #{utc_to || 'nil'} in transitions_up_to" unless @expected_utc_to.eql?(utc_to)
120
-
121
- utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil
122
- raise "Unexpected utc_from #{utc_from || 'nil'} in transitions_up_to" unless @expected_utc_from.eql?(utc_from)
123
-
124
- if utc_from && utc_to <= utc_from
125
- raise ArgumentError, 'utc_to must be greater than utc_from'
126
- end
127
-
128
- []
129
- end
130
-
131
- private
132
-
133
- def setup(identifier, expected_utc_to, expected_utc_from, period_for_utc)
134
- @identifier = identifier
135
- @expected_utc_to = TimeOrDateTime.wrap(expected_utc_to)
136
- @expected_utc_from = expected_utc_from ? TimeOrDateTime.wrap(expected_utc_from) : nil
137
- @period_for_utc = period_for_utc
138
- end
139
- end
140
-
141
- class TestTimezoneTransition < TimezoneTransition
142
- def initialize(offset, previous_offset, at)
143
- super(offset, previous_offset)
144
- @at = TimeOrDateTime.wrap(at)
145
- end
146
-
147
- def at
148
- @at
149
- end
150
- end
151
-
152
- def setup
153
- @orig_default_dst = Timezone.default_dst
154
- @orig_data_source = DataSource.get
155
- Timezone.send :init_loaded_zones
156
- end
157
-
158
- def teardown
159
- Timezone.default_dst = @orig_default_dst
160
- DataSource.set(@orig_data_source)
161
- end
162
-
163
- def test_default_dst_initial_value
164
- assert_nil(Timezone.default_dst)
165
- end
166
-
167
- def test_set_default_dst
168
- Timezone.default_dst = true
169
- assert_equal(true, Timezone.default_dst)
170
- Timezone.default_dst = false
171
- assert_equal(false, Timezone.default_dst)
172
- Timezone.default_dst = nil
173
- assert_nil(Timezone.default_dst)
174
- Timezone.default_dst = 0
175
- assert_equal(true, Timezone.default_dst)
176
- end
177
-
178
- def test_get_valid_1
179
- tz = Timezone.get('Europe/London')
180
-
181
- assert_kind_of(DataTimezone, tz)
182
- assert_equal('Europe/London', tz.identifier)
183
- end
184
-
185
- def test_get_valid_2
186
- tz = Timezone.get('UTC')
187
-
188
- # ZoneinfoDataSource doesn't return LinkedTimezoneInfo for any timezone.
189
- if DataSource.get.load_timezone_info('UTC').kind_of?(LinkedTimezoneInfo)
190
- assert_kind_of(LinkedTimezone, tz)
191
- else
192
- assert_kind_of(DataTimezone, tz)
193
- end
194
-
195
- assert_equal('UTC', tz.identifier)
196
- end
197
-
198
- def test_get_valid_3
199
- tz = Timezone.get('America/Argentina/Buenos_Aires')
200
-
201
- assert_kind_of(DataTimezone, tz)
202
- assert_equal('America/Argentina/Buenos_Aires', tz.identifier)
203
- end
204
-
205
- def test_get_same_instance
206
- tz1 = Timezone.get('Europe/London')
207
- tz2 = Timezone.get('Europe/London')
208
- assert_same(tz1, tz2)
209
- end
210
-
211
- def test_get_not_exist
212
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get('Nowhere/Special') }
213
- end
214
-
215
- def test_get_invalid
216
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get('../Definitions/UTC') }
217
- end
218
-
219
- def test_get_nil
220
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get(nil) }
221
- end
222
-
223
- def test_get_case
224
- Timezone.get('Europe/Prague')
225
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get('Europe/prague') }
226
- end
227
-
228
- def test_get_proxy_valid
229
- proxy = Timezone.get_proxy('Europe/London')
230
- assert_kind_of(TimezoneProxy, proxy)
231
- assert_equal('Europe/London', proxy.identifier)
232
- end
233
-
234
- def test_get_proxy_not_exist
235
- proxy = Timezone.get_proxy('Not/There')
236
- assert_kind_of(TimezoneProxy, proxy)
237
- assert_equal('Not/There', proxy.identifier)
238
- end
239
-
240
- def test_get_proxy_invalid
241
- proxy = Timezone.get_proxy('../Invalid/Identifier')
242
- assert_kind_of(TimezoneProxy, proxy)
243
- assert_equal('../Invalid/Identifier', proxy.identifier)
244
- end
245
-
246
- def test_get_tainted_loaded
247
- Timezone.get('Europe/Andorra')
248
-
249
- safe_test(:unavailable => :skip) do
250
- identifier = 'Europe/Andorra'.dup.taint
251
- assert(identifier.tainted?)
252
- tz = Timezone.get(identifier)
253
- assert_equal('Europe/Andorra', tz.identifier)
254
- assert(identifier.tainted?)
255
- end
256
- end
257
-
258
- def test_get_tainted_and_frozen_loaded
259
- Timezone.get('Europe/Andorra')
260
-
261
- safe_test do
262
- tz = Timezone.get('Europe/Andorra'.dup.taint.freeze)
263
- assert_equal('Europe/Andorra', tz.identifier)
264
- end
265
- end
266
-
267
- def test_get_tainted_not_previously_loaded
268
- skip_if_has_bug_14060
269
-
270
- safe_test(:unavailable => :skip) do
271
- identifier = 'Europe/Andorra'.dup.taint
272
- assert(identifier.tainted?)
273
- tz = Timezone.get(identifier)
274
- assert_equal('Europe/Andorra', tz.identifier)
275
- assert(identifier.tainted?)
276
- end
277
- end
278
-
279
- def test_get_tainted_and_frozen_not_previously_loaded
280
- skip_if_has_bug_14060
281
-
282
- safe_test do
283
- tz = Timezone.get('Europe/Amsterdam'.dup.taint.freeze)
284
- assert_equal('Europe/Amsterdam', tz.identifier)
285
- end
286
- end
287
-
288
- def test_new_no_args
289
- tz = Timezone.new
290
-
291
- assert_raises(UnknownTimezone) { tz.identifier }
292
- assert_raises(UnknownTimezone) { tz.friendly_identifier }
293
- assert_raises(UnknownTimezone) { tz.utc_to_local(DateTime.new(2006,1,1,1,0,0)) }
294
- assert_raises(UnknownTimezone) { tz.local_to_utc(DateTime.new(2006,1,1,1,0,0)) }
295
- assert_raises(UnknownTimezone) { tz.period_for_utc(DateTime.new(2006,1,1,1,0,0)) }
296
- assert_raises(UnknownTimezone) { tz.periods_for_local(DateTime.new(2006,1,1,1,0,0)) }
297
- assert_raises(UnknownTimezone) { tz.period_for_local(DateTime.new(2006,1,1,1,0,0)) }
298
- assert_raises(UnknownTimezone) { tz.now }
299
- assert_raises(UnknownTimezone) { tz.current_period_and_time }
300
- assert_raises(UnknownTimezone) { tz.transitions_up_to(DateTime.new(2006,1,1,1,0,0)) }
301
- assert_raises(UnknownTimezone) { tz.canonical_identifier }
302
- assert_raises(UnknownTimezone) { tz.canonical_zone }
303
- end
304
-
305
- def test_new_nil
306
- tz = Timezone.new(nil)
307
-
308
- assert_raises(UnknownTimezone) { tz.identifier }
309
- assert_raises(UnknownTimezone) { tz.friendly_identifier }
310
- assert_raises(UnknownTimezone) { tz.utc_to_local(DateTime.new(2006,1,1,1,0,0)) }
311
- assert_raises(UnknownTimezone) { tz.local_to_utc(DateTime.new(2006,1,1,1,0,0)) }
312
- assert_raises(UnknownTimezone) { tz.period_for_utc(DateTime.new(2006,1,1,1,0,0)) }
313
- assert_raises(UnknownTimezone) { tz.periods_for_local(DateTime.new(2006,1,1,1,0,0)) }
314
- assert_raises(UnknownTimezone) { tz.period_for_local(DateTime.new(2006,1,1,1,0,0)) }
315
- assert_raises(UnknownTimezone) { tz.now }
316
- assert_raises(UnknownTimezone) { tz.current_period_and_time }
317
- assert_raises(UnknownTimezone) { tz.transitions_up_to(DateTime.new(2006,1,1,1,0,0)) }
318
- assert_raises(UnknownTimezone) { tz.canonical_identifier }
319
- assert_raises(UnknownTimezone) { tz.canonical_zone }
320
- end
321
-
322
- def test_new_arg
323
- tz = Timezone.new('Europe/London')
324
- assert_same(Timezone.get('Europe/London'), tz)
325
- end
326
-
327
- def test_new_arg_not_exist
328
- assert_raises(InvalidTimezoneIdentifier) { Timezone.new('Nowhere/Special') }
329
- end
330
-
331
- def test_all
332
- all = Timezone.all
333
- expected = DataSource.get.timezone_identifiers.collect {|identifier| Timezone.get_proxy(identifier)}
334
- assert_equal(expected, all)
335
- end
336
-
337
- def test_all_identifiers
338
- all = Timezone.all_identifiers
339
- assert_equal(DataSource.get.timezone_identifiers, all)
340
- end
341
-
342
- def test_all_data_zones
343
- all_data = Timezone.all_data_zones
344
- expected = DataSource.get.data_timezone_identifiers.collect {|identifier| Timezone.get_proxy(identifier)}
345
- assert_equal(expected, all_data)
346
- end
347
-
348
- def test_all_data_zone_identifiers
349
- all_data = Timezone.all_data_zone_identifiers
350
- assert_equal(DataSource.get.data_timezone_identifiers, all_data)
351
- end
352
-
353
- def test_all_linked_zones
354
- all_linked = Timezone.all_linked_zones
355
- expected = DataSource.get.linked_timezone_identifiers.collect {|identifier| Timezone.get_proxy(identifier)}
356
- assert_equal(expected, all_linked)
357
- end
358
-
359
- def test_all_linked_zone_identifiers
360
- all_linked = Timezone.all_linked_zone_identifiers
361
- assert_equal(DataSource.get.linked_timezone_identifiers, all_linked)
362
- end
363
-
364
- def test_all_country_zones
365
- # Probably should relax this test - just need all the zones, don't care
366
- # about order.
367
- expected = Country.all.inject([]) {|result,country|
368
- result += country.zones
369
- }
370
- expected.uniq!
371
-
372
- all_country_zones = Timezone.all_country_zones
373
- assert_equal(expected, all_country_zones)
374
-
375
- all_country_zone_identifiers = Timezone.all_country_zone_identifiers
376
- assert_equal(all_country_zone_identifiers.length, all_country_zones.length)
377
-
378
- all_country_zones.each {|zone|
379
- assert_kind_of(TimezoneProxy, zone)
380
- assert(all_country_zone_identifiers.include?(zone.identifier))
381
- }
382
- end
383
-
384
- def test_all_country_zone_identifiers
385
- # Probably should relax this test - just need all the zones, don't care
386
- # about order.
387
- expected = Country.all.inject([]) {|result,country|
388
- result += country.zone_identifiers
389
- }
390
- expected.uniq!
391
-
392
- assert_equal(expected, Timezone.all_country_zone_identifiers)
393
- end
394
-
395
- def test_us_zones
396
- # Probably should relax this test - just need all the zones, don't care
397
- # about order.
398
- us_zones = Timezone.us_zones
399
- assert_equal(Country.get('US').zones.uniq, us_zones)
400
-
401
- us_zone_identifiers = Timezone.us_zone_identifiers
402
- assert_equal(us_zone_identifiers.length, us_zones.length)
403
-
404
- us_zones.each {|zone|
405
- assert_kind_of(TimezoneProxy, zone)
406
- assert(us_zone_identifiers.include?(zone.identifier))
407
- }
408
- end
409
-
410
- def test_us_zone_identifiers
411
- # Probably should relax this test - just need all the zones, don't care
412
- # about order.
413
- assert_equal(Country.get('US').zone_identifiers.uniq, Timezone.us_zone_identifiers)
414
- end
415
-
416
- def test_identifier
417
- assert_raises(UnknownTimezone) { Timezone.new.identifier }
418
- assert_equal('Europe/Paris', TestTimezone.new('Europe/Paris').identifier)
419
- end
420
-
421
- def test_name
422
- assert_raises(UnknownTimezone) { Timezone.new.name }
423
- assert_equal('Europe/Paris', TestTimezone.new('Europe/Paris').name)
424
- end
425
-
426
- def test_friendly_identifier
427
- assert_equal('Paris', TestTimezone.new('Europe/Paris').friendly_identifier(true))
428
- assert_equal('Europe - Paris', TestTimezone.new('Europe/Paris').friendly_identifier(false))
429
- assert_equal('Europe - Paris', TestTimezone.new('Europe/Paris').friendly_identifier)
430
- assert_equal('Knox, Indiana', TestTimezone.new('America/Indiana/Knox').friendly_identifier(true))
431
- assert_equal('America - Knox, Indiana', TestTimezone.new('America/Indiana/Knox').friendly_identifier(false))
432
- assert_equal('America - Knox, Indiana', TestTimezone.new('America/Indiana/Knox').friendly_identifier)
433
- assert_equal('Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').friendly_identifier(true))
434
- assert_equal('Antarctica - Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').friendly_identifier(false))
435
- assert_equal('Antarctica - Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').friendly_identifier)
436
- assert_equal('McMurdo', TestTimezone.new('Antarctica/McMurdo').friendly_identifier(true))
437
- assert_equal('Antarctica - McMurdo', TestTimezone.new('Antarctica/McMurdo').friendly_identifier(false))
438
- assert_equal('Antarctica - McMurdo', TestTimezone.new('Antarctica/McMurdo').friendly_identifier)
439
- assert_equal('GMT+1', TestTimezone.new('Etc/GMT+1').friendly_identifier(true))
440
- assert_equal('Etc - GMT+1', TestTimezone.new('Etc/GMT+1').friendly_identifier(false))
441
- assert_equal('Etc - GMT+1', TestTimezone.new('Etc/GMT+1').friendly_identifier)
442
- assert_equal('UTC', TestTimezone.new('UTC').friendly_identifier(true))
443
- assert_equal('UTC', TestTimezone.new('UTC').friendly_identifier(false))
444
- assert_equal('UTC', TestTimezone.new('UTC').friendly_identifier)
445
- end
446
-
447
- if defined?(Encoding)
448
- def test_friendly_identifier_non_binary_encoding
449
- refute_equal(Encoding::ASCII_8BIT, TestTimezone.new('Europe/Paris').friendly_identifier(true).encoding)
450
- refute_equal(Encoding::ASCII_8BIT, TestTimezone.new('Europe/Paris').friendly_identifier(false).encoding)
451
- end
452
- end
453
-
454
- def test_to_s
455
- assert_equal('Europe - Paris', TestTimezone.new('Europe/Paris').to_s)
456
- assert_equal('America - Knox, Indiana', TestTimezone.new('America/Indiana/Knox').to_s)
457
- assert_equal('Antarctica - Dumont D\'Urville', TestTimezone.new('Antarctica/DumontDUrville').to_s)
458
- assert_equal('Antarctica - McMurdo', TestTimezone.new('Antarctica/McMurdo').to_s)
459
- assert_equal('Etc - GMT+1', TestTimezone.new('Etc/GMT+1').to_s)
460
- assert_equal('UTC', TestTimezone.new('UTC').to_s)
461
- end
462
-
463
- def test_period_for_local
464
- dt = DateTime.new(2005,2,18,16,24,23)
465
- dt2 = DateTime.new(2005,2,18,16,24,23).new_offset(Rational(5,24))
466
- dt3 = DateTime.new(2005,2,18,16,24,23 + Rational(789, 1000))
467
- t = Time.utc(2005,2,18,16,24,23)
468
- t2 = Time.local(2005,2,18,16,24,23)
469
- t3 = Time.utc(2005,2,18,16,24,23,789000)
470
- ts = t.to_i
471
-
472
- o1 = TimezoneOffset.new(0, 0, :GMT)
473
- o2 = TimezoneOffset.new(0, 3600, :BST)
474
-
475
- period = TimezonePeriod.new(
476
- TestTimezoneTransition.new(o1, o2, 1099184400),
477
- TestTimezoneTransition.new(o2, o1, 1111885200))
478
-
479
- dt_period = TestTimezone.new('Europe/London', nil, [period], dt).period_for_local(dt)
480
- dt2_period = TestTimezone.new('Europe/London', nil, [period], dt2).period_for_local(dt2)
481
- dt3_period = TestTimezone.new('Europe/London', nil, [period], dt3).period_for_local(dt3)
482
- t_period = TestTimezone.new('Europe/London', nil, [period], t).period_for_local(t)
483
- t2_period = TestTimezone.new('Europe/London', nil, [period], t2).period_for_local(t2)
484
- t3_period = TestTimezone.new('Europe/London', nil, [period], t3).period_for_local(t3)
485
- ts_period = TestTimezone.new('Europe/London', nil, [period], ts).period_for_local(ts)
486
-
487
- assert_equal(period, dt_period)
488
- assert_equal(period, dt2_period)
489
- assert_equal(period, dt3_period)
490
- assert_equal(period, t_period)
491
- assert_equal(period, t2_period)
492
- assert_equal(period, t3_period)
493
- assert_equal(period, ts_period)
494
- end
495
-
496
- def test_period_for_local_invalid
497
- dt = DateTime.new(2004,4,4,2,30,0)
498
- tz = TestTimezone.new('America/New_York', nil, [], dt)
499
-
500
- assert_raises(PeriodNotFound) do
501
- tz.period_for_local(dt)
502
- end
503
- end
504
-
505
- def test_period_for_local_ambiguous
506
- o1 = TimezoneOffset.new(-18000, 0, :EST)
507
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
508
-
509
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
510
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
511
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
512
-
513
- p1 = TimezonePeriod.new(t1, t2)
514
- p2 = TimezonePeriod.new(t2, t3)
515
-
516
- dt = DateTime.new(2004,10,31,1,0,0)
517
- dt2 = DateTime.new(2004,10,31,1,0,Rational(555,1000))
518
- t = Time.utc(2004,10,31,1,30,0)
519
- t2 = Time.utc(2004,10,31,1,30,0,555000)
520
- i = Time.utc(2004,10,31,1,59,59).to_i
521
-
522
- dt_tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
523
- dt2_tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt2)
524
- t_tz = TestTimezone.new('America/New_York', nil, [p1, p2], t)
525
- t2_tz = TestTimezone.new('America/New_York', nil, [p1, p2], t2)
526
- i_tz = TestTimezone.new('America/New_York', nil, [p1, p2], i)
527
-
528
- assert_raises(AmbiguousTime) { dt_tz.period_for_local(dt) }
529
- assert_raises(AmbiguousTime) { dt2_tz.period_for_local(dt2) }
530
- assert_raises(AmbiguousTime) { t_tz.period_for_local(t) }
531
- assert_raises(AmbiguousTime) { t2_tz.period_for_local(t2) }
532
- assert_raises(AmbiguousTime) { i_tz.period_for_local(i) }
533
- end
534
-
535
- def test_period_for_local_not_found
536
- dt = DateTime.new(2004,4,4,2,0,0)
537
- dt2 = DateTime.new(2004,4,4,2,0,Rational(987,1000))
538
- t = Time.utc(2004,4,4,2,30,0)
539
- t2 = Time.utc(2004,4,4,2,30,0,987000)
540
- i = Time.utc(2004,4,4,2,59,59).to_i
541
-
542
- dt_tz = TestTimezone.new('America/New_York', nil, [], dt)
543
- dt2_tz = TestTimezone.new('America/New_York', nil, [], dt2)
544
- t_tz = TestTimezone.new('America/New_York', nil, [], t)
545
- t2_tz = TestTimezone.new('America/New_York', nil, [], t2)
546
- i_tz = TestTimezone.new('America/New_York', nil, [], i)
547
-
548
- assert_raises(PeriodNotFound) { dt_tz.period_for_local(dt) }
549
- assert_raises(PeriodNotFound) { dt2_tz.period_for_local(dt2) }
550
- assert_raises(PeriodNotFound) { t_tz.period_for_local(t) }
551
- assert_raises(PeriodNotFound) { t2_tz.period_for_local(t2) }
552
- assert_raises(PeriodNotFound) { i_tz.period_for_local(i) }
553
- end
554
-
555
- def test_period_for_local_default_dst_set_true
556
- Timezone.default_dst = true
557
-
558
- o1 = TimezoneOffset.new(-18000, 0, :EST)
559
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
560
-
561
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
562
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
563
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
564
-
565
- p1 = TimezonePeriod.new(t1, t2)
566
- p2 = TimezonePeriod.new(t2, t3)
567
-
568
- dt = DateTime.new(2004,10,31,1,30,0)
569
-
570
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
571
-
572
- assert_equal(p1, tz.period_for_local(dt))
573
- assert_equal(p1, tz.period_for_local(dt, true))
574
- assert_equal(p2, tz.period_for_local(dt, false))
575
- assert_raises(AmbiguousTime) { tz.period_for_local(dt, nil) }
576
- end
577
-
578
- def test_period_for_local_default_dst_set_false
579
- Timezone.default_dst = false
580
-
581
- o1 = TimezoneOffset.new(-18000, 0, :EST)
582
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
583
-
584
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
585
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
586
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
587
-
588
- p1 = TimezonePeriod.new(t1, t2)
589
- p2 = TimezonePeriod.new(t2, t3)
590
-
591
- dt = DateTime.new(2004,10,31,1,30,0)
592
-
593
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
594
-
595
- assert_equal(p2, tz.period_for_local(dt))
596
- assert_equal(p1, tz.period_for_local(dt, true))
597
- assert_equal(p2, tz.period_for_local(dt, false))
598
- assert_raises(AmbiguousTime) { tz.period_for_local(dt, nil) }
599
- end
600
-
601
- def test_period_for_local_dst_flag_resolved
602
- o1 = TimezoneOffset.new(-18000, 0, :EST)
603
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
604
-
605
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
606
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
607
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
608
-
609
- p1 = TimezonePeriod.new(t1, t2)
610
- p2 = TimezonePeriod.new(t2, t3)
611
-
612
- dt = DateTime.new(2004,10,31,1,30,0)
613
-
614
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
615
-
616
- assert_equal(p1, tz.period_for_local(dt, true))
617
- assert_equal(p2, tz.period_for_local(dt, false))
618
- assert_equal(p1, tz.period_for_local(dt, true) {|periods| raise BlockCalled, 'should not be called' })
619
- assert_equal(p2, tz.period_for_local(dt, false) {|periods| raise BlockCalled, 'should not be called' })
620
- end
621
-
622
- def test_period_for_local_dst_block_called
623
- o1 = TimezoneOffset.new(-18000, 0, :EST)
624
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
625
-
626
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
627
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
628
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
629
-
630
- p1 = TimezonePeriod.new(t1, t2)
631
- p2 = TimezonePeriod.new(t2, t3)
632
-
633
- dt = DateTime.new(2004,10,31,1,30,0)
634
-
635
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
636
-
637
- assert_raises(BlockCalled) {
638
- tz.period_for_local(dt) {|periods|
639
- assert_equal([p1, p2], periods)
640
-
641
- # raise exception to test that the block was called
642
- raise BlockCalled, 'should be raised'
643
- }
644
- }
645
-
646
- assert_equal(p1, tz.period_for_local(dt) {|periods| periods.first})
647
- assert_equal(p2, tz.period_for_local(dt) {|periods| periods.last})
648
- assert_equal(p1, tz.period_for_local(dt) {|periods| [periods.first]})
649
- assert_equal(p2, tz.period_for_local(dt) {|periods| [periods.last]})
650
- end
651
-
652
- def test_period_for_local_dst_cannot_resolve
653
- # At midnight local time on Aug 5 1915 in Warsaw, the clocks were put back
654
- # 24 minutes and both periods were non-DST. Hence the block should be
655
- # called regardless of the value of the Boolean dst parameter.
656
-
657
- o0 = TimezoneOffset.new(5040, 0, :LMT)
658
- o1 = TimezoneOffset.new(5040, 0, :WMT)
659
- o2 = TimezoneOffset.new(3600, 0, :CET)
660
- o3 = TimezoneOffset.new(3600, 3600, :CEST)
661
-
662
- t1 = TestTimezoneTransition.new(o1, o0, DateTime.new(1879, 12, 31, 22, 36, 0))
663
- t2 = TestTimezoneTransition.new(o2, o1, DateTime.new(1915, 8, 4, 22, 36, 0))
664
- t3 = TestTimezoneTransition.new(o3, o2, DateTime.new(1916, 4, 30, 22, 0, 0))
665
-
666
- p1 = TimezonePeriod.new(t1, t2)
667
- p2 = TimezonePeriod.new(t2, t3)
668
-
669
- dt = DateTime.new(1915,8,4,23,40,0)
670
-
671
- tz = TestTimezone.new('Europe/Warsaw', nil, [p1, p2], dt)
672
-
673
- assert_raises(BlockCalled) {
674
- tz.period_for_local(dt, true) {|periods|
675
- assert_equal([p1, p2], periods)
676
- raise BlockCalled, 'should be raised'
677
- }
678
- }
679
-
680
- assert_raises(BlockCalled) {
681
- tz.period_for_local(dt, false) {|periods|
682
- assert_equal([p1, p2], periods)
683
- raise BlockCalled, 'should be raised'
684
- }
685
- }
686
- end
687
-
688
- def test_period_for_local_block_ambiguous
689
- o1 = TimezoneOffset.new(-18000, 0, :EST)
690
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
691
-
692
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
693
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
694
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
695
-
696
- p1 = TimezonePeriod.new(t1, t2)
697
- p2 = TimezonePeriod.new(t2, t3)
698
-
699
- dt = DateTime.new(2004,10,31,1,30,0)
700
-
701
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
702
-
703
- assert_raises(AmbiguousTime) do
704
- tz.period_for_local(dt) {|periods| nil}
705
- end
706
-
707
- assert_raises(AmbiguousTime) do
708
- tz.period_for_local(dt) {|periods| periods}
709
- end
710
-
711
- assert_raises(AmbiguousTime) do
712
- tz.period_for_local(dt) {|periods| []}
713
- end
714
-
715
- assert_raises(AmbiguousTime) do
716
- tz.period_for_local(dt) {|periods| raise AmbiguousTime, 'Ambiguous time'}
717
- end
718
- end
719
-
720
- def test_utc_to_local
721
- dt = DateTime.new(2005,6,18,16,24,23)
722
- dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5,24))
723
- dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000))
724
- dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5,24))
725
- t = Time.utc(2005,6,18,16,24,23)
726
- t2 = Time.local(2005,6,18,16,24,23)
727
- tu = Time.utc(2005,6,18,16,24,23,567000)
728
- tu2 = Time.local(2005,6,18,16,24,23,567000)
729
- ts = t.to_i
730
-
731
- o1 = TimezoneOffset.new(0, 0, :GMT)
732
- o2 = TimezoneOffset.new(0, 3600, :BST)
733
-
734
- period = TimezonePeriod.new(
735
- TestTimezoneTransition.new(o2, o1, 1111885200),
736
- TestTimezoneTransition.new(o1, o2, 1130634000))
737
-
738
- assert_equal(DateTime.new(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], dt).utc_to_local(dt))
739
- assert_equal(DateTime.new(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], dt2).utc_to_local(dt2))
740
- assert_equal(DateTime.new(2005,6,18,17,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', period, [], dtu).utc_to_local(dtu))
741
- assert_equal(DateTime.new(2005,6,18,17,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', period, [], dtu2).utc_to_local(dtu2))
742
- assert_equal(Time.utc(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], t).utc_to_local(t))
743
- assert_equal(Time.utc(2005,6,18,17,24,23), TestTimezone.new('Europe/London', period, [], t2).utc_to_local(t2))
744
- assert_equal(Time.utc(2005,6,18,17,24,23,567000), TestTimezone.new('Europe/London', period, [], tu).utc_to_local(tu))
745
- assert_equal(Time.utc(2005,6,18,17,24,23,567000), TestTimezone.new('Europe/London', period, [], tu2).utc_to_local(tu2))
746
- assert_equal(Time.utc(2005,6,18,17,24,23).to_i, TestTimezone.new('Europe/London', period, [], ts).utc_to_local(ts))
747
- end
748
-
749
- def test_utc_to_local_offset
750
- dt = DateTime.new(2005,6,18,16,24,23)
751
- dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5,24))
752
- dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000))
753
- dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5,24))
754
- t = Time.utc(2005,6,18,16,24,23)
755
- t2 = Time.local(2005,6,18,16,24,23)
756
- tu = Time.utc(2005,6,18,16,24,23,567000)
757
- tu2 = Time.local(2005,6,18,16,24,23,567000)
758
-
759
- o1 = TimezoneOffset.new(0, 0, :GMT)
760
- o2 = TimezoneOffset.new(0, 3600, :BST)
761
-
762
- period = TimezonePeriod.new(
763
- TestTimezoneTransition.new(o2, o1, 1111885200),
764
- TestTimezoneTransition.new(o1, o2, 1130634000))
765
-
766
- assert_equal(0, TestTimezone.new('Europe/London', period, [], dt).utc_to_local(dt).offset)
767
- assert_equal(0, TestTimezone.new('Europe/London', period, [], dt2).utc_to_local(dt2).offset)
768
- assert_equal(0, TestTimezone.new('Europe/London', period, [], dtu).utc_to_local(dtu).offset)
769
- assert_equal(0, TestTimezone.new('Europe/London', period, [], dtu2).utc_to_local(dtu2).offset)
770
- assert_equal(0, TestTimezone.new('Europe/London', period, [], t).utc_to_local(t).utc_offset)
771
- assert(TestTimezone.new('Europe/London', period, [], t).utc_to_local(t).utc?)
772
- assert_equal(0, TestTimezone.new('Europe/London', period, [], t2).utc_to_local(t2).utc_offset)
773
- assert(TestTimezone.new('Europe/London', period, [], t2).utc_to_local(t2).utc?)
774
- assert_equal(0, TestTimezone.new('Europe/London', period, [], tu).utc_to_local(tu).utc_offset)
775
- assert(TestTimezone.new('Europe/London', period, [], tu).utc_to_local(tu).utc?)
776
- assert_equal(0, TestTimezone.new('Europe/London', period, [], tu2).utc_to_local(tu2).utc_offset)
777
- assert(TestTimezone.new('Europe/London', period, [], tu2).utc_to_local(tu2).utc?)
778
- end
779
-
780
- def test_local_to_utc
781
- dt = DateTime.new(2005,6,18,16,24,23)
782
- dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5, 24))
783
- dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000))
784
- dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5, 24))
785
- t = Time.utc(2005,6,18,16,24,23)
786
- t2 = Time.local(2005,6,18,16,24,23)
787
- tu = Time.utc(2005,6,18,16,24,23,567000)
788
- tu2 = Time.local(2005,6,18,16,24,23,567000)
789
- ts = t.to_i
790
-
791
- o1 = TimezoneOffset.new(0, 0, :GMT)
792
- o2 = TimezoneOffset.new(0, 3600, :BST)
793
-
794
- period = TimezonePeriod.new(
795
- TestTimezoneTransition.new(o2, o1, 1111885200),
796
- TestTimezoneTransition.new(o1, o2, 1130634000))
797
-
798
- assert_equal(DateTime.new(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], dt).local_to_utc(dt))
799
- assert_equal(DateTime.new(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], dt2).local_to_utc(dt2))
800
- assert_equal(DateTime.new(2005,6,18,15,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', nil, [period], dtu).local_to_utc(dtu))
801
- assert_equal(DateTime.new(2005,6,18,15,24,23 + Rational(567,1000)), TestTimezone.new('Europe/London', nil, [period], dtu2).local_to_utc(dtu2))
802
- assert_equal(Time.utc(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], t).local_to_utc(t))
803
- assert_equal(Time.utc(2005,6,18,15,24,23), TestTimezone.new('Europe/London', nil, [period], t2).local_to_utc(t2))
804
- assert_equal(Time.utc(2005,6,18,15,24,23,567000), TestTimezone.new('Europe/London', nil, [period], tu).local_to_utc(tu))
805
- assert_equal(Time.utc(2005,6,18,15,24,23,567000), TestTimezone.new('Europe/London', nil, [period], tu2).local_to_utc(tu2))
806
- assert_equal(Time.utc(2005,6,18,15,24,23).to_i, TestTimezone.new('Europe/London', nil, [period], ts).local_to_utc(ts))
807
- end
808
-
809
- def test_local_to_utc_offset
810
- dt = DateTime.new(2005,6,18,16,24,23)
811
- dt2 = DateTime.new(2005,6,18,16,24,23).new_offset(Rational(5, 24))
812
- dtu = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000))
813
- dtu2 = DateTime.new(2005,6,18,16,24,23 + Rational(567,1000)).new_offset(Rational(5, 24))
814
- t = Time.utc(2005,6,18,16,24,23)
815
- t2 = Time.local(2005,6,18,16,24,23)
816
- tu = Time.utc(2005,6,18,16,24,23,567000)
817
- tu2 = Time.local(2005,6,18,16,24,23,567000)
818
-
819
- o1 = TimezoneOffset.new(0, 0, :GMT)
820
- o2 = TimezoneOffset.new(0, 3600, :BST)
821
-
822
- period = TimezonePeriod.new(
823
- TestTimezoneTransition.new(o2, o1, 1111885200),
824
- TestTimezoneTransition.new(o1, o2, 1130634000))
825
-
826
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dt).local_to_utc(dt).offset)
827
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dt2).local_to_utc(dt2).offset)
828
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dtu).local_to_utc(dtu).offset)
829
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], dtu2).local_to_utc(dtu2).offset)
830
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], t).local_to_utc(t).utc_offset)
831
- assert(TestTimezone.new('Europe/London', nil, [period], t).local_to_utc(t).utc?)
832
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], t2).local_to_utc(t2).utc_offset)
833
- assert(TestTimezone.new('Europe/London', nil, [period], t2).local_to_utc(t2).utc?)
834
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], tu).local_to_utc(tu).utc_offset)
835
- assert(TestTimezone.new('Europe/London', nil, [period], tu).local_to_utc(tu).utc?)
836
- assert_equal(0, TestTimezone.new('Europe/London', nil, [period], tu2).local_to_utc(tu2).utc_offset)
837
- assert(TestTimezone.new('Europe/London', nil, [period], tu2).local_to_utc(tu2).utc?)
838
- end
839
-
840
- def test_local_to_utc_utc_local_returns_utc
841
- # Check that UTC time instances are always returned even if the system
842
- # is using UTC as the time zone.
843
-
844
- # Note that this will only test will only work correctly on platforms where
845
- # setting the TZ environment variable has an effect. If setting TZ has no
846
- # effect, then this test will still pass.
847
-
848
- old_tz = ENV['TZ']
849
- begin
850
- ENV['TZ'] = 'UTC'
851
-
852
- tz = Timezone.get('America/New_York')
853
-
854
- t = tz.local_to_utc(Time.local(2014, 1, 11, 17, 18, 41))
855
- assert_equal(Time.utc(2014, 1, 11, 22, 18, 41), t)
856
- assert(t.utc?)
857
- ensure
858
- ENV['TZ'] = old_tz
859
- end
860
- end
861
-
862
- def test_local_to_utc_invalid
863
- dt = DateTime.new(2004,4,4,2,30,0)
864
- tz = TestTimezone.new('America/New_York', nil, [], dt)
865
- assert_raises(PeriodNotFound) { tz.local_to_utc(dt) }
866
-
867
- t = Time.utc(2004,4,4,2,30,0)
868
- tz = TestTimezone.new('America/New_York', nil, [], t)
869
- assert_raises(PeriodNotFound) { tz.local_to_utc(t) }
870
-
871
- i = Time.utc(2004,4,4,2,30,0).to_i
872
- tz = TestTimezone.new('America/New_York', nil, [], i)
873
- assert_raises(PeriodNotFound) { tz.local_to_utc(i) }
874
- end
875
-
876
- def test_local_to_utc_ambiguous
877
- o1 = TimezoneOffset.new(-18000, 0, :EST)
878
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
879
-
880
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
881
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
882
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
883
-
884
- p1 = TimezonePeriod.new(t1, t2)
885
- p2 = TimezonePeriod.new(t2, t3)
886
-
887
- dt = DateTime.new(2004,10,31,1,30,0)
888
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
889
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt) }
890
-
891
- t = Time.utc(2004,10,31,1,30,0)
892
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], t)
893
- assert_raises(AmbiguousTime) { tz.local_to_utc(t) }
894
-
895
- i = Time.utc(2004,10,31,1,30,0).to_i
896
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], i)
897
- assert_raises(AmbiguousTime) { tz.local_to_utc(i) }
898
-
899
- f = Time.utc(2004,10,31,1,30,0,501).to_i
900
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], f)
901
- assert_raises(AmbiguousTime) { tz.local_to_utc(f) }
902
- end
903
-
904
- def test_local_to_utc_not_found
905
- dt = DateTime.new(2004,4,4,2,0,0)
906
- t = Time.utc(2004,4,4,2,30,0)
907
- i = Time.utc(2004,4,4,2,59,59).to_i
908
-
909
- dt_tz = TestTimezone.new('America/New_York', nil, [], dt)
910
- t_tz = TestTimezone.new('America/New_York', nil, [], t)
911
- i_tz = TestTimezone.new('America/New_York', nil, [], i)
912
-
913
- assert_raises(PeriodNotFound) { dt_tz.local_to_utc(dt) }
914
- assert_raises(PeriodNotFound) { t_tz.local_to_utc(t) }
915
- assert_raises(PeriodNotFound) { i_tz.local_to_utc(i) }
916
- end
917
-
918
- def test_local_to_utc_default_dst_set_true
919
- Timezone.default_dst = true
920
-
921
- o1 = TimezoneOffset.new(-18000, 0, :EST)
922
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
923
-
924
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
925
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
926
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
927
-
928
- p1 = TimezonePeriod.new(t1, t2)
929
- p2 = TimezonePeriod.new(t2, t3)
930
-
931
- dt = DateTime.new(2004,10,31,1,30,0)
932
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
933
-
934
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt))
935
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true))
936
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false))
937
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt, nil) }
938
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt) {|periods| raise BlockCalled, 'should not be called' })
939
- end
940
-
941
- def test_local_to_utc_default_dst_set_false
942
- Timezone.default_dst = false
943
-
944
- o1 = TimezoneOffset.new(-18000, 0, :EST)
945
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
946
-
947
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
948
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
949
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
950
-
951
- p1 = TimezonePeriod.new(t1, t2)
952
- p2 = TimezonePeriod.new(t2, t3)
953
-
954
- dt = DateTime.new(2004,10,31,1,30,0)
955
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
956
-
957
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt))
958
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false))
959
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true))
960
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt, nil) }
961
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt) {|periods| raise BlockCalled, 'should not be called' })
962
- end
963
-
964
- def test_local_to_utc_dst_flag_resolved
965
- o1 = TimezoneOffset.new(-18000, 0, :EST)
966
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
967
-
968
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
969
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
970
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
971
-
972
- p1 = TimezonePeriod.new(t1, t2)
973
- p2 = TimezonePeriod.new(t2, t3)
974
-
975
- dt = DateTime.new(2004,10,31,1,30,0)
976
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
977
-
978
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true))
979
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false))
980
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt, true) {|periods| raise BlockCalled, 'should not be called' })
981
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt, false) {|periods| raise BlockCalled, 'should not be called' })
982
- end
983
-
984
- def test_local_to_utc_dst_block_called
985
- o1 = TimezoneOffset.new(-18000, 0, :EST)
986
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
987
-
988
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
989
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
990
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
991
-
992
- p1 = TimezonePeriod.new(t1, t2)
993
- p2 = TimezonePeriod.new(t2, t3)
994
-
995
- dt = DateTime.new(2004,10,31,1,30,0)
996
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
997
-
998
- assert_raises(BlockCalled) {
999
- tz.local_to_utc(dt) {|periods|
1000
- assert_equal([p1, p2], periods)
1001
-
1002
- # raise exception to test that the block was called
1003
- raise BlockCalled, 'should be raised'
1004
- }
1005
- }
1006
-
1007
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt) {|periods| periods.first})
1008
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt) {|periods| periods.last})
1009
- assert_equal(DateTime.new(2004,10,31,5,30,0), tz.local_to_utc(dt) {|periods| [periods.first]})
1010
- assert_equal(DateTime.new(2004,10,31,6,30,0), tz.local_to_utc(dt) {|periods| [periods.last]})
1011
- end
1012
-
1013
- def test_local_to_utc_dst_cannot_resolve
1014
- # At midnight local time on Aug 5 1915 in Warsaw, the clocks were put back
1015
- # 24 minutes and both periods were non-DST. Hence the block should be
1016
- # called regardless of the value of the Boolean dst parameter.
1017
-
1018
- o0 = TimezoneOffset.new(5040, 0, :LMT)
1019
- o1 = TimezoneOffset.new(5040, 0, :WMT)
1020
- o2 = TimezoneOffset.new(3600, 0, :CET)
1021
- o3 = TimezoneOffset.new(3600, 3600, :CEST)
1022
-
1023
- t1 = TestTimezoneTransition.new(o1, o0, DateTime.new(1879, 12, 31, 22, 36, 0))
1024
- t2 = TestTimezoneTransition.new(o2, o1, DateTime.new(1915, 8, 4, 22, 36, 0))
1025
- t3 = TestTimezoneTransition.new(o3, o2, DateTime.new(1916, 4, 30, 22, 0, 0))
1026
-
1027
- p1 = TimezonePeriod.new(t1, t2)
1028
- p2 = TimezonePeriod.new(t2, t3)
1029
-
1030
- dt = DateTime.new(1915,8,4,23,40,0)
1031
-
1032
- tz = TestTimezone.new('Europe/Warsaw', nil, [p1, p2], dt)
1033
-
1034
- assert_raises(BlockCalled) do
1035
- tz.local_to_utc(dt, true) do |periods|
1036
- assert_equal([p1, p2], periods)
1037
- raise BlockCalled, 'should be raised'
1038
- end
1039
- end
1040
-
1041
- assert_raises(BlockCalled) do
1042
- tz.local_to_utc(dt, false) do |periods|
1043
- assert_equal([p1, p2], periods)
1044
- raise BlockCalled, 'should be raised'
1045
- end
1046
- end
1047
-
1048
- assert_equal(DateTime.new(1915,8,4,22,16,0), tz.local_to_utc(dt) {|periods| periods.first})
1049
- assert_equal(DateTime.new(1915,8,4,22,40,0), tz.local_to_utc(dt) {|periods| periods.last})
1050
- assert_equal(DateTime.new(1915,8,4,22,16,0), tz.local_to_utc(dt) {|periods| [periods.first]})
1051
- assert_equal(DateTime.new(1915,8,4,22,40,0), tz.local_to_utc(dt) {|periods| [periods.last]})
1052
- end
1053
-
1054
- def test_local_to_utc_block_ambiguous
1055
- o1 = TimezoneOffset.new(-18000, 0, :EST)
1056
- o2 = TimezoneOffset.new(-18000, 3600, :EDT)
1057
-
1058
- t1 = TestTimezoneTransition.new(o2, o1, 1081062000)
1059
- t2 = TestTimezoneTransition.new(o1, o2, 1099202400)
1060
- t3 = TestTimezoneTransition.new(o2, o1, 1112511600)
1061
-
1062
- p1 = TimezonePeriod.new(t1, t2)
1063
- p2 = TimezonePeriod.new(t2, t3)
1064
-
1065
- dt = DateTime.new(2004,10,31,1,30,0)
1066
- tz = TestTimezone.new('America/New_York', nil, [p1, p2], dt)
1067
-
1068
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| nil} }
1069
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| periods} }
1070
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| []} }
1071
- assert_raises(AmbiguousTime) { tz.local_to_utc(dt) {|periods| raise AmbiguousTime, 'Ambiguous time'} }
1072
- end
1073
-
1074
- def test_offsets_up_to
1075
- o1 = TimezoneOffset.new(-17900, 0, :TESTLMT)
1076
- o2 = TimezoneOffset.new(-18000, 3600, :TESTD)
1077
- o3 = TimezoneOffset.new(-18000, 0, :TESTS)
1078
- o4 = TimezoneOffset.new(-21600, 3600, :TESTD)
1079
- o5 = TimezoneOffset.new(-21600, 0, :TESTS)
1080
-
1081
- t1 = TestTimezoneTransition.new(o2, o1, Time.utc(2010, 4,1,1,0,0).to_i)
1082
- t2 = TestTimezoneTransition.new(o3, o2, Time.utc(2010,10,1,1,0,0).to_i)
1083
- t3 = TestTimezoneTransition.new(o2, o3, Time.utc(2011, 3,1,1,0,0).to_i)
1084
- t4 = TestTimezoneTransition.new(o4, o2, Time.utc(2011, 4,1,1,0,0).to_i)
1085
- t5 = TestTimezoneTransition.new(o3, o4, Time.utc(2011,10,1,1,0,0).to_i)
1086
- t6 = TestTimezoneTransition.new(o5, o3, Time.utc(2012, 3,1,1,0,0).to_i)
1087
-
1088
- assert_array_same_items([o1, o2, o3, o4, o5],
1089
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1), nil, [t1, t2, t3, t4, t5, t6]).
1090
- offsets_up_to(Time.utc(2012,3,1,1,0,1)))
1091
- assert_array_same_items([o2, o3, o4, o5],
1092
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,0), [t1, t2, t3, t4, t5, t6]).
1093
- offsets_up_to(Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,0)))
1094
- assert_array_same_items([o1, o2, o3, o4],
1095
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0), nil, [t1, t2, t3, t4, t5]).
1096
- offsets_up_to(Time.utc(2012,3,1,1,0,0)))
1097
- assert_array_same_items([o2, o3, o4, o5],
1098
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,1), [t2, t3, t4, t5, t6]).
1099
- offsets_up_to(Time.utc(2012,3,1,1,0,1), Time.utc(2010,4,1,1,0,1)))
1100
- assert_array_same_items([o2, o3],
1101
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2011,3,1,2,0,0), Time.utc(2011,3,1,0,0,0), [t3]).
1102
- offsets_up_to(Time.utc(2011,3,1,2,0,0), Time.utc(2011,3,1,0,0,0)))
1103
- assert_array_same_items([o3, o4],
1104
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0), Time.utc(2011,4,1,1,0,0), [t4, t5]).
1105
- offsets_up_to(Time.utc(2012,3,1,1,0,0), Time.utc(2011,4,1,1,0,0)))
1106
-
1107
- assert_array_same_items([o1, o2, o3, o4, o5],
1108
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1).to_i, nil, [t1, t2, t3, t4, t5, t6]).
1109
- offsets_up_to(Time.utc(2012,3,1,1,0,1).to_i))
1110
- assert_array_same_items([o2, o3, o4, o5],
1111
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,0).to_i, [t1, t2, t3, t4, t5, t6]).
1112
- offsets_up_to(Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,0).to_i))
1113
- assert_array_same_items([o1, o2, o3, o4],
1114
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0).to_i, nil, [t1, t2, t3, t4, t5]).
1115
- offsets_up_to(Time.utc(2012,3,1,1,0,0).to_i))
1116
- assert_array_same_items([o2, o3, o4, o5],
1117
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,1).to_i, [t2, t3, t4, t5, t6]).
1118
- offsets_up_to(Time.utc(2012,3,1,1,0,1).to_i, Time.utc(2010,4,1,1,0,1).to_i))
1119
- assert_array_same_items([o2, o3],
1120
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2011,3,1,2,0,0).to_i, Time.utc(2011,3,1,0,0,0).to_i, [t3]).
1121
- offsets_up_to(Time.utc(2011,3,1,2,0,0).to_i, Time.utc(2011,3,1,0,0,0).to_i))
1122
- assert_array_same_items([o3, o4],
1123
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,3,1,1,0,0).to_i, Time.utc(2011,4,1,1,0,0).to_i, [t4, t5]).
1124
- offsets_up_to(Time.utc(2012,3,1,1,0,0).to_i, Time.utc(2011,4,1,1,0,0).to_i))
1125
-
1126
- assert_array_same_items([o1, o2, o3, o4, o5],
1127
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,1), nil, [t1, t2, t3, t4, t5, t6]).
1128
- offsets_up_to(DateTime.new(2012,3,1,1,0,1)))
1129
- assert_array_same_items([o2, o3, o4, o5],
1130
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,0), [t1, t2, t3, t4, t5, t6]).
1131
- offsets_up_to(DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,0)))
1132
- assert_array_same_items([o1, o2, o3, o4],
1133
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,0), nil, [t1, t2, t3, t4, t5]).
1134
- offsets_up_to(DateTime.new(2012,3,1,1,0,0)))
1135
- assert_array_same_items([o2, o3, o4, o5],
1136
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,1), [t2, t3, t4, t5, t6]).
1137
- offsets_up_to(DateTime.new(2012,3,1,1,0,1), DateTime.new(2010,4,1,1,0,1)))
1138
- assert_array_same_items([o2, o3],
1139
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2011,3,1,2,0,0), DateTime.new(2011,3,1,0,0,0), [t3]).
1140
- offsets_up_to(DateTime.new(2011,3,1,2,0,0), DateTime.new(2011,3,1,0,0,0)))
1141
- assert_array_same_items([o3, o4],
1142
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,3,1,1,0,0), DateTime.new(2011,4,1,1,0,0), [t4, t5]).
1143
- offsets_up_to(DateTime.new(2012,3,1,1,0,0), DateTime.new(2011,4,1,1,0,0)))
1144
- end
1145
-
1146
- def test_offsets_up_to_no_transitions
1147
- o = TimezoneOffset.new(600, 0, :LMT)
1148
- p = TimezonePeriod.new(nil, nil, o)
1149
-
1150
- assert_array_same_items([o],
1151
- OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0), nil, p).
1152
- offsets_up_to(Time.utc(2000,1,1,1,0,0)))
1153
- assert_array_same_items([o],
1154
- OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0), Time.utc(1990,1,1,1,0,0), p).
1155
- offsets_up_to(Time.utc(2000,1,1,1,0,0), Time.utc(1990,1,1,1,0,0)))
1156
-
1157
- assert_array_same_items([o],
1158
- OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0).to_i, nil, p).
1159
- offsets_up_to(Time.utc(2000,1,1,1,0,0).to_i))
1160
- assert_array_same_items([o],
1161
- OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', Time.utc(2000,1,1,1,0,0).to_i, Time.utc(1990,1,1,1,0,0).to_i, p).
1162
- offsets_up_to(Time.utc(2000,1,1,1,0,0).to_i, Time.utc(1990,1,1,1,0,0).to_i))
1163
-
1164
- assert_array_same_items([o],
1165
- OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', DateTime.new(2000,1,1,1,0,0), nil, p).
1166
- offsets_up_to(DateTime.new(2000,1,1,1,0,0)))
1167
- assert_array_same_items([o],
1168
- OffsetsUpToNoTransitionsTestTimezone.new('Test/Zone', DateTime.new(2000,1,1,1,0,0), DateTime.new(1990,1,1,1,0,0), p).
1169
- offsets_up_to(DateTime.new(2000,1,1,1,0,0), DateTime.new(1990,1,1,1,0,0)))
1170
- end
1171
-
1172
- def test_offsets_up_to_utc_to_not_greater_than_utc_from
1173
- assert_raises(ArgumentError) do
1174
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,8,1,0,0,0), Time.utc(2012,8,1,0,0,0), []).
1175
- offsets_up_to(Time.utc(2012,8,1,0,0,0), Time.utc(2012,8,1,0,0,0))
1176
- end
1177
-
1178
- assert_raises(ArgumentError) do
1179
- OffsetsUpToTestTimezone.new('Test/Zone', Time.utc(2012,8,1,0,0,0).to_i, Time.utc(2012,8,1,0,0,0).to_i, []).
1180
- offsets_up_to(Time.utc(2012,8,1,0,0,0).to_i, Time.utc(2012,8,1,0,0,0).to_i)
1181
- end
1182
-
1183
- assert_raises(ArgumentError) do
1184
- OffsetsUpToTestTimezone.new('Test/Zone', DateTime.new(2012,8,1,0,0,0), DateTime.new(2012,8,1,0,0,0), []).
1185
- offsets_up_to(DateTime.new(2012,8,1,0,0,0), DateTime.new(2012,8,1,0,0,0))
1186
- end
1187
- end
1188
-
1189
- def test_now
1190
- assert_kind_of(Time, Timezone.get('Europe/London').now)
1191
- end
1192
-
1193
- def test_current_period
1194
- assert_kind_of(TimezonePeriod, Timezone.get('Europe/London').current_period)
1195
- end
1196
-
1197
- def test_current_period_and_time
1198
- current = Timezone.get('Europe/London').current_period_and_time
1199
- assert_equal(2, current.length)
1200
- assert_kind_of(Time, current[0])
1201
- assert_kind_of(TimezonePeriod, current[1])
1202
- end
1203
-
1204
- def test_current_time_and_period
1205
- current = Timezone.get('Europe/London').current_time_and_period
1206
- assert_equal(2, current.length)
1207
- assert_kind_of(Time, current[0])
1208
- assert_kind_of(TimezonePeriod, current[1])
1209
- end
1210
-
1211
- def test_compare
1212
- assert_equal(0, TestTimezone.new('Europe/London') <=> TestTimezone.new('Europe/London'))
1213
- assert_equal(-1, TestTimezone.new('Europe/London') <=> TestTimezone.new('Europe/london'))
1214
- assert_equal(-1, TestTimezone.new('Europe/London') <=> TestTimezone.new('Europe/Paris'))
1215
- assert_equal(1, TestTimezone.new('Europe/Paris') <=> TestTimezone.new('Europe/London'))
1216
- assert_equal(-1, TestTimezone.new('America/New_York') <=> TestTimezone.new('Europe/Paris'))
1217
- assert_equal(1, TestTimezone.new('Europe/Paris') <=> TestTimezone.new('America/New_York'))
1218
- end
1219
-
1220
- def test_compare_non_comparable
1221
- assert_nil(TestTimezone.new('Europe/London') <=> Object.new)
1222
- end
1223
-
1224
- def test_equality
1225
- assert_equal(true, TestTimezone.new('Europe/London') == TestTimezone.new('Europe/London'))
1226
- assert_equal(false, TestTimezone.new('Europe/London') == TestTimezone.new('Europe/london'))
1227
- assert_equal(false, TestTimezone.new('Europe/London') == TestTimezone.new('Europe/Paris'))
1228
- assert(!(TestTimezone.new('Europe/London') == Object.new))
1229
- end
1230
-
1231
- def test_eql
1232
- assert_equal(true, TestTimezone.new('Europe/London').eql?(TestTimezone.new('Europe/London')))
1233
- assert_equal(false, TestTimezone.new('Europe/London').eql?(TestTimezone.new('Europe/london')))
1234
- assert_equal(false, TestTimezone.new('Europe/London').eql?(TestTimezone.new('Europe/Paris')))
1235
- assert(!TestTimezone.new('Europe/London').eql?(Object.new))
1236
- end
1237
-
1238
- def test_hash
1239
- assert_equal('Europe/London'.hash, TestTimezone.new('Europe/London').hash)
1240
- assert_equal('America/New_York'.hash, TestTimezone.new('America/New_York').hash)
1241
- end
1242
-
1243
- def test_marshal_data
1244
- tz = Timezone.get('Europe/London')
1245
- assert_kind_of(DataTimezone, tz)
1246
- assert_same(tz, Marshal.load(Marshal.dump(tz)))
1247
- end
1248
-
1249
- def test_marshal_linked
1250
- tz = Timezone.get('UTC')
1251
-
1252
- # ZoneinfoDataSource doesn't return LinkedTimezoneInfo for any timezone.
1253
- if DataSource.get.load_timezone_info('UTC').kind_of?(LinkedTimezoneInfo)
1254
- assert_kind_of(LinkedTimezone, tz)
1255
- else
1256
- assert_kind_of(DataTimezone, tz)
1257
- end
1258
-
1259
- assert_same(tz, Marshal.load(Marshal.dump(tz)))
1260
- end
1261
-
1262
- def test_strftime_datetime
1263
- tz = Timezone.get('Europe/London')
1264
- dt = DateTime.new(2006, 7, 15, 22, 12, 2)
1265
- assert_equal('23:12:02 BST', tz.strftime('%H:%M:%S %Z', dt))
1266
- assert_equal('BST', tz.strftime('%Z', dt))
1267
- assert_equal('%ZBST', tz.strftime('%%Z%Z', dt))
1268
- assert_equal('BST BST', tz.strftime('%Z %Z', dt))
1269
- assert_equal('BST %Z %BST %%Z %%BST', tz.strftime('%Z %%Z %%%Z %%%%Z %%%%%Z', dt))
1270
- assert_equal('+0100 +01:00 +01:00:00 +01 %::::z', tz.strftime('%z %:z %::z %:::z %::::z', dt))
1271
- assert_equal('1153001522 %s %1153001522', tz.strftime('%s %%s %%%s', dt))
1272
- end
1273
-
1274
- def test_strftime_time
1275
- tz = Timezone.get('Europe/London')
1276
- t = Time.utc(2006, 7, 15, 22, 12, 2)
1277
- assert_equal('23:12:02 BST', tz.strftime('%H:%M:%S %Z', t))
1278
- assert_equal('BST', tz.strftime('%Z', t))
1279
- assert_equal('%ZBST', tz.strftime('%%Z%Z', t))
1280
- assert_equal('BST BST', tz.strftime('%Z %Z', t))
1281
- assert_equal('BST %Z %BST %%Z %%BST', tz.strftime('%Z %%Z %%%Z %%%%Z %%%%%Z', t))
1282
- assert_equal('+0100 +01:00 +01:00:00 +01 %::::z', tz.strftime('%z %:z %::z %:::z %::::z', t))
1283
- assert_equal('1153001522 %s %1153001522', tz.strftime('%s %%s %%%s', t))
1284
- end
1285
-
1286
- def test_strftime_int
1287
- tz = Timezone.get('Europe/London')
1288
- i = Time.utc(2006, 7, 15, 22, 12, 2).to_i
1289
- assert_equal('23:12:02 BST', tz.strftime('%H:%M:%S %Z', i))
1290
- assert_equal('BST', tz.strftime('%Z', i))
1291
- assert_equal('%ZBST', tz.strftime('%%Z%Z', i))
1292
- assert_equal('BST BST', tz.strftime('%Z %Z', i))
1293
- assert_equal('BST %Z %BST %%Z %%BST', tz.strftime('%Z %%Z %%%Z %%%%Z %%%%%Z', i))
1294
- assert_equal('+0100 +01:00 +01:00:00 +01 %::::z', tz.strftime('%z %:z %::z %:::z %::::z', i))
1295
- assert_equal('1153001522 %s %1153001522', tz.strftime('%s %%s %%%s', i))
1296
- end
1297
-
1298
- def test_get_missing_data_source
1299
- DataSource.set(DataSource.new)
1300
-
1301
- assert_raises(InvalidDataSource) do
1302
- Timezone.get('Europe/London')
1303
- end
1304
- end
1305
-
1306
- def test_new_missing_data_source
1307
- DataSource.set(DataSource.new)
1308
-
1309
- assert_raises(InvalidDataSource) do
1310
- Timezone.new('Europe/London')
1311
- end
1312
- end
1313
-
1314
- def test_all_missing_data_source
1315
- DataSource.set(DataSource.new)
1316
-
1317
- assert_raises(InvalidDataSource) do
1318
- Timezone.all
1319
- end
1320
- end
1321
-
1322
- def test_all_identifiers_missing_data_source
1323
- DataSource.set(DataSource.new)
1324
-
1325
- assert_raises(InvalidDataSource) do
1326
- Timezone.all_identifiers
1327
- end
1328
- end
1329
-
1330
- def test_all_data_zones_missing_data_source
1331
- DataSource.set(DataSource.new)
1332
-
1333
- assert_raises(InvalidDataSource) do
1334
- Timezone.all_data_zones
1335
- end
1336
- end
1337
-
1338
- def test_all_data_zone_identifiers_missing_data_source
1339
- DataSource.set(DataSource.new)
1340
-
1341
- assert_raises(InvalidDataSource) do
1342
- Timezone.all_data_zone_identifiers
1343
- end
1344
- end
1345
-
1346
- def test_all_linked_zones_missing_data_source
1347
- DataSource.set(DataSource.new)
1348
-
1349
- assert_raises(InvalidDataSource) do
1350
- Timezone.all_linked_zones
1351
- end
1352
- end
1353
-
1354
- def test_all_linked_zone_identifiers_missing_data_source
1355
- DataSource.set(DataSource.new)
1356
-
1357
- assert_raises(InvalidDataSource) do
1358
- Timezone.all_linked_zone_identifiers
1359
- end
1360
- end
1361
- end