repeated_field_test.rb 20 KB

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