1#!/usr/bin/ruby 2 3# generated_code.rb is in the same directory as this test. 4$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) 5 6require 'test/unit' 7require 'google/protobuf/well_known_types' 8require 'generated_code_pb' 9 10class TestTypeErrors < Test::Unit::TestCase 11 # Ruby 2.4 unified Fixnum with Integer 12 IntegerType = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.4') ? Fixnum : Integer 13 14 def test_bad_string 15 check_error Google::Protobuf::TypeError, 16 "Invalid argument for string field 'optional_string' (given #{IntegerType.name})." do 17 A::B::C::TestMessage.new(optional_string: 4) 18 end 19 check_error Google::Protobuf::TypeError, 20 "Invalid argument for string field 'oneof_string' (given #{IntegerType.name})." do 21 A::B::C::TestMessage.new(oneof_string: 4) 22 end 23 check_error ArgumentError, 24 "Expected array as initializer value for repeated field 'repeated_string' (given String)." do 25 A::B::C::TestMessage.new(repeated_string: '4') 26 end 27 end 28 29 def test_bad_float 30 check_error Google::Protobuf::TypeError, 31 "Expected number type for float field 'optional_float' (given TrueClass)." do 32 A::B::C::TestMessage.new(optional_float: true) 33 end 34 check_error Google::Protobuf::TypeError, 35 "Expected number type for float field 'oneof_float' (given TrueClass)." do 36 A::B::C::TestMessage.new(oneof_float: true) 37 end 38 check_error ArgumentError, 39 "Expected array as initializer value for repeated field 'repeated_float' (given String)." do 40 A::B::C::TestMessage.new(repeated_float: 'true') 41 end 42 end 43 44 def test_bad_double 45 check_error Google::Protobuf::TypeError, 46 "Expected number type for double field 'optional_double' (given Symbol)." do 47 A::B::C::TestMessage.new(optional_double: :double) 48 end 49 check_error Google::Protobuf::TypeError, 50 "Expected number type for double field 'oneof_double' (given Symbol)." do 51 A::B::C::TestMessage.new(oneof_double: :double) 52 end 53 check_error ArgumentError, 54 "Expected array as initializer value for repeated field 'repeated_double' (given FalseClass)." do 55 A::B::C::TestMessage.new(repeated_double: false) 56 end 57 end 58 59 def test_bad_bool 60 check_error Google::Protobuf::TypeError, 61 "Invalid argument for boolean field 'optional_bool' (given Float)." do 62 A::B::C::TestMessage.new(optional_bool: 4.4) 63 end 64 check_error Google::Protobuf::TypeError, 65 "Invalid argument for boolean field 'oneof_bool' (given Float)." do 66 A::B::C::TestMessage.new(oneof_bool: 4.4) 67 end 68 check_error ArgumentError, 69 "Expected array as initializer value for repeated field 'repeated_bool' (given String)." do 70 A::B::C::TestMessage.new(repeated_bool: 'hi') 71 end 72 end 73 74 def test_bad_int 75 check_error Google::Protobuf::TypeError, 76 "Expected number type for integral field 'optional_int32' (given String)." do 77 A::B::C::TestMessage.new(optional_int32: 'hi') 78 end 79 check_error RangeError, 80 "Non-integral floating point value assigned to integer field 'optional_int64' (given Float)." do 81 A::B::C::TestMessage.new(optional_int64: 2.4) 82 end 83 check_error Google::Protobuf::TypeError, 84 "Expected number type for integral field 'optional_uint32' (given Symbol)." do 85 A::B::C::TestMessage.new(optional_uint32: :thing) 86 end 87 check_error Google::Protobuf::TypeError, 88 "Expected number type for integral field 'optional_uint64' (given FalseClass)." do 89 A::B::C::TestMessage.new(optional_uint64: false) 90 end 91 check_error Google::Protobuf::TypeError, 92 "Expected number type for integral field 'oneof_int32' (given Symbol)." do 93 A::B::C::TestMessage.new(oneof_int32: :hi) 94 end 95 check_error RangeError, 96 "Non-integral floating point value assigned to integer field 'oneof_int64' (given Float)." do 97 A::B::C::TestMessage.new(oneof_int64: 2.4) 98 end 99 check_error Google::Protobuf::TypeError, 100 "Expected number type for integral field 'oneof_uint32' (given String)." do 101 A::B::C::TestMessage.new(oneof_uint32: 'x') 102 end 103 check_error RangeError, 104 "Non-integral floating point value assigned to integer field 'oneof_uint64' (given Float)." do 105 A::B::C::TestMessage.new(oneof_uint64: 1.1) 106 end 107 check_error ArgumentError, 108 "Expected array as initializer value for repeated field 'repeated_int32' (given Symbol)." do 109 A::B::C::TestMessage.new(repeated_int32: :hi) 110 end 111 check_error ArgumentError, 112 "Expected array as initializer value for repeated field 'repeated_int64' (given Float)." do 113 A::B::C::TestMessage.new(repeated_int64: 2.4) 114 end 115 check_error ArgumentError, 116 "Expected array as initializer value for repeated field 'repeated_uint32' (given String)." do 117 A::B::C::TestMessage.new(repeated_uint32: 'x') 118 end 119 check_error ArgumentError, 120 "Expected array as initializer value for repeated field 'repeated_uint64' (given Float)." do 121 A::B::C::TestMessage.new(repeated_uint64: 1.1) 122 end 123 end 124 125 def test_bad_enum 126 check_error RangeError, 127 "Unknown symbol value for enum field 'optional_enum'." do 128 A::B::C::TestMessage.new(optional_enum: 'enum') 129 end 130 check_error RangeError, 131 "Unknown symbol value for enum field 'oneof_enum'." do 132 A::B::C::TestMessage.new(oneof_enum: '') 133 end 134 check_error ArgumentError, 135 "Expected array as initializer value for repeated field 'repeated_enum' (given String)." do 136 A::B::C::TestMessage.new(repeated_enum: '') 137 end 138 end 139 140 def test_bad_bytes 141 check_error Google::Protobuf::TypeError, 142 "Invalid argument for bytes field 'optional_bytes' (given Float)." do 143 A::B::C::TestMessage.new(optional_bytes: 22.22) 144 end 145 check_error Google::Protobuf::TypeError, 146 "Invalid argument for bytes field 'oneof_bytes' (given Symbol)." do 147 A::B::C::TestMessage.new(oneof_bytes: :T22) 148 end 149 check_error ArgumentError, 150 "Expected array as initializer value for repeated field 'repeated_bytes' (given Symbol)." do 151 A::B::C::TestMessage.new(repeated_bytes: :T22) 152 end 153 end 154 155 def test_bad_msg 156 check_error Google::Protobuf::TypeError, 157 "Invalid type #{IntegerType.name} to assign to submessage field 'optional_msg'." do 158 A::B::C::TestMessage.new(optional_msg: 2) 159 end 160 check_error Google::Protobuf::TypeError, 161 "Invalid type String to assign to submessage field 'oneof_msg'." do 162 A::B::C::TestMessage.new(oneof_msg: '2') 163 end 164 check_error ArgumentError, 165 "Expected array as initializer value for repeated field 'repeated_msg' (given String)." do 166 A::B::C::TestMessage.new(repeated_msg: '2') 167 end 168 end 169 170 def check_error(type, message) 171 err = assert_raises type do 172 yield 173 end 174 assert_equal message, err.message 175 end 176end 177