#!/usr/bin/perl

use strict;
use warnings;

use Test::More;
plan(tests => 1);

use File::Path qw(remove_tree);
use File::Basename qw(dirname);
use lib dirname(dirname(__FILE__));
use Test::DH;
use Debian::Debhelper::Dh_Lib qw(!dirname);

sub extract_generated_lines {
	my ($file) = @_;
	my (@lines, $marker);
	return if not -f $file;
	open(my $fd, '<', $file) or error("open($file) failed: $!");
	while (my $line = <$fd>) {
		chomp($line);
		if (defined($marker)) {
			last if $line eq $marker;
			push(@lines, $line);
			next;
		}
		if ($line =~ m{\s*<<\s*(\S+)\s*$}) {
			$marker = $1;
		}
	}
	close($fd);
	return @lines;
}


sub perform_test {
	my ($install_dirs, $expected_dirs_postinst, $expected_dirs_prerm) = @_;
	my (@postinst, @prerm);
	my @scripts = qw(
        debian/debhelper.postinst.debhelper
        debian/debhelper.prerm.debhelper
    );

	rm_files(@scripts);
	remove_tree('debian/debhelper');
	mkdirs(map { "debian/debhelper/$_" } @{$install_dirs});

	ok(run_dh_tool('dh_usrlocal'));

	@postinst = extract_generated_lines("debian/debhelper.postinst.debhelper");
	@prerm = extract_generated_lines("debian/debhelper.prerm.debhelper");

	is_deeply(\@postinst,
			  [map { "$_ default" } @{$expected_dirs_postinst}],
			  "Correct postinst"
		) or do { diag("postinst: $_") for @postinst; };
	is_deeply(\@prerm,
			  $expected_dirs_prerm,
			  "Correct prerm"
		) or do { diag("prerm: $_") for @prerm; };
}

each_compat_subtest {

	perform_test(
		['/usr/local/bar', '/usr/local/foo'],
		['/usr/local/bar', '/usr/local/foo'],
		[]
	);

	perform_test(
		[
		 '/usr/local/foo/bar',
		 '/usr/local/foo/baz',
		],
		[
		 '/usr/local/foo',
		 '/usr/local/foo/bar',
		 '/usr/local/foo/baz',
		],
		[
		 '/usr/local/foo/bar',
		 '/usr/local/foo/baz',
		]
	);

	perform_test(
		[qw(
		 /usr/local/a/a/a
		 /usr/local/a/a/b
		 /usr/local/a/b/a
		 /usr/local/a/b/b
		 /usr/local/b/a/a
		 /usr/local/b/a/b
		 /usr/local/b/b/a
		 /usr/local/b/b/b
		)],
		[qw(
		 /usr/local/a
		 /usr/local/a/a
		 /usr/local/a/a/a
		 /usr/local/a/a/b
		 /usr/local/a/b
		 /usr/local/a/b/a
		 /usr/local/a/b/b
		 /usr/local/b
		 /usr/local/b/a
		 /usr/local/b/a/a
		 /usr/local/b/a/b
		 /usr/local/b/b
		 /usr/local/b/b/a
		 /usr/local/b/b/b
		 )],
		[qw(
		 /usr/local/a/a/a
		 /usr/local/a/a/b
		 /usr/local/a/a
		 /usr/local/a/b/a
		 /usr/local/a/b/b
		 /usr/local/a/b
		 /usr/local/b/a/a
		 /usr/local/b/a/b
		 /usr/local/b/a
		 /usr/local/b/b/a
		 /usr/local/b/b/b
		 /usr/local/b/b
		 )]
	);

	perform_test(
		[
		 '/usr/local/foo/dir/somewhere',
		 '/usr/local/bar/another-dir/elsewhere',
		 '/usr/local/baz/foo+bar/thing',
		],
		[
		 '/usr/local/bar',
		 '/usr/local/bar/another-dir',
		 '/usr/local/bar/another-dir/elsewhere',
		 '/usr/local/baz',
		 '/usr/local/baz/foo+bar',
		 '/usr/local/baz/foo+bar/thing',
		 '/usr/local/foo',
		 '/usr/local/foo/dir',
		 '/usr/local/foo/dir/somewhere',
		],
		[
		 '/usr/local/bar/another-dir/elsewhere',
		 '/usr/local/bar/another-dir',
		 '/usr/local/baz/foo+bar/thing',
		 '/usr/local/baz/foo+bar',
		 '/usr/local/foo/dir/somewhere',
		 '/usr/local/foo/dir',
		]
	);
};

