1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
#!/usr/bin/env perl
# Recursive schemas
use warnings;
use strict;
use lib 'lib','t';
use TestTools;
use Data::Dumper;
use XML::Compile::Schema;
use XML::Compile::Tester;
use Test::More tests => 65;
set_compile_defaults
elements_qualified => 'NONE';
my $schema = XML::Compile::Schema->new( <<__SCHEMA__ );
<schema targetNamespace="$TestNS"
xmlns="$SchemaNS"
xmlns:me="$TestNS">
<element name="test1">
<complexType>
<sequence>
<element ref="me:test1" minOccurs="0" />
<element name="count" type="int" />
</sequence>
</complexType>
</element>
<element name="test2" type="me:type2"/>
<complexType name="type2">
<sequence>
<element name="a" type="int" />
<element name="b" type="me:type2" minOccurs="0" />
</sequence>
</complexType>
# this is not recursion
<element name="test3">
<complexType>
<sequence>
<element name="c">
<complexType>
<sequence>
<element name="c" type="int"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
# ... neither is this one
<element name="test4">
<complexType>
<sequence>
<element name="test4" type="int" />
</sequence>
</complexType>
</element>
</schema>
__SCHEMA__
ok(defined $schema);
### test 1, recursive element
test_rw($schema, test1 => <<__XML, {count => 1});
<test1>
<count>1</count>
</test1>
__XML
test_rw($schema, test1 => <<__XML, {count => 1, test1 => {count => 2}});
<test1>
<test1>
<count>2</count>
</test1>
<count>1</count>
</test1>
__XML
test_rw($schema, test1 => <<__XML, {count => 1, test1 => {count => 2, test1 => {count => 3}}});
<test1>
<test1>
<test1>
<count>3</count>
</test1>
<count>2</count>
</test1>
<count>1</count>
</test1>
__XML
### test 2, recursive type
test_rw($schema, test2 => <<__XML, {a => 4});
<test2>
<a>4</a>
</test2>
__XML
test_rw($schema, test2 => <<__XML, {a => 5, b => {a => 6}});
<test2>
<a>5</a>
<b><a>6</a></b>
</test2>
__XML
test_rw($schema, test2 => <<__XML, {a => 7, b => {a => 8, b => {a => 9}}});
<test2>
<a>7</a>
<b><a>8</a>
<b><a>9</a>
</b>
</b>
</test2>
__XML
### test 3, no recursion [when detected as recursion, you get errors]
test_rw($schema, test3 => <<__XML, { c => { c => 42 } } );
<test3><c><c>42</c></c></test3>
__XML
### test 4, no recursion
test_rw($schema, test4 => <<__XML, { test4 => 11 } );
<test4><test4>11</test4></test4>
__XML
|