Rewrote XPath evaluator paths spec.
This is the first spec of many that will be re-written. Eventually this will remove the need of the shared examples as well as removing lots of code duplication and odd context blocks.
This commit is contained in:
parent
857ac517d5
commit
3893e56ca8
|
@ -1,101 +1,47 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Oga::XPath::Evaluator do
|
describe Oga::XPath::Evaluator do
|
||||||
before do
|
context 'paths' do
|
||||||
@document = parse('<a xmlns:ns1="x">Foo<b></b><b></b><ns1:c></ns1:c></a>')
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'absolute paths' do
|
|
||||||
before do
|
before do
|
||||||
@set = described_class.new(@document).evaluate('/a')
|
@document = parse('<a xmlns:ns1="x">Foo<b></b><b></b><ns1:c></ns1:c></a>')
|
||||||
|
|
||||||
|
@a1 = @document.children[0]
|
||||||
|
@b1 = @a1.children[1]
|
||||||
|
@b2 = @a1.children[2]
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 1
|
example 'evaluate an absolute path' do
|
||||||
|
evaluate_xpath(@document, '/a').should == node_set(@a1)
|
||||||
example 'return the correct nodes' do
|
|
||||||
@set[0].should == @document.children[0]
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
context 'absolute paths from an element' do
|
example 'evaluate an absolute path relative to a sub node' do
|
||||||
before do
|
|
||||||
b_node = @document.children[0].children[0]
|
b_node = @document.children[0].children[0]
|
||||||
@set = described_class.new(b_node).evaluate('/a')
|
|
||||||
|
evaluate_xpath(b_node, '/a').should == node_set(@a1)
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 1
|
example 'evaluate the root selector' do
|
||||||
|
evaluate_xpath(@document, '/').should == node_set(@document)
|
||||||
example 'return the correct nodes' do
|
|
||||||
@set[0].should == @document.children[0]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'absolute paths without node tests' do
|
|
||||||
before do
|
|
||||||
@set = described_class.new(@document).evaluate('/')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 1
|
example 'evaluate a relative path' do
|
||||||
|
evaluate_xpath(@document, 'a').should == node_set(@a1)
|
||||||
example 'return the root document' do
|
|
||||||
@set[0].is_a?(Oga::XML::Document).should == true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'invalid absolute paths' do
|
|
||||||
before do
|
|
||||||
@set = described_class.new(@document).evaluate('/x/a')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 0
|
example 'evaluate a relative path that returns an empty node set' do
|
||||||
end
|
evaluate_xpath(@document, 'x/a').should == node_set
|
||||||
|
|
||||||
context 'relative paths' do
|
|
||||||
before do
|
|
||||||
@set = described_class.new(@document).evaluate('a')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 1
|
example 'evaluate a nested absolute path' do
|
||||||
|
evaluate_xpath(@document, '/a/b').should == node_set(@b1, @b2)
|
||||||
example 'return the correct nodes' do
|
|
||||||
@set[0].should == @document.children[0]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'invalid relative paths' do
|
|
||||||
before do
|
|
||||||
@set = described_class.new(@document).evaluate('x/a')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 0
|
example 'evaluate an absolute path that returns an empty node set' do
|
||||||
end
|
evaluate_xpath(@document, '/x/a').should == node_set
|
||||||
|
|
||||||
context 'nested paths' do
|
|
||||||
before do
|
|
||||||
@set = described_class.new(@document).evaluate('/a/b')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 2
|
example 'evaluate a namespaced path' do
|
||||||
|
evaluate_xpath(@document, 'a/ns1:c').should == node_set(@a1.children[-1])
|
||||||
example 'return the correct nodes' do
|
|
||||||
a = @document.children[0]
|
|
||||||
|
|
||||||
@set[0].should == a.children[1]
|
|
||||||
@set[1].should == a.children[2]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'namespaced paths' do
|
|
||||||
before do
|
|
||||||
@set = described_class.new(@document).evaluate('a/ns1:c')
|
|
||||||
end
|
|
||||||
|
|
||||||
it_behaves_like :node_set, :length => 1
|
|
||||||
|
|
||||||
example 'return the correct row' do
|
|
||||||
a = @document.children[0]
|
|
||||||
|
|
||||||
@set[0].should == a.children[-1]
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
module Oga
|
module Oga
|
||||||
module EvaluationHelpers
|
module EvaluationHelpers
|
||||||
|
##
|
||||||
|
# @param [Oga::XML::Document] document
|
||||||
|
# @param [String] xpath
|
||||||
|
# @return [Oga::XML::NodeSet]
|
||||||
|
#
|
||||||
|
def evaluate_xpath(document, xpath)
|
||||||
|
return Oga::XPath::Evaluator.new(document).evaluate(xpath)
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Parses and evaluates a CSS expression.
|
# Parses and evaluates a CSS expression.
|
||||||
#
|
#
|
||||||
|
|
|
@ -11,6 +11,13 @@ module Oga
|
||||||
return AST::Node.new(type, children)
|
return AST::Node.new(type, children)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# @see [Oga::XML::NodeSet#initialize]
|
||||||
|
#
|
||||||
|
def node_set(*args)
|
||||||
|
return Oga::XML::NodeSet.new(args)
|
||||||
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
# Lexes a string and returns the tokens.
|
# Lexes a string and returns the tokens.
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue