提交 24bf3f08 编写于 作者: R Ryuta Kamizono

Merge pull request #37882 from kamipo/should_keep_zero_duration_parts

Should keep the original parts for zero duration
上级 596e1250
...@@ -182,15 +182,15 @@ def years(value) #:nodoc: ...@@ -182,15 +182,15 @@ def years(value) #:nodoc:
# #
def build(value) def build(value)
parts = {} parts = {}
remainder = value.to_f remainder = value.round(9)
PARTS.each do |part| PARTS.each do |part|
unless part == :seconds unless part == :seconds
part_in_seconds = PARTS_IN_SECONDS[part] part_in_seconds = PARTS_IN_SECONDS[part]
parts[part] = remainder.div(part_in_seconds) parts[part] = remainder.div(part_in_seconds)
remainder = (remainder % part_in_seconds).round(9) remainder %= part_in_seconds
end end
end end unless value == 0
parts[:seconds] = remainder parts[:seconds] = remainder
...@@ -209,7 +209,7 @@ def calculate_total_seconds(parts) ...@@ -209,7 +209,7 @@ def calculate_total_seconds(parts)
def initialize(value, parts) #:nodoc: def initialize(value, parts) #:nodoc:
@value, @parts = value, parts.to_h @value, @parts = value, parts.to_h
@parts.default = 0 @parts.default = 0
@parts.reject! { |k, v| v.zero? } @parts.reject! { |k, v| v.zero? } unless value == 0
end end
def coerce(other) #:nodoc: def coerce(other) #:nodoc:
......
...@@ -62,6 +62,7 @@ def test_eql ...@@ -62,6 +62,7 @@ def test_eql
def test_inspect def test_inspect
assert_equal "0 seconds", 0.seconds.inspect assert_equal "0 seconds", 0.seconds.inspect
assert_equal "0 days", 0.days.inspect
assert_equal "1 month", 1.month.inspect assert_equal "1 month", 1.month.inspect
assert_equal "1 month and 1 day", (1.month + 1.day).inspect assert_equal "1 month and 1 day", (1.month + 1.day).inspect
assert_equal "6 months and -2 days", (6.months - 2.days).inspect assert_equal "6 months and -2 days", (6.months - 2.days).inspect
...@@ -155,20 +156,29 @@ def test_modulo ...@@ -155,20 +156,29 @@ def test_modulo
assert_instance_of ActiveSupport::Duration, 13.months % 1.year assert_instance_of ActiveSupport::Duration, 13.months % 1.year
end end
def test_date_added_with_zero_days
assert_equal Date.civil(2017, 1, 1), Date.civil(2017, 1, 1) + 0.days
assert_instance_of Date, Date.civil(2017, 1, 1) + 0.days
end
def test_date_added_with_multiplied_duration def test_date_added_with_multiplied_duration
assert_equal Date.civil(2017, 1, 3), Date.civil(2017, 1, 1) + 1.day * 2 assert_equal Date.civil(2017, 1, 3), Date.civil(2017, 1, 1) + 1.day * 2
assert_instance_of Date, Date.civil(2017, 1, 1) + 1.day * 2
end end
def test_date_added_with_multiplied_duration_larger_than_one_month def test_date_added_with_multiplied_duration_larger_than_one_month
assert_equal Date.civil(2017, 2, 15), Date.civil(2017, 1, 1) + 1.day * 45 assert_equal Date.civil(2017, 2, 15), Date.civil(2017, 1, 1) + 1.day * 45
assert_instance_of Date, Date.civil(2017, 1, 1) + 1.day * 45
end end
def test_date_added_with_divided_duration def test_date_added_with_divided_duration
assert_equal Date.civil(2017, 1, 3), Date.civil(2017, 1, 1) + 4.days / 2 assert_equal Date.civil(2017, 1, 3), Date.civil(2017, 1, 1) + 4.days / 2
assert_instance_of Date, Date.civil(2017, 1, 1) + 4.days / 2
end end
def test_date_added_with_divided_duration_larger_than_one_month def test_date_added_with_divided_duration_larger_than_one_month
assert_equal Date.civil(2017, 2, 15), Date.civil(2017, 1, 1) + 90.days / 2 assert_equal Date.civil(2017, 2, 15), Date.civil(2017, 1, 1) + 90.days / 2
assert_instance_of Date, Date.civil(2017, 1, 1) + 90.days / 2
end end
def test_plus_with_time def test_plus_with_time
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册