# (There aren't 1000 locales currently in existence, so 99.9 works)
my $acceptable_fold_failure_percentage = $^O eq 'MSWin32' ? 99.9 : 5;
+# The list of test numbers of the problematic tests.
+my @problematical_tests;
+
+
use Dumpvalue;
my $dumper = Dumpvalue->new(
check_taint_not $a;
+"a" =~ /([a-z])/;
+check_taint_not $1, '"a" =~ /([a-z])/';
+"foo.bar_baz" =~ /^(.*)[._](.*?)$/; # Bug 120675
+check_taint_not $1, '"foo.bar_baz" =~ /^(.*)[._](.*?)$/';
+
+# BE SURE TO COPY ANYTHING YOU ADD to the block below
+
{ # This is just the previous tests copied here with a different
# compile-time pragma.
# After all this tainting $a should be cool.
check_taint_not $a;
+
+ "a" =~ /([a-z])/;
+ check_taint_not $1, '"a" =~ /([a-z])/';
+ "foo.bar_baz" =~ /^(.*)[._](.*?)$/; # Bug 120675
+ check_taint_not $1, '"foo.bar_baz" =~ /^(.*)[._](.*?)$/';
}
# Here are in scope of 'use locale'
my $locales_test_number;
my $not_necessarily_a_problem_test_number;
my $first_casing_test_number;
-my $final_casing_test_number;
my %setlocale_failed; # List of locales that setlocale() didn't work on
foreach $Locale (@Locale) {
}
report_multi_result($Locale, $locales_test_number, \@f);
- $final_casing_test_number = $locales_test_number;
+ foreach ($first_casing_test_number..$locales_test_number) {
+ push @problematical_tests, $_;
+ }
+
# Test for read-only scalars' locale vs non-locale comparisons.
next unless uc $y eq $x;
debug_more( "# UPPER=", disp_chars(($x)),
"; lc=", disp_chars(($y)), "; ",
+ "; fc=", disp_chars((fc $x)), "; ",
disp_chars(($x)), "=~/", disp_chars(($y)), "/i=",
$x =~ /$y/i ? 1 : 0,
"; ",
print "# Regex characters in '$x' or '$y', skipping test $locales_test_number for locale '$Locale'\n";
next;
}
- # With utf8 both will fail since the locale concept
- # of upper/lower does not work well in Unicode.
- push @f, $x unless $x =~ /$y/i == $y =~ /$x/i;
+ push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;
# fc is not a locale concept, so Perl uses lc for it.
push @f, $x unless lc $x eq fc $x;
next unless uc $y eq $x;
debug_more( "# UPPER=", disp_chars(($x)),
"; lc=", disp_chars(($y)), "; ",
+ "; fc=", disp_chars((fc $x)), "; ",
disp_chars(($x)), "=~/", disp_chars(($y)), "/i=",
$x =~ /$y/i ? 1 : 0,
"; ",
$y =~ /$x/i ? 1 : 0,
"\n");
- # Here, we can fully test things, unlike plain 'use locale',
- # because this form does work well with Unicode
push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;
# The places where Unicode's lc is different from fc are
next unless lc $y eq $x;
debug_more( "# lower=", disp_chars(($x)),
"; uc=", disp_chars(($y)), "; ",
+ "; fc=", disp_chars((fc $x)), "; ",
disp_chars(($x)), "=~/", disp_chars(($y)), "/i=",
$x =~ /$y/i ? 1 : 0,
"; ",
print "# Regex characters in '$x' or '$y', skipping test $locales_test_number for locale '$Locale'\n";
next;
}
- # With utf8 both will fail since the locale concept
- # of upper/lower does not work well in Unicode.
- push @f, $x unless $x =~ /$y/i == $y =~ /$x/i;
+ push @f, $x unless $x =~ /$y/i && $y =~ /$x/i;
push @f, $x unless lc $x eq fc $x;
}
next unless lc $y eq $x;
debug_more( "# lower=", disp_chars(($x)),
"; uc=", disp_chars(($y)), "; ",
+ "; fc=", disp_chars((fc $x)), "; ",
disp_chars(($x)), "=~/", disp_chars(($y)), "/i=",
$x =~ /$y/i ? 1 : 0,
"; ",
}
}
report_multi_result($Locale, $locales_test_number, \@f);
+ push @problematical_tests, $locales_test_number;
}
# [perl #109318]
# Recount the errors.
-foreach ($first_locales_test_number..$final_locales_test_number) {
+foreach $test_num ($first_locales_test_number..$final_locales_test_number) {
if (%setlocale_failed) {
print "not ";
}
- elsif ($Problem{$_} || !defined $Okay{$_} || !@{$Okay{$_}}) {
+ elsif ($Problem{$test_num} || !defined $Okay{$test_num} || !@{$Okay{$test_num}}) {
if (defined $not_necessarily_a_problem_test_number
- && $_ == $not_necessarily_a_problem_test_number)
+ && $test_num == $not_necessarily_a_problem_test_number)
{
print "# The failure of test $not_necessarily_a_problem_test_number is not necessarily fatal.\n";
print "# It usually indicates a problem in the environment,\n";
print "# not in Perl itself.\n";
}
- if ($Okay{$_} && ($_ >= $first_casing_test_number
- && $_ <= $final_casing_test_number))
- {
+ if ($Okay{$test_num} && grep { $_ == $test_num } @problematical_tests) {
# Round to nearest .1%
- my $percent_fail = (int(.5 + (1000 * scalar(keys $Problem{$_})
+ my $percent_fail = (int(.5 + (1000 * scalar(keys $Problem{$test_num})
/ scalar(@Locale))))
/ 10;
if (! $debug && $percent_fail < $acceptable_fold_failure_percentage)
{
- $test_names{$_} .= 'TODO';
+ $test_names{$test_num} .= 'TODO';
print "# ", 100 - $percent_fail, "% of locales pass the following test, so it is likely that the failures\n";
print "# are errors in the locale definitions. The test is marked TODO, as the\n";
print "# problem is not likely to be Perl's\n";
print "#\n";
if ($debug) {
print "# The code points that had this failure are given above. Look for lines\n";
- print "# that match 'failed $_'\n";
+ print "# that match 'failed $test_num'\n";
}
else {
print "# For more details, rerun, with environment variable PERL_DEBUG_FULL_TEST=1.\n";
- print "# Then look at that output for lines that match 'failed $_'\n";
+ print "# Then look at that output for lines that match 'failed $test_num'\n";
}
print "not ";
}
- print "ok $_";
- if (defined $test_names{$_}) {
+ print "ok $test_num";
+ if (defined $test_names{$test_num}) {
# If TODO is in the test name, make it thus
- my $todo = $test_names{$_} =~ s/TODO\s*//;
- print " $test_names{$_}";
+ my $todo = $test_names{$test_num} =~ s/TODO\s*//;
+ print " $test_names{$test_num}";
print " # TODO" if $todo;
}
print "\n";
my $F = join(" ", @F);
$F =~ s/(.{50,60}) /$1\n#\t/g;
+ my $details = "";
+ unless ($debug) {
+ $details = "# For more details, rerun, with environment variable PERL_DEBUG_FULL_TEST=1.\n";
+ }
+ elsif ($debug == 1) {
+ $details = "# For even more details, rerun, with environment variable PERL_DEBUG_FULL_TEST=2.\n";
+ }
+
warn
"# The following locales\n#\n",
"#\t", $F, "\n#\n",
"# had problems.\n#\n",
- "# For more details, rerun, with environment variable PERL_DEBUG_FULL_TEST=1.\n";
+ $details;
} else {
warn "# None of your locales were broken.\n";
}