ruby/test/rexml/test_validation_rng.rb

791 строка
19 KiB
Ruby

require "test/unit/testcase"
require "rexml/document"
require "rexml/validation/relaxng"
class RNGValidation < Test::Unit::TestCase
include REXML
def test_validate
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<element name="C">
<attribute name="X"/>
<zeroOrMore>
<element name="E">
<empty/>
</element>
</zeroOrMore>
</element>
<element name="D">
<empty/>
</element>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A><B><C X="x"><E/><E/></C><D/></B></A>} )
error( validator, %q{<A><B><D/><C X="x"/></B></A>} )
end
def test_sequence
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<element name="C">
<empty/>
</element>
<element name="D">
<empty/>
</element>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B><C/><C/><D/></B></A>} )
error( validator, %q{<A><B><D/><C/></B></A>} )
error( validator, %q{<A><C/><D/></A>} )
no_error( validator, %q{<A><B><C/><D/></B></A>} )
end
def test_choice
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<choice>
<element name="C">
<empty/>
</element>
<element name="D">
<empty/>
</element>
</choice>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B><C/><D/></B></A>} )
no_error( validator, %q{<A><B><D/></B></A>} )
no_error( validator, %q{<A><B><C/></B></A>} )
end
def test_optional
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<optional>
<element name="C">
<empty/>
</element>
</optional>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B><C/></B></A>} )
error( validator, %q{<A><B><D/></B></A>} )
error( validator, %q{<A><B><C/><C/></B></A>} )
end
def test_zero_or_more
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<zeroOrMore>
<element name="C">
<empty/>
</element>
</zeroOrMore>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B><C/></B></A>} )
no_error( validator, %q{<A><B><C/><C/><C/></B></A>} )
error( validator, %q{<A><B><D/></B></A>} )
error( validator, %q{<A></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<zeroOrMore>
<element name="C">
<empty/>
</element>
<element name="D">
<empty/>
</element>
</zeroOrMore>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B><C/><D/></B></A>} )
no_error( validator, %q{<A><B><C/><D/><C/><D/></B></A>} )
error( validator, %q{<A><B><D/></B></A>} )
end
def test_one_or_more
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<oneOrMore>
<element name="C">
<empty/>
</element>
</oneOrMore>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B><C/></B></A>} )
no_error( validator, %q{<A><B><C/><C/><C/></B></A>} )
error( validator, %q{<A><B><D/></B></A>} )
error( validator, %q{<A></A>} )
end
def test_attribute
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<attribute name="X"/>
<attribute name="Y"/>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A/>} )
error( validator, %q{<A X=""/>} )
no_error( validator, %q{<A X="1" Y="1"/>} )
end
def test_choice_attributes
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<choice>
<attribute name="X"/>
<attribute name="Y"/>
</choice>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A X="1" Y="1"/>} )
error( validator, %q{<A/>} )
no_error( validator, %q{<A X="1"/>})
no_error( validator, %q{<A Y="1"/>} )
end
def test_choice_attribute_element
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<choice>
<attribute name="X"/>
<element name="B"/>
</choice>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A X="1"><B/></A>} )
error( validator, %q{<A/>} )
no_error( validator, %q{<A X="1"/>})
no_error( validator, %q{<A><B/></A>} )
end
def test_empty
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<empty/>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A>Text</A>} )
no_error( validator, %q{<A/>})
end
def test_text_val
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<text/>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A>Text</A>} )
error( validator, %q{<A/>})
end
def test_choice_text
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<choice>
<element name="B"/>
<text/>
</choice>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/>Text</A>} )
error( validator, %q{<A>Text<B/></A>} )
no_error( validator, %q{<A>Text</A>} )
no_error( validator, %q{<A><B/></A>} )
end
def test_group
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<choice>
<element name="B"/>
<group>
<element name="C"/>
<element name="D"/>
</group>
</choice>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/><C/></A>} )
error( validator, %q{<A><C/></A>} )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><C/><D/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B"/>
<group>
<element name="C"/>
<element name="D"/>
</group>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/><C/></A>} )
error( validator, %q{<A><B/><D/></A>} )
error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B/><C/><D/></A>} )
end
def test_value
# Values as text nodes
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<value>VaLuE</value>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B>X</B></A>} )
error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B>VaLuE</B></A>} )
# Values as text nodes, via choice
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<choice>
<value>Option 1</value>
<value>Option 2</value>
</choice>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A><B>XYZ</B></A>} )
no_error( validator, %q{<A><B>Option 1</B></A>} )
no_error( validator, %q{<A><B>Option 2</B></A>} )
# Attribute values
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<attribute name="B">
<value>VaLuE</value>
</attribute>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A/>} )
error( validator, %q{<A B=""/>} )
error( validator, %q{<A B="Lala"/>} )
no_error( validator, %q{<A B="VaLuE"/>} )
# Attribute values via choice
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<attribute name="B">
<choice>
<value>Option 1</value>
<value>Option 2</value>
</choice>
</attribute>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A B=""/>} )
error( validator, %q{<A B="Value"/>} )
no_error( validator, %q{<A B="Option 1"></A>} )
no_error( validator, %q{<A B="Option 2"/>} )
end
def test_interleave
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<interleave>
<element name="C"/>
<element name="D"/>
<element name="E"/>
</interleave>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B><C/></B></A>} )
error( validator, %q{<A><B><C/><D/><C/></B></A>} )
no_error( validator, %q{<A><B><C/><D/><E/></B></A>} )
no_error( validator, %q{<A><B><E/><D/><C/></B></A>} )
no_error( validator, %q{<A><B><D/><C/><E/></B></A>} )
no_error( validator, %q{<A><B><E/><C/><D/></B></A>} )
error( validator, %q{<A><B><E/><C/><D/><C/></B></A>} )
end
def test_mixed
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<element name="A" xmlns="http://relaxng.org/ns/structure/1.0">
<element name="B">
<mixed>
<element name="D"/>
</mixed>
</element>
</element>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A><B>Text<D/></B></A>} )
no_error( validator, %q{<A><B><D/>Text</B></A>} )
end
def test_ref_sequence
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
<ref name="B"/>
</element>
</start>
<define name="B">
<element name="B">
<attribute name="X"/>
</element>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A><B X=''/><B X=''/></A>} )
error( validator, %q{<A><B X=''/></A>} )
end
def test_ref_choice
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<choice>
<ref name="B"/>
</choice>
</element>
</start>
<define name="B">
<element name="B"/>
<element name="C"/>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><D/></A>} )
error( validator, %q{<A><B/><C/></A>} )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><C/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
</element>
</start>
<define name="B">
<choice>
<element name="B"/>
<element name="C"/>
</choice>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><D/></A>} )
error( validator, %q{<A><B/><C/></A>} )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><C/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<choice>
<ref name="B"/>
<element name="D"/>
</choice>
</element>
</start>
<define name="B">
<element name="B"/>
<element name="C"/>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/><C/></A>} )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><C/></A>} )
no_error( validator, %q{<A><D/></A>} )
end
def test_ref_zero_plus
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<zeroOrMore>
<ref name="B"/>
</zeroOrMore>
</element>
</start>
<define name="B">
<element name="B">
<attribute name="X"/>
</element>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A/>} )
no_error( validator, %q{<A><B X=''/></A>} )
no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
</element>
</start>
<define name="B">
<zeroOrMore>
<element name="B">
<attribute name="X"/>
</element>
</zeroOrMore>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A/>} )
no_error( validator, %q{<A><B X=''/></A>} )
no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
end
def test_ref_one_plus
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<oneOrMore>
<ref name="B"/>
</oneOrMore>
</element>
</start>
<define name="B">
<element name="B">
<attribute name="X"/>
</element>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A/>} )
no_error( validator, %q{<A><B X=''/></A>} )
no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
</element>
</start>
<define name="B">
<oneOrMore>
<element name="B">
<attribute name="X"/>
</element>
</oneOrMore>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A/>} )
no_error( validator, %q{<A><B X=''/></A>} )
no_error( validator, %q{<A><B X=''/><B X=''/><B X=''/></A>} )
end
def test_ref_interleave
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<interleave>
<ref name="B"/>
</interleave>
</element>
</start>
<define name="B">
<element name="B"/>
<element name="C"/>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A><C/></A>} )
error( validator, %q{<A><C/><C/></A>} )
no_error( validator, %q{<A><B/><C/></A>} )
no_error( validator, %q{<A><C/><B/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
</element>
</start>
<define name="B">
<interleave>
<element name="B"/>
<element name="C"/>
</interleave>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A><C/></A>} )
error( validator, %q{<A><C/><C/></A>} )
no_error( validator, %q{<A><B/><C/></A>} )
no_error( validator, %q{<A><C/><B/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<interleave>
<ref name="B"/>
<ref name="C"/>
</interleave>
</element>
</start>
<define name="B">
<element name="B"/>
</define>
<define name="C">
<element name="C"/>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A><B/></A>} )
error( validator, %q{<A><C/></A>} )
error( validator, %q{<A><C/><C/></A>} )
no_error( validator, %q{<A><B/><C/></A>} )
no_error( validator, %q{<A><C/><B/></A>} )
end
def test_ref_recurse
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
</element>
</start>
<define name="B">
<element name="B">
<optional>
<ref name="B"/>
</optional>
</element>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
error( validator, %q{<A></A>} )
no_error( validator, %q{<A><B/></A>} )
no_error( validator, %q{<A><B><B/></B></A>} )
end
def test_ref_optional
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<optional>
<ref name="B"/>
</optional>
</element>
</start>
<define name="B">
<element name="B">
</element>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A></A>} )
no_error( validator, %q{<A><B/></A>} )
error( validator, %q{<A><B/><B/></A>} )
error( validator, %q{<A><C/></A>} )
rng = %q{
<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="A">
<ref name="B"/>
</element>
</start>
<define name="B">
<optional>
<element name="B">
</element>
</optional>
</define>
</grammar>
}
validator = REXML::Validation::RelaxNG.new( rng )
no_error( validator, %q{<A></A>} )
no_error( validator, %q{<A><B/></A>} )
error( validator, %q{<A><B/><B/></A>} )
error( validator, %q{<A><C/></A>} )
end
def error( validator, source )
parser = REXML::Parsers::TreeParser.new( source )
parser.add_listener( validator.reset )
assert_raise( REXML::Validation::ValidationException,
"Expected a validation error" ) { parser.parse }
end
def no_error( validator, source )
parser = REXML::Parsers::TreeParser.new( source )
parser.add_listener( validator.reset )
assert_nothing_raised { parser.parse }
end
end