repeated_field_test.rb 20 KB

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