diff options
Diffstat (limited to 'spec/rubyspec/language/case_spec.rb')
| -rw-r--r-- | spec/rubyspec/language/case_spec.rb | 382 |
1 files changed, 0 insertions, 382 deletions
diff --git a/spec/rubyspec/language/case_spec.rb b/spec/rubyspec/language/case_spec.rb deleted file mode 100644 index cb0e8150bf..0000000000 --- a/spec/rubyspec/language/case_spec.rb +++ /dev/null @@ -1,382 +0,0 @@ -require File.expand_path('../../spec_helper', __FILE__) - -describe "The 'case'-construct" do - it "evaluates the body of the when clause matching the case target expression" do - case 1 - when 2; false - when 1; true - end.should == true - end - - it "evaluates the body of the when clause whose array expression includes the case target expression" do - case 2 - when 3, 4; false - when 1, 2; true - end.should == true - end - - it "evaluates the body of the when clause in left-to-right order if it's an array expression" do - @calls = [] - def foo; @calls << :foo; end - def bar; @calls << :bar; end - - case true - when foo, bar; - end - - @calls.should == [:foo, :bar] - end - - it "evaluates the body of the when clause whose range expression includes the case target expression" do - case 5 - when 21..30; false - when 1..20; true - end.should == true - end - - it "returns nil when no 'then'-bodies are given" do - case "a" - when "a" - when "b" - end.should == nil - end - - it "evaluates the 'else'-body when no other expression matches" do - case "c" - when "a"; 'foo' - when "b"; 'bar' - else 'zzz' - end.should == 'zzz' - end - - it "returns nil when no expression matches and 'else'-body is empty" do - case "c" - when "a"; "a" - when "b"; "b" - else - end.should == nil - end - - it "returns 2 when a then body is empty" do - case Object.new - when Numeric then - 1 - when String then - # ok - else - 2 - end.should == 2 - end - - it "returns the statement following 'then'" do - case "a" - when "a" then 'foo' - when "b" then 'bar' - end.should == 'foo' - end - - it "tests classes with case equality" do - case "a" - when String - 'foo' - when Symbol - 'bar' - end.should == 'foo' - end - - it "tests with matching regexps" do - case "hello" - when /abc/; false - when /^hell/; true - end.should == true - end - - it "does not test with equality when given classes" do - case :symbol.class - when Symbol - "bar" - when String - "bar" - else - "foo" - end.should == "foo" - end - - it "takes lists of values" do - case 'z' - when 'a', 'b', 'c', 'd' - "foo" - when 'x', 'y', 'z' - "bar" - end.should == "bar" - - case 'b' - when 'a', 'b', 'c', 'd' - "foo" - when 'x', 'y', 'z' - "bar" - end.should == "foo" - end - - it "expands arrays to lists of values" do - case 'z' - when *['a', 'b', 'c', 'd'] - "foo" - when *['x', 'y', 'z'] - "bar" - end.should == "bar" - end - - it "takes an expanded array in addition to a list of values" do - case 'f' - when 'f', *['a', 'b', 'c', 'd'] - "foo" - when *['x', 'y', 'z'] - "bar" - end.should == "foo" - - case 'b' - when 'f', *['a', 'b', 'c', 'd'] - "foo" - when *['x', 'y', 'z'] - "bar" - end.should == "foo" - end - - it "takes an expanded array before additional listed values" do - case 'f' - when *['a', 'b', 'c', 'd'], 'f' - "foo" - when *['x', 'y', 'z'] - "bar" - end.should == 'foo' - end - - it "expands arrays from variables before additional listed values" do - a = ['a', 'b', 'c'] - case 'a' - when *a, 'd', 'e' - "foo" - when 'x' - "bar" - end.should == "foo" - end - - it "expands arrays from variables before a single additional listed value" do - a = ['a', 'b', 'c'] - case 'a' - when *a, 'd' - "foo" - when 'x' - "bar" - end.should == "foo" - end - - it "expands multiple arrays from variables before additional listed values" do - a = ['a', 'b', 'c'] - b = ['d', 'e', 'f'] - - case 'f' - when *a, *b, 'g', 'h' - "foo" - when 'x' - "bar" - end.should == "foo" - end - - # MR: critical - it "concats arrays before expanding them" do - a = ['a', 'b', 'c', 'd'] - b = ['f'] - - case 'f' - when 'f', *a|b - "foo" - when *['x', 'y', 'z'] - "bar" - end.should == "foo" - end - - it "never matches when clauses with no values" do - case nil - when *[] - "foo" - end.should == nil - end - - it "lets you define a method after the case statement" do - case (def foo; 'foo'; end; 'f') - when 'a' - 'foo' - when 'f' - 'bar' - end.should == 'bar' - end - - it "raises a SyntaxError when 'else' is used when no 'when' is given" do - lambda { - eval <<-CODE - case 4 - else - true - end - CODE - }.should raise_error(SyntaxError) - end - - it "raises a SyntaxError when 'else' is used before a 'when' was given" do - lambda { - eval <<-CODE - case 4 - else - true - when 4; false - end - CODE - }.should raise_error(SyntaxError) - end - - it "supports nested case statements" do - result = false - case :x - when Symbol - case :y - when Symbol - result = true - end - end - result.should == true - end - - it "supports nested case statements followed by a when with a splatted array" do - result = false - case :x - when Symbol - case :y - when Symbol - result = true - end - when *[Symbol] - result = false - end - result.should == true - end - - it "supports nested case statements followed by a when with a splatted non-array" do - result = false - case :x - when Symbol - case :y - when Symbol - result = true - end - when *Symbol - result = false - end - result.should == true - end - - it "works even if there's only one when statement" do - case 1 - when 1 - 100 - end.should == 100 - end -end - -describe "The 'case'-construct with no target expression" do - it "evaluates the body of the first clause when at least one of its condition expressions is true" do - case - when true, false; 'foo' - end.should == 'foo' - end - - it "evaluates the body of the first when clause that is not false/nil" do - case - when false; 'foo' - when 2; 'bar' - when 1 == 1; 'baz' - end.should == 'bar' - - case - when false; 'foo' - when nil; 'foo' - when 1 == 1; 'bar' - end.should == 'bar' - end - - it "evaluates the body of the else clause if all when clauses are false/nil" do - case - when false; 'foo' - when nil; 'foo' - when 1 == 2; 'bar' - else 'baz' - end.should == 'baz' - end - - it "evaluates multiple conditional expressions as a boolean disjunction" do - case - when true, false; 'foo' - else 'bar' - end.should == 'foo' - - case - when false, true; 'foo' - else 'bar' - end.should == 'foo' - end - - it "evaluates true as only 'true' when true is the first clause" do - case 1 - when true; "bad" - when Integer; "good" - end.should == "good" - end - - it "evaluates false as only 'false' when false is the first clause" do - case nil - when false; "bad" - when nil; "good" - end.should == "good" - end - - it "treats a literal array as its own when argument, rather than a list of arguments" do - case 'foo' - when ['foo', 'foo']; 'bad' - when 'foo'; 'good' - end.should == 'good' - end - - it "takes multiple expanded arrays" do - a1 = ['f', 'o', 'o'] - a2 = ['b', 'a', 'r'] - - case 'f' - when *a1, *['x', 'y', 'z'] - "foo" - when *a2, *['x', 'y', 'z'] - "bar" - end.should == "foo" - - case 'b' - when *a1, *['x', 'y', 'z'] - "foo" - when *a2, *['x', 'y', 'z'] - "bar" - end.should == "bar" - end - - it "calls === even when private" do - klass = Class.new do - def ===(o) - true - end - private :=== - end - - case 1 - when klass.new - :called - end.should == :called - end -end |
