#
# tests/namespace.rb
#
# Copyright (C) UENO Katsuhiro 2002
#
# $Id: testnamespace.rb,v 1.9.2.1 2003/02/28 12:35:17 katsu Exp $
#
require 'test/unit'
require 'deftestcase'
require 'xmlscan/namespace'
require 'visitor'
class TestXMLNamespace < Test::Unit::TestCase
include DefTestCase
class Visitor < RecordingVisitor.new_class(XMLScan::NSVisitor)
def on_stag_end_ns(qname, ns)
super qname, ns.dup
end
def on_stag_end_empty_ns(qname, ns)
super qname, ns.dup
end
end
private
def setup
@v = Visitor.new
@s = XMLScan::XMLParserNS.new(@v)
end
def parse(src)
@s.parse src
@v.result
end
NS_XML = 'http://www.w3.org/XML/1998/namespace'
NS_XMLNS = 'http://www.w3.org/2000/xmlns/'
public
deftestcase 'default', <<-'TESTCASEEND'
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {''=>'fuga'} ]
[ :on_etag, 'hoge' ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {} ]
[ :on_etag, 'hoge' ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'foo', nil, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'foo', nil, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :ns_wellformed_error, "xmlns includes undeclared entity reference" ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'fua'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {''=>'foo'} ]
[ :on_stag_ns, 'fuga', '', 'fuga' ]
[ :on_stag_end_empty_ns, 'fuga', {''=>'foo'} ]
[ :on_etag, 'hoge' ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {''=>'foo'} ]
[ :on_stag_ns, 'fuga', '', 'fuga' ]
[ :on_stag_end_empty_ns, 'fuga', {''=>'bar'} ]
[ :on_stag_ns, 'moga', '', 'moga' ]
[ :on_stag_end_empty_ns, 'moga', {''=>'foo'} ]
[ :on_etag, 'hoge' ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {''=>'foo'} ]
[ :on_stag_ns, 'fuga', '', 'fuga' ]
[ :on_stag_end_ns, 'fuga', {''=>nil} ]
[ :on_stag_ns, 'moga', '', 'moga' ]
[ :on_stag_end_empty_ns, 'moga', {''=>nil} ]
[ :on_etag, 'fuga' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'prefix', <<-'TESTCASEEND'
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :ns_wellformed_error, "prefix `foo' is not declared" ]
[ :on_stag_end_ns, 'foo:hoge', {} ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :ns_wellformed_error, "prefix `foo' is not declared" ]
[ :on_stag_end_empty_ns, 'foo:hoge', {} ]
''
[ :ns_parse_error, "localpart `hoge:fuga' includes `:'" ]
[ :on_stag_ns, 'foo:hoge:fuga', 'foo', 'hoge:fuga' ]
[ :ns_wellformed_error, "prefix `foo' is not declared" ]
[ :on_stag_end_empty_ns, 'foo:hoge:fuga', {} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_attribute_ns, 'foo', nil, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_attribute_ns, 'foo', nil, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
''
[ :on_stag_ns, 'bar:hoge', 'bar', 'hoge' ]
[ :ns_wellformed_error, "prefix `bar' is not declared" ]
[ :on_stag_end_empty_ns, 'bar:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :ns_parse_error, "`foo' is bound to empty namespace name" ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>''} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fuga'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :ns_wellformed_error, "xmlns includes undeclared entity reference" ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'fua'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo'} ]
[ :on_stag_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_stag_end_empty_ns, 'foo:fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'foo'} ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo'} ]
[ :on_stag_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_stag_end_empty_ns, 'foo:fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
[ :on_stag_ns, 'foo:moga', 'foo', 'moga' ]
[ :on_stag_end_empty_ns, 'foo:moga', {'xmlns'=>NS_XMLNS, 'foo'=>'foo'} ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo'} ]
[ :on_stag_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_stag_end_ns, 'foo:fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
[ :on_stag_ns, 'foo:moga', 'foo', 'moga' ]
[ :on_stag_end_empty_ns, 'foo:moga', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
[ :on_etag, 'foo:fuga' ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo', 'bar'=>'bar'} ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo', 'bar'=>'bar'} ]
[ :on_stag_ns, 'bar:fuga', 'bar', 'fuga' ]
[ :on_stag_end_empty_ns, 'bar:fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'foo', 'bar'=>'bar'} ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo', 'bar'=>'bar'} ]
[ :on_stag_ns, 'bar:fuga', 'bar', 'fuga' ]
[ :on_stag_end_empty_ns, 'bar:fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'baz', 'bar'=>'bar'} ]
[ :on_stag_ns, 'moga', '', 'moga' ]
[ :on_stag_end_empty_ns, 'moga', {'xmlns'=>NS_XMLNS, 'foo'=>'foo', 'bar'=>'bar'} ]
[ :on_etag, 'foo:hoge' ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {} ]
[ :on_stag_ns, 'foo:hoge', 'foo', 'hoge' ]
[ :on_stag_end_empty_ns, 'foo:hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'foo', 'bar'=>'bar'} ]
[ :on_stag_ns, 'fuga', '', 'fuga' ]
[ :on_stag_end_empty_ns, 'fuga', {'xmlns'=>NS_XMLNS, 'foo'=>nil, 'bar'=>nil} ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'attribute', <<-'TESTCASEEND'
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'fuga', nil, 'fuga' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end_empty_ns, 'hoge', {''=>'bar'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'foo:fuga' ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'bar:fuga', 'bar', 'fuga' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'bar:fuga' ]
[ :ns_wellformed_error, "prefix `bar' is not declared" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
[ :on_stag_ns, 'fuga', '', 'fuga' ]
[ :on_attribute_ns, 'foo:baz', 'foo', 'baz' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'foo:baz' ]
[ :on_stag_end_empty_ns, 'fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'bar'} ]
[ :on_etag, 'hoge' ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'foo:fuga' ]
[ :on_attribute_ns, 'bar:fuga', 'bar', 'fuga' ]
[ :on_attr_value, 'gema' ]
[ :on_attribute_end, 'bar:fuga' ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'bar', 'bar'=>'baz'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'foo:fuga' ]
[ :on_attribute_ns, 'bar:fuga', 'bar', 'fuga' ]
[ :on_attr_value, 'gema' ]
[ :on_attribute_end, 'bar:fuga' ]
[ :ns_wellformed_error, "doubled localpart `fuga' in the same namespace" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'bar', 'bar'=>'bar'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'foo:fuga', 'foo', 'fuga' ]
[ :on_attr_value, 'moga' ]
[ :on_attribute_end, 'foo:fuga' ]
[ :on_attribute_ns, 'bar:fuga', 'bar', 'fuga' ]
[ :on_attr_value, 'gema' ]
[ :on_attribute_end, 'bar:fuga' ]
[ :ns_wellformed_error, "doubled localpart `fuga' in the same namespace" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'bar', 'bar'=>'bar'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'foo'=>'moga'} ]
[ :on_stag_ns, 'fuga', '', 'fuga' ]
[ :on_attribute_ns, 'foo:bar', 'foo', 'bar' ]
[ :on_attr_value, 'a' ]
[ :on_attribute_end, 'foo:bar' ]
[ :on_attribute_ns, 'baz:bar', 'baz', 'bar' ]
[ :on_attr_value, 'a' ]
[ :on_attribute_end, 'baz:bar' ]
[ :ns_wellformed_error, "doubled localpart `bar' in the same namespace" ]
[ :on_stag_end_empty_ns, 'fuga', {'xmlns'=>NS_XMLNS, 'foo'=>'moga', 'baz'=>'moga'} ]
[ :on_etag, 'hoge' ]
''
[ :on_stag_ns, 'foo', '', 'foo' ]
[ :ns_parse_error, "localpart `bar:fuga' includes `:'" ]
[ :on_attribute_ns, 'foo:bar:fuga', 'foo', 'bar:fuga' ]
[ :on_attr_value, 'hoge' ]
[ :on_attribute_end, 'foo:bar:fuga' ]
[ :on_stag_end_empty_ns, 'foo', {'xmlns'=>NS_XMLNS, 'foo'=>'bar', 'bar'=>'bar'} ]
TESTCASEEND
deftestcase 'reserved', <<-'TESTCASEEND'
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'xml:lang', 'xml', 'lang' ]
[ :on_attr_value, 'ja' ]
[ :on_attribute_end, 'xml:lang' ]
[ :on_stag_end_empty_ns, 'hoge', {'xml'=>NS_XML} ]
''
[ :on_stag_ns, 'foo', '', 'foo' ]
[ :on_stag_end_ns, 'foo', {} ]
[ :on_stag_ns, 'bar', '', 'bar' ]
[ :on_stag_end_ns, 'bar', {} ]
[ :on_stag_ns, 'baz', '', 'baz' ]
[ :on_attribute_ns, 'xml:lang', 'xml', 'lang' ]
[ :on_attr_value, 'ja' ]
[ :on_attribute_end, 'xml:lang' ]
[ :on_stag_end_empty_ns, 'baz', {'xml'=>NS_XML} ]
[ :on_etag, 'bar' ]
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {'xml'=>NS_XML} ]
[ :on_etag, 'foo' ]
''
[ :ns_wellformed_error, "prefix `xmlns' is not used for namespace prefix declaration" ]
[ :on_stag_ns, 'xmlns:hoge', 'xmlns', 'hoge' ]
[ :on_stag_end_empty_ns, 'xmlns:hoge', {'xmlns'=>NS_XMLNS} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :ns_wellformed_error, "prefix `xml' can't be bound to any namespace except `http://www.w3.org/XML/1998/namespace'" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'xml'=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'xml'=>NS_XML} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :ns_wellformed_error, "namespace `http://www.w3.org/XML/1998/namespace' is reserved for prefix `xml'" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'fuga'=>NS_XML} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :ns_wellformed_error, "prefix `xmlns' can't be bound to any namespace explicitly" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>'fuga'} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :ns_wellformed_error, "prefix `xmlns' can't be bound to any namespace explicitly" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :ns_wellformed_error, "namespace `http://www.w3.org/2000/xmlns/' is reserved for prefix `xmlns'" ]
[ :on_stag_end_empty_ns, 'hoge', {'xmlns'=>NS_XMLNS, 'fuga'=>NS_XMLNS} ]
TESTCASEEND
deftestcase 'wellformedness', <<-'TESTCASEEND'
''
[ :on_doctype, 'foo:bar', nil, nil ]
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {} ]
''
[ :ns_parse_error, "qualified name `foo:bar:baz' includes `:'" ]
[ :on_doctype, 'foo:bar:baz', nil, nil ]
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {} ]
''
[ :on_pi, 'foo', '' ]
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {} ]
''
[ :ns_parse_error, "PI target `foo:bar' includes `:'" ]
[ :on_pi, 'foo:bar', '' ]
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_empty_ns, 'hoge', {} ]
''
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_attribute_ns, 'fuga', nil, 'fuga' ]
[ :ns_parse_error, "entity reference `foo:bar' includes `:'" ]
[ :on_attr_entityref, 'foo:bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end_empty_ns, 'hoge', {} ]
'&foo:bar;'
[ :on_stag_ns, 'hoge', '', 'hoge' ]
[ :on_stag_end_ns, 'hoge', {} ]
[ :ns_parse_error, "entity reference `foo:bar' includes `:'" ]
[ :on_entityref, 'foo:bar' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
end
load "#{File.dirname($0)}/runtest.rb" if __FILE__ == $0