summaryrefslogtreecommitdiff
path: root/test/rexml/xpath/test_predicate.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/rexml/xpath/test_predicate.rb')
-rw-r--r--test/rexml/xpath/test_predicate.rb80
1 files changed, 80 insertions, 0 deletions
diff --git a/test/rexml/xpath/test_predicate.rb b/test/rexml/xpath/test_predicate.rb
new file mode 100644
index 0000000..5c196b9
--- /dev/null
+++ b/test/rexml/xpath/test_predicate.rb
@@ -0,0 +1,80 @@
+require "test/unit/testcase"
+require "rexml/document"
+require "rexml/xpath"
+require "rexml/parsers/xpathparser"
+
+class TestXPathPredicate < Test::Unit::TestCase
+ include REXML
+ SRC=<<-EOL
+ <article>
+ <section role="subdivision" id="1">
+ <para>free flowing text.</para>
+ </section>
+ <section role="division">
+ <section role="subdivision" id="2">
+ <para>free flowing text.</para>
+ </section>
+ <section role="division">
+ <para>free flowing text.</para>
+ </section>
+ </section>
+ </article>
+ EOL
+
+ def setup
+ @doc = REXML::Document.new( SRC )
+ @parser = REXML::Parsers::XPathParser.new
+
+ end
+
+ def test_predicates_parent
+ path = '//section[../self::section[@role="division"]]'
+ m = do_path( path )
+ assert_equal( 2, m.size )
+ assert_equal( "2", m[0].attributes["id"] )
+ assert_nil( m[1].attributes["id"] )
+ end
+
+ def test_predicates_single
+ path = '//section[@role="subdivision" and not(../self::section[@role="division"])]'
+ m = do_path( path )
+ assert_equal( 1, m.size )
+ assert_equal( "1", m[0].attributes["id"] )
+ end
+
+ def test_predicates_multi
+ path = '//section[@role="subdivision"][not(../self::section[@role="division"])]'
+ m = do_path( path )
+ assert_equal( 1, m.size )
+ assert_equal( "1", m[0].attributes["id"] )
+ end
+
+ def do_path( path )
+ m = REXML::XPath.match( @doc, path )
+ #puts path, @parser.parse( path ).inspect
+ return m
+ end
+
+ def test_get_no_siblings_terminal_nodes
+ source = <<-XML
+<a>
+ <b number='1' str='abc'>TEXT1</b>
+ <c number='1'/>
+ <c number='2' str='def'>
+ <b number='3'/>
+ <d number='1' str='abc'>TEXT2</d>
+ <b number='2'><!--COMMENT--></b>
+ </c>
+</a>
+XML
+ doc = REXML::Document.new(source)
+ predicate = "count(child::node()|" +
+ "following-sibling::node()|" +
+ "preceding-sibling::node())=0"
+ m = REXML::XPath.match(doc, "/descendant-or-self::node()[#{predicate}]")
+ assert_equal( [REXML::Text.new("TEXT1"),
+ REXML::Text.new("TEXT2"),
+ REXML::Comment.new("COMMENT")],
+ m )
+ end
+end