summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct/test/struct.rb
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-struct/test/struct.rb')
-rw-r--r--mrbgems/mruby-struct/test/struct.rb121
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