[前][次][番号順一覧][スレッド一覧]

ruby-changes:50851

From: kou <ko1@a...>
Date: Mon, 2 Apr 2018 01:17:58 +0900 (JST)
Subject: [ruby-changes:50851] kou:r63057 (trunk): Start re-enabling Jaxen tests

kou	2018-04-02 01:17:52 +0900 (Mon, 02 Apr 2018)

  New Revision: 63057

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63057

  Log:
    Start re-enabling Jaxen tests
    
    [Bug #14600]
    Reported by MSP-Greg. Thanks!!!
    
    * lib/rexml/xpath_parser.rb: Fix a bug that "following_siblings::*[N]"
      doesn't work.
    
    * test/rexml/test_jaxen.rb: Enable only axis test for now.

  Modified files:
    trunk/lib/rexml/xpath_parser.rb
    trunk/test/rexml/test_jaxen.rb
Index: lib/rexml/xpath_parser.rb
===================================================================
--- lib/rexml/xpath_parser.rb	(revision 63056)
+++ lib/rexml/xpath_parser.rb	(revision 63057)
@@ -321,9 +321,10 @@ module REXML https://github.com/ruby/ruby/blob/trunk/lib/rexml/xpath_parser.rb#L321
             all_siblings = node.parent.children
             current_index = all_siblings.index( node )
             following_siblings = all_siblings[ current_index+1 .. -1 ]
-            results += expr( path_stack.dclone, following_siblings )
+            results += following_siblings
           end
           nodeset = results
+          node_types = ELEMENTS
 
         when :preceding_sibling
           results = []
Index: test/rexml/test_jaxen.rb
===================================================================
--- test/rexml/test_jaxen.rb	(revision 63056)
+++ test/rexml/test_jaxen.rb	(revision 63057)
@@ -12,119 +12,117 @@ module REXMLTests https://github.com/ruby/ruby/blob/trunk/test/rexml/test_jaxen.rb#L12
     include REXMLTestUtils
     include REXML
 
-    def test_axis ; test("axis") ; end
-    def test_basic ; test("basic") ; end
-    def test_basicupdate ; test("basicupdate") ; end
-    def test_contents ; test("contents") ; end
-    def test_defaultNamespace ; test("defaultNamespace") ; end
-    def test_fibo ; test("fibo") ; end
-    def test_id ; test("id") ; end
-    def test_jaxen24 ; test("jaxen24") ; end
-    def test_lang ; test("lang") ; end
-    def test_message ; test("message") ; end
-    def test_moreover ; test("moreover") ; end
-    def test_much_ado ; test("much_ado") ; end
-    def test_namespaces ; test("namespaces") ; end
-    def test_nitf ; test("nitf") ; end
-    def test_numbers ; test("numbers") ; end
-    def test_pi ; test("pi") ; end
-    def test_pi2 ; test("pi2") ; end
-    def test_simple ; test("simple") ; end
-    def test_testNamespaces ; test("testNamespaces") ; end
-    def test_text ; test("text") ; end
-    def test_underscore ; test("underscore") ; end
-    def test_web ; test("web") ; end
-    def test_web2 ; test("web2") ; end
+    def test_axis ; process_test_case("axis") ; end
+    def _test_basic ; process_test_case("basic") ; end
+    def _test_basicupdate ; process_test_case("basicupdate") ; end
+    def _test_contents ; process_test_case("contents") ; end
+    def _test_defaultNamespace ; process_test_case("defaultNamespace") ; end
+    def _test_fibo ; process_test_case("fibo") ; end
+    def _test_id ; process_test_case("id") ; end
+    def _test_jaxen24 ; process_test_case("jaxen24") ; end
+    def _test_lang ; process_test_case("lang") ; end
+    def _test_message ; process_test_case("message") ; end
+    def _test_moreover ; process_test_case("moreover") ; end
+    def _test_much_ado ; process_test_case("much_ado") ; end
+    def _test_namespaces ; process_test_case("namespaces") ; end
+    def _test_nitf ; process_test_case("nitf") ; end
+    def _test_numbers ; process_test_case("numbers") ; end
+    def _test_pi ; process_test_case("pi") ; end
+    def _test_pi2 ; process_test_case("pi2") ; end
+    def _test_simple ; process_test_case("simple") ; end
+    def _test_testNamespaces ; process_test_case("testNamespaces") ; end
+    def _test_text ; process_test_case("text") ; end
+    def _test_underscore ; process_test_case("underscore") ; end
+    def _test_web ; process_test_case("web") ; end
+    def _test_web2 ; process_test_case("web2") ; end
 
     private
-    def test( fname )
-#      Dir.entries( xml_dir ).each { |fname|
-#        if fname =~ /\.xml$/
-          doc = File.open(fixture_path(fname+".xml")) do |file|
-            Document.new(file)
-          end
-          XPath.each( doc, "/tests/document" ) {|e| handleDocument(e)}
-#        end
-#      }
+    def process_test_case(name)
+      xml_path = "#{name}.xml"
+      doc = File.open(fixture_path(xml_path)) do |file|
+        Document.new(file)
+      end
+      test_doc = File.open(fixture_path("test/tests.xml")) do |file|
+        Document.new(file)
+      end
+      XPath.each(test_doc,
+                 "/tests/document[@url='xml/#{xml_path}']/context") do |context|
+        process_context(doc, context)
+      end
     end
 
     # processes a tests/document/context node
-    def handleContext( testDoc, ctxElement)
-      testCtx = XPath.match( testDoc, ctxElement.attributes["select"] )[0]
-      namespaces = {}
-      if testCtx.class == Element
-        testCtx.prefixes.each { |pre| handleNamespace( testCtx, pre, namespaces ) }
-      end
+    def process_context(doc, context)
+      test_context = XPath.match(doc, context.attributes["select"])
+      namespaces = context.namespaces
       variables = {}
-      XPath.each( ctxElement, "@*[namespace-uri() = 'http://jaxen.org/test-harness/var']") { |attrib| handleVariable(testCtx, variables, attrib) }
-      XPath.each( ctxElement, "valueOf") { |e| handleValueOf(testCtx, variables, namespaces, e) }
-      XPath.each( ctxElement, "test[not(@exception) or (@exception != 'true') ]") { |e| handleNominalTest(testCtx,variables, namespaces, e) }
-      XPath.each( ctxElement, "test[@exception = 'true']") { |e| handleExceptionalTest(testCtx,variables, namespaces, e) }
+      var_namespace = "http://jaxen.org/test-harness/var"
+      XPath.each(context,
+                 "@*[namespace-uri() = '#{var_namespace}']") do |attribute|
+        variables[attribute.name] = attribute.value
+      end
+      XPath.each(context, "valueOf") do |value|
+        process_value_of(test_context, variables, namespaces, value)
+      end
+      XPath.each(context,
+                 "test[not(@exception) or (@exception != 'true')]") do |test|
+        process_nominal_test(test_context, variables, namespaces, test)
+      end
+      XPath.each(context,
+                 "test[@exception = 'true']") do |test|
+        process_exceptional_test(test_context, variables, namespaces, test)
+      end
     end
 
     # processes a tests/document/context/valueOf or tests/document/context/test/valueOf node
-    def handleValueOf(ctx,variables, namespaces, valueOfElement)
-      expected = valueOfElement.text
-      got = XPath.match( ctx, valueOfElement.attributes["select"], namespaces, variables )[0]
-      assert_true( (got.nil? && expected.nil?) || !got.nil? )
-      case got.class
-      when Element
-        assert_equal( got.class, Element )
-      when Attribute, Text, Comment, TrueClass, FalseClass
-        assert_equal( expected, got.to_s )
-      when Instruction
-        assert_equal( expected, got.content )
-      when Integer
-        assert_equal( exected.to_f, got )
-      when String
-        # normalize values for comparison
-        got = "" if got == nil or got == ""
-        expected = "" if expected == nil or expected == ""
-        assert_equal( expected, got )
+    def process_value_of(context, variables, namespaces, value_of)
+      expected = value_of.text
+      matched = XPath.first(context,
+                            value_of.attributes["select"],
+                            namespaces,
+                            variables)
+      if expected.nil?
+        assert_nil(matched)
       else
-        assert_fail( "Wassup?" )
+        case matched
+        when Element
+          assert_equal(expected, matched.name)
+        when Attribute, Text, Comment, TrueClass, FalseClass
+          assert_equal(expected, matched.to_s)
+        when Instruction
+          assert_equal(expected, matched.content)
+        when Integer
+          assert_equal(exected.to_f, matched)
+        when String
+          assert_equal(expected, matched)
+        else
+          flunk("Unexpected match value: <#{matched.inspect}>")
+        end
       end
     end
 
-
     # processes a tests/document/context/test node ( where @exception is false or doesn't exist )
-    def handleNominalTest(ctx, variables, namespaces, testElement)
-      expected = testElement.attributes["count"]
-      got = XPath.match( ctx, testElement.attributes["select"], namespaces, variables )
+    def process_nominal_test(context, variables, namespaces, test)
+      select = test.attributes["select"]
+      matched = XPath.match(context, select, namespaces, variables)
       # might be a test with no count attribute, but nested valueOf elements
-      assert( expected == got.size.to_s ) if !expected.nil?
+      expected = test.attributes["count"]
+      if expected
+        assert_equal(Integer(expected, 10),
+                     matched.size)
+      end
 
-      XPath.each( testElement, "valueOf") { |e|
-        handleValueOf(got, variables, namespaces, e)
-      }
+      XPath.each(test, "valueOf") do |value_of|
+        process_value_of(mathched, variables, namespaces, value_of)
+      end
     end
 
     # processes a tests/document/context/test node ( where @exception is true )
-    def handleExceptionalTest(ctx, variables, namespaces, testElement)
-      assert_raise( Exception ) {
-        XPath.match( ctx, testElement.attributes["select"], namespaces, variables )
-      }
-    end
-
-    # processes a tests/document node
-    def handleDocument(docElement)
-      puts "- Processing document: #{docElement.attributes['url']}"
-      testFile = File.new( docElement.attributes["url"] )
-      testDoc = Document.new testFile
-      XPath.each( docElement, "context") { |e| handleContext(testDoc, e) }
-    end
-
-    # processes a variable definition in a namespace like <test var:foo="bar">
-    def handleVariable( ctx, variables, attrib )
-      puts "--- Found attribute: #{attrib.name}"
-      variables[attrib.name] = attrib.value
-    end
-
-    # processes a namespace definition like <test xmlns:foo="fiz:bang:bam">
-    def handleNamespace( ctx, prefix, namespaces )
-      puts "--- Found namespace: #{prefix}"
-      namespaces[prefix] = ctx.namespaces[prefix]
+    def process_exceptional_test(context, variables, namespaces, test)
+      select = test.attributes["select"]
+      assert_raise do
+        XPath.match(context, select, namespaces, variables)
+      end
     end
-
   end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]