diff options
Diffstat (limited to 'jni/ruby/test/rexml/test_validation_rng.rb')
-rw-r--r-- | jni/ruby/test/rexml/test_validation_rng.rb | 792 |
1 files changed, 792 insertions, 0 deletions
diff --git a/jni/ruby/test/rexml/test_validation_rng.rb b/jni/ruby/test/rexml/test_validation_rng.rb new file mode 100644 index 0000000..8989fe2 --- /dev/null +++ b/jni/ruby/test/rexml/test_validation_rng.rb @@ -0,0 +1,792 @@ +require "test/unit/testcase" + +require "rexml/document" +require "rexml/validation/relaxng" + +module REXMLTests + 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 +end |