summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-catch/test
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2021-02-06 13:28:47 +0900
committerKOBAYASHI Shuji <[email protected]>2021-02-06 13:28:47 +0900
commit1ea4c512450a79e979b2652764b35a28630f5570 (patch)
tree7af5932607dba8bb35a6ef62c01b28afb9e435c3 /mrbgems/mruby-catch/test
parent4bf4650321c540a8abf31aa801afc0e8545571f6 (diff)
downloadmruby-1ea4c512450a79e979b2652764b35a28630f5570.tar.gz
mruby-1ea4c512450a79e979b2652764b35a28630f5570.zip
Make the argument of `Kernel#catch` optional as Ruby does
Also implement the following changes. * Add tests * Use `Object#equal?` to compare tags for Ruby compatibility * Use `attr_reader`
Diffstat (limited to 'mrbgems/mruby-catch/test')
-rw-r--r--mrbgems/mruby-catch/test/catch.rb79
1 files changed, 79 insertions, 0 deletions
diff --git a/mrbgems/mruby-catch/test/catch.rb b/mrbgems/mruby-catch/test/catch.rb
new file mode 100644
index 000000000..fe5bda096
--- /dev/null
+++ b/mrbgems/mruby-catch/test/catch.rb
@@ -0,0 +1,79 @@
+assert "return throw value" do
+ val = ["val"]
+ result = catch :foo do
+ loop do
+ loop do
+ throw :foo, val
+ break
+ end
+ flunk("should not reach here")
+ end
+ false
+ end
+ assert_same(val, result)
+end
+
+assert "no throw" do
+ assert_equal(:foo, catch(:bar){:foo})
+end
+
+assert "no throw value" do
+ result = catch :foo do
+ throw :foo
+ 1
+ end
+ assert_equal(nil, result)
+end
+
+assert "pass the given tag to block" do
+ tag = [:foo]
+ catch(tag){|t| assert_same(tag, t)}
+end
+
+assert "tag identity" do
+ assert_raise_with_message_pattern(Exception, "uncaught throw *") do
+ catch [:tag] do
+ throw [:tag]
+ end
+ flunk("should not reach here")
+ end
+end
+
+assert "without catch arguments" do
+ result = catch do |tag1|
+ catch do |tag2|
+ throw tag1, 1
+ flunk("should not reach here 1")
+ end
+ flunk("should not reach here 2")
+ end
+ assert_equal(1, result)
+end
+
+assert "catches across invocation boundaries" do
+ v = []
+ catch :one do
+ v << 1
+ catch :two do
+ v << 2
+ throw :one
+ v << 3
+ end
+ v << 4
+ end
+ assert_equal([1,2], v)
+end
+
+assert "catches in the nested invocation with the same key" do
+ v = []
+ catch :tag do
+ v << 1
+ catch :tag do
+ v << 2
+ throw :tag
+ v << 3
+ end
+ v << 4
+ end
+ assert_equal([1,2,4], v)
+end