The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More tests => 46;
use Encode     qw[_utf8_on];
use t::Util    qw[throws_ok pack_overlong_utf8];

BEGIN {
    use_ok('Unicode::UTF8', qw[ decode_utf8
                                encode_utf8 
                                valid_utf8 ]);
}

my @tests = (
      0x00,
      0x80,
     0x800,
    0x1000,
);

foreach my $cp (@tests) {
    foreach my $sequence (pack_overlong_utf8($cp)) {
        my $name = sprintf 'decode_utf8(<%s>) non-shortest form representation of U+%.4X',
          join(' ', map { sprintf '%.2X', ord $_ } split //, $sequence), $cp;

        throws_ok {
            use warnings FATAL => 'utf8';
            decode_utf8($sequence);
        } qr/Can't decode ill-formed UTF-8 octet sequence/, $name;
    }
}

foreach my $cp (@tests) {
    foreach my $sequence (pack_overlong_utf8($cp)) {
        my $name = sprintf 'encode_utf8(<%s>) non-shortest form representation of U+%.4X',
          join(' ', map { sprintf '%.2X', ord $_ } split //, $sequence), $cp;

        _utf8_on($sequence);
        throws_ok { 
            encode_utf8($sequence);
        } qr/Can't decode ill-formed UTF-X octet sequence/, $name;
    }
}

foreach my $cp (@tests) {
    foreach my $sequence (pack_overlong_utf8($cp)) {
        my $name = sprintf 'valid_utf8(<%s>) non-shortest form representation of U+%.4X',
          join(' ', map { sprintf '%.2X', ord $_ } split //, $sequence), $cp;

        ok(!valid_utf8($sequence), $name);
    }
}