This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
In utf8decode.t, constrain more tightly the testing of expected warnings.
authorNicholas Clark <nick@ccl4.org>
Sat, 12 Mar 2011 14:32:27 +0000 (14:32 +0000)
committerNicholas Clark <nick@ccl4.org>
Sat, 12 Mar 2011 15:20:47 +0000 (15:20 +0000)
If one warning is expected, use warning_like() to test for it, which will fail
if multiple warnings are generated. Where multiple warnings are generated,
as well as testing that the first seen matches the expected warning, check that
the expected number are seen. Mark as TODO 3.4.1, which Markus Kuhn annotates
as "All the 10 sequences of 3.3 concatenated, you should see 10 malformed
sequences being signalled", because currently perl generates 18 warnings.

t/op/utf8decode.t

index a947e96..a64753d 100644 (file)
@@ -23,7 +23,7 @@ no utf8;
 foreach (<DATA>) {
     if (/^(?:\d+(?:\.\d+)?)\s/ || /^#/) {
        # print "# $_\n";
-    } elsif (/^(\d+\.\d+\.\d+[bu]?)\s+(y|n)\s+([0-9a-f]{1,8}|-)\s+(\d+)\s+([0-9a-f]{2}(?::[0-9a-f]{2})*)\s+(\d+|-)(?:\s+(.+))?$/) {
+    } elsif (/^(\d+\.\d+\.\d+[bu]?)\s+(y|n|N-?\d+)\s+([0-9a-f]{1,8}|-)\s+(\d+)\s+([0-9a-f]{2}(?::[0-9a-f]{2})*)\s+(\d+|-)(?:\s+(.+))?$/) {
        my ($id, $okay, $Unicode, $byteslen, $hex, $charslen, $experr) =
            ($1, $2, $3, $4, $5, $6, $7);
        my @hex = split(/:/, $hex);
@@ -33,21 +33,32 @@ foreach (<DATA>) {
        if ($okay eq 'y') {
            warning_is(sub {unpack 'C0U*', $octets}, undef,
                       "No warnings expected for $id");
-       } elsif ($okay ne 'n') {
+       } elsif ($okay eq 'n') {
+           isnt($experr, '', "Expected warning for $id provided");
+           warnings_like(sub {unpack 'C0U*', $octets}, [qr/$experr/],
+                        "Only expected warning for $id");
+       } elsif ($okay !~ /^N(-?\d+)/) {
            is($okay, 'n', "Confused test description for $id");
        } else {
-           my $warnings;
+           my $expect = $1;
+           my @warnings;
 
            {
                local $SIG{__WARN__} = sub {
                    print "# $id: @_";
-                   $warnings .= "@_";
+                   push @warnings, "@_";
                };
                unpack 'C0U*', $octets;
            }
 
-           isnt($experr, '', "Expected warning for $id provided");
-           like($warnings, qr/$experr/, "Expected warning for $id seen");
+           isnt($experr, '', "Expected first warning for $id provided");
+           like($warnings[0], qr/$experr/, "Expected first warning for $id seen");
+           local $::TODO;
+           if ($expect < 0) {
+               $expect = -$expect;
+               $::TODO = "Markus Kuhn states that $expect invalid sequences should be signalled";
+           }
+           is(scalar @warnings, $expect, "Expected number of warnings for $id seen");
        }
     } else {
        fail("unknown format '$_'");
@@ -89,19 +100,19 @@ __DATA__
 3.1    Unexpected continuation bytes
 3.1.1 n -              1       80      -       unexpected continuation byte 0x80
 3.1.2 n -              1       bf      -       unexpected continuation byte 0xbf
-3.1.3 n -              2       80:bf   -       unexpected continuation byte 0x80
-3.1.4 n -              3       80:bf:80        -       unexpected continuation byte 0x80
-3.1.5 n -              4       80:bf:80:bf     -       unexpected continuation byte 0x80
-3.1.6 n -              5       80:bf:80:bf:80  -       unexpected continuation byte 0x80
-3.1.7 n -              6       80:bf:80:bf:80:bf       -       unexpected continuation byte 0x80
-3.1.8 n -              7       80:bf:80:bf:80:bf:80    -       unexpected continuation byte 0x80
-3.1.9 n -      64      80:81:82:83:84:85:86:87:88:89:8a:8b:8c:8d:8e:8f:90:91:92:93:94:95:96:97:98:99:9a:9b:9c:9d:9e:9f:a0:a1:a2:a3:a4:a5:a6:a7:a8:a9:aa:ab:ac:ad:ae:af:b0:b1:b2:b3:b4:b5:b6:b7:b8:b9:ba:bb:bc:bd:be:bf -       unexpected continuation byte 0x80
+3.1.3 N2 -             2       80:bf   -       unexpected continuation byte 0x80
+3.1.4 N3 -             3       80:bf:80        -       unexpected continuation byte 0x80
+3.1.5 N4 -             4       80:bf:80:bf     -       unexpected continuation byte 0x80
+3.1.6 N5 -             5       80:bf:80:bf:80  -       unexpected continuation byte 0x80
+3.1.7 N6 -             6       80:bf:80:bf:80:bf       -       unexpected continuation byte 0x80
+3.1.8 N7 -             7       80:bf:80:bf:80:bf:80    -       unexpected continuation byte 0x80
+3.1.9 N64 -    64      80:81:82:83:84:85:86:87:88:89:8a:8b:8c:8d:8e:8f:90:91:92:93:94:95:96:97:98:99:9a:9b:9c:9d:9e:9f:a0:a1:a2:a3:a4:a5:a6:a7:a8:a9:aa:ab:ac:ad:ae:af:b0:b1:b2:b3:b4:b5:b6:b7:b8:b9:ba:bb:bc:bd:be:bf -       unexpected continuation byte 0x80
 3.2    Lonely start characters
-3.2.1 n -      64      c0:20:c1:20:c2:20:c3:20:c4:20:c5:20:c6:20:c7:20:c8:20:c9:20:ca:20:cb:20:cc:20:cd:20:ce:20:cf:20:d0:20:d1:20:d2:20:d3:20:d4:20:d5:20:d6:20:d7:20:d8:20:d9:20:da:20:db:20:dc:20:dd:20:de:20:df:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xc0
-3.2.2 n -      32      e0:20:e1:20:e2:20:e3:20:e4:20:e5:20:e6:20:e7:20:e8:20:e9:20:ea:20:eb:20:ec:20:ed:20:ee:20:ef:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xe0
-3.2.3 n -      16      f0:20:f1:20:f2:20:f3:20:f4:20:f5:20:f6:20:f7:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xf0
-3.2.4 n -      8       f8:20:f9:20:fa:20:fb:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xf8
-3.2.5 n -      4       fc:20:fd:20     -       unexpected non-continuation byte 0x20, immediately after start byte 0xfc
+3.2.1 N32 -    64      c0:20:c1:20:c2:20:c3:20:c4:20:c5:20:c6:20:c7:20:c8:20:c9:20:ca:20:cb:20:cc:20:cd:20:ce:20:cf:20:d0:20:d1:20:d2:20:d3:20:d4:20:d5:20:d6:20:d7:20:d8:20:d9:20:da:20:db:20:dc:20:dd:20:de:20:df:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xc0
+3.2.2 N16 -    32      e0:20:e1:20:e2:20:e3:20:e4:20:e5:20:e6:20:e7:20:e8:20:e9:20:ea:20:eb:20:ec:20:ed:20:ee:20:ef:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xe0
+3.2.3 N8 -     16      f0:20:f1:20:f2:20:f3:20:f4:20:f5:20:f6:20:f7:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xf0
+3.2.4 N4 -     8       f8:20:f9:20:fa:20:fb:20 -       unexpected non-continuation byte 0x20, immediately after start byte 0xf8
+3.2.5 N2 -     4       fc:20:fd:20     -       unexpected non-continuation byte 0x20, immediately after start byte 0xfc
 3.3    Sequences with last continuation byte missing
 3.3.1 n -      1       c0      -       1 byte, need 2
 3.3.2 n -      2       e0:80   -       2 bytes, need 3
@@ -114,11 +125,11 @@ __DATA__
 3.3.9 n -      4       fb:bf:bf:bf     -       4 bytes, need 5
 3.3.10 n -     5       fd:bf:bf:bf:bf  -       5 bytes, need 6
 3.4    Concatenation of incomplete sequences
-3.4.1 n -      30      c0:e0:80:f0:80:80:f8:80:80:80:fc:80:80:80:80:df:ef:bf:f7:bf:bf:fb:bf:bf:bf:fd:bf:bf:bf:bf       -       unexpected non-continuation byte 0xe0, immediately after start byte 0xc0
+3.4.1 N-10 -   30      c0:e0:80:f0:80:80:f8:80:80:80:fc:80:80:80:80:df:ef:bf:f7:bf:bf:fb:bf:bf:bf:fd:bf:bf:bf:bf       -       unexpected non-continuation byte 0xe0, immediately after start byte 0xc0
 3.5    Impossible bytes
 3.5.1 n -      1       fe      -       byte 0xfe
 3.5.2 n -      1       ff      -       byte 0xff
-3.5.3 n -      4       fe:fe:ff:ff     -       byte 0xfe
+3.5.3 N4 -     4       fe:fe:ff:ff     -       byte 0xfe
 4      Overlong sequences
 4.1    Examples of an overlong ASCII character
 4.1.1 n -      2       c0:af   -       2 bytes, need 1