Skip to content

Commit b12ab0c

Browse files
authored
Merge pull request #8320 from haberman/ruby-duration-fix
[Ruby] Fix for truncating behavior when converting Float to Duration.
2 parents 4f961c8 + 3b3aac9 commit b12ab0c

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

ruby/ext/google/protobuf_c/message.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1287,7 +1287,7 @@ const upb_msg* Message_GetUpbMessage(VALUE value, const upb_msgdef* m,
12871287
if (!rb_obj_is_kind_of(value, rb_cNumeric)) goto badtype;
12881288

12891289
sec.int64_val = NUM2LL(value);
1290-
nsec.int32_val = (NUM2DBL(value) - NUM2LL(value)) * 1000000000;
1290+
nsec.int32_val = round((NUM2DBL(value) - NUM2LL(value)) * 1000000000);
12911291
upb_msg_set(msg, sec_f, sec, arena);
12921292
upb_msg_set(msg, nsec_f, nsec, arena);
12931293
return msg;

ruby/tests/common_tests.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1701,6 +1701,12 @@ def test_converts_duration
17011701
m = proto_module::TimeMessage.new(duration: 1.1)
17021702
assert_equal Google::Protobuf::Duration.new(seconds: 1, nanos: 100_000_000), m.duration
17031703

1704+
m = proto_module::TimeMessage.new(duration: 123.321)
1705+
assert_equal Google::Protobuf::Duration.new(seconds: 123, nanos: 321_000_000), m.duration
1706+
1707+
m = proto_module::TimeMessage.new(duration: -123.321)
1708+
assert_equal Google::Protobuf::Duration.new(seconds: -123, nanos: -321_000_000), m.duration
1709+
17041710
assert_raise(Google::Protobuf::TypeError) { m.duration = '2' }
17051711
assert_raise(Google::Protobuf::TypeError) { m.duration = proto_module::TimeMessage.new }
17061712
end

0 commit comments

Comments
 (0)