tzinfo 1.2.11 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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