tzinfo 1.2.11 → 2.0.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 (151) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.yardopts +3 -0
  4. data/CHANGES.md +469 -431
  5. data/LICENSE +13 -13
  6. data/README.md +368 -114
  7. data/lib/tzinfo/country.rb +131 -129
  8. data/lib/tzinfo/country_timezone.rb +70 -112
  9. data/lib/tzinfo/data_source.rb +389 -144
  10. data/lib/tzinfo/data_sources/constant_offset_data_timezone_info.rb +56 -0
  11. data/lib/tzinfo/data_sources/country_info.rb +42 -0
  12. data/lib/tzinfo/data_sources/data_timezone_info.rb +91 -0
  13. data/lib/tzinfo/data_sources/linked_timezone_info.rb +33 -0
  14. data/lib/tzinfo/data_sources/ruby_data_source.rb +141 -0
  15. data/lib/tzinfo/data_sources/timezone_info.rb +47 -0
  16. data/lib/tzinfo/data_sources/transitions_data_timezone_info.rb +214 -0
  17. data/lib/tzinfo/data_sources/zoneinfo_data_source.rb +573 -0
  18. data/lib/tzinfo/data_sources/zoneinfo_reader.rb +284 -0
  19. data/lib/tzinfo/data_sources.rb +8 -0
  20. data/lib/tzinfo/data_timezone.rb +33 -47
  21. data/lib/tzinfo/datetime_with_offset.rb +153 -0
  22. data/lib/tzinfo/format1/country_definer.rb +17 -0
  23. data/lib/tzinfo/format1/country_index_definition.rb +64 -0
  24. data/lib/tzinfo/format1/timezone_definer.rb +64 -0
  25. data/lib/tzinfo/format1/timezone_definition.rb +39 -0
  26. data/lib/tzinfo/format1/timezone_index_definition.rb +77 -0
  27. data/lib/tzinfo/format1.rb +10 -0
  28. data/lib/tzinfo/format2/country_definer.rb +68 -0
  29. data/lib/tzinfo/format2/country_index_definer.rb +68 -0
  30. data/lib/tzinfo/format2/country_index_definition.rb +46 -0
  31. data/lib/tzinfo/format2/timezone_definer.rb +94 -0
  32. data/lib/tzinfo/format2/timezone_definition.rb +73 -0
  33. data/lib/tzinfo/format2/timezone_index_definer.rb +45 -0
  34. data/lib/tzinfo/format2/timezone_index_definition.rb +55 -0
  35. data/lib/tzinfo/format2.rb +10 -0
  36. data/lib/tzinfo/info_timezone.rb +26 -21
  37. data/lib/tzinfo/linked_timezone.rb +33 -52
  38. data/lib/tzinfo/offset_timezone_period.rb +42 -0
  39. data/lib/tzinfo/string_deduper.rb +118 -0
  40. data/lib/tzinfo/time_with_offset.rb +128 -0
  41. data/lib/tzinfo/timestamp.rb +548 -0
  42. data/lib/tzinfo/timestamp_with_offset.rb +85 -0
  43. data/lib/tzinfo/timezone.rb +979 -502
  44. data/lib/tzinfo/timezone_offset.rb +84 -74
  45. data/lib/tzinfo/timezone_period.rb +151 -217
  46. data/lib/tzinfo/timezone_proxy.rb +70 -79
  47. data/lib/tzinfo/timezone_transition.rb +77 -109
  48. data/lib/tzinfo/transitions_timezone_period.rb +63 -0
  49. data/lib/tzinfo/version.rb +7 -0
  50. data/lib/tzinfo/with_offset.rb +61 -0
  51. data/lib/tzinfo.rb +60 -40
  52. data.tar.gz.sig +0 -0
  53. metadata +51 -115
  54. metadata.gz.sig +2 -3
  55. data/Rakefile +0 -107
  56. data/lib/tzinfo/annual_rules.rb +0 -51
  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/posix_time_zone_parser.rb +0 -136
  63. data/lib/tzinfo/ruby_core_support.rb +0 -176
  64. data/lib/tzinfo/ruby_country_info.rb +0 -74
  65. data/lib/tzinfo/ruby_data_source.rb +0 -136
  66. data/lib/tzinfo/time_or_datetime.rb +0 -351
  67. data/lib/tzinfo/timezone_definition.rb +0 -36
  68. data/lib/tzinfo/timezone_index_definition.rb +0 -54
  69. data/lib/tzinfo/timezone_info.rb +0 -30
  70. data/lib/tzinfo/timezone_transition_definition.rb +0 -104
  71. data/lib/tzinfo/transition_data_timezone_info.rb +0 -274
  72. data/lib/tzinfo/transition_rule.rb +0 -325
  73. data/lib/tzinfo/zoneinfo_country_info.rb +0 -37
  74. data/lib/tzinfo/zoneinfo_data_source.rb +0 -504
  75. data/lib/tzinfo/zoneinfo_timezone_info.rb +0 -516
  76. data/test/assets/payload.rb +0 -1
  77. data/test/tc_annual_rules.rb +0 -95
  78. data/test/tc_country.rb +0 -240
  79. data/test/tc_country_index_definition.rb +0 -69
  80. data/test/tc_country_info.rb +0 -16
  81. data/test/tc_country_timezone.rb +0 -173
  82. data/test/tc_data_source.rb +0 -218
  83. data/test/tc_data_timezone.rb +0 -99
  84. data/test/tc_data_timezone_info.rb +0 -18
  85. data/test/tc_info_timezone.rb +0 -34
  86. data/test/tc_linked_timezone.rb +0 -155
  87. data/test/tc_linked_timezone_info.rb +0 -23
  88. data/test/tc_offset_rationals.rb +0 -23
  89. data/test/tc_posix_time_zone_parser.rb +0 -261
  90. data/test/tc_ruby_core_support.rb +0 -168
  91. data/test/tc_ruby_country_info.rb +0 -110
  92. data/test/tc_ruby_data_source.rb +0 -175
  93. data/test/tc_time_or_datetime.rb +0 -674
  94. data/test/tc_timezone.rb +0 -1361
  95. data/test/tc_timezone_definition.rb +0 -113
  96. data/test/tc_timezone_index_definition.rb +0 -73
  97. data/test/tc_timezone_info.rb +0 -11
  98. data/test/tc_timezone_london.rb +0 -143
  99. data/test/tc_timezone_melbourne.rb +0 -142
  100. data/test/tc_timezone_new_york.rb +0 -142
  101. data/test/tc_timezone_offset.rb +0 -126
  102. data/test/tc_timezone_period.rb +0 -555
  103. data/test/tc_timezone_proxy.rb +0 -136
  104. data/test/tc_timezone_transition.rb +0 -366
  105. data/test/tc_timezone_transition_definition.rb +0 -295
  106. data/test/tc_timezone_utc.rb +0 -27
  107. data/test/tc_transition_data_timezone_info.rb +0 -433
  108. data/test/tc_transition_rule.rb +0 -663
  109. data/test/tc_zoneinfo_country_info.rb +0 -78
  110. data/test/tc_zoneinfo_data_source.rb +0 -1226
  111. data/test/tc_zoneinfo_timezone_info.rb +0 -2149
  112. data/test/test_utils.rb +0 -214
  113. data/test/ts_all.rb +0 -7
  114. data/test/ts_all_ruby.rb +0 -5
  115. data/test/ts_all_zoneinfo.rb +0 -9
  116. data/test/tzinfo-data/tzinfo/data/definitions/America/Argentina/Buenos_Aires.rb +0 -89
  117. data/test/tzinfo-data/tzinfo/data/definitions/America/New_York.rb +0 -327
  118. data/test/tzinfo-data/tzinfo/data/definitions/Australia/Melbourne.rb +0 -230
  119. data/test/tzinfo-data/tzinfo/data/definitions/EST.rb +0 -19
  120. data/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__m__1.rb +0 -21
  121. data/test/tzinfo-data/tzinfo/data/definitions/Etc/GMT__p__1.rb +0 -21
  122. data/test/tzinfo-data/tzinfo/data/definitions/Etc/UTC.rb +0 -21
  123. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Amsterdam.rb +0 -273
  124. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Andorra.rb +0 -198
  125. data/test/tzinfo-data/tzinfo/data/definitions/Europe/London.rb +0 -333
  126. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Paris.rb +0 -277
  127. data/test/tzinfo-data/tzinfo/data/definitions/Europe/Prague.rb +0 -235
  128. data/test/tzinfo-data/tzinfo/data/definitions/UTC.rb +0 -16
  129. data/test/tzinfo-data/tzinfo/data/indexes/countries.rb +0 -940
  130. data/test/tzinfo-data/tzinfo/data/indexes/timezones.rb +0 -609
  131. data/test/tzinfo-data/tzinfo/data/version.rb +0 -20
  132. data/test/tzinfo-data/tzinfo/data.rb +0 -8
  133. data/test/zoneinfo/America/Argentina/Buenos_Aires +0 -0
  134. data/test/zoneinfo/America/New_York +0 -0
  135. data/test/zoneinfo/Australia/Melbourne +0 -0
  136. data/test/zoneinfo/EST +0 -0
  137. data/test/zoneinfo/Etc/UTC +0 -0
  138. data/test/zoneinfo/Europe/Amsterdam +0 -0
  139. data/test/zoneinfo/Europe/Andorra +0 -0
  140. data/test/zoneinfo/Europe/London +0 -0
  141. data/test/zoneinfo/Europe/Paris +0 -0
  142. data/test/zoneinfo/Europe/Prague +0 -0
  143. data/test/zoneinfo/Factory +0 -0
  144. data/test/zoneinfo/iso3166.tab +0 -274
  145. data/test/zoneinfo/leapseconds +0 -78
  146. data/test/zoneinfo/posix/Europe/London +0 -0
  147. data/test/zoneinfo/posixrules +0 -0
  148. data/test/zoneinfo/right/Europe/London +0 -0
  149. data/test/zoneinfo/zone.tab +0 -452
  150. data/test/zoneinfo/zone1970.tab +0 -384
  151. data/tzinfo.gemspec +0 -21
