summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-07-27 13:56:54 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-09-15 21:55:34 +0900
commit751d4ab9c2382d60868446cc69fdac0a9f6cdf4a (patch)
treefb97f6995ed6fcfec285bade4e22149cda627260
parent6cad0644248d5acbaf3a2e8de4ff6d88b3dd2cb4 (diff)
Refine Timezone fixture
-rw-r--r--spec/ruby/core/time/at_spec.rb4
-rw-r--r--spec/ruby/core/time/fixtures/classes.rb47
-rw-r--r--spec/ruby/core/time/new_spec.rb6
3 files changed, 39 insertions, 18 deletions
diff --git a/spec/ruby/core/time/at_spec.rb b/spec/ruby/core/time/at_spec.rb
index 592b331a28..8434e8dd16 100644
--- a/spec/ruby/core/time/at_spec.rb
+++ b/spec/ruby/core/time/at_spec.rb
@@ -235,14 +235,14 @@ describe "Time.at" do
end
it "could be a timezone object" do
- zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo", offset: (5*3600+30*60))
+ zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo")
time = Time.at(@epoch_time, in: zone)
time.utc_offset.should == 5*3600+30*60
time.zone.should == zone
time.to_i.should == @epoch_time
- zone = TimeSpecs::TimezoneWithName.new(name: "PST", offset: (-9*60*60))
+ zone = TimeSpecs::TimezoneWithName.new(name: "PST")
time = Time.at(@epoch_time, in: zone)
time.utc_offset.should == -9*60*60
diff --git a/spec/ruby/core/time/fixtures/classes.rb b/spec/ruby/core/time/fixtures/classes.rb
index a648171b32..1a9511b261 100644
--- a/spec/ruby/core/time/fixtures/classes.rb
+++ b/spec/ruby/core/time/fixtures/classes.rb
@@ -55,31 +55,52 @@ module TimeSpecs
end
end
- class TimezoneWithAbbr < Timezone
+ Z = Struct.new(:offset, :abbr)
+ Zone = Struct.new(:std, :dst, :dst_range)
+ Zones = {
+ "Asia/Colombo" => Zone[Z[5*3600+30*60, "MMT"], nil, nil],
+ "Europe/Kiev" => Zone[Z[2*3600, "EET"], Z[3*3600, "EEST"], 4..10],
+ "PST" => Zone[Z[(-9*60*60), "PST"], nil, nil],
+ }
+
+ class TimezoneWithName < Timezone
+ attr_reader :name
+
def initialize(options)
- super
- @abbr = options[:abbr]
+ @name = options[:name]
+ @std, @dst, @dst_range = *Zones[@name]
end
- def abbr(time)
- @abbr
+ def dst?(t)
+ @dst_range&.cover?(t.mon)
end
- end
- class TimezoneWithName < Timezone
- def initialize(options)
- super
- @name = options[:name]
+ def zone(t)
+ (dst?(t) ? @dst : @std)
end
- def name
- @name
+ def utc_offset(t)
+ zone(t)&.offset || 0
+ end
+
+ def abbr(t)
+ zone(t)&.abbr
+ end
+
+ def local_to_utc(t)
+ t - utc_offset(t)
+ end
+
+ def utc_to_local(t)
+ t + utc_offset(t)
end
end
class TimeWithFindTimezone < Time
def self.find_timezone(name)
- TimezoneWithName.new(name: name.to_s, offset: 5*3600+30*60)
+ TimezoneWithName.new(name: name.to_s)
end
end
+
+ TimezoneWithAbbr = TimezoneWithName
end
diff --git a/spec/ruby/core/time/new_spec.rb b/spec/ruby/core/time/new_spec.rb
index 84e97f8082..dcdd83a085 100644
--- a/spec/ruby/core/time/new_spec.rb
+++ b/spec/ruby/core/time/new_spec.rb
@@ -265,7 +265,7 @@ ruby_version_is "2.6" do
context "#name method" do
it "uses the optional #name method for marshaling" do
- zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo", offset: (5*3600+30*60))
+ zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo")
time = Time.new(2000, 1, 1, 12, 0, 0, zone)
time_loaded = Marshal.load(Marshal.dump(time))
@@ -284,7 +284,7 @@ ruby_version_is "2.6" do
end
it "the #abbr method is used by '%Z' in #strftime" do
- zone = TimeSpecs::TimezoneWithAbbr.new(abbr: "MMT", offset: (5*3600+30*60))
+ zone = TimeSpecs::TimezoneWithAbbr.new(name: "Asia/Colombo")
time = Time.new(2000, 1, 1, 12, 0, 0, zone)
time.strftime("%Z").should == "MMT"
@@ -296,7 +296,7 @@ ruby_version_is "2.6" do
# the necessary methods mentioned above.
context "subject's class implements .find_timezone method" do
it "calls .find_timezone to build a time object at loading marshaled data" do
- zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo", offset: (5*3600+30*60))
+ zone = TimeSpecs::TimezoneWithName.new(name: "Asia/Colombo")
time = TimeSpecs::TimeWithFindTimezone.new(2000, 1, 1, 12, 0, 0, zone)
time_loaded = Marshal.load(Marshal.dump(time))