From ab26d27c2c9fd05e01b8dfacff85e9a988a830e8 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Fri, 2 Jan 2015 09:27:49 -0500 Subject: [PATCH] Tests demonstrating the issue from #572 and #454 and #370 and #213. --- test/xml/test_document.rb | 53 ++++++++++++++++++++++ test/xml/test_document_fragment.rb | 72 ++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/test/xml/test_document.rb b/test/xml/test_document.rb index 4a45806b91..96dbf630ef 100644 --- a/test/xml/test_document.rb +++ b/test/xml/test_document.rb @@ -947,6 +947,59 @@ def test_can_be_closed Nokogiri::XML f f.close end + + describe "css pseudoselector :last" do + attr_reader :html, :document + + before do + @html = '

Lorem ipsum

Second paragraph

Not paragraph
' + @document = Nokogiri::XML html + end + + it "works in #css" do + assert_equal(1, document.css('p:last').size) + end + + it "works in #search" do + assert_equal(1, document.search('p:last').size) + end + end + + describe "flavors of xpath search" do + # https://github.com/sparklemotion/nokogiri/issues/572 + attr_reader :xml, :document + + before do + @xml = <<-EOXML.strip + + + + + EOXML + @document = Nokogiri::XML::Document.parse xml + end + + [ + ['root', 1], + ['./root', 1], + ['.//root', 1], + ['.//*[@name="root_1"]', 1], + ['/root', 1], + ['/*[@name="root_1"]', 1], + ['//root', 1], + ['//*[@name="root_1"]', 1], + ['./root/descendant', 2], + ['.//descendant', 2], + ].each do |xpath, expected_n| + + it "returns expected results" do + actual_n = document.xpath(xpath).size + assert_equal(expected_n, actual_n, + "expected #{expected_n} results when searching with '#{xpath}', got #{actual_n}") + end + + end + end end end end diff --git a/test/xml/test_document_fragment.rb b/test/xml/test_document_fragment.rb index 8a36e87785..9761bb2bb8 100644 --- a/test/xml/test_document_fragment.rb +++ b/test/xml/test_document_fragment.rb @@ -254,6 +254,78 @@ def test_for_libxml_in_context_memory_badness_when_encountering_encoding_errors doc = Nokogiri::HTML html doc.at_css("div").replace("Bar") end + + describe "css pseudoselector :last" do + attr_reader :html, :fragment + + before do + @html = '

Lorem ipsum

Second paragraph

Not paragraph
' + @fragment = Nokogiri::XML.fragment html + end + + it "works in #css" do + assert_equal(1, fragment.css('p:last').size) + end + it "works in #search" do + assert_equal(1, fragment.search('p:last').size) + end + end + + describe "xpath search" do + # https://github.com/sparklemotion/nokogiri/issues/572 + attr_reader :xml, :fragment + + before do + @xml = <<-EOXML.strip + + + + + + + + + EOXML + end + + { + "on a fragment parsed in a node context" => lambda do |xml| + Nokogiri::XML::Document.new.fragment xml + end, + "on a bare fragment" => lambda do |xml| + Nokogiri::XML::Document.parse("").at_css("context").parse xml + end + }.each do |desc, factory| + + describe desc do + before do + @fragment = factory.call(xml) + end + + [ + ['root', 2], + ['./root', 2], + ['.//root', 2], + ['.//*[@name="root_1"]', 1], + ['/root', 2], + ['/*[@name="root_1"]', 1], + ['//root', 2], + ['//*[@name="root_1"]', 1], + ['./root/descendant', 4], + ['.//descendant', 4], + ].each do |xpath, expected_n| + + it "returns expected results" do + actual_n = fragment.xpath(xpath).length + assert_equal(expected_n, actual_n, + "expected #{expected_n} results when searching with '#{xpath}', got #{actual_n}") + end + + end + end # describe desc + + end + end end end end