tzinfo 1.2.1 → 2.0.5

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