The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
# test use of big math

use warnings;
use strict;

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

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

use Test::More;

BEGIN {
   eval 'require Math::BigInt';
   if($@)
   {   plan skip_all => "Math::BigInt not installed";
   }

   plan tests => 66;
}

# Will fail when perl's longs get larger than 64bit
my $some_big1 = "12432156239876121237";
my $some_big2 = "243587092790745290879";

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

<simpleType name="t1">
  <restriction base="integer" />
</simpleType>

<element name="test1" type="me:t1" />

<simpleType name="t2">
  <restriction base="integer">
    <minInclusive value="40" />
    <maxInclusive value="$some_big1" />
  </restriction>
</simpleType>

<element name="test2" type="me:t2" />

<element name="test3">
  <complexType>
    <sequence>
      <element name="t3a" type="integer" default="$some_big2" />
      <element name="t3b" type="int"     default="11" />
    </sequence>
  </complexType>
</element>

<element name="test4">
  <complexType>
    <sequence>
      <element name="t4" type="integer" fixed="$some_big2" />
    </sequence>
  </complexType>
</element>

</schema>
__SCHEMA__

ok(defined $schema);

set_compile_defaults
    elements_qualified => 'NONE'
  , sloppy_integers    => 0;

##
### Integers
##

test_rw($schema, "test1" => <<__XML, 12);
<test1>12</test1>
__XML

test_rw($schema, "test1" => <<__XML, Math::BigInt->new($some_big1));
<test1>$some_big1</test1>
__XML

test_rw($schema, "test2" => <<__XML, 42);
<test2>42</test2>
__XML

test_rw($schema, "test2" => <<__XML, Math::BigInt->new($some_big1));
<test2>$some_big1</test2>
__XML

# limit to huge maxInclusive

my $error = error_r($schema, test2 => <<__XML);
<test2>$some_big2</test2>
__XML

is($error, 'too large inclusive 243587092790745290879, max 12432156239876121237 at {http://test-types}test2#facet');

$error = error_w($schema, test2 => Math::BigInt->new($some_big2));
is($error, 'too large inclusive 243587092790745290879, max 12432156239876121237 at {http://test-types}test2#facet');

#
## Big defaults
#

my %t31 = (t3a => Math::BigInt->new($some_big1), t3b => 13);
test_rw($schema, "test3" => <<__XML, \%t31);
<test3><t3a>$some_big1</t3a><t3b>13</t3b></test3>
__XML

my %t34 = (t3a => Math::BigInt->new($some_big2), t3b => 11);
test_rw($schema, test3 => <<__XML, \%t34, <<__XML, {t3b => 11});
<test3 />
__XML
<test3><t3b>11</t3b></test3>
__XML

#
## Big fixed
#

my $bi4 = Math::BigInt->new($some_big2);
test_rw($schema, test4 => <<__XML, {t4 => $bi4}, <<__XML, {t4 => $bi4});
<test4><t4>$some_big2</t4></test4>
__XML
<test4><t4>$some_big2</t4></test4>
__XML