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