data/test/tc_timezone.rb DELETED
@@ -1,1361 +0,0 @@
1
- require File.join(File.expand_path(File.dirname(__FILE__)), 'test_utils')
2
-
3
- include TZInfo
4
-
5
- class TCTimezone < Minitest::Test
6
-
7
- class BlockCalled < StandardError
8
- end
9
-
10
- class TestTimezone < Timezone
11
- def self.new(identifier, period_for_utc = nil, periods_for_local = nil, expected = nil)
12
- t = super()
13
- t.send(:setup, identifier, period_for_utc, periods_for_local, expected)
14
- t
15
- end
16
-
17
- def identifier
18
- @identifier
19
- end
20
-
21
- def period_for_utc(utc)
22
- utc = TimeOrDateTime.wrap(utc)
23
- raise "Unexpected utc #{utc} in period_for_utc" unless @expected.eql?(utc)
24
- @period_for_utc
25
- end
26
-
27
- def periods_for_local(local)
28
- local = TimeOrDateTime.wrap(local)
29
- raise "Unexpected local #{local} in periods_for_local" unless @expected.eql?(local)
30
- @periods_for_local.clone
31
- end
32
-
33
- def transitions_up_to(utc_to, utc_from = nil)
34
- raise 'transitions_up_to called'
35
- end
36
-
37
- private
38
- def setup(identifier, period_for_utc, periods_for_local, expected)
39
- @identifier = identifier
40
- @period_for_utc = period_for_utc
41
- @periods_for_local = periods_for_local || []
42
- @expected = TimeOrDateTime.wrap(expected)
43
- end
44
- end
45
-
46
- class OffsetsUpToTestTimezone < Timezone
47
- def self.new(identifier, expected_utc_to, expected_utc_from, transitions_up_to)
48
- t = super()
49
- t.send(:setup, identifier, expected_utc_to, expected_utc_from, transitions_up_to)
50
- t
51
- end
52
-
53
- def identifier
54
- @identifier
55
- end
56
-
57
- def period_for_utc(utc)
58
- raise 'period_for_utc called'
59
- end
60
-
61
- def periods_for_local(local)
62
- raise 'periods_for_local called'
63
- end
64
-
65
- def transitions_up_to(utc_to, utc_from = nil)
66
- utc_to = TimeOrDateTime.wrap(utc_to)
67
- raise "Unexpected utc_to #{utc_to || 'nil'} in transitions_up_to" unless @expected_utc_to.eql?(utc_to)
68
-
69
- utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil
70
- raise "Unexpected utc_from #{utc_from || 'nil'} in transitions_up_to" unless @expected_utc_from.eql?(utc_from)
71
-
72
- if utc_from && utc_to <= utc_from
73
- raise ArgumentError, 'utc_to must be greater than utc_from'
74
- end
75
-
76
- @transitions_up_to
77
- end
78
-
79
- private
80
-
81
- def setup(identifier, expected_utc_to, expected_utc_from, transitions_up_to)
82
- @identifier = identifier
83
- @expected_utc_to = TimeOrDateTime.wrap(expected_utc_to)
84
- @expected_utc_from = expected_utc_from ? TimeOrDateTime.wrap(expected_utc_from) : nil
85
- @transitions_up_to = transitions_up_to
86
- end
87
- end
88
-
89
- class OffsetsUpToNoTransitionsTestTimezone < Timezone
90
- def self.new(identifier, expected_utc_to, expected_utc_from, period_for_utc)
91
- t = super()
92
- t.send(:setup, identifier, expected_utc_to, expected_utc_from, period_for_utc)
93
- t
94
- end
95
-
96
- def identifier
97
- @identifier
98
- end
99
-
100
- def period_for_utc(utc)
101
- utc = TimeOrDateTime.wrap(utc)
102
-
103
- raise "Unexpected utc #{utc} in period_for_utc (should be utc_from)" if @expected_utc_from && !@expected_utc_from.eql?(utc)
104
- raise "Unexpected utc #{utc} in period_for_utc (should be < utc_to)" if !@expected_utc_from && @expected_utc_to <= utc
105
-
106
- @period_for_utc
107
- end
108
-
109
- def periods_for_local(local)
110
- raise 'periods_for_local called'
111
- end
112
-
113
- def transitions_up_to(utc_to, utc_from = nil)
114
- utc_to = TimeOrDateTime.wrap(utc_to)
115
- raise "Unexpected utc_to #{utc_to || 'nil'} in transitions_up_to" unless @expected_utc_to.eql?(utc_to)
116
-
117
- utc_from = utc_from ? TimeOrDateTime.wrap(utc_from) : nil
118
- raise "Unexpected utc_from #{utc_from || 'nil'} in transitions_up_to" unless @expected_utc_from.eql?(utc_from)
119
-
120
- if utc_from && utc_to <= utc_from
121
- raise ArgumentError, 'utc_to must be greater than utc_from'
122
- end
123
-
124
- []
125
- end
126
-
127
- private
128
-
129
- def setup(identifier, expected_utc_to, expected_utc_from, period_for_utc)
130
- @identifier = identifier
131
- @expected_utc_to = TimeOrDateTime.wrap(expected_utc_to)
132
- @expected_utc_from = expected_utc_from ? TimeOrDateTime.wrap(expected_utc_from) : nil
133
- @period_for_utc = period_for_utc
134
- end
135
- end
136
-
137
- class TestTimezoneTransition < TimezoneTransition
138
- def initialize(offset, previous_offset, at)
139
- super(offset, previous_offset)
140
- @at = TimeOrDateTime.wrap(at)
141
- end
142
-
143
- def at
144
- @at
145
- end
146
- end
147
-
148
- def setup
149
- @orig_default_dst = Timezone.default_dst
150
- @orig_data_source = DataSource.get
151
- Timezone.send :init_loaded_zones
152
- end
153
-
154
- def teardown
155
- Timezone.default_dst = @orig_default_dst
156
- DataSource.set(@orig_data_source)
157
- end
158
-
159
- def test_default_dst_initial_value
160
- assert_nil(Timezone.default_dst)
161
- end
162
-
163
- def test_set_default_dst
164
- Timezone.default_dst = true
165
- assert_equal(true, Timezone.default_dst)
166
- Timezone.default_dst = false
167
- assert_equal(false, Timezone.default_dst)
168
- Timezone.default_dst = nil
169
- assert_nil(Timezone.default_dst)
170
- Timezone.default_dst = 0
171
- assert_equal(true, Timezone.default_dst)
172
- end
173
-
174
- def test_get_valid_1
175
- tz = Timezone.get('Europe/London')
176
-
177
- assert_kind_of(DataTimezone, tz)
178
- assert_equal('Europe/London', tz.identifier)
179
- end
180
-
181
- def test_get_valid_2
182
- tz = Timezone.get('UTC')
183
-
184
- # ZoneinfoDataSource doesn't return LinkedTimezoneInfo for any timezone.
185
- if DataSource.get.load_timezone_info('UTC').kind_of?(LinkedTimezoneInfo)
186
- assert_kind_of(LinkedTimezone, tz)
187
- else
188
- assert_kind_of(DataTimezone, tz)
189
- end
190
-
191
- assert_equal('UTC', tz.identifier)
192
- end
193
-
194
- def test_get_valid_3
195
- tz = Timezone.get('America/Argentina/Buenos_Aires')
196
-
197
- assert_kind_of(DataTimezone, tz)
198
- assert_equal('America/Argentina/Buenos_Aires', tz.identifier)
199
- end
200
-
201
- def test_get_same_instance
202
- tz1 = Timezone.get('Europe/London')
203
- tz2 = Timezone.get('Europe/London')
204
- assert_same(tz1, tz2)
205
- end
206
-
207
- def test_get_not_exist
208
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get('Nowhere/Special') }
209
- end
210
-
211
- def test_get_invalid
212
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get('../definitions/UTC') }
213
- end
214
-
215
- def test_get_nil
216
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get(nil) }
217
- end
218
-
219
- def test_get_case
220
- Timezone.get('Europe/Prague')
221
- assert_raises(InvalidTimezoneIdentifier) { Timezone.get('Europe/prague') }
222
- end
223
-
224
- def test_get_proxy_valid
225
- proxy = Timezone.get_proxy('Europe/London')
226
- assert_kind_of(TimezoneProxy, proxy)
227
- assert_equal('Europe/London', proxy.identifier)
228
- end
229
-
230
- def test_get_proxy_not_exist
231
- proxy = Timezone.get_proxy('Not/There')
232
- assert_kind_of(TimezoneProxy, proxy)
233
- assert_equal('Not/There', proxy.identifier)
234
- end
235
-
236
- def test_get_proxy_invalid
237
- proxy = Timezone.get_proxy('../Invalid/Identifier')
238
- assert_kind_of(TimezoneProxy, proxy)
239
- assert_equal('../Invalid/Identifier', proxy.identifier)
240
- end
241
-
242
- def test_get_tainted_loaded
243
- skip_if_taint_is_undefined_or_no_op
244
- Timezone.get('Europe/Andorra')
245
-
246
- safe_test(:unavailable => :skip) do
247
- identifier = 'Europe/Andorra'.dup.taint
248
- assert(identifier.tainted?)
249
- tz = Timezone.get(identifier)
250
- assert_equal('Europe/Andorra', tz.identifier)
251
- assert(identifier.tainted?)
252
- end
253
- end
254
-
255
- def test_get_tainted_and_frozen_loaded
256
- skip_if_taint_is_undefined_or_no_op
257
- Timezone.get('Europe/Andorra')
258
-
259
- safe_test do
260
- tz = Timezone.get('Europe/Andorra'.dup.taint.freeze)
261
- assert_equal('Europe/Andorra', tz.identifier)
262
- end
263
- end
264
-
265
- def test_get_tainted_not_previously_loaded
266
- skip_if_taint_is_undefined_or_no_op
267
- skip_if_has_bug_14060
268
-
269
- safe_test(:unavailable => :skip) do
270
- identifier = 'Europe/Andorra'.dup.taint
271
- assert(identifier.tainted?)
272
- tz = Timezone.get(identifier)
273
- assert_equal('Europe/Andorra', tz.identifier)
274
- assert(identifier.tainted?)
275
- end
276
- end
277
-
278
- def test_get_tainted_and_frozen_not_previously_loaded
279
- skip_if_taint_is_undefined_or_no_op
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