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

use XML::Compile::Tester;
use Test::More tests => 10;

use XML::Compile::RPC::Util;
 
#use Data::Dumper;
#$Data::Dumper::Indent = 1;

#### Structures

my @members =
  ( {name => 'symbol', value => {string => 'RHAT'}}
  , {name => 'limit', value => {double => 2.25}}
  , {name => 'expires', value =>
        { 'dateTime.iso8601' => '2002-07-09T20:00:00Z' }} );
my $struct = { member => \@members };

my $hash   = struct_to_hash $struct;
is_deeply($hash
         , { symbol  => 'RHAT'
           , limit   => 2.25
           , expires => '2002-07-09T20:00:00Z'
           }
         , 'struct_to_hash'
         );

my @rows   = struct_to_rows $struct;
is_deeply(\@rows
         , [ [ 'symbol',  'string', 'RHAT' ]
           , [ 'limit',   'double', '2.25' ]
           , [ 'expires', 'dateTime.iso8601', '2002-07-09T20:00:00Z' ]
           ]
         , 'struct_to_rows'
         );


my $struct2 = struct_from_rows @rows;
is_deeply($struct2, +{struct => $struct}, 'struct_from_rows');

my $struct3 = struct_from_hash string => { 'A'..'F' };
is_deeply($struct3,
 { struct => { member => [
      { value => { string => 'B' }, name => 'A' },
      { value => { string => 'D' }, name => 'C' },
      { value => { string => 'F' }, name => 'E' }
    ] }}, 'struct_from_hash');

### Arrays

my @arrvals  = ({string => 'RHAT'}, {double => 4.12}, {double => 4.25});
my $rpcarray = {data => {value => \@arrvals}};

is_deeply( [rpcarray_values $rpcarray]
         , ['RHAT', 4.12, 4.25]
         , 'rpcarray_values'
         );

is_deeply( rpcarray_from(int => 1..3)
         , {array => {data => {value => [{int => 1}, {int => 2}, {int => 3}]}}}
         , 'rpcarray_from'
         );

#### Faults

my $errmsg = 'Unknown stock symbol ABCD';
my @fmemb = ( {name => 'faultCode', value => {int => 23}}
            , {name => 'faultString', value => {string => $errmsg}} );
my $fault = +{value => { struct => { member => \@fmemb }}};

my ($rc,$rcmsg) = fault_code $fault;
is($rc, 23, 'faultCode');
is($rcmsg, $errmsg, 'faultString');

my $rc2 = fault_code $fault;
is($rc2, 23, 'faultCode scalar context');

my $fault2 = fault_from 23, $errmsg;
is_deeply($fault2, +{fault => $fault}, 'fault_from');