The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
use Test::More tests => 55;
use strict;
use File::Temp;
use SVK::Test;

my ($xd, $svk) = build_test();
our $output;
my ($copath, $corpath) = get_copath ('prop');
my ($repospath, undef, $repos) = $xd->find_repos ('//', 1);
$svk->checkout ('//', $copath);
mkdir "$copath/A";
overwrite_file ("$copath/A/foo", "foobar");
overwrite_file ("$copath/A/bar", "foobarbazz");
is_output_like ($svk, 'ps', [], qr'SYNOPSIS', 'ps - help');
is_output_like ($svk, 'pe', [], qr'SYNOPSIS', 'ps - help');
is_output_like ($svk, 'pe', ['foo','bar','baz'], qr'SYNOPSIS', 'ps - help');
is_output_like ($svk, 'propdel', [], qr'SYNOPSIS', 'propdel - help');
is_output_like ($svk, 'pg', [], qr'SYNOPSIS', 'pg - help');

is_output_like ($svk, 'pl', ["$copath/A"], qr'not found');

$svk->add ($copath);
is_output ($svk, 'pl', ["$copath/A"],
	   []);
is_output ($svk, 'pl', ["$copath/A/foo"],
	   []);
$svk->commit ('-m', 'commit', $copath);
is_output ($svk, 'pl', ["$copath/A"],
	   []);

is_output ($svk, 'ps', ['myprop', 'myvalue', "$copath/A/unknown"],
	   [__("$copath/A/unknown is not under version control.")]);

overwrite_file ("$copath/A/unknown", 'foo');
is_output ($svk, 'ps', ['myprop', 'myvalue', "$copath/A/unknown"],
	   [__("$copath/A/unknown is not under version control.")]);

$svk->rm ("$copath/A/foo");
is_output ($svk, 'ps', ['myprop', 'myvalue', "$copath/A/foo"],
	   [__("$copath/A/foo is already scheduled for delete.")]);

$svk->revert (-R => $copath);

is_output ($svk, 'ps', ['-q', 'myprop', 'myvalue', "$copath/A"],
	   []);

is_output ($svk, 'ps', ['myprop', 'myvalue', "$copath/A"],
	   [__(" M  $copath/A")]);

is_output ($svk, 'pl', ["$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop']);

is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop: myvalue']);

is_output ($svk, 'pg', ['myprop', "$copath/A"],
	   ['myvalue']);
is_output ($svk, 'pg', [-R => 'myprop', "$copath"],
	   [__('t/checkout/prop/A - myvalue')]);

$svk->commit ('-m', 'commit', $copath);

is_output ($svk, 'ps', ['thisprop', 'thisvalue', "$copath/A", "$copath/A/foo"],
	   [__(" M  $copath/A"),
	    __(" M  $copath/A/foo")]);

$svk->revert (-R => $copath);

is_output ($svk, 'ps', ['myprop', 'myvalue2', "$copath/A"],
	   [__(" M  $copath/A")]);
is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop: myvalue2']);
is_output ($svk, 'pg', ['myprop', "$copath/A"],
	   ['myvalue2']);
is_output ($svk, 'pl', ['-v', "//A"],
	   ["Properties on //A:",
	    '  myprop: myvalue']);
is_output ($svk, 'pg', ['myprop', "//A"],
	   ['myvalue']);
is_output ($svk, 'pg', ['myprop', "$copath/A", "//A"],
	   [__("$copath/A - myvalue2"),
            '//A - myvalue']);
is_output ($svk, 'pg', ['--strict', 'myprop', "$copath/A", "//A"],
	   ['myvalue2myvalue']);
$svk->revert ("$copath/A");
is_output ($svk, 'ps', ['myprop2', 'myvalue2', "$copath/A"],
	   [__(" M  $copath/A")]);
is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop: myvalue',
	    '  myprop2: myvalue2']);
is_output ($svk, 'propdel', ['--quiet', 'myprop', "$copath/A"],
	   []);
