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

eval "use XML::LibXML";
eval "use XML::LibXSLT";
eval "use XML::Dumper";
if ($INC{"XML/LibXML.pm"} && $INC{'XML/LibXSLT.pm'} && $INC{'XML/Dumper.pm'}) {
    plan tests => 11;
}
else {
    plan skip_all => 'works only with systems which have XML::LibXML and XML::LibXSLT.pm';
}

#use File::Basename;
#use lib File::Basename::dirname(__FILE__)."/../..";

use above 'UR';

class Animal {
    has => [
        name    => { is => 'Text' },
        age     => { is => 'Number' },
    ]
};

class Person {
    is => 'Animal',
    has => [
        cats    => { is => 'Cat', is_many => 1 },
    ]
};

class Cat {
    is => 'Animal',
    has => [
        fluf    => { is => 'Number' },
        owner   => { is => 'Person', id_by => 'owner_id' },
    ]
};

my $p = Person->create(name => 'Fester', age => 99);
    ok($p, "made a test person object to have cats");

my $c1 = Cat->create(name => 'fluffy', age => 2, owner => $p, fluf => 11);
    ok($c1, "made a test cat 1");

my $c2 = Cat->create(name => 'nestor', age => 8, owner => $p, fluf => 22);
    ok($c2, "made a test cat 2");

my @c = $p->cats();
is("@c","$c1 $c2", "got expected cat list for the owner");


my $pv = $p->create_view(
    toolkit => 'xml',
    aspects => [
        'name',
        'age',
        {
            name => 'cats',
            perspective => 'default',
            toolkit => 'xml',
            aspects => [
                'name',
                'age',
                'fluf',
                'owner'
            ],
        }
    ]
);
ok($pv, "got an XML view for the person");
my $pv_got_content = $pv->content;
ok($pv_got_content, 'Person XML view generated some content');

SKIP: {
    skip "Need a better way to validate XML output",1;
    my $pv_expected_xml = '';
    is($pv_got_content,$pv_expected_xml,"XML is as expected for the person view");
}

my $c1v = $c1->create_view(toolkit => 'text');
ok($c1v, 'Created text view for a cat');
ok($c1v, "got a text view for one of the cats");

my $c1v_expected_text = "Cat '" . $c1->id . "' age: 2 fluf: 11 name: fluffy owner: Person '" . $p->id . "' age: 99 cats: Cat '" . $c1->id . "' (REUSED ADDR) Cat '".$c2->id."' age: 8 fluf: 22 name: nestor owner: Person '".$p->id."' (REUSED ADDR) name: Fester";
my $c1v_got_content = $c1v->content;
ok($c1v_got_content, 'Cat text view generated some content');
chomp $c1v_got_content;
# Convert all whitespace to a single space
$c1v_got_content =~ s/\n/ /mg;
$c1v_got_content =~ s/\s+/ /mg;


is($c1v_got_content,$c1v_expected_text,"text is as expected for the cat view");