diff --git a/lib/capybara/node/matchers.rb b/lib/capybara/node/matchers.rb index e90f9336..cfadcd30 100644 --- a/lib/capybara/node/matchers.rb +++ b/lib/capybara/node/matchers.rb @@ -37,11 +37,21 @@ module Capybara wait_conditionally_until do results = all(*args) - if options[:count] - results.size == options[:count] + return false if results.empty? + + case + when options[:between] + options[:between] === results.size + when options[:count] + options[:count] == results.size + when options[:maximum] + options[:maximum] >= results.size + when options[:minimum] + options[:minimum] <= results.size else results.size > 0 end + end rescue Capybara::TimeoutError return false @@ -60,11 +70,21 @@ module Capybara wait_conditionally_until do results = all(*args) - if options[:count] - results.size != options[:count] + return true if results.empty? + + case + when options[:between] + not(options[:between] === results.size) + when options[:count] + not(options[:count] == results.size) + when options[:maximum] + not(options[:maximum] >= results.size) + when options[:minimum] + not(options[:minimum] <= results.size) else results.empty? end + end rescue Capybara::TimeoutError return false diff --git a/lib/capybara/spec/session/has_css_spec.rb b/lib/capybara/spec/session/has_css_spec.rb index ca5cb07b..57c36548 100644 --- a/lib/capybara/spec/session/has_css_spec.rb +++ b/lib/capybara/spec/session/has_css_spec.rb @@ -22,13 +22,30 @@ shared_examples_for "has_css" do end end + context "with between" do + it "should be true if the content occurs within the range given" do + @session.should have_css("p", :between => 1..4) + @session.should have_css("p a#foo", :between => 1..3) + end + + it "should be false if the content occurs more or fewer times than range" do + @session.should_not have_css("p", :between => 6..11 ) + @session.should_not have_css("p a#foo", :between => 4..7) + end + + it "should be false if the content isn't on the page at all" do + @session.should_not have_css("abbr", :between => 1..8) + @session.should_not have_css("p a.doesnotexist", :between => 3..8) + end + end + context "with count" do it "should be true if the content is on the page the given number of times" do @session.should have_css("p", :count => 3) @session.should have_css("p a#foo", :count => 1) end - it "should be false if the content is on the page the given number of times" do + it "should be false if the content occurs the given number of times" do @session.should_not have_css("p", :count => 6) @session.should_not have_css("p a#foo", :count => 2) end @@ -39,6 +56,42 @@ shared_examples_for "has_css" do end end + context "with maximum" do + it "should be true when content occurs same or fewer times than given" do + @session.should have_css("h2.head", :maximum => 5) # edge case + @session.should have_css("h2", :maximum => 10) + end + + it "should be false when content occurs more times than given" do + @session.should_not have_css("h2.head", :maximum => 4) # edge case + @session.should_not have_css("h2", :maximum => 6) + @session.should_not have_css("p", :maximum => 1) + end + + it "should be false if the content isn't on the page at all" do + @session.should_not have_css("abbr", :maximum => 2) + @session.should_not have_css("p a.doesnotexist", :maximum => 1) + end + end + + context "with minimum" do + it "should be true when content occurs same or more times than given" do + @session.should have_css("h2.head", :minimum => 5) # edge case + @session.should have_css("h2", :minimum => 3) + end + + it "should be false when content occurs fewer times than given" do + @session.should_not have_css("h2.head", :minimum => 6) # edge case + @session.should_not have_css("h2", :minimum => 8) + @session.should_not have_css("p", :minimum => 10) + end + + it "should be false if the content isn't on the page at all" do + @session.should_not have_css("abbr", :minimum => 2) + @session.should_not have_css("p a.doesnotexist", :minimum => 7) + end + end + context "with text" do it "should discard all matches where the given string is not contained" do @session.should have_css("p a", :text => "Redirect", :count => 1) @@ -75,6 +128,23 @@ shared_examples_for "has_css" do end end + context "with between" do + it "should be false if the content occurs within the range given" do + @session.should_not have_no_css("p", :between => 1..4) + @session.should_not have_no_css("p a#foo", :between => 1..3) + end + + it "should be true if the content occurs more or fewer times than range" do + @session.should have_no_css("p", :between => 6..11 ) + @session.should have_no_css("p a#foo", :between => 4..7) + end + + it "should be true if the content isn't on the page at all" do + @session.should have_no_css("abbr", :between => 1..8) + @session.should have_no_css("p a.doesnotexist", :between => 3..8) + end + end + context "with count" do it "should be false if the content is on the page the given number of times" do @session.should_not have_no_css("p", :count => 3) @@ -92,6 +162,42 @@ shared_examples_for "has_css" do end end + context "with maximum" do + it "should be false when content occurs same or fewer times than given" do + @session.should_not have_no_css("h2.head", :maximum => 5) # edge case + @session.should_not have_no_css("h2", :maximum => 10) + end + + it "should be true when content occurs more times than given" do + @session.should have_no_css("h2.head", :maximum => 4) # edge case + @session.should have_no_css("h2", :maximum => 6) + @session.should have_no_css("p", :maximum => 1) + end + + it "should be true if the content isn't on the page at all" do + @session.should have_no_css("abbr", :maximum => 5) + @session.should have_no_css("p a.doesnotexist", :maximum => 10) + end + end + + context "with minimum" do + it "should be false when content occurs more times than given" do + @session.should_not have_no_css("h2.head", :minimum => 4) # edge case + @session.should_not have_no_css("h2", :minimum => 3) + end + + it "should be true when content occurs fewer times than given" do + @session.should have_no_css("h2.head", :minimum => 6) # edge case + @session.should have_no_css("h2", :minimum => 8) + @session.should have_no_css("p", :minimum => 15) + end + + it "should be true if the content isn't on the page at all" do + @session.should have_no_css("abbr", :minimum => 5) + @session.should have_no_css("p a.doesnotexist", :minimum => 10) + end + end + context "with text" do it "should discard all matches where the given string is not contained" do @session.should_not have_no_css("p a", :text => "Redirect", :count => 1) diff --git a/lib/capybara/spec/views/with_html.erb b/lib/capybara/spec/views/with_html.erb index 829780b0..7549fbc0 100644 --- a/lib/capybara/spec/views/with_html.erb +++ b/lib/capybara/spec/views/with_html.erb @@ -1,6 +1,14 @@
+
+ +Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, @@ -9,7 +17,7 @@
-+
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat Redirect pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia