The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use utf8;

no warnings 'utf8';

use Test::More;
use Test::NoWarnings;

use Unicode::Stringprep;

my @data; while(<DATA>) {
  my @c = map { s/^\s+|\s+$//g;$_; } split m/;/, $_, 3;
  push @data, \@c if $#c > 1;
}

plan tests => ($#data+1) + 2;
ok($#data > 2, 'number of test patterns');

my $func = Unicode::Stringprep->new('3.2', undef, 'KC');

foreach my $d (@data) {
  $d->[2] = sprintf('U+%s - %s', uc($d->[0]), $d->[2]) 
    unless $d->[0] =~ m/\s/;

  $d->[1] ||= $d->[0];

  foreach my $c (0..1) {
    if($d->[$c] =~ m/undef/) {
      $d->[$c] = undef; 
      next;
    }
    $d->[$c] = join '',
      map { chr hex $_ }
	grep { length($_) > 0 }
          split /\s+/, $d->[$c];
  }
  is( eval{ $func->($d->[0]) }, $d->[1], $d->[2] );
};
exit(0);

__DATA__

F951; 964B; Erroneous mapping (Corrigendum 3, corrected in Unicode 3.2)

2F868; 2136A; Erroneous mapping (Corrigendum 4, corrected in Unicode 4.0)
2F874; 5F33; Erroneous mapping (Corrigendum 4, corrected in Unicode 4.0)
2F91F; 43AB; Erroneous mapping (Corrigendum 4, corrected in Unicode 4.0)
2F95F; 7AAE; Erroneous mapping (Corrigendum 4, corrected in Unicode 4.0)
2F9BF; 4D57; Erroneous mapping (Corrigendum 4, corrected in Unicode 4.0)

2047; 3F 3F; DOUBLE QUESTION MARK (added in 3.2)
205F; 20; MEDIUM MATHEMATICAL SPACE (added in 3.2)
30FF; 30B3 30C8; KATAKANA DIGRAPH KOTO (added in 3.2)
2ADC; 2ADD 0338; FORKING (added in 3.2)
1D15E; 1D157 1D165; MUSICAL SYMBOL HALF NOTE (added in 3.1)

213B;; FACSIMILE SIGN (added in 4.0)
1EA5 35D 329;; No reordering for U+035D (added in 4.0)

0B47 0300 0B3E; undef; PR 29 test case 1
1100 0300 1161; undef; PR 29 test case 2
1100 0300 1161 0323; undef; PR 29 test case 2, expanded