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