Add more descriptive error messages to init methods in Ruby (#5659)
* add more descriptive error messages to init methods * add type errors test to Makefile.ampull/5689/head
parent
413c614a94
commit
64eb9b6e85
9 changed files with 225 additions and 34 deletions
@ -0,0 +1,173 @@ |
||||
#!/usr/bin/ruby |
||||
|
||||
# generated_code.rb is in the same directory as this test. |
||||
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) |
||||
|
||||
require 'test/unit' |
||||
require 'google/protobuf/well_known_types' |
||||
require 'generated_code_pb' |
||||
|
||||
class TestTypeErrors < Test::Unit::TestCase |
||||
def test_bad_string |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid argument for string field 'optional_string' (given Integer)." do |
||||
A::B::C::TestMessage.new(optional_string: 4) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid argument for string field 'oneof_string' (given Integer)." do |
||||
A::B::C::TestMessage.new(oneof_string: 4) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_string' (given String)." do |
||||
A::B::C::TestMessage.new(repeated_string: '4') |
||||
end |
||||
end |
||||
|
||||
def test_bad_float |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for float field 'optional_float' (given TrueClass)." do |
||||
A::B::C::TestMessage.new(optional_float: true) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for float field 'oneof_float' (given TrueClass)." do |
||||
A::B::C::TestMessage.new(oneof_float: true) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_float' (given String)." do |
||||
A::B::C::TestMessage.new(repeated_float: 'true') |
||||
end |
||||
end |
||||
|
||||
def test_bad_double |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for double field 'optional_double' (given Symbol)." do |
||||
A::B::C::TestMessage.new(optional_double: :double) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for double field 'oneof_double' (given Symbol)." do |
||||
A::B::C::TestMessage.new(oneof_double: :double) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_double' (given FalseClass)." do |
||||
A::B::C::TestMessage.new(repeated_double: false) |
||||
end |
||||
end |
||||
|
||||
def test_bad_bool |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid argument for boolean field 'optional_bool' (given Float)." do |
||||
A::B::C::TestMessage.new(optional_bool: 4.4) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid argument for boolean field 'oneof_bool' (given Float)." do |
||||
A::B::C::TestMessage.new(oneof_bool: 4.4) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_bool' (given String)." do |
||||
A::B::C::TestMessage.new(repeated_bool: 'hi') |
||||
end |
||||
end |
||||
|
||||
def test_bad_int |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for integral field 'optional_int32' (given String)." do |
||||
A::B::C::TestMessage.new(optional_int32: 'hi') |
||||
end |
||||
check_error RangeError, |
||||
"Non-integral floating point value assigned to integer field 'optional_int64' (given Float)." do |
||||
A::B::C::TestMessage.new(optional_int64: 2.4) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for integral field 'optional_uint32' (given Symbol)." do |
||||
A::B::C::TestMessage.new(optional_uint32: :thing) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for integral field 'optional_uint64' (given FalseClass)." do |
||||
A::B::C::TestMessage.new(optional_uint64: false) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for integral field 'oneof_int32' (given Symbol)." do |
||||
A::B::C::TestMessage.new(oneof_int32: :hi) |
||||
end |
||||
check_error RangeError, |
||||
"Non-integral floating point value assigned to integer field 'oneof_int64' (given Float)." do |
||||
A::B::C::TestMessage.new(oneof_int64: 2.4) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Expected number type for integral field 'oneof_uint32' (given String)." do |
||||
A::B::C::TestMessage.new(oneof_uint32: 'x') |
||||
end |
||||
check_error RangeError, |
||||
"Non-integral floating point value assigned to integer field 'oneof_uint64' (given Float)." do |
||||
A::B::C::TestMessage.new(oneof_uint64: 1.1) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_int32' (given Symbol)." do |
||||
A::B::C::TestMessage.new(repeated_int32: :hi) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_int64' (given Float)." do |
||||
A::B::C::TestMessage.new(repeated_int64: 2.4) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_uint32' (given String)." do |
||||
A::B::C::TestMessage.new(repeated_uint32: 'x') |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_uint64' (given Float)." do |
||||
A::B::C::TestMessage.new(repeated_uint64: 1.1) |
||||
end |
||||
end |
||||
|
||||
def test_bad_enum |
||||
check_error RangeError, |
||||
"Unknown symbol value for enum field 'optional_enum'." do |
||||
A::B::C::TestMessage.new(optional_enum: 'enum') |
||||
end |
||||
check_error RangeError, |
||||
"Unknown symbol value for enum field 'oneof_enum'." do |
||||
A::B::C::TestMessage.new(oneof_enum: '') |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_enum' (given String)." do |
||||
A::B::C::TestMessage.new(repeated_enum: '') |
||||
end |
||||
end |
||||
|
||||
def test_bad_bytes |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid argument for bytes field 'optional_bytes' (given Float)." do |
||||
A::B::C::TestMessage.new(optional_bytes: 22.22) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid argument for bytes field 'oneof_bytes' (given Symbol)." do |
||||
A::B::C::TestMessage.new(oneof_bytes: :T22) |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_bytes' (given Symbol)." do |
||||
A::B::C::TestMessage.new(repeated_bytes: :T22) |
||||
end |
||||
end |
||||
|
||||
def test_bad_msg |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid type Integer to assign to submessage field 'optional_msg'." do |
||||
A::B::C::TestMessage.new(optional_msg: 2) |
||||
end |
||||
check_error Google::Protobuf::TypeError, |
||||
"Invalid type String to assign to submessage field 'oneof_msg'." do |
||||
A::B::C::TestMessage.new(oneof_msg: '2') |
||||
end |
||||
check_error ArgumentError, |
||||
"Expected array as initializer value for repeated field 'repeated_msg' (given String)." do |
||||
A::B::C::TestMessage.new(repeated_msg: '2') |
||||
end |
||||
end |
||||
|
||||
def check_error(type, message) |
||||
err = assert_raises type do |
||||
yield |
||||
end |
||||
assert_equal message, err.message |
||||
end |
||||
end |
Loading…
Reference in new issue