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 => 24;
use strict;
use File::Path;
use Cwd;
use SVK::Test;


my ($xd, $svk) = build_test();
my ($repospath, undef, $repos) = $xd->find_repos ('//', 1);
my $uuid = $repos->fs->get_uuid;

our ($output, $answer);

$svk->mkdir(-m => 'trunk', '//trunk');
my ($copath, $corpath) = get_copath ('smerge-tree');
$svk->checkout ('//trunk', $copath);
chdir($copath);

$svk->mkdir('dir');
overwrite_file('dir/file', "foo\n");
$svk->add('dir');
$svk->ci(-m => 'add tree');

$svk->copy (-m => 'local', '//trunk', '//local');
$svk->switch('//local');
overwrite_file('dir/file', "bar\n");
$svk->ci(-m => 'change file in local');

$svk->rm(-m => 'remove dir with the file in trunk' => '//trunk/dir');

is_output ($svk, 'smerge', ['-C' => '//trunk' => '//local'], [
    'Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	'C   dir',
	'C   dir/file',
    "New merge ticket: $uuid:/trunk:5",
	'Empty merge.',
    '2 conflicts found.',
]);

$ENV{SVKRESOLVE} = 't'; # thiers(delete //local/dir/file)
is_output ($svk, 'smerge', ['-m' => 'smerge tree conflict', '//trunk' => '//local'], [
    'Auto-merging (2, 5) /trunk to /local (base /trunk:2).',
	'D   dir',
    "New merge ticket: $uuid:/trunk:5",
	'Committed revision 6.',
]);

$svk->switch('//trunk');
is_output ($svk, 'st', [], []);

{
    mkdir 'dir';
    overwrite_file('dir/file', "foo\n");
    $svk->add('dir');
    $svk->ci(-m => 'add tree');

    $svk->sm (-m => 'smerge', '//trunk', '//local');

    $svk->switch('//local');
    is_output ($svk, 'cat', ['//local/dir/file'], [ 'foo' ]);
    is_output ($svk, 'cat', ['dir/file'], [ 'foo' ]);
#    overwrite_file('dir/file', 'bar');
#    { local $TODO = "something strange happens here";
#        is_output ($svk, 'st', [], [ 'M   dir/file' ]);
#        is_output ($svk, 'ci', [-m => 'change the file in local', 'dir/file'], [ 'M   dir/file' ]);
#    }
    overwrite_file('dir/file', "foobar\n");
    is_output ($svk, 'st', [], [ __('M   dir/file') ]);
    is_output ($svk, 'ci', [-m => 'change the file in local', 'dir/file'], [ 'Committed revision 9.' ]);

    $svk->rm(-m => 'remove the dir in trunk' => '//trunk/dir');

    is_output ($svk, 'smerge', [-C => '//trunk' => '//local'], [
        'Auto-merging (7, 10) /trunk to /local (base /trunk:7).',
        'C   dir',
        'C   dir/file',
        "New merge ticket: $uuid:/trunk:10",
        'Empty merge.',
        '2 conflicts found.',
    ]);
    $ENV{'SVKRESOLVE'} = 'y';
    is_output ($svk, 'smerge', [-m => 'merge', '//trunk' => '//local'], [
        'Auto-merging (7, 10) /trunk to /local (base /trunk:7).',
        'G   dir',
        'G   dir/file',
        "New merge ticket: $uuid:/trunk:10",
	    'Committed revision 11.',
    ]);
    is_output ($svk, 'cat', ['//local/dir/file'], [ 'foobar' ]);

    $svk->rm(-m => 'remove manually', '//local/dir');
    $svk->sm(-m => 'smerge', '//trunk' => '//local');

    $svk->switch('//trunk');
    is_output ($svk, 'st', [], []);
}

