1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/rubyspec/language/fixtures/break.rb
eregon 95e8c48dd3 Add in-tree mspec and ruby/spec
* For easier modifications of ruby/spec by MRI developers.
* .gitignore: track changes under spec.
* spec/mspec, spec/rubyspec: add in-tree mspec and ruby/spec.
  These files can therefore be updated like any other file in MRI.
  Instructions are provided in spec/README.
  [Feature #13156] [ruby-core:79246]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58595 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2017-05-07 12:04:49 +00:00

263 lines
3.9 KiB
Ruby

module BreakSpecs
class Driver
def initialize(ensures=false)
@ensures = ensures
end
def note(value)
ScratchPad << value
end
end
class Block < Driver
def break_nil
note :a
note yielding {
note :b
break
note :c
}
note :d
end
def break_value
note :a
note yielding {
note :b
break :break
note :c
}
note :d
end
def yielding
note :aa
note yield
note :bb
end
def create_block
note :za
b = capture_block do
note :zb
break :break
note :zc
end
note :zd
b
end
def capture_block(&b)
note :xa
b
end
def break_in_method_captured
note :a
create_block.call
note :b
end
def break_in_yield_captured
note :a
yielding(&create_block)
note :b
end
def break_in_method
note :a
b = capture_block {
note :b
break :break
note :c
}
note :d
note b.call
note :e
end
def call_method(b)
note :aa
note b.call
note :bb
end
def break_in_nested_method
note :a
b = capture_block {
note :b
break :break
note :c
}
note :c
note call_method(b)
note :d
end
def break_in_yielding_method
note :a
b = capture_block {
note :b
break :break
note :c
}
note :c
note yielding(&b)
note :d
end
def method(v)
yield v
end
def invoke_yield_in_while
looping = true
while looping
note :aa
yield
note :bb
looping = false
end
note :should_not_reach_here
end
def break_in_block_in_while
invoke_yield_in_while do
note :break
break :value
note :c
end
end
end
class Lambda < Driver
# Cases for the invocation of the scope defining the lambda still active
# on the call stack when the lambda is invoked.
def break_in_defining_scope(value=true)
note :a
note lambda {
note :b
if value
break :break
else
break
end
note :c
}.call
note :d
end
def break_in_nested_scope
note :a
l = lambda do
note :b
break :break
note :c
end
note :d
invoke_lambda l
note :e
end
def invoke_lambda(l)
note :aa
note l.call
note :bb
end
def break_in_nested_scope_yield
note :a
l = lambda do
note :b
break :break
note :c
end
note :d
invoke_yield(&l)
note :e
end
def note_invoke_yield
note :aa
note yield
note :bb
end
def break_in_nested_scope_block
note :a
l = lambda do
note :b
break :break
note :c
end
note :d
invoke_lambda_block l
note :e
end
def invoke_yield
note :aaa
yield
note :bbb
end
def invoke_lambda_block(b)
note :aa
invoke_yield do
note :bb
note b.call
note :cc
end
note :dd
end
# Cases for the invocation of the scope defining the lambda NOT still
# active on the call stack when the lambda is invoked.
def create_lambda
note :la
l = lambda do
note :lb
break :break
note :lc
end
note :ld
l
end
def break_in_method
note :a
note create_lambda.call
note :b
end
def break_in_block_in_method
note :a
invoke_yield do
note :b
note create_lambda.call
note :c
end
note :d
end
def break_in_method_yield
note :a
invoke_yield(&create_lambda)
note :b
end
end
end