diff options
Diffstat (limited to 'mrbgems/mruby-struct/test/struct.rb')
| -rw-r--r-- | mrbgems/mruby-struct/test/struct.rb | 121 |
1 files changed, 100 insertions, 21 deletions
diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb index 911e657bd..db0fa56d8 100644 --- a/mrbgems/mruby-struct/test/struct.rb +++ b/mrbgems/mruby-struct/test/struct.rb @@ -2,42 +2,51 @@ # Struct ISO Test assert('Struct', '15.2.18') do - Struct.class == Class + assert_equal Class, Struct.class end assert('Struct.new', '15.2.18.3.1') do c = Struct.new(:m1, :m2) - c.superclass == Struct and - c.members == [:m1,:m2] -end - -# Check crash bug with Struc.new and no params. -assert('Struct.new', '15.2.18.3.1') do - c = Struct.new() - c.superclass == Struct and c.members == [] + assert_equal Struct, c.superclass + assert_equal [:m1, :m2], c.members end assert('Struct#==', '15.2.18.4.1') do c = Struct.new(:m1, :m2) cc1 = c.new(1,2) cc2 = c.new(1,2) - cc1 == cc2 + assert_true cc1 == cc2 + + Struct.new(:m1, :m2) { def foo; end } + assert_raise(NoMethodError) { Struct.new(:m1).new.foo } end assert('Struct#[]', '15.2.18.4.2') do c = Struct.new(:m1, :m2) cc = c.new(1,2) - cc[:m1] == 1 and cc["m2"] == 2 + assert_equal 1, cc[:m1] + assert_equal 2, cc["m2"] + assert_equal 1, cc[0] + assert_equal 2, cc[-1] + assert_raise(TypeError) { cc[[]] } + assert_raise(IndexError) { cc[2] } + assert_raise(NameError) { cc['tama'] } end assert('Struct#[]=', '15.2.18.4.3') do c = Struct.new(:m1, :m2) cc = c.new(1,2) cc[:m1] = 3 - cc[:m1] == 3 + assert_equal 3, cc[:m1] cc["m2"] = 3 assert_equal 3, cc["m2"] + cc[0] = 4 + assert_equal 4, cc[0] + cc[-1] = 5 + assert_equal 5, cc[-1] assert_raise(TypeError) { cc[[]] = 3 } + assert_raise(IndexError) { cc[2] = 7 } + assert_raise(NameError) { cc['pochi'] = 8 } end assert('Struct#each', '15.2.18.4.4') do @@ -47,7 +56,7 @@ assert('Struct#each', '15.2.18.4.4') do cc.each{|x| a << x } - a[0] == 1 and a[1] == 2 + assert_equal [1, 2], a end assert('Struct#each_pair', '15.2.18.4.5') do @@ -57,19 +66,17 @@ assert('Struct#each_pair', '15.2.18.4.5') do cc.each_pair{|k,v| a << [k,v] } - a[0] == [:m1, 1] and a[1] == [:m2, 2] + assert_equal [[:m1, 1], [:m2, 2]], a end assert('Struct#members', '15.2.18.4.6') do c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc.members == [:m1,:m2] + assert_equal [:m1, :m2], c.new(1,2).members end assert('Struct#select', '15.2.18.4.7') do c = Struct.new(:m1, :m2) - cc = c.new(1,2) - cc.select{|v| v % 2 == 0} == [2] + assert_equal([2]) { c.new(1,2).select{|v| v % 2 == 0} } end assert('large struct') do @@ -100,10 +107,19 @@ assert('wrong struct arg count') do end end -assert('struct inspect') do +assert('struct dup') do c = Struct.new(:m1, :m2, :m3, :m4, :m5) cc = c.new(1,2,3,4,5) - assert_equal "#<struct #{c.inspect} m1=1, m2=2, m3=3, m4=4, m5=5>", cc.inspect + assert_nothing_raised { + assert_equal(cc, cc.dup) + } +end + +assert('struct inspect') do + c = Struct.new(:m1, :m2, :m3, :m4, :m5, :recur) + cc = c.new(1,2,3,4,5,nil) + cc.recur = cc + assert_equal "#<struct m1=1, m2=2, m3=3, m4=4, m5=5, recur=#<struct #{cc.class}:...>>", cc.inspect end assert('Struct#length, Struct#size') do @@ -120,7 +136,7 @@ end assert('Struct#to_h') do s = Struct.new(:white, :red, :green).new('ruuko', 'yuzuki', 'hitoe') - assert_equal(:white => 'ruuko', :red => 'yuzuki', :green => 'hitoe') { s.to_h } + assert_equal({:white => 'ruuko', :red => 'yuzuki', :green => 'hitoe'}) { s.to_h } end assert('Struct#values_at') do @@ -129,3 +145,66 @@ assert('Struct#values_at') do assert_equal ['io', 'aki'], a.values_at(1, 0) assert_raise(IndexError) { a.values_at 2 } end + +assert("Struct#dig") do + a = Struct.new(:blue, :purple).new('aki', Struct.new(:red).new(1)) + assert_equal 'aki', a.dig(:blue) + assert_equal 1, a.dig(:purple, :red) + assert_equal 1, a.dig(1, 0) +end + +# TODO: suppress redefining Struct warning during test +# assert("Struct.new removes existing constant") do +# begin +# assert_not_equal Struct.new("Test", :a), Struct.new("Test", :a, :b) +# ensure +# Struct.remove_const :Test +# end +# end + +assert("Struct#initialize_copy requires struct to be the same type") do + begin + Struct.new("Test", :a) + a = Struct::Test.new("a") + Struct.remove_const :Test + Struct.new("Test", :a, :b) + assert_raise(TypeError) do + a.initialize_copy(Struct::Test.new("a", "b")) + end + ensure + Struct.remove_const :Test + end +end + +assert("Struct.new does not allow array") do + assert_raise(TypeError) do + Struct.new("Test", [:a]) + end +end + +assert("Struct.new does not allow invalid class name") do + assert_raise(NameError) { Struct.new("Test-", :a) } +end + +assert("Struct.new generates subclass of Struct") do + begin + original_struct = Struct + Struct = String + assert_equal original_struct, original_struct.new(:foo).superclass + ensure + Struct = original_struct + end +end + +assert 'Struct#freeze' do + c = Struct.new :m + + o = c.new + o.m = :test + assert_equal :test, o.m + + o.freeze + assert_raise(FrozenError) { o.m = :modify } + assert_raise(FrozenError) { o[:m] = :modify } + assert_equal :test, o.m +end |
