class EnsureYieldBreak
attr_reader :ensure_context
def try
yield
ensure
@ensure_context = self
end
end
assert('ensure - context - yield') do
yielder = EnsureYieldBreak.new
yielder.try do
end
assert_equal yielder, yielder.ensure_context
end
assert('ensure - context - yield and break') do
yielder = EnsureYieldBreak.new
yielder.try do
break
end
assert_equal yielder, yielder.ensure_context
end
assert('ensure - context - yield and return') do
yielder = EnsureYieldBreak.new
lambda do
yielder.try do
return
end
end.call
assert_equal yielder, yielder.ensure_context
end
assert('ensure with local ||= preserves return value') do
result = lambda do
value = []
:result
ensure
value ||= []
end.call
assert_equal :result, result
end
assert('ensure with an op-assign of every kind preserves the return value') do
cls = Class.new do
def local; v = [1, 2, 3]; :body; ensure; v ||= []; end
def local2; v = [1, 2, 3]; :body; ensure; v &&= []; end
def ivar; @w = [1, 2, 3]; :body; ensure; @w ||= []; end
def gvar; $t7390 = [1, 2, 3]; :body; ensure; $t7390 ||= []; end
def cvar; @@c = [1, 2, 3]; :body; ensure; @@c ||= []; end
end
o = cls.new
assert_equal :body, o.local
assert_equal :body, o.local2
assert_equal :body, o.ivar
assert_equal :body, o.gvar
assert_equal :body, o.cvar
a = nil
assert_equal 1, (a ||= 1)
assert_equal 1, (a ||= 9)
assert_equal 7, (a &&= 7)
end
assert('begin with an empty ensure keeps its value in a register of its own') do
assert_equal [1, nil, 2], [1, (begin ensure end), 2]
assert_equal [nil, 1], [begin ensure end, *[1]]
assert_equal [1, nil, 2], [1, begin ensure end, *[2]]
assert_equal [1, 4, 2], [1, (begin 4 ensure end), 2]
assert_raise(NoMethodError) { begin ensure end[*false] }
end