diff options
Diffstat (limited to 'spec/ruby/language/if_spec.rb')
| -rw-r--r-- | spec/ruby/language/if_spec.rb | 83 |
1 files changed, 67 insertions, 16 deletions
diff --git a/spec/ruby/language/if_spec.rb b/spec/ruby/language/if_spec.rb index 284d852462..53fcb853d5 100644 --- a/spec/ruby/language/if_spec.rb +++ b/spec/ruby/language/if_spec.rb @@ -1,22 +1,20 @@ -require File.expand_path('../../spec_helper', __FILE__) +require_relative '../spec_helper' describe "The if expression" do - ruby_version_is '2.4' do - describe "accepts multiple assignments in conditional expression" do - before(:each) { ScratchPad.record([]) } - after(:each) { ScratchPad.clear } - - it 'with non-nil values' do - ary = [1, 2] - eval "if (a, b = ary); ScratchPad.record [a, b]; end" - ScratchPad.recorded.should == [1, 2] - end + describe "accepts multiple assignments in conditional expression" do + before(:each) { ScratchPad.record([]) } + after(:each) { ScratchPad.clear } + + it 'with non-nil values' do + ary = [1, 2] + eval "if (a, b = ary); ScratchPad.record [a, b]; end" + ScratchPad.recorded.should == [1, 2] + end - it 'with nil values' do - ary = nil - eval "if (a, b = ary); else; ScratchPad.record [a, b]; end" - ScratchPad.recorded.should == [nil, nil] - end + it 'with nil values' do + ary = nil + eval "if (a, b = ary); else; ScratchPad.record [a, b]; end" + ScratchPad.recorded.should == [nil, nil] end end @@ -307,6 +305,59 @@ describe "The if expression" do 6.times(&b) ScratchPad.recorded.should == [4, 5, 4, 5] end + + it "warns when Integer literals are used instead of predicates" do + -> { + eval <<~RUBY + $. = 0 + 10.times { |i| ScratchPad << i if 4..5 } + RUBY + }.should complain(/warning: integer literal in flip-flop/, verbose: true) + ScratchPad.recorded.should == [] + end + end + + describe "when a branch syntactically does not return a value" do + it "raises SyntaxError if both do not return a value" do + -> { + eval <<~RUBY + def m + a = if rand + return + else + return + end + a + end + RUBY + }.should.raise(SyntaxError, /void value expression/) + end + + it "does not raise SyntaxError if one branch returns a value" do + eval(<<~RUBY).should == 1 + def m + a = if false # using false to make it clear that's not checked for + 42 + else + return 1 + end + a + end + m + RUBY + + eval(<<~RUBY).should == 1 + def m + a = if true # using true to make it clear that's not checked for + return 1 + else + 42 + end + a + end + m + RUBY + end end end |
