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 => 20;
}
else {
    plan skip_all => 'Cannot find or use svn commands.';
}

my $t = reset_repo();

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

set_conf(<<'EOS');
CHECK_PROPERTY();
EOS

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

work_nok('conf: no first arg', 'CHECK_PROPERTY: first argument must be a STRING or a qr/Regexp/', <<"EOS");
echo txt >$file
svn add -q --no-auto-props $file
svn ci -mx $file
EOS

set_conf(<<'EOS');
CHECK_PROPERTY(bless({}, 'Nothing'));
EOS

work_nok('conf: wrong first arg', 'CHECK_PROPERTY: first argument must be a STRING or a qr/Regexp/', <<"EOS");
svn ci -mx $file
EOS

set_conf(<<'EOS');
CHECK_PROPERTY('string');
EOS

work_nok('conf: no second arg', 'CHECK_PROPERTY: second argument must be a STRING', <<"EOS");
svn ci -mx $file
EOS

set_conf(<<'EOS');
CHECK_PROPERTY('s', qr/asdf/);
EOS

work_nok('conf: wrong second arg', 'CHECK_PROPERTY: second argument must be a STRING', <<"EOS");
svn ci -mx $file
EOS

set_conf(<<'EOS');
CHECK_PROPERTY('s', 's', bless({}, 'Nothing'));
EOS

work_nok('conf: wrong third arg', 'CHECK_PROPERTY: third argument must be undefined, or a NUMBER, or a STRING, or a qr/Regexp/', <<"EOS");
svn ci -mx $file
EOS

set_conf(<<'EOS');
CHECK_PROPERTY('file1', 'prop');
CHECK_PROPERTY('file2', 'prop', 0);
CHECK_PROPERTY('file3', 'prop', 1);
CHECK_PROPERTY('file4', 'prop', 'value');
CHECK_PROPERTY('file5', 'prop', qr/^value$/);
CHECK_PROPERTY(qr/file6/, 'prop');
EOS

work_nok('check(string, string, undef) fail', 'property prop must be set for: file1', <<"EOS");
echo txt >${file}1
svn add -q --no-auto-props ${file}1
svn ci -mx ${file}1
EOS

work_ok('check(string, string, undef) succeed', <<"EOS");
svn ps prop x ${file}1
svn ci -mx ${file}1
EOS

work_nok('check(string, string, false) fail', 'property prop must not be set for: file2', <<"EOS");
echo txt >${file}2
svn add -q --no-auto-props ${file}2
svn ps prop x ${file}2
svn ci -mx ${file}2
EOS

work_ok('check(string, string, false) succeed', <<"EOS");
svn pd prop ${file}2
svn ci -mx ${file}2
EOS

work_nok('check(string, string, true) fail', 'property prop must be set for: file3', <<"EOS");
echo txt >${file}3
svn add -q --no-auto-props ${file}3
svn ci -mx ${file}3
EOS

work_ok('check(string, string, true) succeed', <<"EOS");
svn ps prop x ${file}3
svn ci -mx ${file}3
EOS

work_nok('check(string, string, string) fail because not set',
	 'property prop must be set to "value" for: file4', <<"EOS");
echo txt >${file}4
svn add -q --no-auto-props ${file}4
svn ci -mx ${file}4
EOS

work_nok('check(string, string, string) fail because of wrong value',
	 'property prop must be set to "value" and not to "x" for: file4', <<"EOS");
svn ps prop x ${file}4
svn ci -mx ${file}4
EOS

work_ok('check(string, string, string) succeed', <<"EOS");
svn ps prop value ${file}4
svn ci -mx ${file}4
EOS

work_nok('check(string, string, regex) fail because not set',
	 qr/property prop must be set and match "\(\?(?:-xism|\^):\^value\$\)" for: file5/, <<"EOS");
echo txt >${file}5
svn add -q --no-auto-props ${file}5
svn ci -mx ${file}5
EOS

work_nok('check(string, string, regex) fail because of wrong value',
	 qr/property prop must match "\(\?(?:-xism|\^):\^value\$\)" but is "x" for: file5/, <<"EOS");
svn ps prop x ${file}5
svn ci -mx ${file}5
EOS

work_ok('check(string, string, regex) succeed', <<"EOS");
svn ps prop value ${file}5
svn ci -mx ${file}5
EOS

work_nok('check(regex, string, undef) fail', 'property prop must be set for: file6', <<"EOS");
echo txt >${file}6
svn add -q --no-auto-props ${file}6
svn ci -mx ${file}6
EOS

work_ok('check(regex, string, undef) succeed', <<"EOS");
svn ps prop x ${file}6
svn ci -mx ${file}6
EOS

work_ok('succeed because dont match file name', <<"EOS");
echo txt >${file}NOMATCH
svn add -q --no-auto-props ${file}NOMATCH
svn ci -mx ${file}NOMATCH
EOS