module Rails::Dom::Testing::Assertions::SelectorAssertions

def assert_dom(*args, &block)

end
assert_dom ":match('name', ?)", /.+/ # Not empty
assert_dom "form input" do
# All input fields in the form have a name

assert_dom "ol>li:match('id', ?)", /item-\d+/
# Use substitution values

assert_dom "body div.header ul.menu"
# Test the content and style

assert_dom "form", false, "This page must contain no forms"
# Page contains no forms

"Wrong title or more than one title element"
assert_dom "title", {count: 1, text: "Welcome"},
# Page title is "Welcome" and there is only one title element

assert_dom "title", "Welcome"
# Page title is "Welcome"

assert_dom "form input", 4
# Form element includes four input fields

assert_dom "form"
# At least one form element

evaluated the block is called with an array of all matched elements.
If the method is called with a block, once all equality tests are

elements is at most this value.
* :maximum - Assertion is true if the number of selected
elements is at least this value.
* :minimum - Assertion is true if the number of selected
is equal to this value.
* :count - Assertion is true if the number of selected elements
content (string or regexp).
* :html - Narrow the selection to elements that have this HTML
value (string or regexp).
* :text - Narrow the selection to elements that have this text
To perform more than one equality tests, use a hash with the following keys:

element selected.
If no equality test specified, the assertion is true if at least one
elements fit the range.
* Range - Assertion is true if the number of selected
elements are selected.
* Integer - Assertion is true if exactly that number of
one element matches the string or regular expression.
* String/Regexp - Assertion is true if the text value of at least
* false - Assertion is true if no element selected.
* true - Assertion is true if at least one element selected.
The equality test may be one of the following:

=== Equality Tests

assert_dom "div:match('id', ?)", /\d+/
assert_dom "div:match('id', ?)", 1
assert_dom "div:match('id', ?)", :id_string
assert_dom "div:match('id', ?)", "id_string"

assert_dom returns nil if called with an invalid css selector.
Substitution uses a custom pseudo class match. Pass in whatever attribute you want to match (enclosed in quotes) and a ? for the substitution.
with substitution values (Array).
The selector may be a CSS selector expression (String, Symbol, or Numeric) or an expression

end
assert_dom "li", 8
assert_dom "ol" do
will pass, as will:

end
end
assert_dom element, "li", 4
elements.each do |element|
assert_dom "ol" do |elements|
If the response contains two ordered lists, each with four list elements then:
==== Example


separately for each element.
Alternatively the array may be iterated through so that +assert_dom+ can be called
runs the assertion on the complete set of elements selected by the enclosing assertion.
to the block. Calling +assert_dom+ from the block, with no element specified,
When called with a block +assert_dom+ passes an array of selected elements

The default implementation raises an exception explaining this.
Override +document_root_element+ to tell +assert_dom+ what to select from.
unless +assert_dom+ is called from within an +assert_dom+ block.
the element returned in +document_root_element+
If no element is specified +assert_dom+ selects from

depth-first order.
starting from (and including) that element and all its children in
If the first argument is an element, selects all matching elements

An assertion that selects elements and makes one or more equality tests.
def assert_dom(*args, &block)
  @selected ||= nil
  selector = HTMLSelector.new(args, @selected) { nodeset document_root_element }
  if selector.selecting_no_body?
    assert true
    return
  end
  selector.select.tap do |matches|
    assert_size_match!(matches.size, selector.tests,
      selector.css_selector, selector.message)
    nest_selection(matches, &block) if block_given? && !matches.empty?
  end
end