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