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 File::Basename;
use lib File::Basename::dirname(__FILE__)."/../../../../lib";
use lib File::Basename::dirname(__FILE__)."/../../..";
use URT;
use Test::More tests => 25;

use IO::File;
use File::Temp;
use Sub::Install;

my $tmpdir = File::Temp::tempdir(CLEANUP => 1);
ok($tmpdir, "Created temp dir $tmpdir");
ok(mkdir($tmpdir."/123/"), 'Create subdir within tmpdir');

my %data = ( 'dogs' => [ [ 1, 'lassie', 11],
                         [ 2, 'benjy', 12 ],
                         [ 3, 'beethoven', 13 ],
                         [ 4, 'ralf', 14 ],
                       ],
             'cats' => [ [ 11, 'garfield', 1 ],
                         [ 12, 'nermal', 2 ],
                         [ 13, 'sassy', 3 ],
                         [ 14, 'fluffy', 4 ],
                       ],
            );

foreach my $species ( keys %data ) {
    my $pathname = "${tmpdir}/123/${species}.dat";
    my $fh = IO::File->new($pathname, 'w') || die  "Can't open $pathname for writing: $!";
    foreach my $animal ( @{ $data{$species} } ) {
        $fh->print(join("\t", @$animal) . "\n");
    }
    ok($fh->close(), "wrote info for $pathname");
}

my $ds = UR::DataSource::Filesystem->create(path => $tmpdir.'/$group/', columns => ['id','name', 'friend_id'], delimiter => "\t");
ok($ds, 'Created Filesystem datasource');

ok(UR::Object::Type->define(
    class_name => 'URT::Cat',
    id_by => [
        cat_id => { is => 'Number', column_name => 'id' }
    ],
    has => [
        group      => { is => 'Number' },
        name       => { is => 'String' },
        friend_id  => { is => 'Number' },
    ],
    data_source_id => $ds->id,
    table_name => 'cats.dat'
    ),
    'Defined class for cats');

ok(UR::Object::Type->define(
    class_name => 'URT::Dog',
    id_by => [
        dog_id => { is => 'Number', column_name => 'id' }
    ],
    has => [
        group => { is => 'Number' },
        name => { is => 'String' },
        friend  => { is => 'URT::Cat', id_by => 'friend_id' },
        friend_name => { via =>'friend', to => 'name' },
    ],
    data_source_id => $ds->id,
    table_name => 'dogs.dat'
    ),
    'Defined class for dogs');

  
my @objs = URT::Dog->get(name => 'benjy');
is(scalar(@objs), 1,'Got one dog named benjy');
is($objs[0]->id, 2, 'It has the right id');
is($objs[0]->name, 'benjy', 'It has the right id');
is($objs[0]->friend_id, 12, 'It has the right friend id');

@objs = $objs[0]->friend;
is(scalar(@objs), 1, 'it has one friend');
is($objs[0]->id, 12, 'with the right ID');
is($objs[0]->name, 'nermal', 'and the right name');

@objs = URT::Dog->get('id <' => 3);
is(scalar(@objs), 2, 'Got 3 dogs with ID < 3');
is($objs[0]->id, 1, 'First has the right ID');
is($objs[1]->id, 2, 'Second has the right ID');


my $cat = URT::Cat->get(name => 'sassy');
ok($cat, 'Got one cat named sassy');
is($cat->name, 'sassy', 'It was the right cat');

@objs = URT::Dog->get(friend => $cat);
is(scalar(@objs), 1, 'There is one dog whose friend is sassy');
is($objs[0]->id, 3, 'its ID is correct');
is($objs[0]->name, 'beethoven', 'its name is correct');


@objs = URT::Dog->get(friend_name => 'fluffy');
is(scalar(@objs), 1, 'Got one dog whose friend name is fluffy');
is($objs[0]->id, 4, 'Its ID is correct');
is($objs[0]->name, 'ralf', 'Its name is correct');