#
# tests/testparser.rb
#
# Copyright (C) UENO Katsuhiro 2002
#
# $Id: testparser.rb,v 1.15.2.1 2003/02/28 12:35:17 katsu Exp $
#
require 'test/unit'
require 'deftestcase'
require 'xmlscan/parser'
require 'visitor'
class TestXMLParser < Test::Unit::TestCase
include DefTestCase
Visitor = RecordingVisitor.new_class(XMLScan::Visitor)
private
def setup
@v = Visitor.new
@s = XMLScan::XMLParser.new(@v)
end
def parse(src)
@s.parse src
@v.result
end
public
deftestcase 'xmldecl', <<-'TESTCASEEND'
''
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :on_xmldecl_end ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_xmldecl ]
[ :warning, "unsupported XML version `1.01'" ]
[ :on_xmldecl_version, '1.01' ]
[ :on_xmldecl_end ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :on_xmldecl_standalone, 'yes' ]
[ :on_xmldecl_end ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :on_xmldecl_standalone, 'no' ]
[ :on_xmldecl_end ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :parse_error, "standalone declaration must be either `yes' or `no'" ]
[ :on_xmldecl_standalone, 'hoge' ]
[ :on_xmldecl_end ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :parse_error, "standalone declaration must be either `yes' or `no'" ]
[ :on_xmldecl_standalone, 'YES' ]
[ :on_xmldecl_end ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
TESTCASEEND
deftestcase 'doctype', <<-'TESTCASEEND'
''
[ :on_doctype, 'hoge', 'foo', 'bar' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :parse_error, "public external ID must have both public ID and system ID" ]
[ :on_doctype, 'hoge', 'foo', nil ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_doctype, 'hoge', nil, 'foo' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
TESTCASEEND
deftestcase 'ignore_space', <<-'TESTCASEEND'
' '
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :on_xmldecl_end ]
[ :on_doctype, 'hoge', nil, nil ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
' '
[ :on_xmldecl ]
[ :on_xmldecl_version, '1.0' ]
[ :on_xmldecl_end ]
[ :on_doctype, 'hoge', nil, nil ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
' '
[ :on_doctype, 'hoge', nil, nil ]
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, ' ' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'pi', <<-'TESTCASEEND'
' '
[ :parse_error, "reserved PI target `xml'" ]
[ :on_pi, 'xml', '' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
' '
[ :parse_error, "reserved PI target `Xml'" ]
[ :on_pi, 'Xml', '' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
' '
[ :parse_error, "reserved PI target `XML'" ]
[ :on_pi, 'XML', '' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
TESTCASEEND
deftestcase 'element_nesting', <<-'TESTCASEEND'
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :on_etag, 'fuga' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_stag, 'fuga' ]
[ :on_stag_end_empty, 'fuga' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :parse_error, "unclosed element `fuga' meets EOF" ]
[ :on_etag, 'fuga' ]
[ :parse_error, "unclosed element `hoge' meets EOF" ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :on_etag, 'fuga' ]
[ :parse_error, "unclosed element `hoge' meets EOF" ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :wellformed_error, "element type `hoge' is not matched" ]
[ :on_etag, 'fuga' ]
[ :wellformed_error, "element type `fuga' is not matched" ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :wellformed_error, "element type `fuga' is not matched" ]
[ :on_etag, 'hoge' ]
''
[ :parse_error, "end tag `hoge' appears alone" ]
[ :parse_error, "no root element was found" ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
[ :parse_error, "another root element is found" ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :parse_error, "unclosed element `fuga' meets EOF" ]
[ :on_etag, 'fuga' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
[ :parse_error, "end tag `fuga' appears alone" ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end_empty, 'hoge' ]
[ :parse_error, "another root element is found" ]
[ :on_stag, 'fuga' ]
[ :on_stag_end_empty, 'fuga' ]
TESTCASEEND
deftestcase 'outside', <<-'TESTCASEEND'
'fuga'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'fuga' ]
[ :on_etag, 'hoge' ]
' fuga '
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'fuga' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_cdata, 'fuga' ]
[ :on_etag, 'hoge' ]
'fuga'
[ :parse_error, "content of element is found outside of root element" ]
[ :on_chardata, 'fuga' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :parse_error, "CDATA section is found outside of root element" ]
[ :on_cdata, 'fuga' ]
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
'fuga'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
[ :parse_error, "content of element is found outside of root element" ]
[ :on_chardata, 'fuga' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
[ :parse_error, "CDATA section is found outside of root element" ]
[ :on_cdata, 'fuga' ]
'foo'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
[ :parse_error, "another root element is found" ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :on_chardata, 'foo' ]
[ :on_etag, 'fuga' ]
''
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
[ :parse_error, "another root element is found" ]
[ :on_stag, 'fuga' ]
[ :on_stag_end, 'fuga' ]
[ :on_cdata, 'fuga' ]
[ :on_etag, 'fuga' ]
TESTCASEEND
deftestcase 'entityref', <<-'TESTCASEEND'
'foo<bar'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'foo' ]
[ :on_entityref, 'lt' ]
[ :on_chardata, 'bar' ]
[ :on_etag, 'hoge' ]
'foo>bar'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'foo' ]
[ :on_entityref, 'gt' ]
[ :on_chardata, 'bar' ]
[ :on_etag, 'hoge' ]
'foo&bar'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'foo' ]
[ :on_entityref, 'amp' ]
[ :on_chardata, 'bar' ]
[ :on_etag, 'hoge' ]
'foo"bar'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'foo' ]
[ :on_entityref, 'quot' ]
[ :on_chardata, 'bar' ]
[ :on_etag, 'hoge' ]
'foo'bar'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'foo' ]
[ :on_entityref, 'apos' ]
[ :on_chardata, 'bar' ]
[ :on_etag, 'hoge' ]
'foo&fuga;bar'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'foo' ]
[ :on_entityref, 'fuga' ]
[ :on_chardata, 'bar' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'charref', <<-'TESTCASEEND'
'fuga'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'fu' ]
[ :on_charref, 103 ]
[ :on_chardata, 'a' ]
[ :on_etag, 'hoge' ]
'fuga'
[ :on_stag, 'hoge' ]
[ :on_stag_end, 'hoge' ]
[ :on_chardata, 'fu' ]
[ :on_charref_hex, 103 ]
[ :on_chardata, 'a' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'attr_entityref', <<-'TESTCASEEND'
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, 'foo' ]
[ :on_attr_entityref, 'lt' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, 'foo' ]
[ :on_attr_entityref, 'gt' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, 'foo' ]
[ :on_attr_entityref, 'amp' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, 'foo' ]
[ :on_attr_entityref, 'quot' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, 'foo' ]
[ :on_attr_entityref, 'apos' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, 'foo' ]
[ :on_attr_entityref, 'HOGE' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'attr_charref', <<-'TESTCASEEND'
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'fu' ]
[ :on_attr_charref, 103 ]
[ :on_attr_value, 'a' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'fu' ]
[ :on_attr_charref_hex, 103 ]
[ :on_attr_value, 'a' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty, 'hoge' ]
TESTCASEEND
deftestcase 'normalize', <<-'TESTCASEEND'
""
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, ' foo bar ' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
""
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, ' foo bar ' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
""
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, ' foo bar ' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
""
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, ' foo bar ' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
""
[ :on_stag, 'hoge' ]
[ :on_attribute, 'fuga' ]
[ :on_attr_value, ' foo' ]
[ :on_attr_charref, 9 ]
[ :on_attr_value, 'bar ' ]
[ :on_attribute_end, 'fuga' ]
[ :on_stag_end, 'hoge' ]
[ :on_etag, 'hoge' ]
TESTCASEEND
deftestcase 'attribute', <<-'TESTCASEEND'
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :on_attribute, 'bar' ]
[ :on_attr_value, 'fuga' ]
[ :on_attribute_end, 'bar' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :wellformed_error, "doubled attribute `foo'" ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'fuga' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty, 'hoge' ]
''
[ :on_stag, 'hoge' ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'bar' ]
[ :on_attribute_end, 'foo' ]
[ :wellformed_error, "doubled attribute `foo'" ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'fuga' ]
[ :on_attribute_end, 'foo' ]
[ :wellformed_error, "doubled attribute `foo'" ]
[ :on_attribute, 'foo' ]
[ :on_attr_value, 'hoge' ]
[ :on_attribute_end, 'foo' ]
[ :on_stag_end_empty, 'hoge' ]
TESTCASEEND
end
load "#{File.dirname($0)}/runtest.rb" if __FILE__ == $0