The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;

my @BOOKLOC;
BEGIN {
  @BOOKLOC = (
    'books/test_packages/FreeBSD_Developers_Handbook.jar',
    'test_packages/other/osoft_9Perl5.8manual_en.jar',
    'books/test_packages/FreeBSD_Developers_Handbook/' .
      'FreeBSDDevelopersHandbook.xml',
  );
  unless((-e $BOOKLOC[0]) and (-e $BOOKLOC[2])) {
    plan skip_all => 'extra books/ dir not available';
  }
  else {
    plan 'no_plan';
  }
}

BEGIN {use_ok('dtRdr::Library::YAMLLibrary')};

my $LIBLOC = 't/library/';
my $LIBFILE = $LIBLOC . $$ . 'testlib.yml';

# Toss the test library if it exists
unlink $LIBFILE if (-e $LIBFILE);

# TODO these id's are improper
my $BOOK1 = 'FreeBSD Developers\' Handbook';
my $BOOK2 = 'Perl 5.8 Documentation';
# we can have two copies of an id if they're a different title
my $BOOK3 = 'FreeBSD Developers\' Handbook';

# first run
{
  dtRdr::Library::YAMLLibrary->create($LIBFILE);
  my $library = dtRdr::Library::YAMLLibrary->new();
  $library->load_uri($LIBFILE);
  ok($library, 'constructor');

  isa_ok($library, 'dtRdr::Library');


  is($library->add_book(
    book_id => $BOOK1,
    title   => $BOOK1,
    uri   => '../../'.$BOOKLOC[0],
    type    => 'Thout_1_0_jar'
  ), 0);
  is($library->add_book(
    book_id    => $BOOK2,
    title => $BOOK2,
    uri   => '../../'.$BOOKLOC[1],
    type  => 'Thout_1_0_jar'
  ), 1);
  is($library->add_book(
    book_id    => $BOOK3,
    title => $BOOK3 . ' (unzipped)',
    uri   => '../../'.$BOOKLOC[2],
    type  => 'Thout_1_0'
  ), 2);
  ok(1, 'Added books');

  my @books = $library->get_book_info();
  ok(@books == 3, "Book info hashes");
  can_ok($_, 'title') for(@books);
  ok($books[0]->title   eq $BOOK1, "checked book info hash");
  ok($books[1]->title   eq $BOOK2, "checked book info hash");
  is($books[2]->intid, 2, "checked book info hash");
  ok($books[2]->book_id eq $BOOK3, "checked book info hash");
  ok($books[2]->title   eq $BOOK3 . ' (unzipped)', "checked book info hash");

  $library->set_name('test library');
  ok($library->name eq 'test library', 'name set');
  $library->set_id('42');
  is($library->id, '42', 'id set');
  eval {$library->set_id('something else')};
  ok($@, 'denied');
  like($@, qr/^the library's id is locked: '42'/, 'locked');

  undef($library);
}

# second run
{
my $library = dtRdr::Library::YAMLLibrary->new();
$library->load_uri($LIBFILE);
isa_ok($library, 'dtRdr::Library');
is($library->name, 'test library', 'name ok');
is($library->id, '42', 'id ok');
is($library->type, $library->LIBTYPE, 'type ok');

my @books = $library->get_book_info();
ok(@books == 3, 'book set');

my $book = $library->open_book(title => $BOOK1);
isa_ok($book, 'dtRdr::Book');
isa_ok($book, 'dtRdr::Book::ThoutBook_1_0_jar');

my (@toc) = $book->toc->children;
my $toc = $toc[0];
isa_ok($toc, 'dtRdr::TOC');
}
{
my $library = dtRdr::Library::YAMLLibrary->new();
$library->load_uri($LIBFILE);
isa_ok($library, 'dtRdr::Library');

my @books = $library->get_book_info();
ok(@books == 3, 'book set');

my $book = $library->open_book(title => $BOOK3 . ' (unzipped)');
isa_ok($book, 'dtRdr::Book');
isa_ok($book, 'dtRdr::Book::ThoutBook_1_0');

my (@toc) = $book->toc->children;
my $toc = $toc[0];
isa_ok($toc, 'dtRdr::TOC');
}

unlink $LIBFILE if (-e $LIBFILE);
# vim:ts=2:sw=2:et:sta