lib/locale.t: Don't assume NUL is a control
authorKarl Williamson <khw@cpan.org>
Mon, 28 Nov 2016 21:16:18 +0000 (14:16 -0700)
committerKarl Williamson <khw@cpan.org>
Tue, 29 Nov 2016 00:15:24 +0000 (17:15 -0700)
A test that assumed NUL would be considered a control fails in locales
where it isn't considered a control.

This was found on FREEBSD, where the locale "hi_IN.ISCII-DEV" is
defective (based on the Wikipedia article on ISCII
https://en.wikipedia.org/wiki/Indian_Script_Code_for_Information_Interchange).
Only the code points 0x09-0x0D are considered controls in this
implementation, whereas the article says ISCII is a superset of ASCII,
so should have 33 controls, not just 5.  (Unrelated to this ticket, but
another apparent defect I saw is that this implementation defines 0x91,
but the article says that code point is unassigned.)

lib/locale.t

index 9695d86..2f3123d 100644 (file)
@@ -1806,10 +1806,16 @@ foreach my $Locale (@Locale) {
 
         ++$locales_test_number;
         $test_names{$locales_test_number}
-                            = 'Verify that \0 sorts before any other control';
-        my $ok = $sorted_controls[0] eq "\0";
-        report_result($Locale, $locales_test_number, $ok);
-        shift @sorted_controls;
+                = 'Skip in locales where \0 is not considered a control;'
+                . ' otherwise verify that \0 sorts before any other control';
+        if ("\0" !~ /[[:cntrl:]]/) {
+            report_result($Locale, $locales_test_number, 1);
+        }
+        else {
+            my $ok = $sorted_controls[0] eq "\0";
+            report_result($Locale, $locales_test_number, $ok);
+            shift @sorted_controls;
+        }
         my $lowest_control = $sorted_controls[0];
 
         ++$locales_test_number;
@@ -1827,7 +1833,7 @@ foreach my $Locale (@Locale) {
         ++$locales_test_number;
         $test_names{$locales_test_number}
                             = 'Verify that strings with embedded NUL collate';
-        $ok = "a\0a\0a" lt "a${lowest_control}a${lowest_control}a";
+        my $ok = "a\0a\0a" lt "a${lowest_control}a${lowest_control}a";
         report_result($Locale, $locales_test_number, $ok);
 
         ++$locales_test_number;