repeated_field_test.rb 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. #!/usr/bin/ruby
  2. require 'google/protobuf'
  3. require 'test/unit'
  4. class RepeatedFieldTest < Test::Unit::TestCase
  5. def test_acts_like_enumerator
  6. m = TestMessage.new
  7. (Enumerable.instance_methods - TestMessage.new.repeated_string.methods).each do |method_name|
  8. assert m.repeated_string.respond_to?(method_name) == true, "does not respond to #{method_name}"
  9. end
  10. end
  11. def test_acts_like_an_array
  12. m = TestMessage.new
  13. arr_methods = ([].methods - TestMessage.new.repeated_string.methods)
  14. # jRuby additions to the Array class that we can ignore
  15. arr_methods -= [ :indices, :iter_for_each, :iter_for_each_index,
  16. :iter_for_each_with_index, :dimensions, :copy_data, :copy_data_simple,
  17. :nitems, :iter_for_reverse_each, :indexes, :append, :prepend]
  18. arr_methods -= [:union, :difference, :filter!]
  19. arr_methods -= [:intersection, :deconstruct] # ruby 2.7 methods we can ignore
  20. arr_methods.each do |method_name|
  21. assert m.repeated_string.respond_to?(method_name) == true, "does not respond to #{method_name}"
  22. end
  23. end
  24. def test_first
  25. m = TestMessage.new
  26. repeated_field_names(TestMessage).each do |field_name|
  27. assert_nil m.send(field_name).first
  28. assert_equal [], m.send(field_name).first(0)
  29. assert_equal [], m.send(field_name).first(1)
  30. end
  31. fill_test_msg(m)
  32. assert_equal -10, m.repeated_int32.first
  33. assert_equal -1_000_000, m.repeated_int64.first
  34. assert_equal 10, m.repeated_uint32.first
  35. assert_equal 1_000_000, m.repeated_uint64.first
  36. assert_equal true, m.repeated_bool.first
  37. assert_equal -1.01, m.repeated_float.first.round(2)
  38. assert_equal -1.0000000000001, m.repeated_double.first
  39. assert_equal 'foo', m.repeated_string.first
  40. assert_equal "bar".encode!('ASCII-8BIT'), m.repeated_bytes.first
  41. assert_equal TestMessage2.new(:foo => 1), m.repeated_msg.first
  42. assert_equal :A, m.repeated_enum.first
  43. assert_equal [], m.repeated_int32.first(0)
  44. assert_equal [-10], m.repeated_int32.first(1)
  45. assert_equal [-10, -11], m.repeated_int32.first(2)
  46. assert_equal [-10, -11], m.repeated_int32.first(3)
  47. end
  48. def test_last
  49. m = TestMessage.new
  50. repeated_field_names(TestMessage).each do |field_name|
  51. assert_nil m.send(field_name).first
  52. end
  53. fill_test_msg(m)
  54. assert_equal -11, m.repeated_int32.last
  55. assert_equal -1_000_001, m.repeated_int64.last
  56. assert_equal 11, m.repeated_uint32.last
  57. assert_equal 1_000_001, m.repeated_uint64.last
  58. assert_equal false, m.repeated_bool.last
  59. assert_equal -1.02, m.repeated_float.last.round(2)
  60. assert_equal -1.0000000000002, m.repeated_double.last
  61. assert_equal 'bar', m.repeated_string.last
  62. assert_equal "foo".encode!('ASCII-8BIT'), m.repeated_bytes.last
  63. assert_equal TestMessage2.new(:foo => 2), m.repeated_msg.last
  64. assert_equal :B, m.repeated_enum.last
  65. end
  66. def test_pop
  67. m = TestMessage.new
  68. repeated_field_names(TestMessage).each do |field_name|
  69. assert_nil m.send(field_name).pop
  70. end
  71. fill_test_msg(m)
  72. assert_equal -11, m.repeated_int32.pop
  73. assert_equal -10, m.repeated_int32.pop
  74. assert_equal -1_000_001, m.repeated_int64.pop
  75. assert_equal -1_000_000, m.repeated_int64.pop
  76. assert_equal 11, m.repeated_uint32.pop
  77. assert_equal 10, m.repeated_uint32.pop
  78. assert_equal 1_000_001, m.repeated_uint64.pop
  79. assert_equal 1_000_000, m.repeated_uint64.pop
  80. assert_equal false, m.repeated_bool.pop
  81. assert_equal true, m.repeated_bool.pop
  82. assert_equal -1.02, m.repeated_float.pop.round(2)
  83. assert_equal -1.01, m.repeated_float.pop.round(2)
  84. assert_equal -1.0000000000002, m.repeated_double.pop
  85. assert_equal -1.0000000000001, m.repeated_double.pop
  86. assert_equal 'bar', m.repeated_string.pop
  87. assert_equal 'foo', m.repeated_string.pop
  88. assert_equal "foo".encode!('ASCII-8BIT'), m.repeated_bytes.pop
  89. assert_equal "bar".encode!('ASCII-8BIT'), m.repeated_bytes.pop
  90. assert_equal TestMessage2.new(:foo => 2), m.repeated_msg.pop
  91. assert_equal TestMessage2.new(:foo => 1), m.repeated_msg.pop
  92. assert_equal :B, m.repeated_enum.pop
  93. assert_equal :A, m.repeated_enum.pop
  94. repeated_field_names(TestMessage).each do |field_name|
  95. assert_nil m.send(field_name).pop
  96. end
  97. fill_test_msg(m)
  98. assert_equal ['bar', 'foo'], m.repeated_string.pop(2)
  99. assert_nil m.repeated_string.pop
  100. end
  101. def test_each
  102. m = TestMessage.new
  103. 5.times{|i| m.repeated_string << 'string' }
  104. count = 0
  105. m.repeated_string.each do |val|
  106. assert_equal 'string', val
  107. count += 1
  108. end
  109. assert_equal 5, count
  110. result = m.repeated_string.each{|val| val + '_junk'}
  111. assert_equal ['string'] * 5, result
  112. end
  113. def test_empty?
  114. m = TestMessage.new
  115. assert_equal true, m.repeated_string.empty?
  116. m.repeated_string << 'foo'
  117. assert_equal false, m.repeated_string.empty?
  118. m.repeated_string << 'bar'
  119. assert_equal false, m.repeated_string.empty?
  120. end
  121. def test_reassign
  122. m = TestMessage.new
  123. m.repeated_msg = Google::Protobuf::RepeatedField.new(:message, TestMessage2, [TestMessage2.new(:foo => 1)])
  124. assert_equal m.repeated_msg.first, TestMessage2.new(:foo => 1)
  125. end
  126. def test_array_accessor
  127. m = TestMessage.new
  128. reference_arr = %w(foo bar baz)
  129. m.repeated_string += reference_arr.clone
  130. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  131. arr[1]
  132. end
  133. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  134. arr[-2]
  135. end
  136. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  137. arr[20]
  138. end
  139. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  140. arr[1, 2]
  141. end
  142. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  143. arr[0..2]
  144. end
  145. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  146. arr[-1, 1]
  147. end
  148. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  149. arr[10, 12]
  150. end
  151. end
  152. def test_array_settor
  153. m = TestMessage.new
  154. reference_arr = %w(foo bar baz)
  155. m.repeated_string += reference_arr.clone
  156. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  157. arr[1] = 'junk'
  158. end
  159. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  160. arr[-2] = 'snappy'
  161. end
  162. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  163. arr[3] = ''
  164. end
  165. # slight deviation; we are strongly typed, and nil is not allowed
  166. # for string types;
  167. m.repeated_string[5] = 'spacious'
  168. assert_equal ["foo", "snappy", "baz", "", "", "spacious"], m.repeated_string
  169. #make sure it sests the default types for other fields besides strings
  170. %w(repeated_int32 repeated_int64 repeated_uint32 repeated_uint64).each do |field_name|
  171. m.send(field_name)[3] = 10
  172. assert_equal [0,0,0,10], m.send(field_name)
  173. end
  174. m.repeated_float[3] = 10.1
  175. #wonky mri float handling
  176. assert_equal [0,0,0], m.repeated_float.to_a[0..2]
  177. assert_equal 10.1, m.repeated_float[3].round(1)
  178. m.repeated_double[3] = 10.1
  179. assert_equal [0,0,0,10.1], m.repeated_double
  180. m.repeated_bool[3] = true
  181. assert_equal [false, false, false, true], m.repeated_bool
  182. m.repeated_bytes[3] = "bar".encode!('ASCII-8BIT')
  183. assert_equal ['', '', '', "bar".encode!('ASCII-8BIT')], m.repeated_bytes
  184. m.repeated_msg[3] = TestMessage2.new(:foo => 1)
  185. assert_equal [nil, nil, nil, TestMessage2.new(:foo => 1)], m.repeated_msg
  186. m.repeated_enum[3] = :A
  187. assert_equal [:Default, :Default, :Default, :A], m.repeated_enum
  188. # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  189. # arr[20] = 'spacious'
  190. # end
  191. # TODO: accessor doesn't allow other ruby-like methods
  192. # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  193. # arr[1, 2] = 'fizz'
  194. # end
  195. # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  196. # arr[0..2] = 'buzz'
  197. # end
  198. end
  199. def test_push
  200. m = TestMessage.new
  201. reference_arr = %w[foo bar baz]
  202. m.repeated_string += reference_arr.clone
  203. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  204. arr.push('fizz')
  205. end
  206. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  207. arr << 'fizz'
  208. end
  209. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  210. arr.push('fizz', 'buzz')
  211. end
  212. end
  213. def test_clear
  214. m = TestMessage.new
  215. reference_arr = %w(foo bar baz)
  216. m.repeated_string += reference_arr.clone
  217. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  218. arr.clear
  219. end
  220. end
  221. def test_concat
  222. m = TestMessage.new
  223. reference_arr = %w(foo bar baz)
  224. m.repeated_string += reference_arr.clone
  225. m.repeated_string.concat(['fizz', 'buzz'])
  226. assert_equal %w(foo bar baz fizz buzz), m.repeated_string
  227. #TODO: concat should return the orig array
  228. # check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  229. # arr.concat(['fizz', 'buzz'])
  230. # end
  231. end
  232. def test_equal
  233. m = TestMessage.new
  234. reference_arr = %w(foo bar baz)
  235. m.repeated_string += reference_arr.clone
  236. assert_equal reference_arr, m.repeated_string
  237. reference_arr << 'fizz'
  238. assert_not_equal reference_arr, m.repeated_string
  239. m.repeated_string << 'fizz'
  240. assert_equal reference_arr, m.repeated_string
  241. end
  242. def test_hash
  243. # just a sanity check
  244. m = TestMessage.new
  245. reference_arr = %w(foo bar baz)
  246. m.repeated_string += reference_arr.clone
  247. assert m.repeated_string.hash.is_a?(Integer)
  248. hash = m.repeated_string.hash
  249. assert_equal hash, m.repeated_string.hash
  250. m.repeated_string << 'j'
  251. assert_not_equal hash, m.repeated_string.hash
  252. end
  253. def test_plus
  254. m = TestMessage.new
  255. reference_arr = %w(foo bar baz)
  256. m.repeated_string += reference_arr.clone
  257. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  258. arr + ['fizz', 'buzz']
  259. end
  260. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  261. arr += ['fizz', 'buzz']
  262. end
  263. end
  264. def test_replace
  265. m = TestMessage.new
  266. reference_arr = %w(foo bar baz)
  267. m.repeated_string += reference_arr.clone
  268. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  269. arr.replace(['fizz', 'buzz'])
  270. end
  271. end
  272. def test_to_a
  273. m = TestMessage.new
  274. reference_arr = %w(foo bar baz)
  275. m.repeated_string += reference_arr.clone
  276. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  277. arr.to_a
  278. end
  279. end
  280. def test_to_ary
  281. m = TestMessage.new
  282. reference_arr = %w(foo bar baz)
  283. m.repeated_string += reference_arr.clone
  284. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  285. arr.to_ary
  286. end
  287. end
  288. # emulate Array behavior
  289. ##########################
  290. def test_collect!
  291. m = TestMessage.new
  292. reference_arr = %w(foo bar baz)
  293. m.repeated_string += reference_arr.clone
  294. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  295. arr.collect!{|x| x + "!" }
  296. end
  297. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  298. arr.collect!.with_index{|x, i| x[0...i] }
  299. end
  300. end
  301. def test_compact!
  302. m = TestMessage.new
  303. m.repeated_msg << TestMessage2.new(:foo => 1)
  304. m.repeated_msg << nil
  305. m.repeated_msg << TestMessage2.new(:foo => 2)
  306. reference_arr = m.repeated_string.to_a
  307. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  308. arr.compact!
  309. end
  310. end
  311. def test_delete
  312. m = TestMessage.new
  313. reference_arr = %w(foo bar baz)
  314. m.repeated_string += reference_arr.clone
  315. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  316. arr.delete('bar')
  317. end
  318. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  319. arr.delete('nope')
  320. end
  321. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  322. arr.delete('nope'){'within'}
  323. end
  324. end
  325. def test_delete_at
  326. m = TestMessage.new
  327. reference_arr = %w(foo bar baz)
  328. m.repeated_string += reference_arr.clone
  329. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  330. arr.delete_at(2)
  331. end
  332. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  333. arr.delete_at(10)
  334. end
  335. end
  336. def test_delete_if
  337. m = TestMessage.new
  338. reference_arr = %w(foo bar baz)
  339. m.repeated_string += reference_arr.clone
  340. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  341. arr.delete_if { |v| v == "bar" }
  342. end
  343. end
  344. def test_fill
  345. m = TestMessage.new
  346. reference_arr = %w(foo bar baz)
  347. m.repeated_string += reference_arr.clone
  348. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  349. arr.fill("x")
  350. end
  351. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  352. arr.fill("z", 2, 2)
  353. end
  354. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  355. arr.fill("y", 0..1)
  356. end
  357. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  358. arr.fill { |i| (i*i).to_s }
  359. end
  360. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  361. arr.fill(-2) { |i| (i*i*i).to_s }
  362. end
  363. end
  364. def test_flatten!
  365. m = TestMessage.new
  366. reference_arr = %w(foo bar baz)
  367. m.repeated_string += reference_arr.clone
  368. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  369. arr.flatten!
  370. end
  371. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  372. arr.flatten!(1)
  373. end
  374. end
  375. def test_insert
  376. m = TestMessage.new
  377. reference_arr = %w(foo bar baz)
  378. m.repeated_string += reference_arr.clone
  379. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  380. arr.insert(2, 'fizz')
  381. end
  382. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  383. arr.insert(3, 'fizz', 'buzz', 'bazz')
  384. end
  385. end
  386. def test_inspect
  387. m = TestMessage.new
  388. assert_equal '[]', m.repeated_string.inspect
  389. m.repeated_string << 'foo'
  390. assert_equal m.repeated_string.to_a.inspect, m.repeated_string.inspect
  391. m.repeated_string << 'bar'
  392. assert_equal m.repeated_string.to_a.inspect, m.repeated_string.inspect
  393. end
  394. def test_reverse!
  395. m = TestMessage.new
  396. reference_arr = %w(foo bar baz)
  397. m.repeated_string += reference_arr.clone
  398. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  399. arr.reverse!
  400. end
  401. end
  402. def test_rotate!
  403. m = TestMessage.new
  404. reference_arr = %w(foo bar baz)
  405. m.repeated_string += reference_arr.clone
  406. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  407. arr.rotate!
  408. end
  409. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  410. arr.rotate!(2)
  411. end
  412. end
  413. def test_select!
  414. m = TestMessage.new
  415. reference_arr = %w(foo bar baz)
  416. m.repeated_string += reference_arr.clone
  417. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  418. arr.select! { |v| v =~ /[aeiou]/ }
  419. end
  420. end
  421. def test_shift
  422. m = TestMessage.new
  423. reference_arr = %w(foo bar baz)
  424. m.repeated_string += reference_arr.clone
  425. # should return an element
  426. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  427. arr.shift
  428. end
  429. # should return an array
  430. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  431. arr.shift(2)
  432. end
  433. # should return nil
  434. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  435. arr.shift
  436. end
  437. end
  438. def test_shuffle!
  439. m = TestMessage.new
  440. m.repeated_string += %w(foo bar baz)
  441. orig_repeated_string = m.repeated_string.clone
  442. result = m.repeated_string.shuffle!
  443. assert_equal m.repeated_string, result
  444. # NOTE: sometimes it doesn't change the order...
  445. # assert_not_equal m.repeated_string.to_a, orig_repeated_string.to_a
  446. end
  447. def test_slice!
  448. m = TestMessage.new
  449. reference_arr = %w(foo bar baz bar fizz buzz)
  450. m.repeated_string += reference_arr.clone
  451. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  452. arr.slice!(2)
  453. end
  454. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  455. arr.slice!(1,2)
  456. end
  457. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  458. arr.slice!(0..1)
  459. end
  460. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  461. arr.slice!(10)
  462. end
  463. end
  464. def test_sort!
  465. m = TestMessage.new
  466. reference_arr = %w(foo bar baz)
  467. m.repeated_string += reference_arr.clone
  468. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  469. arr.sort!
  470. end
  471. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  472. arr.sort! { |x,y| y <=> x }
  473. end
  474. end
  475. def test_sort_by!
  476. m = TestMessage.new
  477. reference_arr = %w(foo bar baz)
  478. m.repeated_string += reference_arr.clone
  479. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  480. arr.sort_by!
  481. end
  482. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  483. arr.sort_by!(&:hash)
  484. end
  485. end
  486. def test_uniq!
  487. m = TestMessage.new
  488. reference_arr = %w(foo bar baz)
  489. m.repeated_string += reference_arr.clone
  490. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  491. arr.uniq!
  492. end
  493. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  494. arr.uniq!{|s| s[0] }
  495. end
  496. end
  497. def test_unshift
  498. m = TestMessage.new
  499. reference_arr = %w(foo bar baz)
  500. m.repeated_string += reference_arr.clone
  501. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  502. arr.unshift('1')
  503. end
  504. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  505. arr.unshift('a', 'b')
  506. end
  507. check_self_modifying_method(m.repeated_string, reference_arr) do |arr|
  508. arr.unshift('')
  509. end
  510. end
  511. ##### HELPER METHODS
  512. def check_self_modifying_method(repeated_field, ref_array)
  513. expected_result = yield(ref_array)
  514. actual_result = yield(repeated_field)
  515. if expected_result.is_a?(Enumerator)
  516. assert_equal expected_result.to_a, actual_result.to_a
  517. else
  518. assert_equal expected_result, actual_result
  519. end
  520. assert_equal ref_array, repeated_field
  521. end
  522. def repeated_field_names(klass)
  523. klass.descriptor.find_all{|f| f.label == :repeated}.map(&:name)
  524. end
  525. def fill_test_msg(test_msg)
  526. test_msg.repeated_int32 += [-10, -11]
  527. test_msg.repeated_int64 += [-1_000_000, -1_000_001]
  528. test_msg.repeated_uint32 += [10, 11]
  529. test_msg.repeated_uint64 += [1_000_000, 1_000_001]
  530. test_msg.repeated_bool += [true, false]
  531. test_msg.repeated_float += [-1.01, -1.02]
  532. test_msg.repeated_double += [-1.0000000000001, -1.0000000000002]
  533. test_msg.repeated_string += %w(foo bar)
  534. test_msg.repeated_bytes += ["bar".encode!('ASCII-8BIT'), "foo".encode!('ASCII-8BIT')]
  535. test_msg.repeated_msg << TestMessage2.new(:foo => 1)
  536. test_msg.repeated_msg << TestMessage2.new(:foo => 2)
  537. test_msg.repeated_enum << :A
  538. test_msg.repeated_enum << :B
  539. end
  540. pool = Google::Protobuf::DescriptorPool.new
  541. pool.build do
  542. add_message "TestMessage" do
  543. optional :optional_int32, :int32, 1
  544. optional :optional_int64, :int64, 2
  545. optional :optional_uint32, :uint32, 3
  546. optional :optional_uint64, :uint64, 4
  547. optional :optional_bool, :bool, 5
  548. optional :optional_float, :float, 6
  549. optional :optional_double, :double, 7
  550. optional :optional_string, :string, 8
  551. optional :optional_bytes, :bytes, 9
  552. optional :optional_msg, :message, 10, "TestMessage2"
  553. optional :optional_enum, :enum, 11, "TestEnum"
  554. repeated :repeated_int32, :int32, 12
  555. repeated :repeated_int64, :int64, 13
  556. repeated :repeated_uint32, :uint32, 14
  557. repeated :repeated_uint64, :uint64, 15
  558. repeated :repeated_bool, :bool, 16
  559. repeated :repeated_float, :float, 17
  560. repeated :repeated_double, :double, 18
  561. repeated :repeated_string, :string, 19
  562. repeated :repeated_bytes, :bytes, 20
  563. repeated :repeated_msg, :message, 21, "TestMessage2"
  564. repeated :repeated_enum, :enum, 22, "TestEnum"
  565. end
  566. add_message "TestMessage2" do
  567. optional :foo, :int32, 1
  568. end
  569. add_enum "TestEnum" do
  570. value :Default, 0
  571. value :A, 1
  572. value :B, 2
  573. value :C, 3
  574. end
  575. end
  576. TestMessage = pool.lookup("TestMessage").msgclass
  577. TestMessage2 = pool.lookup("TestMessage2").msgclass
  578. TestEnum = pool.lookup("TestEnum").enummodule
  579. end