The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
# QName builtins are harder, because they need the node which is processed
# to lookup the name-space.

use warnings;
use strict;

use lib 'lib','t';
use TestTools;

use XML::Compile::Schema;
use XML::Compile::Tester;

use Test::More tests => 33;

set_compile_defaults
    elements_qualified => 'NONE';

my $NS2 = "http://test2/ns";

my $schema   = XML::Compile::Schema->new( <<__SCHEMA__ );
<schema
   targetNamespace="$TestNS"
   xmlns="$SchemaNS"
   xmlns:me="$TestNS"
   elementFormDefault="qualified">

<element name="test1" type="QName" />

<element name="test2">
  <simpleType>
    <list itemType="QName" />
  </simpleType>
</element>

<element name="test3">
  <simpleType>
    <restriction base="QName" />
  </simpleType>
</element>

<element name="test4">
  <simpleType name="t1">
    <union>
      <simpleType>
        <restriction base="QName" />
      </simpleType>
      <simpleType>
        <restriction base="string">
          <enumeration value="unbounded" />
        </restriction>
      </simpleType>
    </union>
  </simpleType>
</element>


</schema>
__SCHEMA__

ok(defined $schema);

my %prefixes =
  ( $TestNS => { prefix => '', uri => $TestNS }
  , $NS2    => { prefix => 'two', uri => $NS2, used => 1 }
  );

set_compile_defaults
    include_namespaces => 1
  , prefixes => \%prefixes;

### QName direct

test_rw($schema, test1 => <<__TRY1, "{$NS2}aaa"); 
<test1 xmlns="$TestNS" xmlns:two="$NS2">two:aaa</test1>
__TRY1

### QName in LIST

$prefixes{$NS2}{used} = 1;
test_rw($schema, test2 => <<__TRY2, [ "{$NS2}aaa", "{$NS2}bbb" ]); 
<test2 xmlns="$TestNS" xmlns:two="$NS2">
  two:aaa
  two:bbb
</test2>
__TRY2

### QName extended

$prefixes{$NS2}{used} = 1;
test_rw($schema, test3 => <<__TRY3, "{$NS2}aaa"); 
<test3 xmlns="$TestNS" xmlns:two="$NS2">two:aaa</test3>
__TRY3

### QName union

$prefixes{$NS2}{used} = 1;
test_rw($schema, test4 => <<__TRY4, "{$NS2}aaa"); 
<test4 xmlns="$TestNS" xmlns:two="$NS2">two:aaa</test4>
__TRY4