summaryrefslogtreecommitdiff
path: root/spec/ruby/language/if_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/language/if_spec.rb')
-rw-r--r--spec/ruby/language/if_spec.rb72
1 files changed, 55 insertions, 17 deletions
diff --git a/spec/ruby/language/if_spec.rb b/spec/ruby/language/if_spec.rb
index 4d809019c9..53fcb853d5 100644
--- a/spec/ruby/language/if_spec.rb
+++ b/spec/ruby/language/if_spec.rb
@@ -233,22 +233,19 @@ describe "The if expression" do
describe "with a boolean range ('flip-flop' operator)" do
before :each do
ScratchPad.record []
- @verbose = $VERBOSE
- $VERBOSE = nil
end
after :each do
ScratchPad.clear
- $VERBOSE = @verbose
end
it "mimics an awk conditional with a single-element inclusive-end range" do
- eval "10.times { |i| ScratchPad << i if (i == 4)..(i == 4) }"
+ 10.times { |i| ScratchPad << i if (i == 4)..(i == 4) }
ScratchPad.recorded.should == [4]
end
it "mimics an awk conditional with a many-element inclusive-end range" do
- eval "10.times { |i| ScratchPad << i if (i == 4)..(i == 7) }"
+ 10.times { |i| ScratchPad << i if (i == 4)..(i == 7) }
ScratchPad.recorded.should == [4, 5, 6, 7]
end
@@ -258,12 +255,12 @@ describe "The if expression" do
end
it "mimics a sed conditional with a many-element exclusive-end range" do
- eval "10.times { |i| ScratchPad << i if (i == 4)...(i == 5) }"
+ 10.times { |i| ScratchPad << i if (i == 4)...(i == 5) }
ScratchPad.recorded.should == [4, 5]
end
it "allows combining two flip-flops" do
- eval "10.times { |i| ScratchPad << i if (i == 4)...(i == 5) or (i == 7)...(i == 8) }"
+ 10.times { |i| ScratchPad << i if (i == 4)...(i == 5) or (i == 7)...(i == 8) }
ScratchPad.recorded.should == [4, 5, 7, 8]
end
@@ -281,18 +278,18 @@ describe "The if expression" do
it "evaluates the second conditions lazily with inclusive-end range" do
collector = proc { |i| ScratchPad << i }
- eval "10.times { |i| i if (i == 4)...collector[i] }"
+ 10.times { |i| i if (i == 4)...collector[i] }
ScratchPad.recorded.should == [5]
end
it "evaluates the second conditions lazily with exclusive-end range" do
collector = proc { |i| ScratchPad << i }
- eval "10.times { |i| i if (i == 4)..collector[i] }"
+ 10.times { |i| i if (i == 4)..collector[i] }
ScratchPad.recorded.should == [4]
end
it "scopes state by flip-flop" do
- store_me = eval("proc { |i| ScratchPad << i if (i == 4)..(i == 7) }")
+ store_me = proc { |i| ScratchPad << i if (i == 4)..(i == 7) }
store_me[1]
store_me[4]
proc { store_me[1] }.call
@@ -309,16 +306,57 @@ describe "The if expression" do
ScratchPad.recorded.should == [4, 5, 4, 5]
end
- ruby_version_is "2.6" do
- it 'is deprecated' do
- i = 4
+ 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
- -> do
- eval "ScratchPad << 'it works' if (i == 4)..(i == 7)"
- end.should complain(/flip-flop is deprecated/)
+ 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
- ScratchPad.recorded.should == ['it works']
+ 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