basic_proto2.rb 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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_a?
  65. assert OneofMessage.descriptor.lookup('a').has?(m)
  66. assert_equal "foo", m.a
  67. assert m.has_my_oneof?
  68. assert !m.has_b?
  69. assert !OneofMessage.descriptor.lookup('b').has?(m)
  70. assert !m.has_c?
  71. assert !OneofMessage.descriptor.lookup('c').has?(m)
  72. assert !m.has_d?
  73. assert !OneofMessage.descriptor.lookup('d').has?(m)
  74. m = OneofMessage.new
  75. m.b = 100
  76. assert m.has_b?
  77. assert_equal 100, m.b
  78. assert m.has_my_oneof?
  79. assert !m.has_a?
  80. assert !m.has_c?
  81. assert !m.has_d?
  82. m = OneofMessage.new
  83. m.c = TestMessage2.new
  84. assert m.has_c?
  85. assert_equal TestMessage2.new, m.c
  86. assert m.has_my_oneof?
  87. assert !m.has_a?
  88. assert !m.has_b?
  89. assert !m.has_d?
  90. m = OneofMessage.new
  91. m.d = :A
  92. assert m.has_d?
  93. assert_equal :A, m.d
  94. assert m.has_my_oneof?
  95. assert !m.has_a?
  96. assert !m.has_b?
  97. assert !m.has_c?
  98. end
  99. def test_defined_defaults
  100. m = TestMessageDefaults.new
  101. assert_equal 1, m.optional_int32
  102. assert_equal 2, m.optional_int64
  103. assert_equal 3, m.optional_uint32
  104. assert_equal 4, m.optional_uint64
  105. assert_equal true, m.optional_bool
  106. assert_equal 6.0, m.optional_float
  107. assert_equal 7.0, m.optional_double
  108. assert_equal "Default Str", m.optional_string
  109. assert_equal "\xCF\xA5s\xBD\xBA\xE6fubar".force_encoding("ASCII-8BIT"), m.optional_bytes
  110. assert_equal :B2, m.optional_enum
  111. assert !m.has_optional_int32?
  112. assert !m.has_optional_int64?
  113. assert !m.has_optional_uint32?
  114. assert !m.has_optional_uint64?
  115. assert !m.has_optional_bool?
  116. assert !m.has_optional_float?
  117. assert !m.has_optional_double?
  118. assert !m.has_optional_string?
  119. assert !m.has_optional_bytes?
  120. assert !m.has_optional_enum?
  121. end
  122. def test_set_clear_defaults
  123. m = TestMessageDefaults.new
  124. m.optional_int32 = -42
  125. assert_equal -42, m.optional_int32
  126. assert m.has_optional_int32?
  127. m.clear_optional_int32
  128. assert_equal 1, m.optional_int32
  129. assert !m.has_optional_int32?
  130. m.optional_string = "foo bar"
  131. assert_equal "foo bar", m.optional_string
  132. assert m.has_optional_string?
  133. m.clear_optional_string
  134. assert_equal "Default Str", m.optional_string
  135. assert !m.has_optional_string?
  136. m.optional_msg = TestMessage2.new(:foo => 42)
  137. assert_equal TestMessage2.new(:foo => 42), m.optional_msg
  138. assert m.has_optional_msg?
  139. m.clear_optional_msg
  140. assert_equal nil, m.optional_msg
  141. assert !m.has_optional_msg?
  142. m.optional_msg = TestMessage2.new(:foo => 42)
  143. assert_equal TestMessage2.new(:foo => 42), m.optional_msg
  144. assert TestMessageDefaults.descriptor.lookup('optional_msg').has?(m)
  145. TestMessageDefaults.descriptor.lookup('optional_msg').clear(m)
  146. assert_equal nil, m.optional_msg
  147. assert !TestMessageDefaults.descriptor.lookup('optional_msg').has?(m)
  148. m = TestMessage.new
  149. m.repeated_int32.push(1)
  150. assert_equal [1], m.repeated_int32
  151. m.clear_repeated_int32
  152. assert_equal [], m.repeated_int32
  153. m = OneofMessage.new
  154. m.a = "foo"
  155. assert_equal "foo", m.a
  156. assert m.has_a?
  157. m.clear_a
  158. assert !m.has_a?
  159. m = OneofMessage.new
  160. m.a = "foobar"
  161. assert m.has_my_oneof?
  162. m.clear_my_oneof
  163. assert !m.has_my_oneof?
  164. m = OneofMessage.new
  165. m.a = "bar"
  166. assert_equal "bar", m.a
  167. assert m.has_my_oneof?
  168. OneofMessage.descriptor.lookup('a').clear(m)
  169. assert !m.has_my_oneof?
  170. end
  171. def test_initialization_map_errors
  172. e = assert_raise ArgumentError do
  173. TestMessage.new(:hello => "world")
  174. end
  175. assert_match(/hello/, e.message)
  176. e = assert_raise ArgumentError do
  177. TestMessage.new(:repeated_uint32 => "hello")
  178. end
  179. assert_equal e.message, "Expected array as initializer value for repeated field 'repeated_uint32' (given String)."
  180. end
  181. def test_to_h
  182. m = TestMessage.new(:optional_bool => true, :optional_double => -10.100001, :optional_string => 'foo', :repeated_string => ['bar1', 'bar2'])
  183. expected_result = {
  184. :optional_bool=>true,
  185. :optional_double=>-10.100001,
  186. :optional_string=>"foo",
  187. :repeated_string=>["bar1", "bar2"],
  188. }
  189. assert_equal expected_result, m.to_h
  190. m = OneofMessage.new(:a => "foo")
  191. expected_result = {:a => "foo"}
  192. assert_equal expected_result, m.to_h
  193. end
  194. def test_map_keyword_disabled
  195. pool = Google::Protobuf::DescriptorPool.new
  196. e = assert_raise ArgumentError do
  197. pool.build do
  198. add_file 'test_file.proto', syntax: :proto2 do
  199. add_message "MapMessage" do
  200. map :map_string_int32, :string, :int32, 1
  201. map :map_string_msg, :string, :message, 2, "TestMessage2"
  202. end
  203. end
  204. end
  205. end
  206. assert_match(/Cannot add a native map/, e.message)
  207. end
  208. def test_respond_to
  209. # This test fails with JRuby 1.7.23, likely because of an old JRuby bug.
  210. return if RUBY_PLATFORM == "java"
  211. msg = TestMessage.new
  212. assert !msg.respond_to?(:bacon)
  213. end
  214. def test_file_descriptor
  215. file_descriptor = TestMessage.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. file_descriptor = TestEnum.descriptor.file_descriptor
  220. assert nil != file_descriptor
  221. assert_equal "tests/basic_test_proto2.proto", file_descriptor.name
  222. assert_equal :proto2, file_descriptor.syntax
  223. end
  224. end
  225. end