is_output ($svk, 'propdel', ['myprop', "$copath/A"],
	   [__(" M  $copath/A")]);
is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop2: myvalue2']);
is_output ($svk, 'pl', ['-v', "//A"],
	   ["Properties on //A:",
	    '  myprop: myvalue']);

$svk->commit ('-m', 'commit', $copath);
is_output ($svk, 'pl', ['-v', "//A"],
	   ["Properties on //A:",
	    '  myprop2: myvalue2']);
is_output ($svk, 'ps', ['-m', 'direct', 'direct', 'directly', '//A'],
	   ['Committed revision 4.']);
is_output ($svk, 'ps', ['-m', 'direct', 'direct', 'directly', '//A/foo'],
	   ['Committed revision 5.']);
#	   [' M  A']);
is_output_like ($svk, 'ps', ['-m', 'direct', 'direct', 'directly', '//A/non'],
		qr'Filesystem has no item');
is_output ($svk, 'pl', ['-v', "//A"],
	   ["Properties on //A:",
	    '  direct: directly',
	    '  myprop2: myvalue2']);

is_output ($svk, 'propdel', ['-m', 'direct', 'direct','//A'],
	   ['Committed revision 6.']);
#	   [' M  A']);
$svk->update ($copath);
is_output ($svk, 'pl', ['-v', "//A"],
	   ["Properties on //A:",
	    '  myprop2: myvalue2']);

is_output ($svk, 'pl', ['-v', '-r1', '//A'],
	   []);
is_output ($svk, 'pl', ['-v', '-r1', "$copath/A"],
	   []);
is_output ($svk, 'pl', ['-v', '-r2', '//A'],
	   ["Properties on //A:",
	    '  myprop: myvalue']);
is_output ($svk, 'pl', ['-v', '-r2', "$copath/A"],
	   ["Properties on //A:",
	    '  myprop: myvalue']);

set_editor(<< 'TMP');
$_ = shift;
open _ or die $!;
@_ = ("prepended_prop\n", <_>);
close _;
unlink $_;
open _, '>', $_ or die $!;
print _ @_;
close _;
TMP

is_output ($svk, 'pe', ['-r2', 'newprop', "$copath/A"],
	   [qr'not allowed']);

is_output ($svk, 'pe', ['newprop', "$copath/A"],
	   ['Waiting for editor...',
	    __(" M  $copath/A")]);

is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop2: myvalue2',
	    '  newprop: prepended_prop',
	    '']);
is_output ($svk, 'pe', ['myprop2', "$copath/A"],
	   ['Waiting for editor...',
	    __(" M  $copath/A")]);
is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop2: prepended_prop',
	    'myvalue2',
	    '  newprop: prepended_prop',
	    '']);

$svk->commit ('-m', 'commit after propedit', $copath);

is_output ($svk, 'pe', ['-m', 'commit with pe', 'pedirect', "//A"],
	   ['Waiting for editor...',
	    'Committed revision 8.']);

is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop2: prepended_prop',
	    'myvalue2',
	    '  newprop: prepended_prop',
	    '']);

$svk->update ($copath);

is_output ($svk, 'pl', ['-v', "$copath/A"],
	   [__("Properties on $copath/A:"),
	    '  myprop2: prepended_prop',
	    'myvalue2',
	    '  newprop: prepended_prop', '',
	    '  pedirect: prepended_prop', '']);
chdir ("$copath/A");

is_output ($svk, 'pl', ['-v'],
	   [__("Properties on .:"),
	    '  myprop2: prepended_prop',
	    'myvalue2',
	    '  newprop: prepended_prop', '',
	    '  pedirect: prepended_prop',
	    '']);

is_output ($svk, 'pg', ['myprop2'], ['prepended_prop', 'myvalue2']);
is_output ($svk, 'pg', ['-r1', 'myprop2'], []);
is_output ($svk, 'pg', ['nosuchprop'], []);