repeated_field_test.rb 20 KB

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