* tests/wc/wc.pl ($mb_locale, $single_byte_locale): New variables.
(@mbTests): Add some test cases.
---
 tests/wc/wc.pl | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 59 insertions(+)

diff --git a/tests/wc/wc.pl b/tests/wc/wc.pl
index 266f88d55..b57cd5145 100755
--- a/tests/wc/wc.pl
+++ b/tests/wc/wc.pl
@@ -23,6 +23,20 @@ my $prog = 'wc';
 # Turn off localization of executable's output.
 @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
 
+my $mb_locale = $ENV{LOCALE_FR_UTF8};
+my $single_byte_locale = 'C';
+
+{
+  my $codeset = qx(LC_ALL=C locale charmap 2>/dev/null);
+  chomp $codeset;
+  if ($codeset eq 'UTF-8')
+    {
+      my $fr_locale = $ENV{LOCALE_FR};
+      $single_byte_locale
+        = defined $fr_locale && $fr_locale ne 'none' ? $fr_locale : undef;
+    }
+}
+
 my @Tests =
     (
      ['a0', '-c',  {IN_PIPE=>''},            {OUT=>"0\n"}],
@@ -44,6 +58,51 @@ my @Tests =
      ['d1', '-w',  {IN_PIPE=>"\1\n"},        {OUT=>"1\n"}],
     );
 
+# Test the behavior of -m with a multi-byte locale.
+my @mbTests =
+    (
+     # LATIN SMALL LETTER A
+     ['mb-m-1byte-1', '-m', {IN_PIPE=>"\x61"}, {OUT=>"1\n"},
+      {ENV=>"LC_ALL=$mb_locale"}],
+     # NO-BREAK SPACE
+     ['mb-m-2byte-1', '-m', {IN_PIPE=>"\xC2\xA0"}, {OUT=>"1\n"},
+      {ENV=>"LC_ALL=$mb_locale"}],
+     # SAMARITAN LETTER ALAF
+     ['mb-m-3byte-1', '-m', {IN_PIPE=>"\xE0\xA0\x80"}, {OUT=>"1\n"},
+      {ENV=>"LC_ALL=$mb_locale"}],
+     # LINEAR B SYLLABLE B008 A
+     ['mb-m-4byte-1', '-m', {IN_PIPE=>"\xF0\x90\x80\x80"}, {OUT=>"1\n"},
+      {ENV=>"LC_ALL=$mb_locale"}],
+    );
+
+defined $mb_locale && $mb_locale ne 'none' and push @Tests, @mbTests;
+
+# Make sure -m counts bytes in single-byte locales.
+if (defined $single_byte_locale)
+  {
+    my @new;
+    my $in_len;
+    for my $t (@mbTests)
+      {
+        my @new_t = map { ref $_ eq 'HASH' ? { %$_ } : $_ } @$t;
+        (my $test_name = shift @new_t) =~ s/^mb/c/;
+        for my $e (@new_t)
+          {
+            next unless ref $e eq 'HASH';
+            $e->{ENV} = "LC_ALL=$single_byte_locale" if exists $e->{ENV};
+            $in_len = length $e->{IN_PIPE} if exists $e->{IN_PIPE};
+          }
+        for my $e (@new_t)
+          {
+            next unless ref $e eq 'HASH';
+            $e->{OUT} = "$in_len\n" if exists $e->{OUT};
+          }
+        unshift @new_t, $test_name;
+        push @new, \@new_t;
+      }
+    push @Tests, @new;
+  };
+
 my $save_temps = $ENV{DEBUG};
 my $verbose = $ENV{VERBOSE};
 
-- 
2.55.0


Reply via email to