xref: /aosp_15_r20/external/protobuf/ruby/tests/basic_proto2.rb (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker#!/usr/bin/ruby
2*1b3f573fSAndroid Build Coastguard Worker
3*1b3f573fSAndroid Build Coastguard Worker# basic_test_pb.rb is in the same directory as this test.
4*1b3f573fSAndroid Build Coastguard Worker$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
5*1b3f573fSAndroid Build Coastguard Worker
6*1b3f573fSAndroid Build Coastguard Workerrequire 'basic_test_proto2_pb'
7*1b3f573fSAndroid Build Coastguard Workerrequire 'common_tests'
8*1b3f573fSAndroid Build Coastguard Workerrequire 'google/protobuf'
9*1b3f573fSAndroid Build Coastguard Workerrequire 'json'
10*1b3f573fSAndroid Build Coastguard Workerrequire 'test/unit'
11*1b3f573fSAndroid Build Coastguard Worker
12*1b3f573fSAndroid Build Coastguard Worker# ------------- generated code --------------
13*1b3f573fSAndroid Build Coastguard Worker
14*1b3f573fSAndroid Build Coastguard Workermodule BasicTestProto2
15*1b3f573fSAndroid Build Coastguard Worker  pool = Google::Protobuf::DescriptorPool.new
16*1b3f573fSAndroid Build Coastguard Worker  pool.build do
17*1b3f573fSAndroid Build Coastguard Worker    add_file "test_proto2.proto", syntax: :proto2 do
18*1b3f573fSAndroid Build Coastguard Worker      add_message "BadFieldNames" do
19*1b3f573fSAndroid Build Coastguard Worker        optional :dup, :int32, 1
20*1b3f573fSAndroid Build Coastguard Worker        optional :class, :int32, 2
21*1b3f573fSAndroid Build Coastguard Worker      end
22*1b3f573fSAndroid Build Coastguard Worker    end
23*1b3f573fSAndroid Build Coastguard Worker  end
24*1b3f573fSAndroid Build Coastguard Worker
25*1b3f573fSAndroid Build Coastguard Worker  BadFieldNames = pool.lookup("BadFieldNames").msgclass
26*1b3f573fSAndroid Build Coastguard Worker
27*1b3f573fSAndroid Build Coastguard Worker# ------------ test cases ---------------
28*1b3f573fSAndroid Build Coastguard Worker
29*1b3f573fSAndroid Build Coastguard Worker  class MessageContainerTest < Test::Unit::TestCase
30*1b3f573fSAndroid Build Coastguard Worker    # Required by CommonTests module to resolve proto2 proto classes used in tests.
31*1b3f573fSAndroid Build Coastguard Worker    def proto_module
32*1b3f573fSAndroid Build Coastguard Worker      ::BasicTestProto2
33*1b3f573fSAndroid Build Coastguard Worker    end
34*1b3f573fSAndroid Build Coastguard Worker    include CommonTests
35*1b3f573fSAndroid Build Coastguard Worker
36*1b3f573fSAndroid Build Coastguard Worker    def test_has_field
37*1b3f573fSAndroid Build Coastguard Worker      m = TestMessage.new
38*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_int32?
39*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_int32').has?(m)
40*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_int64?
41*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_int64').has?(m)
42*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_uint32?
43*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_uint32').has?(m)
44*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_uint64?
45*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_uint64').has?(m)
46*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_bool?
47*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_bool').has?(m)
48*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_float?
49*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_float').has?(m)
50*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_double?
51*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_double').has?(m)
52*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_string?
53*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_string').has?(m)
54*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_bytes?
55*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_bytes').has?(m)
56*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_enum?
57*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessage.descriptor.lookup('optional_enum').has?(m)
58*1b3f573fSAndroid Build Coastguard Worker
59*1b3f573fSAndroid Build Coastguard Worker      m = TestMessage.new(:optional_int32 => nil)
60*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_int32?
61*1b3f573fSAndroid Build Coastguard Worker
62*1b3f573fSAndroid Build Coastguard Worker      assert_raise NoMethodError do
63*1b3f573fSAndroid Build Coastguard Worker        m.has_repeated_msg?
64*1b3f573fSAndroid Build Coastguard Worker      end
65*1b3f573fSAndroid Build Coastguard Worker      assert_raise ArgumentError do
66*1b3f573fSAndroid Build Coastguard Worker        TestMessage.descriptor.lookup('repeated_msg').has?(m)
67*1b3f573fSAndroid Build Coastguard Worker      end
68*1b3f573fSAndroid Build Coastguard Worker
69*1b3f573fSAndroid Build Coastguard Worker      m.optional_msg = TestMessage2.new
70*1b3f573fSAndroid Build Coastguard Worker      assert m.has_optional_msg?
71*1b3f573fSAndroid Build Coastguard Worker      assert TestMessage.descriptor.lookup('optional_msg').has?(m)
72*1b3f573fSAndroid Build Coastguard Worker
73*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
74*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_my_oneof?
75*1b3f573fSAndroid Build Coastguard Worker      m.a = "foo"
76*1b3f573fSAndroid Build Coastguard Worker      assert m.has_my_oneof?
77*1b3f573fSAndroid Build Coastguard Worker      assert_equal :a, m.my_oneof
78*1b3f573fSAndroid Build Coastguard Worker      assert m.has_a?
79*1b3f573fSAndroid Build Coastguard Worker      assert OneofMessage.descriptor.lookup('a').has?(m)
80*1b3f573fSAndroid Build Coastguard Worker      assert_equal "foo", m.a
81*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_b?
82*1b3f573fSAndroid Build Coastguard Worker      assert !OneofMessage.descriptor.lookup('b').has?(m)
83*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_c?
84*1b3f573fSAndroid Build Coastguard Worker      assert !OneofMessage.descriptor.lookup('c').has?(m)
85*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_d?
86*1b3f573fSAndroid Build Coastguard Worker      assert !OneofMessage.descriptor.lookup('d').has?(m)
87*1b3f573fSAndroid Build Coastguard Worker
88*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
89*1b3f573fSAndroid Build Coastguard Worker      m.b = 100
90*1b3f573fSAndroid Build Coastguard Worker      assert m.has_b?
91*1b3f573fSAndroid Build Coastguard Worker      assert_equal 100, m.b
92*1b3f573fSAndroid Build Coastguard Worker      assert m.has_my_oneof?
93*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_a?
94*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_c?
95*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_d?
96*1b3f573fSAndroid Build Coastguard Worker
97*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
98*1b3f573fSAndroid Build Coastguard Worker      m.c = TestMessage2.new
99*1b3f573fSAndroid Build Coastguard Worker      assert m.has_c?
100*1b3f573fSAndroid Build Coastguard Worker      assert_equal TestMessage2.new, m.c
101*1b3f573fSAndroid Build Coastguard Worker      assert m.has_my_oneof?
102*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_a?
103*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_b?
104*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_d?
105*1b3f573fSAndroid Build Coastguard Worker
106*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
107*1b3f573fSAndroid Build Coastguard Worker      m.d = :A
108*1b3f573fSAndroid Build Coastguard Worker      assert m.has_d?
109*1b3f573fSAndroid Build Coastguard Worker      assert_equal :A, m.d
110*1b3f573fSAndroid Build Coastguard Worker      assert m.has_my_oneof?
111*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_a?
112*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_b?
113*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_c?
114*1b3f573fSAndroid Build Coastguard Worker    end
115*1b3f573fSAndroid Build Coastguard Worker
116*1b3f573fSAndroid Build Coastguard Worker    def test_defined_defaults
117*1b3f573fSAndroid Build Coastguard Worker      m = TestMessageDefaults.new
118*1b3f573fSAndroid Build Coastguard Worker      assert_equal 1, m.optional_int32
119*1b3f573fSAndroid Build Coastguard Worker      assert_equal 2, m.optional_int64
120*1b3f573fSAndroid Build Coastguard Worker      assert_equal 3, m.optional_uint32
121*1b3f573fSAndroid Build Coastguard Worker      assert_equal 4, m.optional_uint64
122*1b3f573fSAndroid Build Coastguard Worker      assert_equal true, m.optional_bool
123*1b3f573fSAndroid Build Coastguard Worker      assert_equal 6.0, m.optional_float
124*1b3f573fSAndroid Build Coastguard Worker      assert_equal 7.0, m.optional_double
125*1b3f573fSAndroid Build Coastguard Worker      assert_equal "Default Str", m.optional_string
126*1b3f573fSAndroid Build Coastguard Worker      assert_equal "\xCF\xA5s\xBD\xBA\xE6fubar".force_encoding("ASCII-8BIT"), m.optional_bytes
127*1b3f573fSAndroid Build Coastguard Worker      assert_equal :B2, m.optional_enum
128*1b3f573fSAndroid Build Coastguard Worker
129*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_int32?
130*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_int64?
131*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_uint32?
132*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_uint64?
133*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_bool?
134*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_float?
135*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_double?
136*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_string?
137*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_bytes?
138*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_enum?
139*1b3f573fSAndroid Build Coastguard Worker    end
140*1b3f573fSAndroid Build Coastguard Worker
141*1b3f573fSAndroid Build Coastguard Worker    def test_set_clear_defaults
142*1b3f573fSAndroid Build Coastguard Worker      m = TestMessageDefaults.new
143*1b3f573fSAndroid Build Coastguard Worker
144*1b3f573fSAndroid Build Coastguard Worker      m.optional_int32 = -42
145*1b3f573fSAndroid Build Coastguard Worker      assert_equal( -42, m.optional_int32 )
146*1b3f573fSAndroid Build Coastguard Worker      assert m.has_optional_int32?
147*1b3f573fSAndroid Build Coastguard Worker      m.clear_optional_int32
148*1b3f573fSAndroid Build Coastguard Worker      assert_equal 1, m.optional_int32
149*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_int32?
150*1b3f573fSAndroid Build Coastguard Worker
151*1b3f573fSAndroid Build Coastguard Worker      m.optional_string = "foo bar"
152*1b3f573fSAndroid Build Coastguard Worker      assert_equal "foo bar", m.optional_string
153*1b3f573fSAndroid Build Coastguard Worker      assert m.has_optional_string?
154*1b3f573fSAndroid Build Coastguard Worker      m.clear_optional_string
155*1b3f573fSAndroid Build Coastguard Worker      assert_equal "Default Str", m.optional_string
156*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_string?
157*1b3f573fSAndroid Build Coastguard Worker
158*1b3f573fSAndroid Build Coastguard Worker      m.optional_msg = TestMessage2.new(:foo => 42)
159*1b3f573fSAndroid Build Coastguard Worker      assert_equal TestMessage2.new(:foo => 42), m.optional_msg
160*1b3f573fSAndroid Build Coastguard Worker      assert m.has_optional_msg?
161*1b3f573fSAndroid Build Coastguard Worker
162*1b3f573fSAndroid Build Coastguard Worker      m.clear_optional_msg
163*1b3f573fSAndroid Build Coastguard Worker      assert_equal nil, m.optional_msg
164*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_msg?
165*1b3f573fSAndroid Build Coastguard Worker
166*1b3f573fSAndroid Build Coastguard Worker      m.optional_msg = TestMessage2.new(:foo => 42)
167*1b3f573fSAndroid Build Coastguard Worker      assert_equal TestMessage2.new(:foo => 42), m.optional_msg
168*1b3f573fSAndroid Build Coastguard Worker      assert TestMessageDefaults.descriptor.lookup('optional_msg').has?(m)
169*1b3f573fSAndroid Build Coastguard Worker
170*1b3f573fSAndroid Build Coastguard Worker      TestMessageDefaults.descriptor.lookup('optional_msg').clear(m)
171*1b3f573fSAndroid Build Coastguard Worker      assert_equal nil, m.optional_msg
172*1b3f573fSAndroid Build Coastguard Worker      assert !TestMessageDefaults.descriptor.lookup('optional_msg').has?(m)
173*1b3f573fSAndroid Build Coastguard Worker
174*1b3f573fSAndroid Build Coastguard Worker      m = TestMessage.new
175*1b3f573fSAndroid Build Coastguard Worker      m.repeated_int32.push(1)
176*1b3f573fSAndroid Build Coastguard Worker      assert_equal [1], m.repeated_int32
177*1b3f573fSAndroid Build Coastguard Worker      m.clear_repeated_int32
178*1b3f573fSAndroid Build Coastguard Worker      assert_equal [], m.repeated_int32
179*1b3f573fSAndroid Build Coastguard Worker
180*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
181*1b3f573fSAndroid Build Coastguard Worker      m.a = "foo"
182*1b3f573fSAndroid Build Coastguard Worker      assert_equal "foo", m.a
183*1b3f573fSAndroid Build Coastguard Worker      assert m.has_a?
184*1b3f573fSAndroid Build Coastguard Worker      m.clear_a
185*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_a?
186*1b3f573fSAndroid Build Coastguard Worker
187*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
188*1b3f573fSAndroid Build Coastguard Worker      m.a = "foobar"
189*1b3f573fSAndroid Build Coastguard Worker      assert m.has_my_oneof?
190*1b3f573fSAndroid Build Coastguard Worker      m.clear_my_oneof
191*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_my_oneof?
192*1b3f573fSAndroid Build Coastguard Worker
193*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new
194*1b3f573fSAndroid Build Coastguard Worker      m.a = "bar"
195*1b3f573fSAndroid Build Coastguard Worker      assert_equal "bar", m.a
196*1b3f573fSAndroid Build Coastguard Worker      assert m.has_my_oneof?
197*1b3f573fSAndroid Build Coastguard Worker      OneofMessage.descriptor.lookup('a').clear(m)
198*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_my_oneof?
199*1b3f573fSAndroid Build Coastguard Worker    end
200*1b3f573fSAndroid Build Coastguard Worker
201*1b3f573fSAndroid Build Coastguard Worker    def test_assign_nil
202*1b3f573fSAndroid Build Coastguard Worker      m = TestMessageDefaults.new
203*1b3f573fSAndroid Build Coastguard Worker      m.optional_msg = TestMessage2.new(:foo => 42)
204*1b3f573fSAndroid Build Coastguard Worker
205*1b3f573fSAndroid Build Coastguard Worker      assert_equal TestMessage2.new(:foo => 42), m.optional_msg
206*1b3f573fSAndroid Build Coastguard Worker      assert m.has_optional_msg?
207*1b3f573fSAndroid Build Coastguard Worker      m.optional_msg = nil
208*1b3f573fSAndroid Build Coastguard Worker      assert_equal nil, m.optional_msg
209*1b3f573fSAndroid Build Coastguard Worker      assert !m.has_optional_msg?
210*1b3f573fSAndroid Build Coastguard Worker    end
211*1b3f573fSAndroid Build Coastguard Worker
212*1b3f573fSAndroid Build Coastguard Worker    def test_initialization_map_errors
213*1b3f573fSAndroid Build Coastguard Worker      e = assert_raise ArgumentError do
214*1b3f573fSAndroid Build Coastguard Worker        TestMessage.new(:hello => "world")
215*1b3f573fSAndroid Build Coastguard Worker      end
216*1b3f573fSAndroid Build Coastguard Worker      assert_match(/hello/, e.message)
217*1b3f573fSAndroid Build Coastguard Worker
218*1b3f573fSAndroid Build Coastguard Worker      e = assert_raise ArgumentError do
219*1b3f573fSAndroid Build Coastguard Worker        TestMessage.new(:repeated_uint32 => "hello")
220*1b3f573fSAndroid Build Coastguard Worker      end
221*1b3f573fSAndroid Build Coastguard Worker      assert_equal e.message, "Expected array as initializer value for repeated field 'repeated_uint32' (given String)."
222*1b3f573fSAndroid Build Coastguard Worker    end
223*1b3f573fSAndroid Build Coastguard Worker
224*1b3f573fSAndroid Build Coastguard Worker
225*1b3f573fSAndroid Build Coastguard Worker    def test_to_h
226*1b3f573fSAndroid Build Coastguard Worker      m = TestMessage.new(:optional_bool => true, :optional_double => -10.100001, :optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
227*1b3f573fSAndroid Build Coastguard Worker      expected_result = {
228*1b3f573fSAndroid Build Coastguard Worker        :optional_bool=>true,
229*1b3f573fSAndroid Build Coastguard Worker        :optional_double=>-10.100001,
230*1b3f573fSAndroid Build Coastguard Worker        :optional_string=>"foo",
231*1b3f573fSAndroid Build Coastguard Worker        :repeated_string=>["bar1", "bar2"],
232*1b3f573fSAndroid Build Coastguard Worker      }
233*1b3f573fSAndroid Build Coastguard Worker      assert_equal expected_result, m.to_h
234*1b3f573fSAndroid Build Coastguard Worker
235*1b3f573fSAndroid Build Coastguard Worker      m = OneofMessage.new(:a => "foo")
236*1b3f573fSAndroid Build Coastguard Worker      expected_result = {:a => "foo"}
237*1b3f573fSAndroid Build Coastguard Worker      assert_equal expected_result, m.to_h
238*1b3f573fSAndroid Build Coastguard Worker    end
239*1b3f573fSAndroid Build Coastguard Worker
240*1b3f573fSAndroid Build Coastguard Worker    def test_respond_to
241*1b3f573fSAndroid Build Coastguard Worker      # This test fails with JRuby 1.7.23, likely because of an old JRuby bug.
242*1b3f573fSAndroid Build Coastguard Worker      return if RUBY_PLATFORM == "java"
243*1b3f573fSAndroid Build Coastguard Worker      msg = TestMessage.new
244*1b3f573fSAndroid Build Coastguard Worker      assert !msg.respond_to?(:bacon)
245*1b3f573fSAndroid Build Coastguard Worker    end
246*1b3f573fSAndroid Build Coastguard Worker
247*1b3f573fSAndroid Build Coastguard Worker    def test_file_descriptor
248*1b3f573fSAndroid Build Coastguard Worker      file_descriptor = TestMessage.descriptor.file_descriptor
249*1b3f573fSAndroid Build Coastguard Worker      assert nil != file_descriptor
250*1b3f573fSAndroid Build Coastguard Worker      assert_equal "tests/basic_test_proto2.proto", file_descriptor.name
251*1b3f573fSAndroid Build Coastguard Worker      assert_equal :proto2, file_descriptor.syntax
252*1b3f573fSAndroid Build Coastguard Worker
253*1b3f573fSAndroid Build Coastguard Worker      file_descriptor = TestEnum.descriptor.file_descriptor
254*1b3f573fSAndroid Build Coastguard Worker      assert nil != file_descriptor
255*1b3f573fSAndroid Build Coastguard Worker      assert_equal "tests/basic_test_proto2.proto", file_descriptor.name
256*1b3f573fSAndroid Build Coastguard Worker      assert_equal :proto2, file_descriptor.syntax
257*1b3f573fSAndroid Build Coastguard Worker    end
258*1b3f573fSAndroid Build Coastguard Worker
259*1b3f573fSAndroid Build Coastguard Worker    def test_oneof_fields_respond_to? # regression test for issue 9202
260*1b3f573fSAndroid Build Coastguard Worker      msg = proto_module::OneofMessage.new(a: "foo")
261*1b3f573fSAndroid Build Coastguard Worker      # `has_` prefix + "?" suffix actions should only work for oneofs fields.
262*1b3f573fSAndroid Build Coastguard Worker      assert msg.respond_to? :has_my_oneof?
263*1b3f573fSAndroid Build Coastguard Worker      assert msg.has_my_oneof?
264*1b3f573fSAndroid Build Coastguard Worker      assert msg.respond_to? :has_a?
265*1b3f573fSAndroid Build Coastguard Worker      assert msg.has_a?
266*1b3f573fSAndroid Build Coastguard Worker      assert msg.respond_to? :has_b?
267*1b3f573fSAndroid Build Coastguard Worker      assert !msg.has_b?
268*1b3f573fSAndroid Build Coastguard Worker      assert msg.respond_to? :has_c?
269*1b3f573fSAndroid Build Coastguard Worker      assert !msg.has_c?
270*1b3f573fSAndroid Build Coastguard Worker      assert msg.respond_to? :has_d?
271*1b3f573fSAndroid Build Coastguard Worker      assert !msg.has_d?
272*1b3f573fSAndroid Build Coastguard Worker    end
273*1b3f573fSAndroid Build Coastguard Worker  end
274*1b3f573fSAndroid Build Coastguard Workerend
275