mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 3a47cf3395
			
		
	
	
		3a47cf3395
		
	
	
	
	
		
			
			git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31573 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			790 lines
		
	
	
	
		
			19 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			790 lines
		
	
	
	
		
			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
 |