The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- cperl -*-

use strict;
use warnings;
use lib 't';
use Test::More;

require "test-functions.pl";

if (can_svn()) {
    plan tests => 13;
}
else {
    plan skip_all => 'Cannot find or use svn commands.';
}

my $t    = reset_repo();
my $wc   = catdir($t, 'wc');
my $file = catfile($wc, '_');

set_hook(<<'EOS');
use SVN::Hooks::CheckStructure;
EOS

set_conf(<<'EOS');
CHECK_STRUCTURE(
    [
	_invalid_rhs => 'invalid rhs',
	_deny => 0,
	_allow => 1,
	_file => 'FILE',
	_dir => 'DIR',
	sub1 => [
	    sub2 => [
		sub3 => [
		],
	    ],
	],
	qr/regex/ => [
	    _just => 1,
	    0 => 'custom error message',
	],
	1 => 'DIR',
    ],
);
EOS

work_nok('invalid_rhs', 'syntax error: unknown string spec (invalid rhs)', <<"EOS");
echo txt >${file}invalid_rhs
svn add -q --no-auto-props ${file}invalid_rhs
svn ci -mx ${file}invalid_rhs
EOS

work_nok('deny 0', 'invalid path', <<"EOS");
echo txt >${file}deny
svn add -q --no-auto-props ${file}deny
svn ci -mx ${file}deny
EOS

work_ok('allow 1', <<"EOS");
echo txt >${file}allow
svn add -q --no-auto-props ${file}allow
svn ci -mx ${file}allow
EOS

work_nok('is not file', 'the component (_file) should be a FILE in', <<"EOS");
mkdir ${file}file
svn add -q --no-auto-props ${file}file
svn ci -mx ${file}file
EOS

work_ok('is file', <<"EOS");
svn rm -q --force ${file}file
echo txt >${file}file
svn add -q --no-auto-props ${file}file
svn ci -mx ${file}file
EOS

work_nok('is not dir', 'the component (_dir) should be a DIR in', <<"EOS");
echo txt >${file}dir
svn add -q --no-auto-props ${file}dir
svn ci -mx ${file}dir
EOS

work_ok('is dir', <<"EOS");
svn rm -q --force ${file}dir
mkdir ${file}dir
svn add -q --no-auto-props ${file}dir
svn ci -mx ${file}dir
EOS

my $sub1 = catdir($wc, 'sub1');
my $sub2 = catdir($sub1, 'sub2');
my $sub3 = catdir($sub2, 'sub3');

work_ok('allow sub', <<"EOS");
mkdir $sub1 $sub2 $sub3
svn add -q --no-auto-props $sub1
svn ci -mx $sub1
EOS

my $deny = catfile($sub2, '_deny');

work_nok('deny sub', 'the component (_deny) is not allowed in', <<"EOS");
echo txt >$deny
svn add -q --no-auto-props $deny
svn ci -mx $deny
EOS

my $preregexsuf = catdir($wc, 'preregexsuf');
my $just        = catfile($preregexsuf, '_just');

work_ok('regex allow', <<"EOS");
mkdir $preregexsuf
echo txt >$just
svn add -q --no-auto-props $preregexsuf
svn ci -mx $preregexsuf
EOS

my $no = catfile($preregexsuf, 'no');

work_nok('0 error', 'custom error message', <<"EOS");
echo txt >$no
svn add -q --no-auto-props $no
svn ci -mx $no
EOS

work_nok('deny else', 'the component (_else) should be a DIR in', <<"EOS");
echo txt >${file}else
svn add -q --no-auto-props ${file}else
svn ci -mx ${file}else
EOS

work_ok('deny else', <<"EOS");
svn rm -q --force ${file}else
mkdir ${file}else
svn add -q --no-auto-props ${file}else
svn ci -mx ${file}else
EOS