1*1b3f573fSAndroid Build Coastguard Workerrequire 'google/protobuf/wrappers_pb.rb' 2*1b3f573fSAndroid Build Coastguard Worker 3*1b3f573fSAndroid Build Coastguard Worker# Defines tests which are common between proto2 and proto3 syntax. 4*1b3f573fSAndroid Build Coastguard Worker# 5*1b3f573fSAndroid Build Coastguard Worker# Requires that the proto messages are exactly the same in proto2 and proto3 syntax 6*1b3f573fSAndroid Build Coastguard Worker# and that the including class should define a 'proto_module' method which returns 7*1b3f573fSAndroid Build Coastguard Worker# the enclosing module of the proto message classes. 8*1b3f573fSAndroid Build Coastguard Worker 9*1b3f573fSAndroid Build Coastguard Workerrequire 'bigdecimal' 10*1b3f573fSAndroid Build Coastguard Worker 11*1b3f573fSAndroid Build Coastguard Workermodule CommonTests 12*1b3f573fSAndroid Build Coastguard Worker # Ruby 2.5 changed to raise FrozenError instead of RuntimeError 13*1b3f573fSAndroid Build Coastguard Worker FrozenErrorType = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.5') ? RuntimeError : FrozenError 14*1b3f573fSAndroid Build Coastguard Worker 15*1b3f573fSAndroid Build Coastguard Worker def test_defaults 16*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 17*1b3f573fSAndroid Build Coastguard Worker assert m.optional_int32 == 0 18*1b3f573fSAndroid Build Coastguard Worker assert m.optional_int64 == 0 19*1b3f573fSAndroid Build Coastguard Worker assert m.optional_uint32 == 0 20*1b3f573fSAndroid Build Coastguard Worker assert m.optional_uint64 == 0 21*1b3f573fSAndroid Build Coastguard Worker assert m.optional_bool == false 22*1b3f573fSAndroid Build Coastguard Worker assert m.optional_float == 0.0 23*1b3f573fSAndroid Build Coastguard Worker assert m.optional_double == 0.0 24*1b3f573fSAndroid Build Coastguard Worker assert m.optional_string == "" 25*1b3f573fSAndroid Build Coastguard Worker assert m.optional_bytes == "" 26*1b3f573fSAndroid Build Coastguard Worker assert m.optional_msg == nil 27*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :Default 28*1b3f573fSAndroid Build Coastguard Worker end 29*1b3f573fSAndroid Build Coastguard Worker 30*1b3f573fSAndroid Build Coastguard Worker def test_setters 31*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 32*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = -42 33*1b3f573fSAndroid Build Coastguard Worker assert m.optional_int32 == -42 34*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = -0x1_0000_0000 35*1b3f573fSAndroid Build Coastguard Worker assert m.optional_int64 == -0x1_0000_0000 36*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = 0x9000_0000 37*1b3f573fSAndroid Build Coastguard Worker assert m.optional_uint32 == 0x9000_0000 38*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = 0x9000_0000_0000_0000 39*1b3f573fSAndroid Build Coastguard Worker assert m.optional_uint64 == 0x9000_0000_0000_0000 40*1b3f573fSAndroid Build Coastguard Worker m.optional_bool = true 41*1b3f573fSAndroid Build Coastguard Worker assert m.optional_bool == true 42*1b3f573fSAndroid Build Coastguard Worker m.optional_float = 0.5 43*1b3f573fSAndroid Build Coastguard Worker assert m.optional_float == 0.5 44*1b3f573fSAndroid Build Coastguard Worker m.optional_double = 0.5 45*1b3f573fSAndroid Build Coastguard Worker assert m.optional_double == 0.5 46*1b3f573fSAndroid Build Coastguard Worker m.optional_string = "hello" 47*1b3f573fSAndroid Build Coastguard Worker assert m.optional_string == "hello" 48*1b3f573fSAndroid Build Coastguard Worker m.optional_string = :hello 49*1b3f573fSAndroid Build Coastguard Worker assert m.optional_string == "hello" 50*1b3f573fSAndroid Build Coastguard Worker m.optional_bytes = "world".encode!('ASCII-8BIT') 51*1b3f573fSAndroid Build Coastguard Worker assert m.optional_bytes == "world" 52*1b3f573fSAndroid Build Coastguard Worker m.optional_msg = proto_module::TestMessage2.new(:foo => 42) 53*1b3f573fSAndroid Build Coastguard Worker assert m.optional_msg == proto_module::TestMessage2.new(:foo => 42) 54*1b3f573fSAndroid Build Coastguard Worker m.optional_msg = nil 55*1b3f573fSAndroid Build Coastguard Worker assert m.optional_msg == nil 56*1b3f573fSAndroid Build Coastguard Worker m.optional_enum = :C 57*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :C 58*1b3f573fSAndroid Build Coastguard Worker m.optional_enum = 'C' 59*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :C 60*1b3f573fSAndroid Build Coastguard Worker end 61*1b3f573fSAndroid Build Coastguard Worker 62*1b3f573fSAndroid Build Coastguard Worker def test_ctor_args 63*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_int32 => -42, 64*1b3f573fSAndroid Build Coastguard Worker :optional_msg => proto_module::TestMessage2.new, 65*1b3f573fSAndroid Build Coastguard Worker :optional_enum => :C, 66*1b3f573fSAndroid Build Coastguard Worker :repeated_string => ["hello", "there", "world"]) 67*1b3f573fSAndroid Build Coastguard Worker assert m.optional_int32 == -42 68*1b3f573fSAndroid Build Coastguard Worker assert m.optional_msg.class == proto_module::TestMessage2 69*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string.length == 3 70*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :C 71*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string[0] == "hello" 72*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string[1] == "there" 73*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string[2] == "world" 74*1b3f573fSAndroid Build Coastguard Worker end 75*1b3f573fSAndroid Build Coastguard Worker 76*1b3f573fSAndroid Build Coastguard Worker def test_ctor_string_symbol_args 77*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_enum => 'C', :repeated_enum => ['A', 'B']) 78*1b3f573fSAndroid Build Coastguard Worker assert_equal :C, m.optional_enum 79*1b3f573fSAndroid Build Coastguard Worker assert_equal [:A, :B], m.repeated_enum 80*1b3f573fSAndroid Build Coastguard Worker 81*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_string => :foo, :repeated_string => [:foo, :bar]) 82*1b3f573fSAndroid Build Coastguard Worker assert_equal 'foo', m.optional_string 83*1b3f573fSAndroid Build Coastguard Worker assert_equal ['foo', 'bar'], m.repeated_string 84*1b3f573fSAndroid Build Coastguard Worker end 85*1b3f573fSAndroid Build Coastguard Worker 86*1b3f573fSAndroid Build Coastguard Worker def test_ctor_nil_args 87*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_enum => nil, :optional_int32 => nil, :optional_string => nil, :optional_msg => nil) 88*1b3f573fSAndroid Build Coastguard Worker 89*1b3f573fSAndroid Build Coastguard Worker assert_equal :Default, m.optional_enum 90*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, m.optional_int32 91*1b3f573fSAndroid Build Coastguard Worker assert_equal "", m.optional_string 92*1b3f573fSAndroid Build Coastguard Worker assert_nil m.optional_msg 93*1b3f573fSAndroid Build Coastguard Worker end 94*1b3f573fSAndroid Build Coastguard Worker 95*1b3f573fSAndroid Build Coastguard Worker def test_embeddedmsg_hash_init 96*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestEmbeddedMessageParent.new( 97*1b3f573fSAndroid Build Coastguard Worker :child_msg => {sub_child: {optional_int32: 1}}, 98*1b3f573fSAndroid Build Coastguard Worker :number => 2, 99*1b3f573fSAndroid Build Coastguard Worker :repeated_msg => [{sub_child: {optional_int32: 3}}], 100*1b3f573fSAndroid Build Coastguard Worker :repeated_number => [10, 20, 30]) 101*1b3f573fSAndroid Build Coastguard Worker 102*1b3f573fSAndroid Build Coastguard Worker assert_equal 2, m.number 103*1b3f573fSAndroid Build Coastguard Worker assert_equal [10, 20, 30], m.repeated_number 104*1b3f573fSAndroid Build Coastguard Worker 105*1b3f573fSAndroid Build Coastguard Worker assert_not_nil m.child_msg 106*1b3f573fSAndroid Build Coastguard Worker assert_not_nil m.child_msg.sub_child 107*1b3f573fSAndroid Build Coastguard Worker assert_equal m.child_msg.sub_child.optional_int32, 1 108*1b3f573fSAndroid Build Coastguard Worker 109*1b3f573fSAndroid Build Coastguard Worker assert_not_nil m.repeated_msg 110*1b3f573fSAndroid Build Coastguard Worker assert_equal 1, m.repeated_msg.length 111*1b3f573fSAndroid Build Coastguard Worker assert_equal 3, m.repeated_msg.first.sub_child.optional_int32 112*1b3f573fSAndroid Build Coastguard Worker end 113*1b3f573fSAndroid Build Coastguard Worker 114*1b3f573fSAndroid Build Coastguard Worker def test_inspect_eq_to_s 115*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new( 116*1b3f573fSAndroid Build Coastguard Worker :optional_int32 => -42, 117*1b3f573fSAndroid Build Coastguard Worker :optional_enum => :A, 118*1b3f573fSAndroid Build Coastguard Worker :optional_msg => proto_module::TestMessage2.new(foo: 0), 119*1b3f573fSAndroid Build Coastguard Worker :repeated_string => ["hello", "there", "world"]) 120*1b3f573fSAndroid Build Coastguard Worker expected = "<#{proto_module}::TestMessage: optional_int32: -42, optional_msg: <#{proto_module}::TestMessage2: foo: 0>, optional_enum: :A, repeated_int32: [], repeated_int64: [], repeated_uint32: [], repeated_uint64: [], repeated_bool: [], repeated_float: [], repeated_double: [], repeated_string: [\"hello\", \"there\", \"world\"], repeated_bytes: [], repeated_msg: [], repeated_enum: []>" 121*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, m.inspect 122*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, m.to_s 123*1b3f573fSAndroid Build Coastguard Worker 124*1b3f573fSAndroid Build Coastguard Worker m = proto_module::OneofMessage.new(:b => -42) 125*1b3f573fSAndroid Build Coastguard Worker expected = "<#{proto_module}::OneofMessage: b: -42>" 126*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, m.inspect 127*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, m.to_s 128*1b3f573fSAndroid Build Coastguard Worker end 129*1b3f573fSAndroid Build Coastguard Worker 130*1b3f573fSAndroid Build Coastguard Worker def test_hash 131*1b3f573fSAndroid Build Coastguard Worker m1 = proto_module::TestMessage.new(:optional_int32 => 42) 132*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.new(:optional_int32 => 102, repeated_string: ['please', 'work', 'ok?']) 133*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::TestMessage.new(:optional_int32 => 102, repeated_string: ['please', 'work', 'ok?']) 134*1b3f573fSAndroid Build Coastguard Worker assert m1.hash != 0 135*1b3f573fSAndroid Build Coastguard Worker assert m2.hash != 0 136*1b3f573fSAndroid Build Coastguard Worker assert m3.hash != 0 137*1b3f573fSAndroid Build Coastguard Worker # relying on the randomness here -- if hash function changes and we are 138*1b3f573fSAndroid Build Coastguard Worker # unlucky enough to get a collision, then change the values above. 139*1b3f573fSAndroid Build Coastguard Worker assert m1.hash != m2.hash 140*1b3f573fSAndroid Build Coastguard Worker assert_equal m2.hash, m3.hash 141*1b3f573fSAndroid Build Coastguard Worker end 142*1b3f573fSAndroid Build Coastguard Worker 143*1b3f573fSAndroid Build Coastguard Worker def test_unknown_field_errors 144*1b3f573fSAndroid Build Coastguard Worker e = assert_raise NoMethodError do 145*1b3f573fSAndroid Build Coastguard Worker proto_module::TestMessage.new.hello 146*1b3f573fSAndroid Build Coastguard Worker end 147*1b3f573fSAndroid Build Coastguard Worker assert_match(/hello/, e.message) 148*1b3f573fSAndroid Build Coastguard Worker 149*1b3f573fSAndroid Build Coastguard Worker e = assert_raise NoMethodError do 150*1b3f573fSAndroid Build Coastguard Worker proto_module::TestMessage.new.hello = "world" 151*1b3f573fSAndroid Build Coastguard Worker end 152*1b3f573fSAndroid Build Coastguard Worker assert_match(/hello/, e.message) 153*1b3f573fSAndroid Build Coastguard Worker end 154*1b3f573fSAndroid Build Coastguard Worker 155*1b3f573fSAndroid Build Coastguard Worker def test_type_errors 156*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 157*1b3f573fSAndroid Build Coastguard Worker e = assert_raise Google::Protobuf::TypeError do 158*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = "hello" 159*1b3f573fSAndroid Build Coastguard Worker end 160*1b3f573fSAndroid Build Coastguard Worker 161*1b3f573fSAndroid Build Coastguard Worker # Google::Protobuf::TypeError should inherit from TypeError for backwards compatibility 162*1b3f573fSAndroid Build Coastguard Worker # TODO: This can be removed when we can safely migrate to Google::Protobuf::TypeError 163*1b3f573fSAndroid Build Coastguard Worker assert e.is_a?(::TypeError) 164*1b3f573fSAndroid Build Coastguard Worker 165*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 166*1b3f573fSAndroid Build Coastguard Worker m.optional_string = 42 167*1b3f573fSAndroid Build Coastguard Worker end 168*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 169*1b3f573fSAndroid Build Coastguard Worker m.optional_string = nil 170*1b3f573fSAndroid Build Coastguard Worker end 171*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 172*1b3f573fSAndroid Build Coastguard Worker m.optional_bool = 42 173*1b3f573fSAndroid Build Coastguard Worker end 174*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 175*1b3f573fSAndroid Build Coastguard Worker m.optional_msg = proto_module::TestMessage.new # expects TestMessage2 176*1b3f573fSAndroid Build Coastguard Worker end 177*1b3f573fSAndroid Build Coastguard Worker 178*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 179*1b3f573fSAndroid Build Coastguard Worker m.repeated_int32 = [] # needs RepeatedField 180*1b3f573fSAndroid Build Coastguard Worker end 181*1b3f573fSAndroid Build Coastguard Worker 182*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 183*1b3f573fSAndroid Build Coastguard Worker m.repeated_int32.push "hello" 184*1b3f573fSAndroid Build Coastguard Worker end 185*1b3f573fSAndroid Build Coastguard Worker 186*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 187*1b3f573fSAndroid Build Coastguard Worker m.repeated_msg.push proto_module::TestMessage.new 188*1b3f573fSAndroid Build Coastguard Worker end 189*1b3f573fSAndroid Build Coastguard Worker end 190*1b3f573fSAndroid Build Coastguard Worker 191*1b3f573fSAndroid Build Coastguard Worker def test_string_encoding 192*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 193*1b3f573fSAndroid Build Coastguard Worker 194*1b3f573fSAndroid Build Coastguard Worker # Assigning a normal (ASCII or UTF8) string to a bytes field, or 195*1b3f573fSAndroid Build Coastguard Worker # ASCII-8BIT to a string field will convert to the proper encoding. 196*1b3f573fSAndroid Build Coastguard Worker m.optional_bytes = "Test string ASCII".encode!('ASCII') 197*1b3f573fSAndroid Build Coastguard Worker assert m.optional_bytes.frozen? 198*1b3f573fSAndroid Build Coastguard Worker assert_equal Encoding::ASCII_8BIT, m.optional_bytes.encoding 199*1b3f573fSAndroid Build Coastguard Worker assert_equal "Test string ASCII", m.optional_bytes 200*1b3f573fSAndroid Build Coastguard Worker 201*1b3f573fSAndroid Build Coastguard Worker assert_raise Encoding::UndefinedConversionError do 202*1b3f573fSAndroid Build Coastguard Worker m.optional_bytes = "Test string UTF-8 \u0100".encode!('UTF-8') 203*1b3f573fSAndroid Build Coastguard Worker end 204*1b3f573fSAndroid Build Coastguard Worker 205*1b3f573fSAndroid Build Coastguard Worker assert_raise Encoding::UndefinedConversionError do 206*1b3f573fSAndroid Build Coastguard Worker m.optional_string = ["FFFF"].pack('H*') 207*1b3f573fSAndroid Build Coastguard Worker end 208*1b3f573fSAndroid Build Coastguard Worker 209*1b3f573fSAndroid Build Coastguard Worker # "Ordinary" use case. 210*1b3f573fSAndroid Build Coastguard Worker m.optional_bytes = ["FFFF"].pack('H*') 211*1b3f573fSAndroid Build Coastguard Worker m.optional_string = "\u0100" 212*1b3f573fSAndroid Build Coastguard Worker 213*1b3f573fSAndroid Build Coastguard Worker # strings are immutable so we can't do this, but serialize should catch it. 214*1b3f573fSAndroid Build Coastguard Worker m.optional_string = "asdf".encode!('UTF-8') 215*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_string.encode!('ASCII-8BIT') } 216*1b3f573fSAndroid Build Coastguard Worker end 217*1b3f573fSAndroid Build Coastguard Worker 218*1b3f573fSAndroid Build Coastguard Worker def test_rptfield_int32 219*1b3f573fSAndroid Build Coastguard Worker l = Google::Protobuf::RepeatedField.new(:int32) 220*1b3f573fSAndroid Build Coastguard Worker assert l.count == 0 221*1b3f573fSAndroid Build Coastguard Worker l = Google::Protobuf::RepeatedField.new(:int32, [1, 2, 3]) 222*1b3f573fSAndroid Build Coastguard Worker assert l.count == 3 223*1b3f573fSAndroid Build Coastguard Worker assert_equal [1, 2, 3], l 224*1b3f573fSAndroid Build Coastguard Worker assert_equal l, [1, 2, 3] 225*1b3f573fSAndroid Build Coastguard Worker l.push 4 226*1b3f573fSAndroid Build Coastguard Worker assert l == [1, 2, 3, 4] 227*1b3f573fSAndroid Build Coastguard Worker dst_list = [] 228*1b3f573fSAndroid Build Coastguard Worker l.each { |val| dst_list.push val } 229*1b3f573fSAndroid Build Coastguard Worker assert dst_list == [1, 2, 3, 4] 230*1b3f573fSAndroid Build Coastguard Worker assert l.to_a == [1, 2, 3, 4] 231*1b3f573fSAndroid Build Coastguard Worker assert l[0] == 1 232*1b3f573fSAndroid Build Coastguard Worker assert l[3] == 4 233*1b3f573fSAndroid Build Coastguard Worker l[0] = 5 234*1b3f573fSAndroid Build Coastguard Worker assert l == [5, 2, 3, 4] 235*1b3f573fSAndroid Build Coastguard Worker 236*1b3f573fSAndroid Build Coastguard Worker l2 = l.dup 237*1b3f573fSAndroid Build Coastguard Worker assert l == l2 238*1b3f573fSAndroid Build Coastguard Worker assert l.object_id != l2.object_id 239*1b3f573fSAndroid Build Coastguard Worker l2.push 6 240*1b3f573fSAndroid Build Coastguard Worker assert l.count == 4 241*1b3f573fSAndroid Build Coastguard Worker assert l2.count == 5 242*1b3f573fSAndroid Build Coastguard Worker 243*1b3f573fSAndroid Build Coastguard Worker assert l.inspect == '[5, 2, 3, 4]' 244*1b3f573fSAndroid Build Coastguard Worker 245*1b3f573fSAndroid Build Coastguard Worker l.concat([7, 8, 9]) 246*1b3f573fSAndroid Build Coastguard Worker assert l == [5, 2, 3, 4, 7, 8, 9] 247*1b3f573fSAndroid Build Coastguard Worker assert l.pop == 9 248*1b3f573fSAndroid Build Coastguard Worker assert l == [5, 2, 3, 4, 7, 8] 249*1b3f573fSAndroid Build Coastguard Worker 250*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 251*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 252*1b3f573fSAndroid Build Coastguard Worker l.push m 253*1b3f573fSAndroid Build Coastguard Worker end 254*1b3f573fSAndroid Build Coastguard Worker 255*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 256*1b3f573fSAndroid Build Coastguard Worker m.repeated_int32 = l 257*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_int32 == [5, 2, 3, 4, 7, 8] 258*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_int32.object_id == l.object_id 259*1b3f573fSAndroid Build Coastguard Worker l.push 42 260*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_int32.pop == 42 261*1b3f573fSAndroid Build Coastguard Worker 262*1b3f573fSAndroid Build Coastguard Worker l3 = l + l.dup 263*1b3f573fSAndroid Build Coastguard Worker assert l3.count == l.count * 2 264*1b3f573fSAndroid Build Coastguard Worker l.count.times do |i| 265*1b3f573fSAndroid Build Coastguard Worker assert l3[i] == l[i] 266*1b3f573fSAndroid Build Coastguard Worker assert l3[l.count + i] == l[i] 267*1b3f573fSAndroid Build Coastguard Worker end 268*1b3f573fSAndroid Build Coastguard Worker 269*1b3f573fSAndroid Build Coastguard Worker l.clear 270*1b3f573fSAndroid Build Coastguard Worker assert l.count == 0 271*1b3f573fSAndroid Build Coastguard Worker l += [1, 2, 3, 4] 272*1b3f573fSAndroid Build Coastguard Worker l.replace([5, 6, 7, 8]) 273*1b3f573fSAndroid Build Coastguard Worker assert l == [5, 6, 7, 8] 274*1b3f573fSAndroid Build Coastguard Worker 275*1b3f573fSAndroid Build Coastguard Worker l4 = Google::Protobuf::RepeatedField.new(:int32) 276*1b3f573fSAndroid Build Coastguard Worker l4[5] = 42 277*1b3f573fSAndroid Build Coastguard Worker assert l4 == [0, 0, 0, 0, 0, 42] 278*1b3f573fSAndroid Build Coastguard Worker 279*1b3f573fSAndroid Build Coastguard Worker l4 << 100 280*1b3f573fSAndroid Build Coastguard Worker assert l4 == [0, 0, 0, 0, 0, 42, 100] 281*1b3f573fSAndroid Build Coastguard Worker l4 << 101 << 102 282*1b3f573fSAndroid Build Coastguard Worker assert l4 == [0, 0, 0, 0, 0, 42, 100, 101, 102] 283*1b3f573fSAndroid Build Coastguard Worker end 284*1b3f573fSAndroid Build Coastguard Worker 285*1b3f573fSAndroid Build Coastguard Worker def test_parent_rptfield 286*1b3f573fSAndroid Build Coastguard Worker #make sure we set the RepeatedField and can add to it 287*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 288*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string == [] 289*1b3f573fSAndroid Build Coastguard Worker m.repeated_string << 'ok' 290*1b3f573fSAndroid Build Coastguard Worker m.repeated_string.push('ok2') 291*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string == ['ok', 'ok2'] 292*1b3f573fSAndroid Build Coastguard Worker m.repeated_string += ['ok3'] 293*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_string == ['ok', 'ok2', 'ok3'] 294*1b3f573fSAndroid Build Coastguard Worker end 295*1b3f573fSAndroid Build Coastguard Worker 296*1b3f573fSAndroid Build Coastguard Worker def test_rptfield_msg 297*1b3f573fSAndroid Build Coastguard Worker l = Google::Protobuf::RepeatedField.new(:message, proto_module::TestMessage) 298*1b3f573fSAndroid Build Coastguard Worker l.push proto_module::TestMessage.new 299*1b3f573fSAndroid Build Coastguard Worker assert l.count == 1 300*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 301*1b3f573fSAndroid Build Coastguard Worker l.push proto_module::TestMessage2.new 302*1b3f573fSAndroid Build Coastguard Worker end 303*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 304*1b3f573fSAndroid Build Coastguard Worker l.push 42 305*1b3f573fSAndroid Build Coastguard Worker end 306*1b3f573fSAndroid Build Coastguard Worker 307*1b3f573fSAndroid Build Coastguard Worker l2 = l.dup 308*1b3f573fSAndroid Build Coastguard Worker assert l2[0] == l[0] 309*1b3f573fSAndroid Build Coastguard Worker assert l2[0].object_id == l[0].object_id 310*1b3f573fSAndroid Build Coastguard Worker 311*1b3f573fSAndroid Build Coastguard Worker l2 = Google::Protobuf.deep_copy(l) 312*1b3f573fSAndroid Build Coastguard Worker assert l2[0] == l[0] 313*1b3f573fSAndroid Build Coastguard Worker assert l2[0].object_id != l[0].object_id 314*1b3f573fSAndroid Build Coastguard Worker 315*1b3f573fSAndroid Build Coastguard Worker l3 = l + l2 316*1b3f573fSAndroid Build Coastguard Worker assert l3.count == 2 317*1b3f573fSAndroid Build Coastguard Worker assert l3[0] == l[0] 318*1b3f573fSAndroid Build Coastguard Worker assert l3[1] == l2[0] 319*1b3f573fSAndroid Build Coastguard Worker l3[0].optional_int32 = 1000 320*1b3f573fSAndroid Build Coastguard Worker assert l[0].optional_int32 == 1000 321*1b3f573fSAndroid Build Coastguard Worker 322*1b3f573fSAndroid Build Coastguard Worker new_msg = proto_module::TestMessage.new(:optional_int32 => 200) 323*1b3f573fSAndroid Build Coastguard Worker l4 = l + [new_msg] 324*1b3f573fSAndroid Build Coastguard Worker assert l4.count == 2 325*1b3f573fSAndroid Build Coastguard Worker new_msg.optional_int32 = 1000 326*1b3f573fSAndroid Build Coastguard Worker assert l4[1].optional_int32 == 1000 327*1b3f573fSAndroid Build Coastguard Worker end 328*1b3f573fSAndroid Build Coastguard Worker 329*1b3f573fSAndroid Build Coastguard Worker def test_rptfield_enum 330*1b3f573fSAndroid Build Coastguard Worker l = Google::Protobuf::RepeatedField.new(:enum, proto_module::TestEnum) 331*1b3f573fSAndroid Build Coastguard Worker l.push :A 332*1b3f573fSAndroid Build Coastguard Worker l.push :B 333*1b3f573fSAndroid Build Coastguard Worker l.push :C 334*1b3f573fSAndroid Build Coastguard Worker l.push :v0 335*1b3f573fSAndroid Build Coastguard Worker assert l.count == 4 336*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 337*1b3f573fSAndroid Build Coastguard Worker l.push :D 338*1b3f573fSAndroid Build Coastguard Worker end 339*1b3f573fSAndroid Build Coastguard Worker assert l[0] == :A 340*1b3f573fSAndroid Build Coastguard Worker assert l[3] == :v0 341*1b3f573fSAndroid Build Coastguard Worker 342*1b3f573fSAndroid Build Coastguard Worker l.push 5 343*1b3f573fSAndroid Build Coastguard Worker assert l[4] == 5 344*1b3f573fSAndroid Build Coastguard Worker end 345*1b3f573fSAndroid Build Coastguard Worker 346*1b3f573fSAndroid Build Coastguard Worker def test_rptfield_initialize 347*1b3f573fSAndroid Build Coastguard Worker assert_raise ArgumentError do 348*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf::RepeatedField.new 349*1b3f573fSAndroid Build Coastguard Worker end 350*1b3f573fSAndroid Build Coastguard Worker assert_raise ArgumentError do 351*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf::RepeatedField.new(:message) 352*1b3f573fSAndroid Build Coastguard Worker end 353*1b3f573fSAndroid Build Coastguard Worker assert_raise ArgumentError do 354*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf::RepeatedField.new([1, 2, 3]) 355*1b3f573fSAndroid Build Coastguard Worker end 356*1b3f573fSAndroid Build Coastguard Worker assert_raise ArgumentError do 357*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf::RepeatedField.new(:message, [proto_module::TestMessage2.new]) 358*1b3f573fSAndroid Build Coastguard Worker end 359*1b3f573fSAndroid Build Coastguard Worker end 360*1b3f573fSAndroid Build Coastguard Worker 361*1b3f573fSAndroid Build Coastguard Worker def test_rptfield_array_ducktyping 362*1b3f573fSAndroid Build Coastguard Worker l = Google::Protobuf::RepeatedField.new(:int32) 363*1b3f573fSAndroid Build Coastguard Worker length_methods = %w(count length size) 364*1b3f573fSAndroid Build Coastguard Worker length_methods.each do |lm| 365*1b3f573fSAndroid Build Coastguard Worker assert l.send(lm) == 0 366*1b3f573fSAndroid Build Coastguard Worker end 367*1b3f573fSAndroid Build Coastguard Worker # out of bounds returns a nil 368*1b3f573fSAndroid Build Coastguard Worker assert l[0] == nil 369*1b3f573fSAndroid Build Coastguard Worker assert l[1] == nil 370*1b3f573fSAndroid Build Coastguard Worker assert l[-1] == nil 371*1b3f573fSAndroid Build Coastguard Worker l.push 4 372*1b3f573fSAndroid Build Coastguard Worker length_methods.each do |lm| 373*1b3f573fSAndroid Build Coastguard Worker assert l.send(lm) == 1 374*1b3f573fSAndroid Build Coastguard Worker end 375*1b3f573fSAndroid Build Coastguard Worker assert l[0] == 4 376*1b3f573fSAndroid Build Coastguard Worker assert l[1] == nil 377*1b3f573fSAndroid Build Coastguard Worker assert l[-1] == 4 378*1b3f573fSAndroid Build Coastguard Worker assert l[-2] == nil 379*1b3f573fSAndroid Build Coastguard Worker 380*1b3f573fSAndroid Build Coastguard Worker l.push 2 381*1b3f573fSAndroid Build Coastguard Worker length_methods.each do |lm| 382*1b3f573fSAndroid Build Coastguard Worker assert l.send(lm) == 2 383*1b3f573fSAndroid Build Coastguard Worker end 384*1b3f573fSAndroid Build Coastguard Worker assert l[0] == 4 385*1b3f573fSAndroid Build Coastguard Worker assert l[1] == 2 386*1b3f573fSAndroid Build Coastguard Worker assert l[2] == nil 387*1b3f573fSAndroid Build Coastguard Worker assert l[-1] == 2 388*1b3f573fSAndroid Build Coastguard Worker assert l[-2] == 4 389*1b3f573fSAndroid Build Coastguard Worker assert l[-3] == nil 390*1b3f573fSAndroid Build Coastguard Worker 391*1b3f573fSAndroid Build Coastguard Worker #adding out of scope will backfill with empty objects 392*1b3f573fSAndroid Build Coastguard Worker end 393*1b3f573fSAndroid Build Coastguard Worker 394*1b3f573fSAndroid Build Coastguard Worker def test_map_basic 395*1b3f573fSAndroid Build Coastguard Worker # allowed key types: 396*1b3f573fSAndroid Build Coastguard Worker # :int32, :int64, :uint32, :uint64, :bool, :string, :bytes. 397*1b3f573fSAndroid Build Coastguard Worker 398*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:string, :int32) 399*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 1 400*1b3f573fSAndroid Build Coastguard Worker assert m["asdf"] == 1 401*1b3f573fSAndroid Build Coastguard Worker m["jkl;"] = 42 402*1b3f573fSAndroid Build Coastguard Worker assert m == { "jkl;" => 42, "asdf" => 1 } 403*1b3f573fSAndroid Build Coastguard Worker assert m.has_key?("asdf") 404*1b3f573fSAndroid Build Coastguard Worker assert !m.has_key?("qwerty") 405*1b3f573fSAndroid Build Coastguard Worker assert m.length == 2 406*1b3f573fSAndroid Build Coastguard Worker 407*1b3f573fSAndroid Build Coastguard Worker m2 = m.dup 408*1b3f573fSAndroid Build Coastguard Worker assert_equal m, m2 409*1b3f573fSAndroid Build Coastguard Worker assert m.hash != 0 410*1b3f573fSAndroid Build Coastguard Worker assert_equal m.hash, m2.hash 411*1b3f573fSAndroid Build Coastguard Worker 412*1b3f573fSAndroid Build Coastguard Worker collected = {} 413*1b3f573fSAndroid Build Coastguard Worker m.each { |k,v| collected[v] = k } 414*1b3f573fSAndroid Build Coastguard Worker assert collected == { 42 => "jkl;", 1 => "asdf" } 415*1b3f573fSAndroid Build Coastguard Worker 416*1b3f573fSAndroid Build Coastguard Worker assert m.delete("asdf") == 1 417*1b3f573fSAndroid Build Coastguard Worker assert !m.has_key?("asdf") 418*1b3f573fSAndroid Build Coastguard Worker assert m["asdf"] == nil 419*1b3f573fSAndroid Build Coastguard Worker assert !m.has_key?("asdf") 420*1b3f573fSAndroid Build Coastguard Worker 421*1b3f573fSAndroid Build Coastguard Worker # We only assert on inspect value when there is one map entry because the 422*1b3f573fSAndroid Build Coastguard Worker # order in which elements appear is unspecified (depends on the internal 423*1b3f573fSAndroid Build Coastguard Worker # hash function). We don't want a brittle test. 424*1b3f573fSAndroid Build Coastguard Worker assert m.inspect == "{\"jkl;\"=>42}" 425*1b3f573fSAndroid Build Coastguard Worker 426*1b3f573fSAndroid Build Coastguard Worker assert m.keys == ["jkl;"] 427*1b3f573fSAndroid Build Coastguard Worker assert m.values == [42] 428*1b3f573fSAndroid Build Coastguard Worker 429*1b3f573fSAndroid Build Coastguard Worker m.clear 430*1b3f573fSAndroid Build Coastguard Worker assert m.length == 0 431*1b3f573fSAndroid Build Coastguard Worker assert m == {} 432*1b3f573fSAndroid Build Coastguard Worker 433*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 434*1b3f573fSAndroid Build Coastguard Worker m[1] = 1 435*1b3f573fSAndroid Build Coastguard Worker end 436*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 437*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 0x1_0000_0000 438*1b3f573fSAndroid Build Coastguard Worker end 439*1b3f573fSAndroid Build Coastguard Worker end 440*1b3f573fSAndroid Build Coastguard Worker 441*1b3f573fSAndroid Build Coastguard Worker def test_b_8385 442*1b3f573fSAndroid Build Coastguard Worker m1 = Google::Protobuf::Map.new(:string, :string) 443*1b3f573fSAndroid Build Coastguard Worker m2 = Google::Protobuf::Map.new(:string, :string) 444*1b3f573fSAndroid Build Coastguard Worker 445*1b3f573fSAndroid Build Coastguard Worker assert_equal m1, m2 446*1b3f573fSAndroid Build Coastguard Worker 447*1b3f573fSAndroid Build Coastguard Worker m1["counter"] = "a" 448*1b3f573fSAndroid Build Coastguard Worker m2["counter"] = "aa" 449*1b3f573fSAndroid Build Coastguard Worker 450*1b3f573fSAndroid Build Coastguard Worker assert_not_equal m1, m2 451*1b3f573fSAndroid Build Coastguard Worker end 452*1b3f573fSAndroid Build Coastguard Worker 453*1b3f573fSAndroid Build Coastguard Worker def test_map_ctor 454*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:string, :int32, 455*1b3f573fSAndroid Build Coastguard Worker {"a" => 1, "b" => 2, "c" => 3}) 456*1b3f573fSAndroid Build Coastguard Worker assert m == {"a" => 1, "c" => 3, "b" => 2} 457*1b3f573fSAndroid Build Coastguard Worker end 458*1b3f573fSAndroid Build Coastguard Worker 459*1b3f573fSAndroid Build Coastguard Worker def test_map_keytypes 460*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:int32, :int32) 461*1b3f573fSAndroid Build Coastguard Worker m[1] = 42 462*1b3f573fSAndroid Build Coastguard Worker m[-1] = 42 463*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 464*1b3f573fSAndroid Build Coastguard Worker m[0x8000_0000] = 1 465*1b3f573fSAndroid Build Coastguard Worker end 466*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 467*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 1 468*1b3f573fSAndroid Build Coastguard Worker end 469*1b3f573fSAndroid Build Coastguard Worker 470*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:int64, :int32) 471*1b3f573fSAndroid Build Coastguard Worker m[0x1000_0000_0000_0000] = 1 472*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 473*1b3f573fSAndroid Build Coastguard Worker m[0x1_0000_0000_0000_0000] = 1 474*1b3f573fSAndroid Build Coastguard Worker end 475*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 476*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 1 477*1b3f573fSAndroid Build Coastguard Worker end 478*1b3f573fSAndroid Build Coastguard Worker 479*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:uint32, :int32) 480*1b3f573fSAndroid Build Coastguard Worker m[0x8000_0000] = 1 481*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 482*1b3f573fSAndroid Build Coastguard Worker m[0x1_0000_0000] = 1 483*1b3f573fSAndroid Build Coastguard Worker end 484*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 485*1b3f573fSAndroid Build Coastguard Worker m[-1] = 1 486*1b3f573fSAndroid Build Coastguard Worker end 487*1b3f573fSAndroid Build Coastguard Worker 488*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:uint64, :int32) 489*1b3f573fSAndroid Build Coastguard Worker m[0x8000_0000_0000_0000] = 1 490*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 491*1b3f573fSAndroid Build Coastguard Worker m[0x1_0000_0000_0000_0000] = 1 492*1b3f573fSAndroid Build Coastguard Worker end 493*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 494*1b3f573fSAndroid Build Coastguard Worker m[-1] = 1 495*1b3f573fSAndroid Build Coastguard Worker end 496*1b3f573fSAndroid Build Coastguard Worker 497*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:bool, :int32) 498*1b3f573fSAndroid Build Coastguard Worker m[true] = 1 499*1b3f573fSAndroid Build Coastguard Worker m[false] = 2 500*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 501*1b3f573fSAndroid Build Coastguard Worker m[1] = 1 502*1b3f573fSAndroid Build Coastguard Worker end 503*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 504*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 1 505*1b3f573fSAndroid Build Coastguard Worker end 506*1b3f573fSAndroid Build Coastguard Worker 507*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:string, :int32) 508*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 1 509*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 510*1b3f573fSAndroid Build Coastguard Worker m[1] = 1 511*1b3f573fSAndroid Build Coastguard Worker end 512*1b3f573fSAndroid Build Coastguard Worker assert_raise Encoding::UndefinedConversionError do 513*1b3f573fSAndroid Build Coastguard Worker bytestring = ["FFFF"].pack("H*") 514*1b3f573fSAndroid Build Coastguard Worker m[bytestring] = 1 515*1b3f573fSAndroid Build Coastguard Worker end 516*1b3f573fSAndroid Build Coastguard Worker 517*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:bytes, :int32) 518*1b3f573fSAndroid Build Coastguard Worker bytestring = ["FFFF"].pack("H*") 519*1b3f573fSAndroid Build Coastguard Worker m[bytestring] = 1 520*1b3f573fSAndroid Build Coastguard Worker # Allowed -- we will automatically convert to ASCII-8BIT. 521*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = 1 522*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 523*1b3f573fSAndroid Build Coastguard Worker m[1] = 1 524*1b3f573fSAndroid Build Coastguard Worker end 525*1b3f573fSAndroid Build Coastguard Worker end 526*1b3f573fSAndroid Build Coastguard Worker 527*1b3f573fSAndroid Build Coastguard Worker def test_map_msg_enum_valuetypes 528*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:string, :message, proto_module::TestMessage) 529*1b3f573fSAndroid Build Coastguard Worker m["asdf"] = proto_module::TestMessage.new 530*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 531*1b3f573fSAndroid Build Coastguard Worker m["jkl;"] = proto_module::TestMessage2.new 532*1b3f573fSAndroid Build Coastguard Worker end 533*1b3f573fSAndroid Build Coastguard Worker 534*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new( 535*1b3f573fSAndroid Build Coastguard Worker :string, :message, proto_module::TestMessage, 536*1b3f573fSAndroid Build Coastguard Worker { "a" => proto_module::TestMessage.new(:optional_int32 => 42), 537*1b3f573fSAndroid Build Coastguard Worker "b" => proto_module::TestMessage.new(:optional_int32 => 84) }) 538*1b3f573fSAndroid Build Coastguard Worker assert m.length == 2 539*1b3f573fSAndroid Build Coastguard Worker assert m.values.map{|msg| msg.optional_int32}.sort == [42, 84] 540*1b3f573fSAndroid Build Coastguard Worker 541*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new(:string, :enum, proto_module::TestEnum, 542*1b3f573fSAndroid Build Coastguard Worker { "x" => :A, "y" => :B, "z" => :C }) 543*1b3f573fSAndroid Build Coastguard Worker assert m.length == 3 544*1b3f573fSAndroid Build Coastguard Worker assert m["z"] == :C 545*1b3f573fSAndroid Build Coastguard Worker m["z"] = 2 546*1b3f573fSAndroid Build Coastguard Worker assert m["z"] == :B 547*1b3f573fSAndroid Build Coastguard Worker m["z"] = 5 548*1b3f573fSAndroid Build Coastguard Worker assert m["z"] == 5 549*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 550*1b3f573fSAndroid Build Coastguard Worker m["z"] = :Z 551*1b3f573fSAndroid Build Coastguard Worker end 552*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 553*1b3f573fSAndroid Build Coastguard Worker m["z"] = "z" 554*1b3f573fSAndroid Build Coastguard Worker end 555*1b3f573fSAndroid Build Coastguard Worker end 556*1b3f573fSAndroid Build Coastguard Worker 557*1b3f573fSAndroid Build Coastguard Worker def test_map_dup_deep_copy 558*1b3f573fSAndroid Build Coastguard Worker m = Google::Protobuf::Map.new( 559*1b3f573fSAndroid Build Coastguard Worker :string, :message, proto_module::TestMessage, 560*1b3f573fSAndroid Build Coastguard Worker { "a" => proto_module::TestMessage.new(:optional_int32 => 42), 561*1b3f573fSAndroid Build Coastguard Worker "b" => proto_module::TestMessage.new(:optional_int32 => 84) }) 562*1b3f573fSAndroid Build Coastguard Worker 563*1b3f573fSAndroid Build Coastguard Worker m2 = m.dup 564*1b3f573fSAndroid Build Coastguard Worker assert m.to_h == m2.to_h 565*1b3f573fSAndroid Build Coastguard Worker assert m == m2 566*1b3f573fSAndroid Build Coastguard Worker assert m.object_id != m2.object_id 567*1b3f573fSAndroid Build Coastguard Worker assert m["a"].object_id == m2["a"].object_id 568*1b3f573fSAndroid Build Coastguard Worker assert m["b"].object_id == m2["b"].object_id 569*1b3f573fSAndroid Build Coastguard Worker 570*1b3f573fSAndroid Build Coastguard Worker m2 = Google::Protobuf.deep_copy(m) 571*1b3f573fSAndroid Build Coastguard Worker assert m == m2 572*1b3f573fSAndroid Build Coastguard Worker assert m.object_id != m2.object_id 573*1b3f573fSAndroid Build Coastguard Worker assert m["a"].object_id != m2["a"].object_id 574*1b3f573fSAndroid Build Coastguard Worker assert m["b"].object_id != m2["b"].object_id 575*1b3f573fSAndroid Build Coastguard Worker end 576*1b3f573fSAndroid Build Coastguard Worker 577*1b3f573fSAndroid Build Coastguard Worker def test_oneof_descriptors 578*1b3f573fSAndroid Build Coastguard Worker d = proto_module::OneofMessage.descriptor 579*1b3f573fSAndroid Build Coastguard Worker o = d.lookup_oneof("my_oneof") 580*1b3f573fSAndroid Build Coastguard Worker assert o != nil 581*1b3f573fSAndroid Build Coastguard Worker assert o.class == Google::Protobuf::OneofDescriptor 582*1b3f573fSAndroid Build Coastguard Worker assert o.name == "my_oneof" 583*1b3f573fSAndroid Build Coastguard Worker oneof_count = 0 584*1b3f573fSAndroid Build Coastguard Worker d.each_oneof{ |oneof| 585*1b3f573fSAndroid Build Coastguard Worker oneof_count += 1 586*1b3f573fSAndroid Build Coastguard Worker assert oneof == o 587*1b3f573fSAndroid Build Coastguard Worker } 588*1b3f573fSAndroid Build Coastguard Worker assert oneof_count == 1 589*1b3f573fSAndroid Build Coastguard Worker assert o.count == 4 590*1b3f573fSAndroid Build Coastguard Worker field_names = o.map{|f| f.name}.sort 591*1b3f573fSAndroid Build Coastguard Worker assert field_names == ["a", "b", "c", "d"] 592*1b3f573fSAndroid Build Coastguard Worker end 593*1b3f573fSAndroid Build Coastguard Worker 594*1b3f573fSAndroid Build Coastguard Worker def test_oneof 595*1b3f573fSAndroid Build Coastguard Worker d = proto_module::OneofMessage.new 596*1b3f573fSAndroid Build Coastguard Worker assert d.a == "" 597*1b3f573fSAndroid Build Coastguard Worker assert d.b == 0 598*1b3f573fSAndroid Build Coastguard Worker assert d.c == nil 599*1b3f573fSAndroid Build Coastguard Worker assert d.d == :Default 600*1b3f573fSAndroid Build Coastguard Worker assert d.my_oneof == nil 601*1b3f573fSAndroid Build Coastguard Worker 602*1b3f573fSAndroid Build Coastguard Worker d.a = "hi" 603*1b3f573fSAndroid Build Coastguard Worker assert d.a == "hi" 604*1b3f573fSAndroid Build Coastguard Worker assert d.b == 0 605*1b3f573fSAndroid Build Coastguard Worker assert d.c == nil 606*1b3f573fSAndroid Build Coastguard Worker assert d.d == :Default 607*1b3f573fSAndroid Build Coastguard Worker assert d.my_oneof == :a 608*1b3f573fSAndroid Build Coastguard Worker 609*1b3f573fSAndroid Build Coastguard Worker d.b = 42 610*1b3f573fSAndroid Build Coastguard Worker assert d.a == "" 611*1b3f573fSAndroid Build Coastguard Worker assert d.b == 42 612*1b3f573fSAndroid Build Coastguard Worker assert d.c == nil 613*1b3f573fSAndroid Build Coastguard Worker assert d.d == :Default 614*1b3f573fSAndroid Build Coastguard Worker assert d.my_oneof == :b 615*1b3f573fSAndroid Build Coastguard Worker 616*1b3f573fSAndroid Build Coastguard Worker d.c = proto_module::TestMessage2.new(:foo => 100) 617*1b3f573fSAndroid Build Coastguard Worker assert d.a == "" 618*1b3f573fSAndroid Build Coastguard Worker assert d.b == 0 619*1b3f573fSAndroid Build Coastguard Worker assert d.c.foo == 100 620*1b3f573fSAndroid Build Coastguard Worker assert d.d == :Default 621*1b3f573fSAndroid Build Coastguard Worker assert d.my_oneof == :c 622*1b3f573fSAndroid Build Coastguard Worker 623*1b3f573fSAndroid Build Coastguard Worker d.d = :C 624*1b3f573fSAndroid Build Coastguard Worker assert d.a == "" 625*1b3f573fSAndroid Build Coastguard Worker assert d.b == 0 626*1b3f573fSAndroid Build Coastguard Worker assert d.c == nil 627*1b3f573fSAndroid Build Coastguard Worker assert d.d == :C 628*1b3f573fSAndroid Build Coastguard Worker assert d.my_oneof == :d 629*1b3f573fSAndroid Build Coastguard Worker 630*1b3f573fSAndroid Build Coastguard Worker d2 = proto_module::OneofMessage.decode(proto_module::OneofMessage.encode(d)) 631*1b3f573fSAndroid Build Coastguard Worker assert d2 == d 632*1b3f573fSAndroid Build Coastguard Worker 633*1b3f573fSAndroid Build Coastguard Worker encoded_field_a = proto_module::OneofMessage.encode(proto_module::OneofMessage.new(:a => "string")) 634*1b3f573fSAndroid Build Coastguard Worker encoded_field_b = proto_module::OneofMessage.encode(proto_module::OneofMessage.new(:b => 1000)) 635*1b3f573fSAndroid Build Coastguard Worker encoded_field_c = proto_module::OneofMessage.encode( 636*1b3f573fSAndroid Build Coastguard Worker proto_module::OneofMessage.new(:c => proto_module::TestMessage2.new(:foo => 1))) 637*1b3f573fSAndroid Build Coastguard Worker encoded_field_d = proto_module::OneofMessage.encode(proto_module::OneofMessage.new(:d => :B)) 638*1b3f573fSAndroid Build Coastguard Worker 639*1b3f573fSAndroid Build Coastguard Worker d3 = proto_module::OneofMessage.decode( 640*1b3f573fSAndroid Build Coastguard Worker encoded_field_c + encoded_field_a + encoded_field_b + encoded_field_d) 641*1b3f573fSAndroid Build Coastguard Worker assert d3.a == "" 642*1b3f573fSAndroid Build Coastguard Worker assert d3.b == 0 643*1b3f573fSAndroid Build Coastguard Worker assert d3.c == nil 644*1b3f573fSAndroid Build Coastguard Worker assert d3.d == :B 645*1b3f573fSAndroid Build Coastguard Worker 646*1b3f573fSAndroid Build Coastguard Worker d4 = proto_module::OneofMessage.decode( 647*1b3f573fSAndroid Build Coastguard Worker encoded_field_c + encoded_field_a + encoded_field_b + encoded_field_d + 648*1b3f573fSAndroid Build Coastguard Worker encoded_field_c) 649*1b3f573fSAndroid Build Coastguard Worker assert d4.a == "" 650*1b3f573fSAndroid Build Coastguard Worker assert d4.b == 0 651*1b3f573fSAndroid Build Coastguard Worker assert d4.c.foo == 1 652*1b3f573fSAndroid Build Coastguard Worker assert d4.d == :Default 653*1b3f573fSAndroid Build Coastguard Worker 654*1b3f573fSAndroid Build Coastguard Worker d5 = proto_module::OneofMessage.new(:a => "hello") 655*1b3f573fSAndroid Build Coastguard Worker assert d5.a == "hello" 656*1b3f573fSAndroid Build Coastguard Worker d5.a = nil 657*1b3f573fSAndroid Build Coastguard Worker assert d5.a == "" 658*1b3f573fSAndroid Build Coastguard Worker assert proto_module::OneofMessage.encode(d5) == '' 659*1b3f573fSAndroid Build Coastguard Worker assert d5.my_oneof == nil 660*1b3f573fSAndroid Build Coastguard Worker end 661*1b3f573fSAndroid Build Coastguard Worker 662*1b3f573fSAndroid Build Coastguard Worker def test_enum_field 663*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 664*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :Default 665*1b3f573fSAndroid Build Coastguard Worker m.optional_enum = :A 666*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :A 667*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 668*1b3f573fSAndroid Build Coastguard Worker m.optional_enum = :ASDF 669*1b3f573fSAndroid Build Coastguard Worker end 670*1b3f573fSAndroid Build Coastguard Worker m.optional_enum = 1 671*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == :A 672*1b3f573fSAndroid Build Coastguard Worker m.optional_enum = 100 673*1b3f573fSAndroid Build Coastguard Worker assert m.optional_enum == 100 674*1b3f573fSAndroid Build Coastguard Worker end 675*1b3f573fSAndroid Build Coastguard Worker 676*1b3f573fSAndroid Build Coastguard Worker def test_dup 677*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 678*1b3f573fSAndroid Build Coastguard Worker m.optional_string = "hello" 679*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 42 680*1b3f573fSAndroid Build Coastguard Worker tm1 = proto_module::TestMessage2.new(:foo => 100) 681*1b3f573fSAndroid Build Coastguard Worker tm2 = proto_module::TestMessage2.new(:foo => 200) 682*1b3f573fSAndroid Build Coastguard Worker m.repeated_msg.push tm1 683*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg[-1] == tm1 684*1b3f573fSAndroid Build Coastguard Worker m.repeated_msg.push tm2 685*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg[-1] == tm2 686*1b3f573fSAndroid Build Coastguard Worker m2 = m.dup 687*1b3f573fSAndroid Build Coastguard Worker assert m == m2 688*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 += 1 689*1b3f573fSAndroid Build Coastguard Worker assert m != m2 690*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg[0] == m2.repeated_msg[0] 691*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg[0].object_id == m2.repeated_msg[0].object_id 692*1b3f573fSAndroid Build Coastguard Worker end 693*1b3f573fSAndroid Build Coastguard Worker 694*1b3f573fSAndroid Build Coastguard Worker def test_deep_copy 695*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_int32 => 42, 696*1b3f573fSAndroid Build Coastguard Worker :repeated_msg => [proto_module::TestMessage2.new(:foo => 100)]) 697*1b3f573fSAndroid Build Coastguard Worker m2 = Google::Protobuf.deep_copy(m) 698*1b3f573fSAndroid Build Coastguard Worker assert m == m2 699*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg == m2.repeated_msg 700*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg.object_id != m2.repeated_msg.object_id 701*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_msg[0].object_id != m2.repeated_msg[0].object_id 702*1b3f573fSAndroid Build Coastguard Worker end 703*1b3f573fSAndroid Build Coastguard Worker 704*1b3f573fSAndroid Build Coastguard Worker def test_message_eq 705*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_int32 => 42, 706*1b3f573fSAndroid Build Coastguard Worker :repeated_int32 => [1, 2, 3]) 707*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.new(:optional_int32 => 43, 708*1b3f573fSAndroid Build Coastguard Worker :repeated_int32 => [1, 2, 3]) 709*1b3f573fSAndroid Build Coastguard Worker assert m != m2 710*1b3f573fSAndroid Build Coastguard Worker assert_not_equal proto_module::TestMessage.new, proto_module::TestMessage2.new 711*1b3f573fSAndroid Build Coastguard Worker end 712*1b3f573fSAndroid Build Coastguard Worker 713*1b3f573fSAndroid Build Coastguard Worker def test_enum_lookup 714*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::A == 1 715*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::B == 2 716*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::C == 3 717*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::V0 == 4 718*1b3f573fSAndroid Build Coastguard Worker 719*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::lookup(1) == :A 720*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::lookup(2) == :B 721*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::lookup(3) == :C 722*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::lookup(4) == :v0 723*1b3f573fSAndroid Build Coastguard Worker 724*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::resolve(:A) == 1 725*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::resolve(:B) == 2 726*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::resolve(:C) == 3 727*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestEnum::resolve(:v0) == 4 728*1b3f573fSAndroid Build Coastguard Worker end 729*1b3f573fSAndroid Build Coastguard Worker 730*1b3f573fSAndroid Build Coastguard Worker def test_enum_const_get_helpers 731*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 732*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum::Default, m.optional_enum_const 733*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum.const_get(:Default), m.optional_enum_const 734*1b3f573fSAndroid Build Coastguard Worker 735*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new({optional_enum: proto_module::TestEnum::A}) 736*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum::A, m.optional_enum_const 737*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum.const_get(:A), m.optional_enum_const 738*1b3f573fSAndroid Build Coastguard Worker 739*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new({optional_enum: proto_module::TestEnum::B}) 740*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum::B, m.optional_enum_const 741*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum.const_get(:B), m.optional_enum_const 742*1b3f573fSAndroid Build Coastguard Worker 743*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new({optional_enum: proto_module::TestEnum::C}) 744*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum::C, m.optional_enum_const 745*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum.const_get(:C), m.optional_enum_const 746*1b3f573fSAndroid Build Coastguard Worker 747*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage2.new({foo: 2}) 748*1b3f573fSAndroid Build Coastguard Worker assert_equal 2, m.foo 749*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_ } 750*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_X } 751*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_XX } 752*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_XXX } 753*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_XXXX } 754*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_XXXXX } 755*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.foo_XXXXXX } 756*1b3f573fSAndroid Build Coastguard Worker 757*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Enumer.new({optional_enum: :B}) 758*1b3f573fSAndroid Build Coastguard Worker assert_equal :B, m.optional_enum 759*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_ } 760*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_X } 761*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_XX } 762*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_XXX } 763*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_XXXX } 764*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_XXXXX } 765*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.optional_enum_XXXXXX } 766*1b3f573fSAndroid Build Coastguard Worker end 767*1b3f573fSAndroid Build Coastguard Worker 768*1b3f573fSAndroid Build Coastguard Worker def test_enum_getter 769*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Enumer.new(:optional_enum => :B, :repeated_enum => [:A, :C]) 770*1b3f573fSAndroid Build Coastguard Worker 771*1b3f573fSAndroid Build Coastguard Worker assert_equal :B, m.optional_enum 772*1b3f573fSAndroid Build Coastguard Worker assert_equal 2, m.optional_enum_const 773*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum::B, m.optional_enum_const 774*1b3f573fSAndroid Build Coastguard Worker assert_equal [:A, :C], m.repeated_enum 775*1b3f573fSAndroid Build Coastguard Worker assert_equal [1, 3], m.repeated_enum_const 776*1b3f573fSAndroid Build Coastguard Worker assert_equal [proto_module::TestEnum::A, proto_module::TestEnum::C], m.repeated_enum_const 777*1b3f573fSAndroid Build Coastguard Worker end 778*1b3f573fSAndroid Build Coastguard Worker 779*1b3f573fSAndroid Build Coastguard Worker def test_enum_getter_oneof 780*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Enumer.new(:const => :C) 781*1b3f573fSAndroid Build Coastguard Worker 782*1b3f573fSAndroid Build Coastguard Worker assert_equal :C, m.const 783*1b3f573fSAndroid Build Coastguard Worker assert_equal 3, m.const_const 784*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestEnum::C, m.const_const 785*1b3f573fSAndroid Build Coastguard Worker end 786*1b3f573fSAndroid Build Coastguard Worker 787*1b3f573fSAndroid Build Coastguard Worker def test_enum_getter_only_enums 788*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Enumer.new(:optional_enum => :B, :a_const => 'thing') 789*1b3f573fSAndroid Build Coastguard Worker 790*1b3f573fSAndroid Build Coastguard Worker assert_equal 'thing', m.a_const 791*1b3f573fSAndroid Build Coastguard Worker assert_equal :B, m.optional_enum 792*1b3f573fSAndroid Build Coastguard Worker 793*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.a } 794*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.a_const_const } 795*1b3f573fSAndroid Build Coastguard Worker end 796*1b3f573fSAndroid Build Coastguard Worker 797*1b3f573fSAndroid Build Coastguard Worker def test_repeated_push 798*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 799*1b3f573fSAndroid Build Coastguard Worker 800*1b3f573fSAndroid Build Coastguard Worker m.repeated_string += ['one'] 801*1b3f573fSAndroid Build Coastguard Worker m.repeated_string += %w[two three] 802*1b3f573fSAndroid Build Coastguard Worker assert_equal %w[one two three], m.repeated_string 803*1b3f573fSAndroid Build Coastguard Worker 804*1b3f573fSAndroid Build Coastguard Worker m.repeated_string.push( *['four', 'five'] ) 805*1b3f573fSAndroid Build Coastguard Worker assert_equal %w[one two three four five], m.repeated_string 806*1b3f573fSAndroid Build Coastguard Worker 807*1b3f573fSAndroid Build Coastguard Worker m.repeated_string.push 'six', 'seven' 808*1b3f573fSAndroid Build Coastguard Worker assert_equal %w[one two three four five six seven], m.repeated_string 809*1b3f573fSAndroid Build Coastguard Worker 810*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 811*1b3f573fSAndroid Build Coastguard Worker 812*1b3f573fSAndroid Build Coastguard Worker m.repeated_msg += [proto_module::TestMessage2.new(:foo => 1), proto_module::TestMessage2.new(:foo => 2)] 813*1b3f573fSAndroid Build Coastguard Worker m.repeated_msg += [proto_module::TestMessage2.new(:foo => 3)] 814*1b3f573fSAndroid Build Coastguard Worker m.repeated_msg.push proto_module::TestMessage2.new(:foo => 4), proto_module::TestMessage2.new(:foo => 5) 815*1b3f573fSAndroid Build Coastguard Worker assert_equal [1, 2, 3, 4, 5], m.repeated_msg.map {|x| x.foo} 816*1b3f573fSAndroid Build Coastguard Worker end 817*1b3f573fSAndroid Build Coastguard Worker 818*1b3f573fSAndroid Build Coastguard Worker def test_parse_serialize 819*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_int32 => 42, 820*1b3f573fSAndroid Build Coastguard Worker :optional_string => "hello world", 821*1b3f573fSAndroid Build Coastguard Worker :optional_enum => :B, 822*1b3f573fSAndroid Build Coastguard Worker :repeated_string => ["a", "b", "c"], 823*1b3f573fSAndroid Build Coastguard Worker :repeated_int32 => [42, 43, 44], 824*1b3f573fSAndroid Build Coastguard Worker :repeated_enum => [:A, :B, :C], 825*1b3f573fSAndroid Build Coastguard Worker :repeated_msg => [proto_module::TestMessage2.new(:foo => 1), 826*1b3f573fSAndroid Build Coastguard Worker proto_module::TestMessage2.new(:foo => 2)]) 827*1b3f573fSAndroid Build Coastguard Worker if proto_module == ::BasicTest 828*1b3f573fSAndroid Build Coastguard Worker # For proto3 we can add an unknown enum value safely. 829*1b3f573fSAndroid Build Coastguard Worker m.repeated_enum << 100 830*1b3f573fSAndroid Build Coastguard Worker end 831*1b3f573fSAndroid Build Coastguard Worker 832*1b3f573fSAndroid Build Coastguard Worker data = proto_module::TestMessage.encode m 833*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.decode data 834*1b3f573fSAndroid Build Coastguard Worker 835*1b3f573fSAndroid Build Coastguard Worker assert_equal m, m2 836*1b3f573fSAndroid Build Coastguard Worker 837*1b3f573fSAndroid Build Coastguard Worker data = Google::Protobuf.encode m 838*1b3f573fSAndroid Build Coastguard Worker m2 = Google::Protobuf.decode(proto_module::TestMessage, data) 839*1b3f573fSAndroid Build Coastguard Worker assert m == m2 840*1b3f573fSAndroid Build Coastguard Worker end 841*1b3f573fSAndroid Build Coastguard Worker 842*1b3f573fSAndroid Build Coastguard Worker def test_encode_decode_helpers 843*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2']) 844*1b3f573fSAndroid Build Coastguard Worker assert_equal 'foo', m.optional_string 845*1b3f573fSAndroid Build Coastguard Worker assert_equal ['bar1', 'bar2'], m.repeated_string 846*1b3f573fSAndroid Build Coastguard Worker 847*1b3f573fSAndroid Build Coastguard Worker json = m.to_json 848*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.decode_json(json) 849*1b3f573fSAndroid Build Coastguard Worker assert_equal 'foo', m2.optional_string 850*1b3f573fSAndroid Build Coastguard Worker assert_equal ['bar1', 'bar2'], m2.repeated_string 851*1b3f573fSAndroid Build Coastguard Worker if RUBY_PLATFORM != "java" 852*1b3f573fSAndroid Build Coastguard Worker assert m2.optional_string.frozen? 853*1b3f573fSAndroid Build Coastguard Worker assert m2.repeated_string[0].frozen? 854*1b3f573fSAndroid Build Coastguard Worker end 855*1b3f573fSAndroid Build Coastguard Worker 856*1b3f573fSAndroid Build Coastguard Worker proto = m.to_proto 857*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.decode(proto) 858*1b3f573fSAndroid Build Coastguard Worker assert_equal 'foo', m2.optional_string 859*1b3f573fSAndroid Build Coastguard Worker assert_equal ['bar1', 'bar2'], m2.repeated_string 860*1b3f573fSAndroid Build Coastguard Worker end 861*1b3f573fSAndroid Build Coastguard Worker 862*1b3f573fSAndroid Build Coastguard Worker def test_protobuf_encode_decode_helpers 863*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2']) 864*1b3f573fSAndroid Build Coastguard Worker encoded_msg = Google::Protobuf.encode(m) 865*1b3f573fSAndroid Build Coastguard Worker assert_equal m.to_proto, encoded_msg 866*1b3f573fSAndroid Build Coastguard Worker 867*1b3f573fSAndroid Build Coastguard Worker decoded_msg = Google::Protobuf.decode(proto_module::TestMessage, encoded_msg) 868*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestMessage.decode(m.to_proto), decoded_msg 869*1b3f573fSAndroid Build Coastguard Worker end 870*1b3f573fSAndroid Build Coastguard Worker 871*1b3f573fSAndroid Build Coastguard Worker def test_protobuf_encode_decode_json_helpers 872*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2']) 873*1b3f573fSAndroid Build Coastguard Worker encoded_msg = Google::Protobuf.encode_json(m) 874*1b3f573fSAndroid Build Coastguard Worker assert_equal m.to_json, encoded_msg 875*1b3f573fSAndroid Build Coastguard Worker 876*1b3f573fSAndroid Build Coastguard Worker decoded_msg = Google::Protobuf.decode_json(proto_module::TestMessage, encoded_msg) 877*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestMessage.decode_json(m.to_json), decoded_msg 878*1b3f573fSAndroid Build Coastguard Worker 879*1b3f573fSAndroid Build Coastguard Worker assert_equal [m].to_json, Google::Protobuf.encode_json([m]) 880*1b3f573fSAndroid Build Coastguard Worker assert_equal proto_module::TestMessage.decode_json([m.to_json].first), decoded_msg 881*1b3f573fSAndroid Build Coastguard Worker end 882*1b3f573fSAndroid Build Coastguard Worker 883*1b3f573fSAndroid Build Coastguard Worker def test_def_errors 884*1b3f573fSAndroid Build Coastguard Worker s = Google::Protobuf::DescriptorPool.new 885*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 886*1b3f573fSAndroid Build Coastguard Worker s.build do 887*1b3f573fSAndroid Build Coastguard Worker # enum with no default (integer value 0) 888*1b3f573fSAndroid Build Coastguard Worker add_enum "MyEnum" do 889*1b3f573fSAndroid Build Coastguard Worker value :A, 1 890*1b3f573fSAndroid Build Coastguard Worker end 891*1b3f573fSAndroid Build Coastguard Worker end 892*1b3f573fSAndroid Build Coastguard Worker end 893*1b3f573fSAndroid Build Coastguard Worker assert_raise Google::Protobuf::TypeError do 894*1b3f573fSAndroid Build Coastguard Worker s.build do 895*1b3f573fSAndroid Build Coastguard Worker # message with required field (unsupported in proto3) 896*1b3f573fSAndroid Build Coastguard Worker add_message "MyMessage" do 897*1b3f573fSAndroid Build Coastguard Worker required :foo, :int32, 1 898*1b3f573fSAndroid Build Coastguard Worker end 899*1b3f573fSAndroid Build Coastguard Worker end 900*1b3f573fSAndroid Build Coastguard Worker end 901*1b3f573fSAndroid Build Coastguard Worker end 902*1b3f573fSAndroid Build Coastguard Worker 903*1b3f573fSAndroid Build Coastguard Worker def test_corecursive 904*1b3f573fSAndroid Build Coastguard Worker # just be sure that we can instantiate types with corecursive field-type 905*1b3f573fSAndroid Build Coastguard Worker # references. 906*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Recursive1.new(:foo => proto_module::Recursive2.new(:foo => proto_module::Recursive1.new)) 907*1b3f573fSAndroid Build Coastguard Worker assert proto_module::Recursive1.descriptor.lookup("foo").subtype == 908*1b3f573fSAndroid Build Coastguard Worker proto_module::Recursive2.descriptor 909*1b3f573fSAndroid Build Coastguard Worker assert proto_module::Recursive2.descriptor.lookup("foo").subtype == 910*1b3f573fSAndroid Build Coastguard Worker proto_module::Recursive1.descriptor 911*1b3f573fSAndroid Build Coastguard Worker 912*1b3f573fSAndroid Build Coastguard Worker serialized = proto_module::Recursive1.encode(m) 913*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Recursive1.decode(serialized) 914*1b3f573fSAndroid Build Coastguard Worker assert m == m2 915*1b3f573fSAndroid Build Coastguard Worker end 916*1b3f573fSAndroid Build Coastguard Worker 917*1b3f573fSAndroid Build Coastguard Worker def test_serialize_cycle 918*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Recursive1.new(:foo => proto_module::Recursive2.new) 919*1b3f573fSAndroid Build Coastguard Worker m.foo.foo = m 920*1b3f573fSAndroid Build Coastguard Worker assert_raise RuntimeError do 921*1b3f573fSAndroid Build Coastguard Worker proto_module::Recursive1.encode(m) 922*1b3f573fSAndroid Build Coastguard Worker end 923*1b3f573fSAndroid Build Coastguard Worker end 924*1b3f573fSAndroid Build Coastguard Worker 925*1b3f573fSAndroid Build Coastguard Worker def test_bad_field_names 926*1b3f573fSAndroid Build Coastguard Worker m = proto_module::BadFieldNames.new(:dup => 1, :class => 2) 927*1b3f573fSAndroid Build Coastguard Worker m2 = m.dup 928*1b3f573fSAndroid Build Coastguard Worker assert m == m2 929*1b3f573fSAndroid Build Coastguard Worker assert m['dup'] == 1 930*1b3f573fSAndroid Build Coastguard Worker assert m['class'] == 2 931*1b3f573fSAndroid Build Coastguard Worker m['dup'] = 3 932*1b3f573fSAndroid Build Coastguard Worker assert m['dup'] == 3 933*1b3f573fSAndroid Build Coastguard Worker end 934*1b3f573fSAndroid Build Coastguard Worker 935*1b3f573fSAndroid Build Coastguard Worker def test_int_ranges 936*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 937*1b3f573fSAndroid Build Coastguard Worker 938*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 0 939*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = -0x8000_0000 940*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = +0x7fff_ffff 941*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 1.0 942*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = -1.0 943*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 2e9 944*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 945*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = -0x8000_0001 946*1b3f573fSAndroid Build Coastguard Worker end 947*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 948*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = +0x8000_0000 949*1b3f573fSAndroid Build Coastguard Worker end 950*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 951*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = +0x1000_0000_0000_0000_0000_0000 # force Bignum 952*1b3f573fSAndroid Build Coastguard Worker end 953*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 954*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 1e12 955*1b3f573fSAndroid Build Coastguard Worker end 956*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 957*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 1.5 958*1b3f573fSAndroid Build Coastguard Worker end 959*1b3f573fSAndroid Build Coastguard Worker 960*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = 0 961*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = +0xffff_ffff 962*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = 1.0 963*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = 4e9 964*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 965*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = -1 966*1b3f573fSAndroid Build Coastguard Worker end 967*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 968*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = -1.5 969*1b3f573fSAndroid Build Coastguard Worker end 970*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 971*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = -1.5e12 972*1b3f573fSAndroid Build Coastguard Worker end 973*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 974*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = -0x1000_0000_0000_0000 975*1b3f573fSAndroid Build Coastguard Worker end 976*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 977*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = +0x1_0000_0000 978*1b3f573fSAndroid Build Coastguard Worker end 979*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 980*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = +0x1000_0000_0000_0000_0000_0000 # force Bignum 981*1b3f573fSAndroid Build Coastguard Worker end 982*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 983*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = 1e12 984*1b3f573fSAndroid Build Coastguard Worker end 985*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 986*1b3f573fSAndroid Build Coastguard Worker m.optional_uint32 = 1.5 987*1b3f573fSAndroid Build Coastguard Worker end 988*1b3f573fSAndroid Build Coastguard Worker 989*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = 0 990*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = -0x8000_0000_0000_0000 991*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = +0x7fff_ffff_ffff_ffff 992*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = 1.0 993*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = -1.0 994*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = 8e18 995*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = -8e18 996*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 997*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = -0x8000_0000_0000_0001 998*1b3f573fSAndroid Build Coastguard Worker end 999*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1000*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = +0x8000_0000_0000_0000 1001*1b3f573fSAndroid Build Coastguard Worker end 1002*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1003*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = +0x1000_0000_0000_0000_0000_0000 # force Bignum 1004*1b3f573fSAndroid Build Coastguard Worker end 1005*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1006*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = 1e50 1007*1b3f573fSAndroid Build Coastguard Worker end 1008*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1009*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = 1.5 1010*1b3f573fSAndroid Build Coastguard Worker end 1011*1b3f573fSAndroid Build Coastguard Worker 1012*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = 0 1013*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = +0xffff_ffff_ffff_ffff 1014*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = 1.0 1015*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = 16e18 1016*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1017*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = -1 1018*1b3f573fSAndroid Build Coastguard Worker end 1019*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1020*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = -1.5 1021*1b3f573fSAndroid Build Coastguard Worker end 1022*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1023*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = -1.5e12 1024*1b3f573fSAndroid Build Coastguard Worker end 1025*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1026*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = -0x1_0000_0000_0000_0000 1027*1b3f573fSAndroid Build Coastguard Worker end 1028*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1029*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = +0x1_0000_0000_0000_0000 1030*1b3f573fSAndroid Build Coastguard Worker end 1031*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1032*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = +0x1000_0000_0000_0000_0000_0000 # force Bignum 1033*1b3f573fSAndroid Build Coastguard Worker end 1034*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1035*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = 1e50 1036*1b3f573fSAndroid Build Coastguard Worker end 1037*1b3f573fSAndroid Build Coastguard Worker assert_raise RangeError do 1038*1b3f573fSAndroid Build Coastguard Worker m.optional_uint64 = 1.5 1039*1b3f573fSAndroid Build Coastguard Worker end 1040*1b3f573fSAndroid Build Coastguard Worker end 1041*1b3f573fSAndroid Build Coastguard Worker 1042*1b3f573fSAndroid Build Coastguard Worker def test_stress_test 1043*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 1044*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 42 1045*1b3f573fSAndroid Build Coastguard Worker m.optional_int64 = 0x100000000 1046*1b3f573fSAndroid Build Coastguard Worker m.optional_string = "hello world" 1047*1b3f573fSAndroid Build Coastguard Worker 10.times do m.repeated_msg.push proto_module::TestMessage2.new(:foo => 42) end 1048*1b3f573fSAndroid Build Coastguard Worker 10.times do m.repeated_string.push "hello world" end 1049*1b3f573fSAndroid Build Coastguard Worker 1050*1b3f573fSAndroid Build Coastguard Worker data = proto_module::TestMessage.encode(m) 1051*1b3f573fSAndroid Build Coastguard Worker 1052*1b3f573fSAndroid Build Coastguard Worker 10_000.times do 1053*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.decode(data) 1054*1b3f573fSAndroid Build Coastguard Worker data_new = proto_module::TestMessage.encode(m) 1055*1b3f573fSAndroid Build Coastguard Worker assert data_new == data 1056*1b3f573fSAndroid Build Coastguard Worker data = data_new 1057*1b3f573fSAndroid Build Coastguard Worker end 1058*1b3f573fSAndroid Build Coastguard Worker end 1059*1b3f573fSAndroid Build Coastguard Worker 1060*1b3f573fSAndroid Build Coastguard Worker def test_reflection 1061*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_int32 => 1234) 1062*1b3f573fSAndroid Build Coastguard Worker msgdef = m.class.descriptor 1063*1b3f573fSAndroid Build Coastguard Worker assert msgdef.class == Google::Protobuf::Descriptor 1064*1b3f573fSAndroid Build Coastguard Worker assert msgdef.any? {|field| field.name == "optional_int32"} 1065*1b3f573fSAndroid Build Coastguard Worker optional_int32 = msgdef.lookup "optional_int32" 1066*1b3f573fSAndroid Build Coastguard Worker assert optional_int32.class == Google::Protobuf::FieldDescriptor 1067*1b3f573fSAndroid Build Coastguard Worker assert optional_int32 != nil 1068*1b3f573fSAndroid Build Coastguard Worker assert optional_int32.name == "optional_int32" 1069*1b3f573fSAndroid Build Coastguard Worker assert optional_int32.type == :int32 1070*1b3f573fSAndroid Build Coastguard Worker optional_int32.set(m, 5678) 1071*1b3f573fSAndroid Build Coastguard Worker assert m.optional_int32 == 5678 1072*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 1000 1073*1b3f573fSAndroid Build Coastguard Worker assert optional_int32.get(m) == 1000 1074*1b3f573fSAndroid Build Coastguard Worker 1075*1b3f573fSAndroid Build Coastguard Worker optional_msg = msgdef.lookup "optional_msg" 1076*1b3f573fSAndroid Build Coastguard Worker assert optional_msg.subtype == proto_module::TestMessage2.descriptor 1077*1b3f573fSAndroid Build Coastguard Worker 1078*1b3f573fSAndroid Build Coastguard Worker optional_msg.set(m, optional_msg.subtype.msgclass.new) 1079*1b3f573fSAndroid Build Coastguard Worker 1080*1b3f573fSAndroid Build Coastguard Worker assert msgdef.msgclass == proto_module::TestMessage 1081*1b3f573fSAndroid Build Coastguard Worker 1082*1b3f573fSAndroid Build Coastguard Worker optional_enum = msgdef.lookup "optional_enum" 1083*1b3f573fSAndroid Build Coastguard Worker assert optional_enum.subtype == proto_module::TestEnum.descriptor 1084*1b3f573fSAndroid Build Coastguard Worker assert optional_enum.subtype.class == Google::Protobuf::EnumDescriptor 1085*1b3f573fSAndroid Build Coastguard Worker optional_enum.subtype.each do |k, v| 1086*1b3f573fSAndroid Build Coastguard Worker # set with integer, check resolution to symbolic name 1087*1b3f573fSAndroid Build Coastguard Worker optional_enum.set(m, v) 1088*1b3f573fSAndroid Build Coastguard Worker assert optional_enum.get(m) == k 1089*1b3f573fSAndroid Build Coastguard Worker end 1090*1b3f573fSAndroid Build Coastguard Worker end 1091*1b3f573fSAndroid Build Coastguard Worker 1092*1b3f573fSAndroid Build Coastguard Worker def test_json 1093*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(:optional_int32 => 1234, 1094*1b3f573fSAndroid Build Coastguard Worker :optional_int64 => -0x1_0000_0000, 1095*1b3f573fSAndroid Build Coastguard Worker :optional_uint32 => 0x8000_0000, 1096*1b3f573fSAndroid Build Coastguard Worker :optional_uint64 => 0xffff_ffff_ffff_ffff, 1097*1b3f573fSAndroid Build Coastguard Worker :optional_bool => true, 1098*1b3f573fSAndroid Build Coastguard Worker :optional_float => 1.0, 1099*1b3f573fSAndroid Build Coastguard Worker :optional_double => -1e100, 1100*1b3f573fSAndroid Build Coastguard Worker :optional_string => "Test string", 1101*1b3f573fSAndroid Build Coastguard Worker :optional_bytes => ["FFFFFFFF"].pack('H*'), 1102*1b3f573fSAndroid Build Coastguard Worker :optional_msg => proto_module::TestMessage2.new(:foo => 42), 1103*1b3f573fSAndroid Build Coastguard Worker :repeated_int32 => [1, 2, 3, 4], 1104*1b3f573fSAndroid Build Coastguard Worker :repeated_string => ["a", "b", "c"], 1105*1b3f573fSAndroid Build Coastguard Worker :repeated_bool => [true, false, true, false], 1106*1b3f573fSAndroid Build Coastguard Worker :repeated_msg => [proto_module::TestMessage2.new(:foo => 1), 1107*1b3f573fSAndroid Build Coastguard Worker proto_module::TestMessage2.new(:foo => 2)]) 1108*1b3f573fSAndroid Build Coastguard Worker 1109*1b3f573fSAndroid Build Coastguard Worker json_text = proto_module::TestMessage.encode_json(m) 1110*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.decode_json(json_text) 1111*1b3f573fSAndroid Build Coastguard Worker assert_equal m, m2 1112*1b3f573fSAndroid Build Coastguard Worker 1113*1b3f573fSAndroid Build Coastguard Worker # Crash case from GitHub issue 283. 1114*1b3f573fSAndroid Build Coastguard Worker bar = proto_module::Bar.new(msg: "bar") 1115*1b3f573fSAndroid Build Coastguard Worker baz1 = proto_module::Baz.new(msg: "baz") 1116*1b3f573fSAndroid Build Coastguard Worker baz2 = proto_module::Baz.new(msg: "quux") 1117*1b3f573fSAndroid Build Coastguard Worker proto_module::Foo.encode_json(proto_module::Foo.new) 1118*1b3f573fSAndroid Build Coastguard Worker proto_module::Foo.encode_json(proto_module::Foo.new(bar: bar)) 1119*1b3f573fSAndroid Build Coastguard Worker proto_module::Foo.encode_json(proto_module::Foo.new(bar: bar, baz: [baz1, baz2])) 1120*1b3f573fSAndroid Build Coastguard Worker end 1121*1b3f573fSAndroid Build Coastguard Worker 1122*1b3f573fSAndroid Build Coastguard Worker def test_json_empty 1123*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestMessage.encode_json(proto_module::TestMessage.new) == '{}' 1124*1b3f573fSAndroid Build Coastguard Worker end 1125*1b3f573fSAndroid Build Coastguard Worker 1126*1b3f573fSAndroid Build Coastguard Worker def test_json_emit_defaults 1127*1b3f573fSAndroid Build Coastguard Worker # TODO: Fix JSON in JRuby version. 1128*1b3f573fSAndroid Build Coastguard Worker return if RUBY_PLATFORM == "java" 1129*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 1130*1b3f573fSAndroid Build Coastguard Worker 1131*1b3f573fSAndroid Build Coastguard Worker expected = { 1132*1b3f573fSAndroid Build Coastguard Worker repeatedInt32: [], 1133*1b3f573fSAndroid Build Coastguard Worker repeatedInt64: [], 1134*1b3f573fSAndroid Build Coastguard Worker repeatedUint32: [], 1135*1b3f573fSAndroid Build Coastguard Worker repeatedUint64: [], 1136*1b3f573fSAndroid Build Coastguard Worker repeatedBool: [], 1137*1b3f573fSAndroid Build Coastguard Worker repeatedFloat: [], 1138*1b3f573fSAndroid Build Coastguard Worker repeatedDouble: [], 1139*1b3f573fSAndroid Build Coastguard Worker repeatedString: [], 1140*1b3f573fSAndroid Build Coastguard Worker repeatedBytes: [], 1141*1b3f573fSAndroid Build Coastguard Worker repeatedMsg: [], 1142*1b3f573fSAndroid Build Coastguard Worker repeatedEnum: [] 1143*1b3f573fSAndroid Build Coastguard Worker } 1144*1b3f573fSAndroid Build Coastguard Worker 1145*1b3f573fSAndroid Build Coastguard Worker actual = proto_module::TestMessage.encode_json(m, :emit_defaults => true) 1146*1b3f573fSAndroid Build Coastguard Worker 1147*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, JSON.parse(actual, :symbolize_names => true) 1148*1b3f573fSAndroid Build Coastguard Worker end 1149*1b3f573fSAndroid Build Coastguard Worker 1150*1b3f573fSAndroid Build Coastguard Worker def test_json_emit_defaults_submsg 1151*1b3f573fSAndroid Build Coastguard Worker # TODO: Fix JSON in JRuby version. 1152*1b3f573fSAndroid Build Coastguard Worker return if RUBY_PLATFORM == "java" 1153*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(optional_msg: proto_module::TestMessage2.new) 1154*1b3f573fSAndroid Build Coastguard Worker 1155*1b3f573fSAndroid Build Coastguard Worker expected = { 1156*1b3f573fSAndroid Build Coastguard Worker optionalMsg: {}, 1157*1b3f573fSAndroid Build Coastguard Worker repeatedInt32: [], 1158*1b3f573fSAndroid Build Coastguard Worker repeatedInt64: [], 1159*1b3f573fSAndroid Build Coastguard Worker repeatedUint32: [], 1160*1b3f573fSAndroid Build Coastguard Worker repeatedUint64: [], 1161*1b3f573fSAndroid Build Coastguard Worker repeatedBool: [], 1162*1b3f573fSAndroid Build Coastguard Worker repeatedFloat: [], 1163*1b3f573fSAndroid Build Coastguard Worker repeatedDouble: [], 1164*1b3f573fSAndroid Build Coastguard Worker repeatedString: [], 1165*1b3f573fSAndroid Build Coastguard Worker repeatedBytes: [], 1166*1b3f573fSAndroid Build Coastguard Worker repeatedMsg: [], 1167*1b3f573fSAndroid Build Coastguard Worker repeatedEnum: [] 1168*1b3f573fSAndroid Build Coastguard Worker } 1169*1b3f573fSAndroid Build Coastguard Worker 1170*1b3f573fSAndroid Build Coastguard Worker actual = proto_module::TestMessage.encode_json(m, :emit_defaults => true) 1171*1b3f573fSAndroid Build Coastguard Worker 1172*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, JSON.parse(actual, :symbolize_names => true) 1173*1b3f573fSAndroid Build Coastguard Worker end 1174*1b3f573fSAndroid Build Coastguard Worker 1175*1b3f573fSAndroid Build Coastguard Worker def test_json_emit_defaults_repeated_submsg 1176*1b3f573fSAndroid Build Coastguard Worker # TODO: Fix JSON in JRuby version. 1177*1b3f573fSAndroid Build Coastguard Worker return if RUBY_PLATFORM == "java" 1178*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(repeated_msg: [proto_module::TestMessage2.new]) 1179*1b3f573fSAndroid Build Coastguard Worker 1180*1b3f573fSAndroid Build Coastguard Worker expected = { 1181*1b3f573fSAndroid Build Coastguard Worker repeatedInt32: [], 1182*1b3f573fSAndroid Build Coastguard Worker repeatedInt64: [], 1183*1b3f573fSAndroid Build Coastguard Worker repeatedUint32: [], 1184*1b3f573fSAndroid Build Coastguard Worker repeatedUint64: [], 1185*1b3f573fSAndroid Build Coastguard Worker repeatedBool: [], 1186*1b3f573fSAndroid Build Coastguard Worker repeatedFloat: [], 1187*1b3f573fSAndroid Build Coastguard Worker repeatedDouble: [], 1188*1b3f573fSAndroid Build Coastguard Worker repeatedString: [], 1189*1b3f573fSAndroid Build Coastguard Worker repeatedBytes: [], 1190*1b3f573fSAndroid Build Coastguard Worker repeatedMsg: [{}], 1191*1b3f573fSAndroid Build Coastguard Worker repeatedEnum: [] 1192*1b3f573fSAndroid Build Coastguard Worker } 1193*1b3f573fSAndroid Build Coastguard Worker 1194*1b3f573fSAndroid Build Coastguard Worker actual = proto_module::TestMessage.encode_json(m, :emit_defaults => true) 1195*1b3f573fSAndroid Build Coastguard Worker 1196*1b3f573fSAndroid Build Coastguard Worker assert_equal expected, JSON.parse(actual, :symbolize_names => true) 1197*1b3f573fSAndroid Build Coastguard Worker end 1198*1b3f573fSAndroid Build Coastguard Worker 1199*1b3f573fSAndroid Build Coastguard Worker def value_from_ruby(value) 1200*1b3f573fSAndroid Build Coastguard Worker ret = Google::Protobuf::Value.new 1201*1b3f573fSAndroid Build Coastguard Worker case value 1202*1b3f573fSAndroid Build Coastguard Worker when String 1203*1b3f573fSAndroid Build Coastguard Worker ret.string_value = value 1204*1b3f573fSAndroid Build Coastguard Worker when Google::Protobuf::Struct 1205*1b3f573fSAndroid Build Coastguard Worker ret.struct_value = value 1206*1b3f573fSAndroid Build Coastguard Worker when Hash 1207*1b3f573fSAndroid Build Coastguard Worker ret.struct_value = struct_from_ruby(value) 1208*1b3f573fSAndroid Build Coastguard Worker when Google::Protobuf::ListValue 1209*1b3f573fSAndroid Build Coastguard Worker ret.list_value = value 1210*1b3f573fSAndroid Build Coastguard Worker when Array 1211*1b3f573fSAndroid Build Coastguard Worker ret.list_value = list_from_ruby(value) 1212*1b3f573fSAndroid Build Coastguard Worker else 1213*1b3f573fSAndroid Build Coastguard Worker @log.error "Unknown type: #{value.class}" 1214*1b3f573fSAndroid Build Coastguard Worker raise Google::Protobuf::Error, "Unknown type: #{value.class}" 1215*1b3f573fSAndroid Build Coastguard Worker end 1216*1b3f573fSAndroid Build Coastguard Worker ret 1217*1b3f573fSAndroid Build Coastguard Worker end 1218*1b3f573fSAndroid Build Coastguard Worker 1219*1b3f573fSAndroid Build Coastguard Worker def list_from_ruby(arr) 1220*1b3f573fSAndroid Build Coastguard Worker ret = Google::Protobuf::ListValue.new 1221*1b3f573fSAndroid Build Coastguard Worker arr.each do |v| 1222*1b3f573fSAndroid Build Coastguard Worker ret.values << value_from_ruby(v) 1223*1b3f573fSAndroid Build Coastguard Worker end 1224*1b3f573fSAndroid Build Coastguard Worker ret 1225*1b3f573fSAndroid Build Coastguard Worker end 1226*1b3f573fSAndroid Build Coastguard Worker 1227*1b3f573fSAndroid Build Coastguard Worker def struct_from_ruby(hash) 1228*1b3f573fSAndroid Build Coastguard Worker ret = Google::Protobuf::Struct.new 1229*1b3f573fSAndroid Build Coastguard Worker hash.each do |k, v| 1230*1b3f573fSAndroid Build Coastguard Worker ret.fields[k] ||= value_from_ruby(v) 1231*1b3f573fSAndroid Build Coastguard Worker end 1232*1b3f573fSAndroid Build Coastguard Worker ret 1233*1b3f573fSAndroid Build Coastguard Worker end 1234*1b3f573fSAndroid Build Coastguard Worker 1235*1b3f573fSAndroid Build Coastguard Worker def test_deep_json 1236*1b3f573fSAndroid Build Coastguard Worker # will not overflow 1237*1b3f573fSAndroid Build Coastguard Worker json = '{"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":{"a":'\ 1238*1b3f573fSAndroid Build Coastguard Worker '{"a":{"a":{"a":{"a":{}}}}}}}}}}}}}}}}' 1239*1b3f573fSAndroid Build Coastguard Worker 1240*1b3f573fSAndroid Build Coastguard Worker struct = struct_from_ruby(JSON.parse(json)) 1241*1b3f573fSAndroid Build Coastguard Worker assert_equal json, struct.to_json 1242*1b3f573fSAndroid Build Coastguard Worker 1243*1b3f573fSAndroid Build Coastguard Worker encoded = proto_module::MyRepeatedStruct.encode( 1244*1b3f573fSAndroid Build Coastguard Worker proto_module::MyRepeatedStruct.new(structs: [proto_module::MyStruct.new(struct: struct)])) 1245*1b3f573fSAndroid Build Coastguard Worker assert_equal json, proto_module::MyRepeatedStruct.decode(encoded).structs[0].struct.to_json 1246*1b3f573fSAndroid Build Coastguard Worker 1247*1b3f573fSAndroid Build Coastguard Worker # will overflow 1248*1b3f573fSAndroid Build Coastguard Worker json = '{"a":{"a":{"a":[{"a":{"a":[{"a":[{"a":{"a":[{"a":[{"a":'\ 1249*1b3f573fSAndroid Build Coastguard Worker '{"a":[{"a":[{"a":{"a":{"a":[{"a":"a"}]}}}]}]}}]}]}}]}]}}]}}}' 1250*1b3f573fSAndroid Build Coastguard Worker 1251*1b3f573fSAndroid Build Coastguard Worker struct = struct_from_ruby(JSON.parse(json)) 1252*1b3f573fSAndroid Build Coastguard Worker assert_equal json, struct.to_json 1253*1b3f573fSAndroid Build Coastguard Worker 1254*1b3f573fSAndroid Build Coastguard Worker assert_raise(RuntimeError, "Recursion limit exceeded during encoding") do 1255*1b3f573fSAndroid Build Coastguard Worker struct = Google::Protobuf::Struct.new 1256*1b3f573fSAndroid Build Coastguard Worker struct.fields["foobar"] = Google::Protobuf::Value.new(struct_value: struct) 1257*1b3f573fSAndroid Build Coastguard Worker Google::Protobuf::Struct.encode(struct) 1258*1b3f573fSAndroid Build Coastguard Worker end 1259*1b3f573fSAndroid Build Coastguard Worker end 1260*1b3f573fSAndroid Build Coastguard Worker 1261*1b3f573fSAndroid Build Coastguard Worker def test_comparison_with_arbitrary_object 1262*1b3f573fSAndroid Build Coastguard Worker assert proto_module::TestMessage.new != nil 1263*1b3f573fSAndroid Build Coastguard Worker end 1264*1b3f573fSAndroid Build Coastguard Worker 1265*1b3f573fSAndroid Build Coastguard Worker def test_wrappers_set_to_default 1266*1b3f573fSAndroid Build Coastguard Worker run_asserts = ->(m) { 1267*1b3f573fSAndroid Build Coastguard Worker assert_equal 0.0, m.double.value 1268*1b3f573fSAndroid Build Coastguard Worker assert_equal 0.0, m.float.value 1269*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, m.int32.value 1270*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, m.int64.value 1271*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, m.uint32.value 1272*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, m.uint64.value 1273*1b3f573fSAndroid Build Coastguard Worker assert_equal false, m.bool.value 1274*1b3f573fSAndroid Build Coastguard Worker assert_equal '', m.string.value 1275*1b3f573fSAndroid Build Coastguard Worker assert_equal '', m.bytes.value 1276*1b3f573fSAndroid Build Coastguard Worker } 1277*1b3f573fSAndroid Build Coastguard Worker 1278*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new( 1279*1b3f573fSAndroid Build Coastguard Worker double: Google::Protobuf::DoubleValue.new(value: 0.0), 1280*1b3f573fSAndroid Build Coastguard Worker float: Google::Protobuf::FloatValue.new(value: 0.0), 1281*1b3f573fSAndroid Build Coastguard Worker int32: Google::Protobuf::Int32Value.new(value: 0), 1282*1b3f573fSAndroid Build Coastguard Worker int64: Google::Protobuf::Int64Value.new(value: 0), 1283*1b3f573fSAndroid Build Coastguard Worker uint32: Google::Protobuf::UInt32Value.new(value: 0), 1284*1b3f573fSAndroid Build Coastguard Worker uint64: Google::Protobuf::UInt64Value.new(value: 0), 1285*1b3f573fSAndroid Build Coastguard Worker bool: Google::Protobuf::BoolValue.new(value: false), 1286*1b3f573fSAndroid Build Coastguard Worker string: Google::Protobuf::StringValue.new(value: ""), 1287*1b3f573fSAndroid Build Coastguard Worker bytes: Google::Protobuf::BytesValue.new(value: ''), 1288*1b3f573fSAndroid Build Coastguard Worker ) 1289*1b3f573fSAndroid Build Coastguard Worker 1290*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m) 1291*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Wrapper.decode(m.to_proto) 1292*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m2) 1293*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::Wrapper.decode_json(m.to_json) 1294*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m3) 1295*1b3f573fSAndroid Build Coastguard Worker end 1296*1b3f573fSAndroid Build Coastguard Worker 1297*1b3f573fSAndroid Build Coastguard Worker def test_wrapper_getters 1298*1b3f573fSAndroid Build Coastguard Worker run_asserts = ->(m) { 1299*1b3f573fSAndroid Build Coastguard Worker assert_equal 2.0, m.double_as_value 1300*1b3f573fSAndroid Build Coastguard Worker assert_equal 2.0, m.double.value 1301*1b3f573fSAndroid Build Coastguard Worker assert_equal 2.0, m.double_as_value 1302*1b3f573fSAndroid Build Coastguard Worker 1303*1b3f573fSAndroid Build Coastguard Worker assert_equal 4.0, m.float_as_value 1304*1b3f573fSAndroid Build Coastguard Worker assert_equal 4.0, m.float.value 1305*1b3f573fSAndroid Build Coastguard Worker assert_equal 4.0, m.float_as_value 1306*1b3f573fSAndroid Build Coastguard Worker 1307*1b3f573fSAndroid Build Coastguard Worker assert_equal 3, m.int32_as_value 1308*1b3f573fSAndroid Build Coastguard Worker assert_equal 3, m.int32.value 1309*1b3f573fSAndroid Build Coastguard Worker assert_equal 3, m.int32_as_value 1310*1b3f573fSAndroid Build Coastguard Worker 1311*1b3f573fSAndroid Build Coastguard Worker assert_equal 4, m.int64_as_value 1312*1b3f573fSAndroid Build Coastguard Worker assert_equal 4, m.int64.value 1313*1b3f573fSAndroid Build Coastguard Worker assert_equal 4, m.int64_as_value 1314*1b3f573fSAndroid Build Coastguard Worker 1315*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.uint32_as_value 1316*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.uint32.value 1317*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.uint32_as_value 1318*1b3f573fSAndroid Build Coastguard Worker 1319*1b3f573fSAndroid Build Coastguard Worker assert_equal 6, m.uint64_as_value 1320*1b3f573fSAndroid Build Coastguard Worker assert_equal 6, m.uint64.value 1321*1b3f573fSAndroid Build Coastguard Worker assert_equal 6, m.uint64_as_value 1322*1b3f573fSAndroid Build Coastguard Worker 1323*1b3f573fSAndroid Build Coastguard Worker assert_equal true, m.bool_as_value 1324*1b3f573fSAndroid Build Coastguard Worker assert_equal true, m.bool.value 1325*1b3f573fSAndroid Build Coastguard Worker assert_equal true, m.bool_as_value 1326*1b3f573fSAndroid Build Coastguard Worker 1327*1b3f573fSAndroid Build Coastguard Worker assert_equal "st\nr", m.string_as_value 1328*1b3f573fSAndroid Build Coastguard Worker assert_equal "st\nr", m.string.value 1329*1b3f573fSAndroid Build Coastguard Worker assert_equal "st\nr", m.string_as_value 1330*1b3f573fSAndroid Build Coastguard Worker 1331*1b3f573fSAndroid Build Coastguard Worker assert_equal 'fun', m.bytes_as_value 1332*1b3f573fSAndroid Build Coastguard Worker assert_equal 'fun', m.bytes.value 1333*1b3f573fSAndroid Build Coastguard Worker assert_equal 'fun', m.bytes_as_value 1334*1b3f573fSAndroid Build Coastguard Worker } 1335*1b3f573fSAndroid Build Coastguard Worker 1336*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new( 1337*1b3f573fSAndroid Build Coastguard Worker double: Google::Protobuf::DoubleValue.new(value: 2.0), 1338*1b3f573fSAndroid Build Coastguard Worker float: Google::Protobuf::FloatValue.new(value: 4.0), 1339*1b3f573fSAndroid Build Coastguard Worker int32: Google::Protobuf::Int32Value.new(value: 3), 1340*1b3f573fSAndroid Build Coastguard Worker int64: Google::Protobuf::Int64Value.new(value: 4), 1341*1b3f573fSAndroid Build Coastguard Worker uint32: Google::Protobuf::UInt32Value.new(value: 5), 1342*1b3f573fSAndroid Build Coastguard Worker uint64: Google::Protobuf::UInt64Value.new(value: 6), 1343*1b3f573fSAndroid Build Coastguard Worker bool: Google::Protobuf::BoolValue.new(value: true), 1344*1b3f573fSAndroid Build Coastguard Worker string: Google::Protobuf::StringValue.new(value: "st\nr"), 1345*1b3f573fSAndroid Build Coastguard Worker bytes: Google::Protobuf::BytesValue.new(value: 'fun'), 1346*1b3f573fSAndroid Build Coastguard Worker real_string: '100' 1347*1b3f573fSAndroid Build Coastguard Worker ) 1348*1b3f573fSAndroid Build Coastguard Worker 1349*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m) 1350*1b3f573fSAndroid Build Coastguard Worker serialized = proto_module::Wrapper::encode(m) 1351*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Wrapper::decode(serialized) 1352*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m2) 1353*1b3f573fSAndroid Build Coastguard Worker 1354*1b3f573fSAndroid Build Coastguard Worker # Test the case where we are serializing directly from the parsed form 1355*1b3f573fSAndroid Build Coastguard Worker # (before anything lazy is materialized). 1356*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::Wrapper::decode(serialized) 1357*1b3f573fSAndroid Build Coastguard Worker serialized2 = proto_module::Wrapper::encode(m3) 1358*1b3f573fSAndroid Build Coastguard Worker m4 = proto_module::Wrapper::decode(serialized2) 1359*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m4) 1360*1b3f573fSAndroid Build Coastguard Worker 1361*1b3f573fSAndroid Build Coastguard Worker # Test that the lazy form compares equal to the expanded form. 1362*1b3f573fSAndroid Build Coastguard Worker m5 = proto_module::Wrapper::decode(serialized2) 1363*1b3f573fSAndroid Build Coastguard Worker assert_equal m5, m 1364*1b3f573fSAndroid Build Coastguard Worker 1365*1b3f573fSAndroid Build Coastguard Worker serialized_json = proto_module::Wrapper::encode_json(m) 1366*1b3f573fSAndroid Build Coastguard Worker m6 = proto_module::Wrapper::decode_json(serialized_json) 1367*1b3f573fSAndroid Build Coastguard Worker assert_equal m6, m 1368*1b3f573fSAndroid Build Coastguard Worker end 1369*1b3f573fSAndroid Build Coastguard Worker 1370*1b3f573fSAndroid Build Coastguard Worker def test_repeated_wrappers 1371*1b3f573fSAndroid Build Coastguard Worker run_asserts = ->(m) { 1372*1b3f573fSAndroid Build Coastguard Worker assert_equal 2.0, m.repeated_double[0].value 1373*1b3f573fSAndroid Build Coastguard Worker assert_equal 4.0, m.repeated_float[0].value 1374*1b3f573fSAndroid Build Coastguard Worker assert_equal 3, m.repeated_int32[0].value 1375*1b3f573fSAndroid Build Coastguard Worker assert_equal 4, m.repeated_int64[0].value 1376*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.repeated_uint32[0].value 1377*1b3f573fSAndroid Build Coastguard Worker assert_equal 6, m.repeated_uint64[0].value 1378*1b3f573fSAndroid Build Coastguard Worker assert_equal true, m.repeated_bool[0].value 1379*1b3f573fSAndroid Build Coastguard Worker assert_equal 'str', m.repeated_string[0].value 1380*1b3f573fSAndroid Build Coastguard Worker assert_equal 'fun', m.repeated_bytes[0].value 1381*1b3f573fSAndroid Build Coastguard Worker } 1382*1b3f573fSAndroid Build Coastguard Worker 1383*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new( 1384*1b3f573fSAndroid Build Coastguard Worker repeated_double: [Google::Protobuf::DoubleValue.new(value: 2.0)], 1385*1b3f573fSAndroid Build Coastguard Worker repeated_float: [Google::Protobuf::FloatValue.new(value: 4.0)], 1386*1b3f573fSAndroid Build Coastguard Worker repeated_int32: [Google::Protobuf::Int32Value.new(value: 3)], 1387*1b3f573fSAndroid Build Coastguard Worker repeated_int64: [Google::Protobuf::Int64Value.new(value: 4)], 1388*1b3f573fSAndroid Build Coastguard Worker repeated_uint32: [Google::Protobuf::UInt32Value.new(value: 5)], 1389*1b3f573fSAndroid Build Coastguard Worker repeated_uint64: [Google::Protobuf::UInt64Value.new(value: 6)], 1390*1b3f573fSAndroid Build Coastguard Worker repeated_bool: [Google::Protobuf::BoolValue.new(value: true)], 1391*1b3f573fSAndroid Build Coastguard Worker repeated_string: [Google::Protobuf::StringValue.new(value: 'str')], 1392*1b3f573fSAndroid Build Coastguard Worker repeated_bytes: [Google::Protobuf::BytesValue.new(value: 'fun')], 1393*1b3f573fSAndroid Build Coastguard Worker ) 1394*1b3f573fSAndroid Build Coastguard Worker 1395*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m) 1396*1b3f573fSAndroid Build Coastguard Worker serialized = proto_module::Wrapper::encode(m) 1397*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Wrapper::decode(serialized) 1398*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m2) 1399*1b3f573fSAndroid Build Coastguard Worker 1400*1b3f573fSAndroid Build Coastguard Worker # Test the case where we are serializing directly from the parsed form 1401*1b3f573fSAndroid Build Coastguard Worker # (before anything lazy is materialized). 1402*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::Wrapper::decode(serialized) 1403*1b3f573fSAndroid Build Coastguard Worker serialized2 = proto_module::Wrapper::encode(m3) 1404*1b3f573fSAndroid Build Coastguard Worker m4 = proto_module::Wrapper::decode(serialized2) 1405*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m4) 1406*1b3f573fSAndroid Build Coastguard Worker 1407*1b3f573fSAndroid Build Coastguard Worker # Test that the lazy form compares equal to the expanded form. 1408*1b3f573fSAndroid Build Coastguard Worker m5 = proto_module::Wrapper::decode(serialized2) 1409*1b3f573fSAndroid Build Coastguard Worker assert_equal m5, m 1410*1b3f573fSAndroid Build Coastguard Worker 1411*1b3f573fSAndroid Build Coastguard Worker # Test JSON. 1412*1b3f573fSAndroid Build Coastguard Worker serialized_json = proto_module::Wrapper::encode_json(m5) 1413*1b3f573fSAndroid Build Coastguard Worker m6 = proto_module::Wrapper::decode_json(serialized_json) 1414*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m6) 1415*1b3f573fSAndroid Build Coastguard Worker assert_equal m6, m 1416*1b3f573fSAndroid Build Coastguard Worker end 1417*1b3f573fSAndroid Build Coastguard Worker 1418*1b3f573fSAndroid Build Coastguard Worker def test_oneof_wrappers 1419*1b3f573fSAndroid Build Coastguard Worker run_test = ->(m) { 1420*1b3f573fSAndroid Build Coastguard Worker serialized = proto_module::Wrapper::encode(m) 1421*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Wrapper::decode(serialized) 1422*1b3f573fSAndroid Build Coastguard Worker 1423*1b3f573fSAndroid Build Coastguard Worker # Encode directly from lazy form. 1424*1b3f573fSAndroid Build Coastguard Worker serialized2 = proto_module::Wrapper::encode(m2) 1425*1b3f573fSAndroid Build Coastguard Worker 1426*1b3f573fSAndroid Build Coastguard Worker assert_equal m, m2 1427*1b3f573fSAndroid Build Coastguard Worker assert_equal serialized, serialized2 1428*1b3f573fSAndroid Build Coastguard Worker 1429*1b3f573fSAndroid Build Coastguard Worker serialized_json = proto_module::Wrapper::encode_json(m) 1430*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::Wrapper::decode_json(serialized_json) 1431*1b3f573fSAndroid Build Coastguard Worker assert_equal m, m3 1432*1b3f573fSAndroid Build Coastguard Worker } 1433*1b3f573fSAndroid Build Coastguard Worker 1434*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new() 1435*1b3f573fSAndroid Build Coastguard Worker 1436*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1437*1b3f573fSAndroid Build Coastguard Worker m.oneof_double_as_value = 2.0 1438*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1439*1b3f573fSAndroid Build Coastguard Worker m.oneof_float_as_value = 4.0 1440*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1441*1b3f573fSAndroid Build Coastguard Worker m.oneof_int32_as_value = 3 1442*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1443*1b3f573fSAndroid Build Coastguard Worker m.oneof_int64_as_value = 5 1444*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1445*1b3f573fSAndroid Build Coastguard Worker m.oneof_uint32_as_value = 6 1446*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1447*1b3f573fSAndroid Build Coastguard Worker m.oneof_uint64_as_value = 7 1448*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1449*1b3f573fSAndroid Build Coastguard Worker m.oneof_string_as_value = 'str' 1450*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1451*1b3f573fSAndroid Build Coastguard Worker m.oneof_bytes_as_value = 'fun' 1452*1b3f573fSAndroid Build Coastguard Worker run_test.call(m) 1453*1b3f573fSAndroid Build Coastguard Worker end 1454*1b3f573fSAndroid Build Coastguard Worker 1455*1b3f573fSAndroid Build Coastguard Worker def test_top_level_wrappers 1456*1b3f573fSAndroid Build Coastguard Worker # We don't expect anyone to do this, but we should also make sure it does 1457*1b3f573fSAndroid Build Coastguard Worker # the right thing. 1458*1b3f573fSAndroid Build Coastguard Worker run_test = ->(klass, val) { 1459*1b3f573fSAndroid Build Coastguard Worker m = klass.new(value: val) 1460*1b3f573fSAndroid Build Coastguard Worker serialized = klass::encode(m) 1461*1b3f573fSAndroid Build Coastguard Worker m2 = klass::decode(serialized) 1462*1b3f573fSAndroid Build Coastguard Worker 1463*1b3f573fSAndroid Build Coastguard Worker # Encode directly from lazy form. 1464*1b3f573fSAndroid Build Coastguard Worker serialized2 = klass::encode(m2) 1465*1b3f573fSAndroid Build Coastguard Worker 1466*1b3f573fSAndroid Build Coastguard Worker assert_equal m, m2 1467*1b3f573fSAndroid Build Coastguard Worker assert_equal serialized, serialized2 1468*1b3f573fSAndroid Build Coastguard Worker 1469*1b3f573fSAndroid Build Coastguard Worker serialized_json = klass::encode_json(m) 1470*1b3f573fSAndroid Build Coastguard Worker 1471*1b3f573fSAndroid Build Coastguard Worker # This is nonsensical to do and does not work. There is no good reason 1472*1b3f573fSAndroid Build Coastguard Worker # to parse a wrapper type directly. 1473*1b3f573fSAndroid Build Coastguard Worker assert_raise(RuntimeError) { klass::decode_json(serialized_json) } 1474*1b3f573fSAndroid Build Coastguard Worker } 1475*1b3f573fSAndroid Build Coastguard Worker 1476*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::DoubleValue, 2.0) 1477*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::FloatValue, 4.0) 1478*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::Int32Value, 3) 1479*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::Int64Value, 4) 1480*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::UInt32Value, 5) 1481*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::UInt64Value, 6) 1482*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::BoolValue, true) 1483*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::StringValue, 'str') 1484*1b3f573fSAndroid Build Coastguard Worker run_test.call(Google::Protobuf::BytesValue, 'fun') 1485*1b3f573fSAndroid Build Coastguard Worker end 1486*1b3f573fSAndroid Build Coastguard Worker 1487*1b3f573fSAndroid Build Coastguard Worker def test_wrapper_setters_as_value 1488*1b3f573fSAndroid Build Coastguard Worker run_asserts = ->(m) { 1489*1b3f573fSAndroid Build Coastguard Worker m.double_as_value = 4.8 1490*1b3f573fSAndroid Build Coastguard Worker assert_equal 4.8, m.double_as_value 1491*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::DoubleValue.new(value: 4.8), m.double 1492*1b3f573fSAndroid Build Coastguard Worker m.float_as_value = 2.4 1493*1b3f573fSAndroid Build Coastguard Worker assert_in_delta 2.4, m.float_as_value 1494*1b3f573fSAndroid Build Coastguard Worker assert_in_delta Google::Protobuf::FloatValue.new(value: 2.4).value, m.float.value 1495*1b3f573fSAndroid Build Coastguard Worker m.int32_as_value = 5 1496*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.int32_as_value 1497*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Int32Value.new(value: 5), m.int32 1498*1b3f573fSAndroid Build Coastguard Worker m.int64_as_value = 15 1499*1b3f573fSAndroid Build Coastguard Worker assert_equal 15, m.int64_as_value 1500*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Int64Value.new(value: 15), m.int64 1501*1b3f573fSAndroid Build Coastguard Worker m.uint32_as_value = 50 1502*1b3f573fSAndroid Build Coastguard Worker assert_equal 50, m.uint32_as_value 1503*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::UInt32Value.new(value: 50), m.uint32 1504*1b3f573fSAndroid Build Coastguard Worker m.uint64_as_value = 500 1505*1b3f573fSAndroid Build Coastguard Worker assert_equal 500, m.uint64_as_value 1506*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::UInt64Value.new(value: 500), m.uint64 1507*1b3f573fSAndroid Build Coastguard Worker m.bool_as_value = false 1508*1b3f573fSAndroid Build Coastguard Worker assert_equal false, m.bool_as_value 1509*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::BoolValue.new(value: false), m.bool 1510*1b3f573fSAndroid Build Coastguard Worker m.string_as_value = 'xy' 1511*1b3f573fSAndroid Build Coastguard Worker assert_equal 'xy', m.string_as_value 1512*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::StringValue.new(value: 'xy'), m.string 1513*1b3f573fSAndroid Build Coastguard Worker m.bytes_as_value = '123' 1514*1b3f573fSAndroid Build Coastguard Worker assert_equal '123', m.bytes_as_value 1515*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::BytesValue.new(value: '123'), m.bytes 1516*1b3f573fSAndroid Build Coastguard Worker 1517*1b3f573fSAndroid Build Coastguard Worker m.double_as_value = nil 1518*1b3f573fSAndroid Build Coastguard Worker assert_nil m.double 1519*1b3f573fSAndroid Build Coastguard Worker assert_nil m.double_as_value 1520*1b3f573fSAndroid Build Coastguard Worker m.float_as_value = nil 1521*1b3f573fSAndroid Build Coastguard Worker assert_nil m.float 1522*1b3f573fSAndroid Build Coastguard Worker assert_nil m.float_as_value 1523*1b3f573fSAndroid Build Coastguard Worker m.int32_as_value = nil 1524*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int32 1525*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int32_as_value 1526*1b3f573fSAndroid Build Coastguard Worker m.int64_as_value = nil 1527*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int64 1528*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int64_as_value 1529*1b3f573fSAndroid Build Coastguard Worker m.uint32_as_value = nil 1530*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint32 1531*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint32_as_value 1532*1b3f573fSAndroid Build Coastguard Worker m.uint64_as_value = nil 1533*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint64 1534*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint64_as_value 1535*1b3f573fSAndroid Build Coastguard Worker m.bool_as_value = nil 1536*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bool 1537*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bool_as_value 1538*1b3f573fSAndroid Build Coastguard Worker m.string_as_value = nil 1539*1b3f573fSAndroid Build Coastguard Worker assert_nil m.string 1540*1b3f573fSAndroid Build Coastguard Worker assert_nil m.string_as_value 1541*1b3f573fSAndroid Build Coastguard Worker m.bytes_as_value = nil 1542*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bytes 1543*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bytes_as_value 1544*1b3f573fSAndroid Build Coastguard Worker } 1545*1b3f573fSAndroid Build Coastguard Worker 1546*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Wrapper.new( 1547*1b3f573fSAndroid Build Coastguard Worker double: Google::Protobuf::DoubleValue.new(value: 2.0), 1548*1b3f573fSAndroid Build Coastguard Worker float: Google::Protobuf::FloatValue.new(value: 4.0), 1549*1b3f573fSAndroid Build Coastguard Worker int32: Google::Protobuf::Int32Value.new(value: 3), 1550*1b3f573fSAndroid Build Coastguard Worker int64: Google::Protobuf::Int64Value.new(value: 4), 1551*1b3f573fSAndroid Build Coastguard Worker uint32: Google::Protobuf::UInt32Value.new(value: 5), 1552*1b3f573fSAndroid Build Coastguard Worker uint64: Google::Protobuf::UInt64Value.new(value: 6), 1553*1b3f573fSAndroid Build Coastguard Worker bool: Google::Protobuf::BoolValue.new(value: true), 1554*1b3f573fSAndroid Build Coastguard Worker string: Google::Protobuf::StringValue.new(value: 'str'), 1555*1b3f573fSAndroid Build Coastguard Worker bytes: Google::Protobuf::BytesValue.new(value: 'fun'), 1556*1b3f573fSAndroid Build Coastguard Worker real_string: '100' 1557*1b3f573fSAndroid Build Coastguard Worker ) 1558*1b3f573fSAndroid Build Coastguard Worker 1559*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m2) 1560*1b3f573fSAndroid Build Coastguard Worker 1561*1b3f573fSAndroid Build Coastguard Worker serialized = proto_module::Wrapper::encode(m2) 1562*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::Wrapper::decode(serialized) 1563*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m3) 1564*1b3f573fSAndroid Build Coastguard Worker end 1565*1b3f573fSAndroid Build Coastguard Worker 1566*1b3f573fSAndroid Build Coastguard Worker def test_wrapper_setters 1567*1b3f573fSAndroid Build Coastguard Worker run_asserts = ->(m) { 1568*1b3f573fSAndroid Build Coastguard Worker m.double = Google::Protobuf::DoubleValue.new(value: 4.8) 1569*1b3f573fSAndroid Build Coastguard Worker assert_equal 4.8, m.double_as_value 1570*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::DoubleValue.new(value: 4.8), m.double 1571*1b3f573fSAndroid Build Coastguard Worker m.float = Google::Protobuf::FloatValue.new(value: 2.4) 1572*1b3f573fSAndroid Build Coastguard Worker assert_in_delta 2.4, m.float_as_value 1573*1b3f573fSAndroid Build Coastguard Worker assert_in_delta Google::Protobuf::FloatValue.new(value: 2.4).value, m.float.value 1574*1b3f573fSAndroid Build Coastguard Worker m.int32 = Google::Protobuf::Int32Value.new(value: 5) 1575*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.int32_as_value 1576*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Int32Value.new(value: 5), m.int32 1577*1b3f573fSAndroid Build Coastguard Worker m.int64 = Google::Protobuf::Int64Value.new(value: 15) 1578*1b3f573fSAndroid Build Coastguard Worker assert_equal 15, m.int64_as_value 1579*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Int64Value.new(value: 15), m.int64 1580*1b3f573fSAndroid Build Coastguard Worker m.uint32 = Google::Protobuf::UInt32Value.new(value: 50) 1581*1b3f573fSAndroid Build Coastguard Worker assert_equal 50, m.uint32_as_value 1582*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::UInt32Value.new(value: 50), m.uint32 1583*1b3f573fSAndroid Build Coastguard Worker m.uint64 = Google::Protobuf::UInt64Value.new(value: 500) 1584*1b3f573fSAndroid Build Coastguard Worker assert_equal 500, m.uint64_as_value 1585*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::UInt64Value.new(value: 500), m.uint64 1586*1b3f573fSAndroid Build Coastguard Worker m.bool = Google::Protobuf::BoolValue.new(value: false) 1587*1b3f573fSAndroid Build Coastguard Worker assert_equal false, m.bool_as_value 1588*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::BoolValue.new(value: false), m.bool 1589*1b3f573fSAndroid Build Coastguard Worker m.string = Google::Protobuf::StringValue.new(value: 'xy') 1590*1b3f573fSAndroid Build Coastguard Worker assert_equal 'xy', m.string_as_value 1591*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::StringValue.new(value: 'xy'), m.string 1592*1b3f573fSAndroid Build Coastguard Worker m.bytes = Google::Protobuf::BytesValue.new(value: '123') 1593*1b3f573fSAndroid Build Coastguard Worker assert_equal '123', m.bytes_as_value 1594*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::BytesValue.new(value: '123'), m.bytes 1595*1b3f573fSAndroid Build Coastguard Worker 1596*1b3f573fSAndroid Build Coastguard Worker m.double = nil 1597*1b3f573fSAndroid Build Coastguard Worker assert_nil m.double 1598*1b3f573fSAndroid Build Coastguard Worker assert_nil m.double_as_value 1599*1b3f573fSAndroid Build Coastguard Worker m.float = nil 1600*1b3f573fSAndroid Build Coastguard Worker assert_nil m.float 1601*1b3f573fSAndroid Build Coastguard Worker assert_nil m.float_as_value 1602*1b3f573fSAndroid Build Coastguard Worker m.int32 = nil 1603*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int32 1604*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int32_as_value 1605*1b3f573fSAndroid Build Coastguard Worker m.int64 = nil 1606*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int64 1607*1b3f573fSAndroid Build Coastguard Worker assert_nil m.int64_as_value 1608*1b3f573fSAndroid Build Coastguard Worker m.uint32 = nil 1609*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint32 1610*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint32_as_value 1611*1b3f573fSAndroid Build Coastguard Worker m.uint64 = nil 1612*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint64 1613*1b3f573fSAndroid Build Coastguard Worker assert_nil m.uint64_as_value 1614*1b3f573fSAndroid Build Coastguard Worker m.bool = nil 1615*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bool 1616*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bool_as_value 1617*1b3f573fSAndroid Build Coastguard Worker m.string = nil 1618*1b3f573fSAndroid Build Coastguard Worker assert_nil m.string 1619*1b3f573fSAndroid Build Coastguard Worker assert_nil m.string_as_value 1620*1b3f573fSAndroid Build Coastguard Worker m.bytes = nil 1621*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bytes 1622*1b3f573fSAndroid Build Coastguard Worker assert_nil m.bytes_as_value 1623*1b3f573fSAndroid Build Coastguard Worker } 1624*1b3f573fSAndroid Build Coastguard Worker 1625*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new 1626*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m) 1627*1b3f573fSAndroid Build Coastguard Worker 1628*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::Wrapper.new( 1629*1b3f573fSAndroid Build Coastguard Worker double: Google::Protobuf::DoubleValue.new(value: 2.0), 1630*1b3f573fSAndroid Build Coastguard Worker float: Google::Protobuf::FloatValue.new(value: 4.0), 1631*1b3f573fSAndroid Build Coastguard Worker int32: Google::Protobuf::Int32Value.new(value: 3), 1632*1b3f573fSAndroid Build Coastguard Worker int64: Google::Protobuf::Int64Value.new(value: 4), 1633*1b3f573fSAndroid Build Coastguard Worker uint32: Google::Protobuf::UInt32Value.new(value: 5), 1634*1b3f573fSAndroid Build Coastguard Worker uint64: Google::Protobuf::UInt64Value.new(value: 6), 1635*1b3f573fSAndroid Build Coastguard Worker bool: Google::Protobuf::BoolValue.new(value: true), 1636*1b3f573fSAndroid Build Coastguard Worker string: Google::Protobuf::StringValue.new(value: 'str'), 1637*1b3f573fSAndroid Build Coastguard Worker bytes: Google::Protobuf::BytesValue.new(value: 'fun'), 1638*1b3f573fSAndroid Build Coastguard Worker real_string: '100' 1639*1b3f573fSAndroid Build Coastguard Worker ) 1640*1b3f573fSAndroid Build Coastguard Worker 1641*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m2) 1642*1b3f573fSAndroid Build Coastguard Worker 1643*1b3f573fSAndroid Build Coastguard Worker serialized = proto_module::Wrapper::encode(m2) 1644*1b3f573fSAndroid Build Coastguard Worker m3 = proto_module::Wrapper::decode(serialized) 1645*1b3f573fSAndroid Build Coastguard Worker run_asserts.call(m3) 1646*1b3f573fSAndroid Build Coastguard Worker end 1647*1b3f573fSAndroid Build Coastguard Worker 1648*1b3f573fSAndroid Build Coastguard Worker def test_wrappers_only 1649*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new(real_string: 'hi', string_in_oneof: 'there') 1650*1b3f573fSAndroid Build Coastguard Worker 1651*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.real_string_as_value } 1652*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.as_value } 1653*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m._as_value } 1654*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_in_oneof_as_value } 1655*1b3f573fSAndroid Build Coastguard Worker 1656*1b3f573fSAndroid Build Coastguard Worker m = proto_module::Wrapper.new 1657*1b3f573fSAndroid Build Coastguard Worker m.string_as_value = 'you' 1658*1b3f573fSAndroid Build Coastguard Worker assert_equal 'you', m.string.value 1659*1b3f573fSAndroid Build Coastguard Worker assert_equal 'you', m.string_as_value 1660*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_ } 1661*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_X } 1662*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XX } 1663*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXX } 1664*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXX } 1665*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXXX } 1666*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXXXX } 1667*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXXXXX } 1668*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXXXXXX } 1669*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXXXXXXX } 1670*1b3f573fSAndroid Build Coastguard Worker assert_raise(NoMethodError) { m.string_XXXXXXXXXX } 1671*1b3f573fSAndroid Build Coastguard Worker end 1672*1b3f573fSAndroid Build Coastguard Worker 1673*1b3f573fSAndroid Build Coastguard Worker def test_converts_time 1674*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TimeMessage.new 1675*1b3f573fSAndroid Build Coastguard Worker 1676*1b3f573fSAndroid Build Coastguard Worker m.timestamp = Google::Protobuf::Timestamp.new(seconds: 5, nanos: 6) 1677*1b3f573fSAndroid Build Coastguard Worker assert_kind_of Google::Protobuf::Timestamp, m.timestamp 1678*1b3f573fSAndroid Build Coastguard Worker assert_equal 5, m.timestamp.seconds 1679*1b3f573fSAndroid Build Coastguard Worker assert_equal 6, m.timestamp.nanos 1680*1b3f573fSAndroid Build Coastguard Worker 1681*1b3f573fSAndroid Build Coastguard Worker m.timestamp = Time.at(9466, 123456.789) 1682*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Timestamp.new(seconds: 9466, nanos: 123456789), m.timestamp 1683*1b3f573fSAndroid Build Coastguard Worker 1684*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TimeMessage.new(timestamp: Time.at(1)) 1685*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Timestamp.new(seconds: 1, nanos: 0), m.timestamp 1686*1b3f573fSAndroid Build Coastguard Worker 1687*1b3f573fSAndroid Build Coastguard Worker assert_raise(Google::Protobuf::TypeError) { m.timestamp = 2 } 1688*1b3f573fSAndroid Build Coastguard Worker assert_raise(Google::Protobuf::TypeError) { m.timestamp = 2.4 } 1689*1b3f573fSAndroid Build Coastguard Worker assert_raise(Google::Protobuf::TypeError) { m.timestamp = '4' } 1690*1b3f573fSAndroid Build Coastguard Worker assert_raise(Google::Protobuf::TypeError) { m.timestamp = proto_module::TimeMessage.new } 1691*1b3f573fSAndroid Build Coastguard Worker 1692*1b3f573fSAndroid Build Coastguard Worker def test_time(year, month, day) 1693*1b3f573fSAndroid Build Coastguard Worker str = ("\"%04d-%02d-%02dT00:00:00.000+00:00\"" % [year, month, day]) 1694*1b3f573fSAndroid Build Coastguard Worker t = Google::Protobuf::Timestamp.decode_json(str) 1695*1b3f573fSAndroid Build Coastguard Worker time = Time.new(year, month, day, 0, 0, 0, "+00:00") 1696*1b3f573fSAndroid Build Coastguard Worker assert_equal t.seconds, time.to_i 1697*1b3f573fSAndroid Build Coastguard Worker end 1698*1b3f573fSAndroid Build Coastguard Worker 1699*1b3f573fSAndroid Build Coastguard Worker (1970..2010).each do |year| 1700*1b3f573fSAndroid Build Coastguard Worker test_time(year, 2, 28) 1701*1b3f573fSAndroid Build Coastguard Worker test_time(year, 3, 01) 1702*1b3f573fSAndroid Build Coastguard Worker end 1703*1b3f573fSAndroid Build Coastguard Worker end 1704*1b3f573fSAndroid Build Coastguard Worker 1705*1b3f573fSAndroid Build Coastguard Worker def test_converts_duration 1706*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TimeMessage.new 1707*1b3f573fSAndroid Build Coastguard Worker 1708*1b3f573fSAndroid Build Coastguard Worker m.duration = Google::Protobuf::Duration.new(seconds: 2, nanos: 22) 1709*1b3f573fSAndroid Build Coastguard Worker assert_kind_of Google::Protobuf::Duration, m.duration 1710*1b3f573fSAndroid Build Coastguard Worker assert_equal 2, m.duration.seconds 1711*1b3f573fSAndroid Build Coastguard Worker assert_equal 22, m.duration.nanos 1712*1b3f573fSAndroid Build Coastguard Worker 1713*1b3f573fSAndroid Build Coastguard Worker m.duration = 10.5 1714*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: 10, nanos: 500_000_000), m.duration 1715*1b3f573fSAndroid Build Coastguard Worker 1716*1b3f573fSAndroid Build Coastguard Worker m.duration = 200 1717*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: 200, nanos: 0), m.duration 1718*1b3f573fSAndroid Build Coastguard Worker 1719*1b3f573fSAndroid Build Coastguard Worker m.duration = Rational(3, 2) 1720*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: 1, nanos: 500_000_000), m.duration 1721*1b3f573fSAndroid Build Coastguard Worker 1722*1b3f573fSAndroid Build Coastguard Worker m.duration = BigDecimal("5") 1723*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: 5, nanos: 0), m.duration 1724*1b3f573fSAndroid Build Coastguard Worker 1725*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TimeMessage.new(duration: 1.1) 1726*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: 1, nanos: 100_000_000), m.duration 1727*1b3f573fSAndroid Build Coastguard Worker 1728*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TimeMessage.new(duration: 123.321) 1729*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: 123, nanos: 321_000_000), m.duration 1730*1b3f573fSAndroid Build Coastguard Worker 1731*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TimeMessage.new(duration: -123.321) 1732*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::Duration.new(seconds: -123, nanos: -321_000_000), m.duration 1733*1b3f573fSAndroid Build Coastguard Worker 1734*1b3f573fSAndroid Build Coastguard Worker assert_raise(Google::Protobuf::TypeError) { m.duration = '2' } 1735*1b3f573fSAndroid Build Coastguard Worker assert_raise(Google::Protobuf::TypeError) { m.duration = proto_module::TimeMessage.new } 1736*1b3f573fSAndroid Build Coastguard Worker end 1737*1b3f573fSAndroid Build Coastguard Worker 1738*1b3f573fSAndroid Build Coastguard Worker def test_freeze 1739*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 1740*1b3f573fSAndroid Build Coastguard Worker m.optional_int32 = 10 1741*1b3f573fSAndroid Build Coastguard Worker m.freeze 1742*1b3f573fSAndroid Build Coastguard Worker 1743*1b3f573fSAndroid Build Coastguard Worker frozen_error = assert_raise(FrozenErrorType) { m.optional_int32 = 20 } 1744*1b3f573fSAndroid Build Coastguard Worker assert_match "can't modify frozen #{proto_module}::TestMessage", frozen_error.message 1745*1b3f573fSAndroid Build Coastguard Worker assert_equal 10, m.optional_int32 1746*1b3f573fSAndroid Build Coastguard Worker assert_equal true, m.frozen? 1747*1b3f573fSAndroid Build Coastguard Worker 1748*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_int64 = 2 } 1749*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_uint32 = 3 } 1750*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_uint64 = 4 } 1751*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_bool = true } 1752*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_float = 6.0 } 1753*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_double = 7.0 } 1754*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_string = '8' } 1755*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_bytes = nil } 1756*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_msg = proto_module::TestMessage2.new } 1757*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.optional_enum = :A } 1758*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_int32 = 1 } 1759*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_int64 = 2 } 1760*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_uint32 = 3 } 1761*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_uint64 = 4 } 1762*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_bool = true } 1763*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_float = 6.0 } 1764*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_double = 7.0 } 1765*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_string = '8' } 1766*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_bytes = nil } 1767*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_msg = proto_module::TestMessage2.new } 1768*1b3f573fSAndroid Build Coastguard Worker assert_raise(FrozenErrorType) { m.repeated_enum = :A } 1769*1b3f573fSAndroid Build Coastguard Worker end 1770*1b3f573fSAndroid Build Coastguard Worker 1771*1b3f573fSAndroid Build Coastguard Worker def test_eq 1772*1b3f573fSAndroid Build Coastguard Worker m1 = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2']) 1773*1b3f573fSAndroid Build Coastguard Worker m2 = proto_module::TestMessage.new(:optional_string => 'foo', :repeated_string => ['bar1', 'bar2']) 1774*1b3f573fSAndroid Build Coastguard Worker 1775*1b3f573fSAndroid Build Coastguard Worker h = {} 1776*1b3f573fSAndroid Build Coastguard Worker h[m1] = :yes 1777*1b3f573fSAndroid Build Coastguard Worker 1778*1b3f573fSAndroid Build Coastguard Worker assert m1 == m2 1779*1b3f573fSAndroid Build Coastguard Worker assert m1.eql?(m2) 1780*1b3f573fSAndroid Build Coastguard Worker assert m1.hash == m2.hash 1781*1b3f573fSAndroid Build Coastguard Worker assert h[m1] == :yes 1782*1b3f573fSAndroid Build Coastguard Worker assert h[m2] == :yes 1783*1b3f573fSAndroid Build Coastguard Worker 1784*1b3f573fSAndroid Build Coastguard Worker m1.optional_int32 = 2 1785*1b3f573fSAndroid Build Coastguard Worker 1786*1b3f573fSAndroid Build Coastguard Worker assert m1 != m2 1787*1b3f573fSAndroid Build Coastguard Worker assert !m1.eql?(m2) 1788*1b3f573fSAndroid Build Coastguard Worker assert m1.hash != m2.hash 1789*1b3f573fSAndroid Build Coastguard Worker assert_nil h[m2] 1790*1b3f573fSAndroid Build Coastguard Worker end 1791*1b3f573fSAndroid Build Coastguard Worker 1792*1b3f573fSAndroid Build Coastguard Worker def cruby_or_jruby_9_3_or_higher? 1793*1b3f573fSAndroid Build Coastguard Worker # https://github.com/jruby/jruby/issues/6818 was fixed in JRuby 9.3.0.0 1794*1b3f573fSAndroid Build Coastguard Worker match = RUBY_PLATFORM == "java" && 1795*1b3f573fSAndroid Build Coastguard Worker JRUBY_VERSION.match(/^(\d+)\.(\d+)\.\d+\.\d+$/) 1796*1b3f573fSAndroid Build Coastguard Worker match && (match[1].to_i > 9 || (match[1].to_i == 9 && match[2].to_i >= 3)) 1797*1b3f573fSAndroid Build Coastguard Worker end 1798*1b3f573fSAndroid Build Coastguard Worker 1799*1b3f573fSAndroid Build Coastguard Worker def test_object_gc 1800*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new(optional_msg: proto_module::TestMessage2.new) 1801*1b3f573fSAndroid Build Coastguard Worker m.optional_msg 1802*1b3f573fSAndroid Build Coastguard Worker # https://github.com/jruby/jruby/issues/6818 was fixed in JRuby 9.3.0.0 1803*1b3f573fSAndroid Build Coastguard Worker GC.start(full_mark: true, immediate_sweep: true) if cruby_or_jruby_9_3_or_higher? 1804*1b3f573fSAndroid Build Coastguard Worker m.optional_msg.inspect 1805*1b3f573fSAndroid Build Coastguard Worker end 1806*1b3f573fSAndroid Build Coastguard Worker 1807*1b3f573fSAndroid Build Coastguard Worker def test_object_gc_freeze 1808*1b3f573fSAndroid Build Coastguard Worker m = proto_module::TestMessage.new 1809*1b3f573fSAndroid Build Coastguard Worker m.repeated_float.freeze 1810*1b3f573fSAndroid Build Coastguard Worker # https://github.com/jruby/jruby/issues/6818 was fixed in JRuby 9.3.0.0 1811*1b3f573fSAndroid Build Coastguard Worker GC.start(full_mark: true) if cruby_or_jruby_9_3_or_higher? 1812*1b3f573fSAndroid Build Coastguard Worker 1813*1b3f573fSAndroid Build Coastguard Worker # Make sure we remember that the object is frozen. 1814*1b3f573fSAndroid Build Coastguard Worker # The wrapper object contains this information, so we need to ensure that 1815*1b3f573fSAndroid Build Coastguard Worker # the previous GC did not collect it. 1816*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_float.frozen? 1817*1b3f573fSAndroid Build Coastguard Worker 1818*1b3f573fSAndroid Build Coastguard Worker # https://github.com/jruby/jruby/issues/6818 was fixed in JRuby 9.3.0.0 1819*1b3f573fSAndroid Build Coastguard Worker GC.start(full_mark: true, immediate_sweep: true) if cruby_or_jruby_9_3_or_higher? 1820*1b3f573fSAndroid Build Coastguard Worker assert m.repeated_float.frozen? 1821*1b3f573fSAndroid Build Coastguard Worker end 1822*1b3f573fSAndroid Build Coastguard Worker 1823*1b3f573fSAndroid Build Coastguard Worker def test_optional_fields_respond_to? # regression test for issue 9202 1824*1b3f573fSAndroid Build Coastguard Worker msg = proto_module::TestMessage.new 1825*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :optional_int32= 1826*1b3f573fSAndroid Build Coastguard Worker msg.optional_int32 = 42 1827*1b3f573fSAndroid Build Coastguard Worker 1828*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :optional_int32 1829*1b3f573fSAndroid Build Coastguard Worker assert_equal 42, msg.optional_int32 1830*1b3f573fSAndroid Build Coastguard Worker 1831*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :clear_optional_int32 1832*1b3f573fSAndroid Build Coastguard Worker msg.clear_optional_int32 1833*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, msg.optional_int32 1834*1b3f573fSAndroid Build Coastguard Worker 1835*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :has_optional_int32? 1836*1b3f573fSAndroid Build Coastguard Worker assert !msg.has_optional_int32? 1837*1b3f573fSAndroid Build Coastguard Worker 1838*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :optional_int32_as_value= ) 1839*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1840*1b3f573fSAndroid Build Coastguard Worker msg.optional_int32_as_value = 42 1841*1b3f573fSAndroid Build Coastguard Worker end 1842*1b3f573fSAndroid Build Coastguard Worker 1843*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :optional_int32_as_value ) 1844*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1845*1b3f573fSAndroid Build Coastguard Worker msg.optional_int32_as_value 1846*1b3f573fSAndroid Build Coastguard Worker end 1847*1b3f573fSAndroid Build Coastguard Worker 1848*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :optional_enum_const 1849*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, msg.optional_enum_const 1850*1b3f573fSAndroid Build Coastguard Worker 1851*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :foo ) 1852*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1853*1b3f573fSAndroid Build Coastguard Worker msg.foo 1854*1b3f573fSAndroid Build Coastguard Worker end 1855*1b3f573fSAndroid Build Coastguard Worker 1856*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :foo_const ) 1857*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1858*1b3f573fSAndroid Build Coastguard Worker msg.foo_const 1859*1b3f573fSAndroid Build Coastguard Worker end 1860*1b3f573fSAndroid Build Coastguard Worker 1861*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :optional_int32_const ) 1862*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1863*1b3f573fSAndroid Build Coastguard Worker msg.optional_int32_const 1864*1b3f573fSAndroid Build Coastguard Worker end 1865*1b3f573fSAndroid Build Coastguard Worker end 1866*1b3f573fSAndroid Build Coastguard Worker 1867*1b3f573fSAndroid Build Coastguard Worker def test_oneof_fields_respond_to? # regression test for issue 9202 1868*1b3f573fSAndroid Build Coastguard Worker msg = proto_module::OneofMessage.new 1869*1b3f573fSAndroid Build Coastguard Worker 1870*1b3f573fSAndroid Build Coastguard Worker # names of the elements of a oneof and the oneof itself are valid actions. 1871*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :my_oneof 1872*1b3f573fSAndroid Build Coastguard Worker assert_nil msg.my_oneof 1873*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :a 1874*1b3f573fSAndroid Build Coastguard Worker assert_equal "", msg.a 1875*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :b 1876*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, msg.b 1877*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :c 1878*1b3f573fSAndroid Build Coastguard Worker assert_nil msg.c 1879*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :d 1880*1b3f573fSAndroid Build Coastguard Worker assert_equal :Default, msg.d 1881*1b3f573fSAndroid Build Coastguard Worker 1882*1b3f573fSAndroid Build Coastguard Worker # `clear` prefix actions work on elements of a oneof and the oneof itself. 1883*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :clear_my_oneof 1884*1b3f573fSAndroid Build Coastguard Worker msg.clear_my_oneof 1885*1b3f573fSAndroid Build Coastguard Worker # Repeatedly clearing a oneof used to cause a NoMethodError under JRuby 1886*1b3f573fSAndroid Build Coastguard Worker msg.clear_my_oneof 1887*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :clear_a 1888*1b3f573fSAndroid Build Coastguard Worker msg.clear_a 1889*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :clear_b 1890*1b3f573fSAndroid Build Coastguard Worker msg.clear_b 1891*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :clear_c 1892*1b3f573fSAndroid Build Coastguard Worker msg.clear_c 1893*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :clear_d 1894*1b3f573fSAndroid Build Coastguard Worker msg.clear_d 1895*1b3f573fSAndroid Build Coastguard Worker 1896*1b3f573fSAndroid Build Coastguard Worker # `=` suffix actions should work on elements of a oneof but not the oneof itself. 1897*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :my_oneof= ) 1898*1b3f573fSAndroid Build Coastguard Worker error = assert_raise RuntimeError do 1899*1b3f573fSAndroid Build Coastguard Worker msg.my_oneof = nil 1900*1b3f573fSAndroid Build Coastguard Worker end 1901*1b3f573fSAndroid Build Coastguard Worker assert_equal "Oneof accessors are read-only.", error.message 1902*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :a= 1903*1b3f573fSAndroid Build Coastguard Worker msg.a = "foo" 1904*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :b= 1905*1b3f573fSAndroid Build Coastguard Worker msg.b = 42 1906*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :c= 1907*1b3f573fSAndroid Build Coastguard Worker msg.c = proto_module::TestMessage2.new 1908*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :d= 1909*1b3f573fSAndroid Build Coastguard Worker msg.d = :Default 1910*1b3f573fSAndroid Build Coastguard Worker 1911*1b3f573fSAndroid Build Coastguard Worker # `has_` prefix + "?" suffix actions work for oneofs fields. 1912*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :has_my_oneof? 1913*1b3f573fSAndroid Build Coastguard Worker assert msg.has_my_oneof? 1914*1b3f573fSAndroid Build Coastguard Worker 1915*1b3f573fSAndroid Build Coastguard Worker # `_as_value` suffix actions should only work for wrapped fields. 1916*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :my_oneof_as_value ) 1917*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1918*1b3f573fSAndroid Build Coastguard Worker msg.my_oneof_as_value 1919*1b3f573fSAndroid Build Coastguard Worker end 1920*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :a_as_value ) 1921*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1922*1b3f573fSAndroid Build Coastguard Worker msg.a_as_value 1923*1b3f573fSAndroid Build Coastguard Worker end 1924*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :b_as_value ) 1925*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1926*1b3f573fSAndroid Build Coastguard Worker msg.b_as_value 1927*1b3f573fSAndroid Build Coastguard Worker end 1928*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :c_as_value ) 1929*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1930*1b3f573fSAndroid Build Coastguard Worker msg.c_as_value 1931*1b3f573fSAndroid Build Coastguard Worker end 1932*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :d_as_value ) 1933*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1934*1b3f573fSAndroid Build Coastguard Worker msg.d_as_value 1935*1b3f573fSAndroid Build Coastguard Worker end 1936*1b3f573fSAndroid Build Coastguard Worker 1937*1b3f573fSAndroid Build Coastguard Worker # `_as_value=` suffix actions should only work for wrapped fields. 1938*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :my_oneof_as_value= ) 1939*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1940*1b3f573fSAndroid Build Coastguard Worker msg.my_oneof_as_value = :boom 1941*1b3f573fSAndroid Build Coastguard Worker end 1942*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :a_as_value= ) 1943*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1944*1b3f573fSAndroid Build Coastguard Worker msg.a_as_value = "" 1945*1b3f573fSAndroid Build Coastguard Worker end 1946*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :b_as_value= ) 1947*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1948*1b3f573fSAndroid Build Coastguard Worker msg.b_as_value = 42 1949*1b3f573fSAndroid Build Coastguard Worker end 1950*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :c_as_value= ) 1951*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1952*1b3f573fSAndroid Build Coastguard Worker msg.c_as_value = proto_module::TestMessage2.new 1953*1b3f573fSAndroid Build Coastguard Worker end 1954*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :d_as_value= ) 1955*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1956*1b3f573fSAndroid Build Coastguard Worker msg.d_as_value = :Default 1957*1b3f573fSAndroid Build Coastguard Worker end 1958*1b3f573fSAndroid Build Coastguard Worker 1959*1b3f573fSAndroid Build Coastguard Worker # `_const` suffix actions should only work for enum fields. 1960*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :my_oneof_const ) 1961*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1962*1b3f573fSAndroid Build Coastguard Worker msg.my_oneof_const 1963*1b3f573fSAndroid Build Coastguard Worker end 1964*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :a_const ) 1965*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1966*1b3f573fSAndroid Build Coastguard Worker msg.a_const 1967*1b3f573fSAndroid Build Coastguard Worker end 1968*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :b_const ) 1969*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1970*1b3f573fSAndroid Build Coastguard Worker msg.b_const 1971*1b3f573fSAndroid Build Coastguard Worker end 1972*1b3f573fSAndroid Build Coastguard Worker assert !msg.respond_to?( :c_const ) 1973*1b3f573fSAndroid Build Coastguard Worker assert_raise NoMethodError do 1974*1b3f573fSAndroid Build Coastguard Worker msg.c_const 1975*1b3f573fSAndroid Build Coastguard Worker end 1976*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to? :d_const 1977*1b3f573fSAndroid Build Coastguard Worker assert_equal 0, msg.d_const 1978*1b3f573fSAndroid Build Coastguard Worker end 1979*1b3f573fSAndroid Build Coastguard Worker 1980*1b3f573fSAndroid Build Coastguard Worker def test_wrapped_fields_respond_to? # regression test for issue 9202 1981*1b3f573fSAndroid Build Coastguard Worker msg = proto_module::Wrapper.new 1982*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to?( :double_as_value= ) 1983*1b3f573fSAndroid Build Coastguard Worker msg.double_as_value = 42 1984*1b3f573fSAndroid Build Coastguard Worker assert msg.respond_to?( :double_as_value ) 1985*1b3f573fSAndroid Build Coastguard Worker assert_equal 42, msg.double_as_value 1986*1b3f573fSAndroid Build Coastguard Worker assert_equal Google::Protobuf::DoubleValue.new(value: 42), msg.double 1987*1b3f573fSAndroid Build Coastguard Worker end 1988*1b3f573fSAndroid Build Coastguard Workerend 1989