use strict;
use vars ('$DEBUG');
use IO::Handle;
BEGIN { require "t/common.pl"; }
my $loaded;
BEGIN { $| = 1; print "1..36\n"; }
END {print "not ok 1\n" unless $loaded;}
use Text::BibTeX qw(:macrosubs);
$loaded = 1;
print "ok 1\n";
$DEBUG = 1;
setup_stderr;
# ----------------------------------------------------------------------
# test macro parsing and expansion
my ($macrodef, $regular, $entry, @warnings);
$macrodef = <<'TEXT';
@string ( foo = " The Foo
Journal",
sons = " \& Sons",
bar
= {Bar } # sons,
)
TEXT
$regular = <<'TEXT';
@article { my_article,
author = { Us and Them },
journal = foo,
publisher = "Fu" # bar
}
TEXT
# Direct access to macro table, part 1: make sure the macros we're going to
# defined aren't defined
print "testing that none of our macros are defined yet\n" if $DEBUG;
test (macro_length ('foo') == 0 &&
macro_length ('sons') == 0 &&
macro_length ('bar') == 0);
test (! defined macro_text ('foo') &&
! defined macro_text ('sons') &&
! defined macro_text ('bar'));
@warnings = warnings;
test (@warnings == 3 &&
$warnings[0] =~ /undefined macro "foo"/ &&
$warnings[1] =~ /undefined macro "sons"/ &&
$warnings[2] =~ /undefined macro "bar"/);
# Now parse the macro-definition entry; this should put the three
# macros we're interested in into the macro table so we can
# successfully parse the regular entry
print "parsing macro-definition entry to define 3 macros\n" if $DEBUG;
$entry = new Text::BibTeX::Entry;
$entry->parse_s ($macrodef);
test (! warnings);
test_entry ($entry, 'string', undef,
[qw(foo sons bar)],
[' The Foo Journal', ' \& Sons', 'Bar \& Sons']);
# Direct access to macro table, part 2: make sure the macros we've just
# defined now have the correct values
print "checking macro table to ensure that the macros were properly defined\n"
if $DEBUG;
test (macro_length ('foo') == 19 &&
macro_length ('sons') == 8 &&
macro_length ('bar') == 14);
test (macro_text ('foo') eq ' The Foo Journal' &&
macro_text ('sons') eq ' \& Sons' &&
macro_text ('bar') eq 'Bar \& Sons');
test (! warnings);
# Parse the regular entry -- there should be no warnings, because
# we've just defined the 'foo' and 'bar' macros on which it depends
# calling a parse or read method on an existing object isn't documented
# as an "ok thing to do", but it is (at least as the XS code currently
# is!) -- hence I can leave the "new" uncommented
# $entry = new Text::BibTeX::Entry;
print "parsing the regular entry which uses those 2 of those macros\n"
if $DEBUG;
$entry->parse_s ($regular);
test (! warnings);
test_entry ($entry, 'article', 'my_article',
[qw(author journal publisher)],
['Us and Them', 'The Foo Journal', 'FuBar \& Sons']);
# Delete the 'bar' macro and change 'foo' -- this should result in
# one warning about the macro value being overridden
delete_macro ('bar');
test (macro_length ('bar') == 0 &&
! defined macro_text ('bar') &&
(@warnings = warnings) == 1 &&
$warnings[0] =~ /undefined macro "bar"/);
add_macro_text ('foo', 'The Journal of Fooology');
test ((@warnings = warnings) == 1 &&
$warnings[0] =~ /overriding existing definition of macro "foo"/);
# Now re-parse our regular entry; we should get a warning about the deleted
# "bar" macro, and the "journal" field (which relies on "foo") should have
# a different value
$entry->parse_s ($regular);
test ((@warnings = warnings) == 1 &&
$warnings[0] =~ /undefined macro "bar"/);
test_entry ($entry, 'article', 'my_article',
[qw(author journal publisher)],
['Us and Them', 'The Journal of Fooology', 'Fu']);