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

use Test::More;

use CGI::Alert;

# Not interested in any email being sent
$SIG{__DIE__}  = 'DEFAULT';
$SIG{__WARN__} = 'DEFAULT';

#
# LHS (key) is what we pass to the import method
# RHS (val) is how we expect to see that interpreted
#
our %tests =
  (
   'hide=/^passw/'	=> '(?^:^passw)',       # Note: new >=5.14 regexs
   'hide=m!^passw!'	=> '(?^:^passw)',
   'hide=^passw'	=> '(?^:^passw)',
   '-hide=^passw'	=> '(?^:^passw)',

   'hide=qr/^passw/i'	=> '(?^i:^passw)',
   'hide=/^aaa(/'	=> 'err:Unmatched \( in regex; marked by <-- HERE',
  );

# 2 tests for each of the above: one to make sure it parses, one to make
# sure it is interpreted correctly.
plan tests => 2 * keys %tests;


my @warnings;
$SIG{__WARN__} = sub { push @warnings, @_ };

for my $t (sort keys %tests) {
    # Reset
    @CGI::Alert::Hide = ();
    @warnings = ();

    # Do it
    CGI::Alert->import( $t );

    # Do we expect an error?
    if ((my $expect = $tests{$t}) =~ m!^err:(.*)!) {
	# Error expected.  Make sure the result matches.
	my $warn_re = qr/$1/;
	if (@warnings == 1) {
	    like $warnings[0], $warn_re, "$t: expected warnings";
	}
	else {
	    fail "$t (1: expected failure!)";
	}
	# (meaningless to check the parsed RE)
	ok 1, "$t (2: results - meaningless)";
    }
    else {
	# No error expected.
	if (@warnings == 0) {
	    pass "$t (1: parsed OK)";
	}
	else {
	    fail "$t (1: did not parse: @warnings)";
	}

	# Make sure the compiled RE matches what we expect.
        # Note the regex transformation hackery: perl 5.14 changed the
        # string representation of compiled regexps:
        #
        #    perl <  5.14  : (?-xism:foo)
        #    perl >= 5.14  : (?^:foo)
        #
        # To deal with both, we transform old-style to new.
        my $got = $CGI::Alert::Hide[0];
        $got =~ s{^\(\?(.*)-[a-z]+:}{(?^$1:};

	is $got, $expect, "$t (2: results)";
    }
}

exit 0;