use strict;
use CGI::Wiki;
use CGI::Wiki::TestConfig::Utilities;
use Test::More tests =>
(1 + 17 * $CGI::Wiki::TestConfig::Utilities::num_stores);
use_ok( "CGI::Wiki::Plugin::Diff" );
my %stores = CGI::Wiki::TestConfig::Utilities->stores;
my ($store_name, $store);
while ( ($store_name, $store) = each %stores ) {
SKIP: {
skip "$store_name storage backend not configured for testing", 17
unless $store;
print "#\n##### TEST CONFIG: Store: $store_name\n#\n";
my $wiki = CGI::Wiki->new( store => $store );
my $differ = eval { CGI::Wiki::Plugin::Diff->new; };
is( $@, "", "'new' doesn't croak" );
isa_ok( $differ, "CGI::Wiki::Plugin::Diff" );
$wiki->register_plugin( plugin => $differ );
# Test ->null diff
my %nulldiff = $differ->differences(
node => "Jerusalem Tavern",
left_version => 1,
right_version => 1);
ok( !exists($nulldiff{diff}), "Diffing the same version returns empty diff");
# Test ->body diff
my %bodydiff = $differ->differences(
node => "Jerusalem Tavern",
left_version => 1,
right_version => 2);
is( @{$bodydiff{diff}}, 2, "Differ returns 2 elements for body diff");
is_deeply( $bodydiff{diff}[0], {
left => "== Line 0 ==\n",
right => "== Line 1 ==\n"},
"First element is line number on right");
is_deeply( $bodydiff{diff}[1], {
left => 'Pub '.
'in Clerkenwell with St Peter\'s beer.'.
"
\n",
right => 'Tiny pub '.
'in Clerkenwell with St Peter\'s beer.'.
'
'.
"\nNear Farringdon station".
"
\n",
},
"Differences highlights body diff with span tags");
# Test ->meta diff
my %metadiff = $differ->differences(
node => "Jerusalem Tavern",
left_version => 2,
right_version => 3);
is( @{$metadiff{diff}}, 2, "Differ returns 2 elements for meta diff");
is_deeply( $metadiff{diff}[0], {
left => "== Line 2 ==\n",
right => "== Line 2 ==\n"},
"First element is line number on right");
is_deeply( $metadiff{diff}[1], {
left => "category='Pubs'",
right => "category='Pubs".
',Real Ale\'
'.
"\nlocale='Farringdon'",
},
"Differences highlights metadata diff with span tags");
# Another body diff with bracketed content
%bodydiff = $differ->differences(
node => 'IvorW',
left_version => 1,
right_version => 2);
is_deeply( $bodydiff{diff}[0], {
left => "== Line 11 ==\n",
right => "== Line 11 ==\n"},
"Diff finds the right line number on right");
is_deeply( $bodydiff{diff}[1], {
left => "metatest='".
'Moo\'',
right => ''.
"[[IvorW's Test Page]]
\n".
"
\n".
"metatest='".
'Boo\'',
},
"Diff scans words correctly");
# And now a check for framing
%bodydiff = $differ->differences(
node => 'IvorW',
left_version => 2,
right_version => 3);
is_deeply( $bodydiff{diff}[0], {
left => "== Line 13 ==\n",
right => "== Line 13 ==\n"},
"Diff finds the right line number on right");
is_deeply( $bodydiff{diff}[1], {
left => "metatest='".
'Boo\'',
right => ''.
"[[Another Test Page]]
\n".
"
\n".
"metatest='".
'Quack\'',
},
"Diff frames correctly");
# Trailing whitespace test 1
%bodydiff = $differ->differences(
node => 'IvorW',
left_version => 3,
right_version => 4);
ok(!exists($bodydiff{diff}), 'No change found for trailing whitespace');
# Trailing whitespace test 2
%bodydiff = $differ->differences(
node => 'Jerusalem Tavern',
left_version => 3,
right_version => 4);
is_deeply( $bodydiff{diff}[0], {
left => "== Line 0 ==\n",
right => "== Line 0 ==\n" },
"Diff finds the right line numbers");
is_deeply( $bodydiff{diff}[1], {
left => "Tiny pub in Clerkenwell with St Peter's beer".
".
\n",
right => "Tiny pub in Clerkenwell with St Peter's beer".
' but no food.'.
"
\n",
},
"Diff handles trailing whitespace correctly");
eval {
$differ->differences(
node => 'Test',
left_version => 1,
right_version => 2 ) };
is( $@, "", "differences doesn't die when only difference is a newline");
} # end of SKIP
}