From: Collin Funk Date: Wed, 22 Jul 2026 04:45:42 +0000 (-0700) Subject: tests: wc: test -m in single byte and multi byte locales X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=2db599e8b0dbd9810011c154ebfce0b923a3401e;p=thirdparty%2Fcoreutils.git tests: wc: test -m in single byte and multi byte locales * tests/wc/wc.pl ($mb_locale, $single_byte_locale): New variables. (@mbTests): Add some test cases. --- diff --git a/tests/wc/wc.pl b/tests/wc/wc.pl index 266f88d559..b57cd51451 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};