basic_proto2.rb 7.9 KB

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