The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use Data::Dumper;
use Try::Tiny;
use Test::More;

use WWW::Google::Contacts::Types qw(
  PhoneNumber ArrayRefOfPhoneNumber
  UserDefined ArrayRefOfUserDefined
);

# phone_number
my $phone_number;
my $num = "+123456";
$phone_number = to_PhoneNumber($num);
ok( defined $phone_number, "Valid phone number type" );
is( $phone_number->value,      $num,     "...right value" );
is( $phone_number->type->name, "mobile", "...got default type [mobile]" );

$phone_number = to_PhoneNumber( { type => "mobile", value => $num } );
ok( defined $phone_number, "Valid phone number type" );
is( $phone_number->value, $num, "...right value" );
is( $phone_number->type->name, "mobile",
    "...got explicitly set type [mobile]" );

my $res = to_ArrayRefOfPhoneNumber($num);
is( ref $res, "ARRAY", "Got an array of phone numbers" );
$phone_number = shift @{$res};
ok( defined $phone_number, "Valid phone number type" );
is( $phone_number->value,      $num,     "...right value" );
is( $phone_number->type->name, "mobile", "...got default type [mobile]" );

$res = to_ArrayRefOfPhoneNumber( [ 1, 2, 3 ] );
ok( defined $res, "Got array ref" );
is( scalar @{$res},   3,   "...with 3 entries" );
is( $res->[0]->value, "1", "Entry 1 is correct" );
is( $res->[1]->value, "2", "Entry 2 is correct" );
is( $res->[2]->value, "3", "Entry 3 is correct" );

# user defined
my $user_def;
my $def = { key => "Foo", value => "Bar" };
$user_def = to_UserDefined($def);
ok( defined $user_def, "Valid user defined type" );
is( $user_def->key,   $def->{key},   "...right key" );
is( $user_def->value, $def->{value}, "...right value" );

$def = [
    { key => "First",  value => "Something" },
    { key => "Second", value => "Good stuff" }
];
$res = to_ArrayRefOfUserDefined($def);
ok( defined $res, "Got array ref" );
is( scalar @{$res},   2,            "...with 2 entries" );
is( $res->[0]->value, "Something",  "Entry 1 is correct" );
is( $res->[1]->value, "Good stuff", "Entry 2 is correct" );

$def = {
    "First"  => { value => "Something" },
    "Second" => { value => "Good stuff" }
};
$res = to_ArrayRefOfUserDefined($def);
ok( defined $res, "Got array ref" );
is( scalar @{$res},           2, "...with 2 entries" );
is( defined $res->[0]->key,   1, "Entry 1 got key" );
is( defined $res->[0]->value, 1, "..and value" );
is( defined $res->[1]->key,   1, "Entry 2 got key" );
is( defined $res->[1]->value, 1, "..and value" );

done_testing;