{
    $svk->mkdir('dir');
    overwrite_file('dir/file', "foo\n");
    $svk->add('dir');
    $svk->ci(-m => 'add tree');

    $svk->sm (-m => 'smerge', '//trunk', '//local');

    $svk->switch('//local');
    overwrite_file('dir/new_local_file', "bar\n");
    $svk->add('dir/new_local_file');
    $svk->ci(-m => 'add new file in local');
    is_output ($svk, 'cat', ['//local/dir/new_local_file'], [ 'bar' ]);

    $svk->rm(-m => 'remove the dir in trunk' => '//trunk/dir');

    is_output ($svk, 'smerge', [-C => '//trunk' => '//local'], [
        'Auto-merging (13, 16) /trunk to /local (base /trunk:13).',
        'C   dir',
        'D   dir/file',
        'C   dir/new_local_file',
        "New merge ticket: $uuid:/trunk:16",
        'Empty merge.',
        '2 conflicts found.',
    ]);
    $ENV{'SVKRESOLVE'} = 'y';
    is_output ($svk, 'smerge', [-m => 'merge', '//trunk' => '//local'], [
        'Auto-merging (13, 16) /trunk to /local (base /trunk:13).',
        'G   dir',
        'D   dir/file',
        'G   dir/new_local_file',
        "New merge ticket: $uuid:/trunk:16",
        'Committed revision 17.',
    ]);
    is_output ($svk, 'cat', ['//local/dir/new_local_file'], [ 'bar' ]);

    $svk->rm(-m => 'remove manually', '//local/dir');
    $svk->sm(-m => 'smerge', '//trunk' => '//local');

    $svk->switch('//trunk');
    is_output ($svk, 'st', [], []);
}

{
    $svk->mkdir('dir');
    overwrite_file('dir/file', "foo\n");
    $svk->add('dir');
    $svk->ci(-m => 'add tree');

    $svk->sm (-m => 'smerge', '//trunk', '//local');

    $svk->switch('//local');
    overwrite_file('dir/new_local_file', "bar\n");
    $svk->add('dir/new_local_file');
    $svk->ci(-m => 'add new file in local');

    $svk->rm(-m => 'remove the dir in trunk' => '//trunk/dir');

    is_output ($svk, 'smerge', [-C => '//trunk' => '//local'], [
        'Auto-merging (19, 22) /trunk to /local (base /trunk:19).',
        'C   dir',
        'D   dir/file',
        'C   dir/new_local_file',
        "New merge ticket: $uuid:/trunk:22",
        'Empty merge.',
        '2 conflicts found.',
    ]);
    { local $TODO = "not yet implemented";
        # their - empty, base - empty, yours - our content
        # SVK::Resolve thinks we have no conflict and leave the
        # content even if we want to delete it :)
        $ENV{'SVKRESOLVE'} = 't';
        is_output ($svk, 'smerge', [-m => 'merge', '//trunk' => '//local'], [
            'Auto-merging (19, 22) /trunk to /local (base /trunk:19).',
            'D   dir',
            'D   dir/file',
            'D   dir/new_local_file',
            "New merge ticket: $uuid:/trunk:22",
            'Committed revision 23.',
        ]);
        is_output ($svk, 'ls', ['//local'], [ '' ]);
        # XXX: delete this lines when you'll drop TODO
        $svk->rm(-m => 'remove manually', '//local/dir');
        $svk->sm(-m => 'smerge', '//trunk' => '//local');
    }

    $svk->switch('//trunk');
    is_output ($svk, 'st', [], []);
}

{
    $svk->mkdir(-p => 'dir/sub');
    $svk->ci(-m => 'add tree');

    $svk->sm (-m => 'smerge', '//trunk', '//local');

    $svk->switch('//local');
    $svk->rm('dir/sub');
    $svk->ci(-m => 'delete subdir in local');
    overwrite_file('dir/sub', "bar\n");
    $svk->add('dir/sub');
    $svk->ci(-m => 'add file in place of subdir');

    $svk->rm(-m => 'remove the dir in trunk' => '//trunk/dir');

    is_output ($svk, 'smerge', [-C => '//trunk' => '//local'], [
        'Auto-merging (25, 29) /trunk to /local (base /trunk:25).',
        'C   dir',
        'C   dir/sub',
        "New merge ticket: $uuid:/trunk:29",
        'Empty merge.',
        '2 conflicts found.',
    ]);
    { local $TODO = "not yet implemented";
        $ENV{'SVKRESOLVE'} = 't';
        is_output ($svk, 'smerge', [-m => 'merge', '//trunk' => '//local'], [
            'Auto-merging (25, 29) /trunk to /local (base /trunk:25).',
            'D   dir',
            'D   dir/sub',
            "New merge ticket: $uuid:/trunk:29",
            'Committed revision 30.',
        ]);
        is_output ($svk, 'ls', ['//local'], [ '' ]);
        # XXX: delete this lines when you'll drop TODO
        $svk->rm(-m => 'remove manually', '//local/dir');
        $svk->sm(-m => 'smerge', '//trunk' => '//local');
    }

    $svk->switch('//trunk');
    is_output ($svk, 'st', [], []);
}