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

use IO::Handle;
use Test::More tests => 20;

use vars qw($DEBUG);

BEGIN {
    use_ok('Text::BibTeX');
    require "t/common.pl";
}

use Fcntl;

# ----------------------------------------------------------------------
# entry output methods

my ($text, $entry, @warnings, @fields);
my ($new_text, $new_entry);

$text = <<'TEXT';
@article{homer97,
  author = "H{\"o}mer Simpson" # { \"und } # "Ned Flanders",
  title = {Territorial Imperatives in Modern Suburbia},
  journal = {Journal of Suburban Studies},
  year = 1997
}
TEXT
ok($entry = new Text::BibTeX::Entry $text);
ok($entry->parse_ok);

$new_text = $entry->print_s;

like $new_text => qr/^\@article\{homer97,\s*$/m;
like $new_text => qr/^\s*author\s*=\s*\{H\{\\"o\}mer Simpson \\"und Ned Flanders\},\s*$/m;
like $new_text => qr/^\s*title\s*=\s*[{"]Territorial[^}"]*Suburbia[}"],\s*$/m;
like $new_text => qr/^\s*journal\s*=\s*[{"]Journal[^\}]*Studies[}"],\s*$/m;
like $new_text => qr/^\s*year\s*=\s*[{"]1997[}"],\s*$/m;

$new_entry = new Text::BibTeX::Entry $new_text;
ok($entry->parse_ok);

is $entry->type => $new_entry->type;
is $entry->key  => $new_entry->key;

ok(slist_equal (scalar $entry->fieldlist, scalar $new_entry->fieldlist));

@fields = $entry->fieldlist;
ok(slist_equal ([$entry->get (@fields)], [$new_entry->get (@fields)]));

my @test = map { "t/test$_.bib" } 1..3;
my ($bib);

END { unlink @test }

open (BIB, ">$test[0]") || die "couldn't create $test[0]: $!\n";
$entry->print (\*BIB);
close (BIB);

$bib = new IO::File $test[1], O_CREAT|O_WRONLY
   or die "couldn't create $test[1]: $!\n";
$entry->print ($bib);
$bib->close;

$bib = new Text::BibTeX::File $test[2], O_CREAT|O_WRONLY
   or die "couldn't create $test[2]: $!\n";
$entry->write ($bib);
$bib->close;

my (@contents, $i);
for $i (0 .. 2)
{
   open (BIB, $test[$i]) || die "couldn't open $test[$i]: $!\n";
   $contents[$i] = join ('', <BIB>);
   close (BIB);
}

is $new_text => $contents[0];
is $new_text => $contents[1];
is $new_text => $contents[2];

my $clone = $entry->clone;
is ref($clone) => 'Text::BibTeX::Entry';
is $clone->get('title') => 'Territorial Imperatives in Modern Suburbia';
$clone->set('title', 'Changed title');
is $clone->get('title') => 'Changed title';
is $entry->get('title') => 'Territorial Imperatives in Modern Suburbia';