The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
print "1..18\n";

use strict;
use Unicode::Map8 qw(NOCHAR);


print "MAPS_DIR = $Unicode::Map8::MAPS_DIR\n";

my $l1 = Unicode::Map8->new("latin1") || die;
my $no = Unicode::Map8->new("no")     || die;

#dump_map($no);

print "not " unless $no->to8($l1->to16("xyzæøå")) eq "xyz{|}";
print "ok 1\n";

print "not " unless $no->recode8($l1, "xyz{|}") eq "xyzæøå";
print "ok 2\n";


print "not " unless NOCHAR == 0xFFFF;
print "ok 3\n";

my $m = Unicode::Map8->new;

$m->addpair(32, 32);
$m->addpair(32, 160);
$m->addpair(160, 32);
$m->addpair(ord("D"), 0x0394);  # U+0394 = DELTA
dump_map($m);

print "not " unless $m->to16(" ") eq "\0 ";
print "ok 4\n";
print "not " unless $m->to16(chr(160)) eq "\0 ";
print "ok 5\n";
print "not " unless $m->to8("\0 ") eq " ";
print "ok 6\n";
print "not " unless $m->to8("\0" . chr(160)) eq " ";
print "ok 7\n";

print "not " unless $m->to16("D") eq "\x03\x94" &&
                    $m->to8("\x03\x94") eq "D";
print "ok 8\n";
print "not " unless $m->to_char16(ord("D")) == 0x0394 &&
                    $m->to_char8(0x0394) == ord("D") &&
                    $m->to_char16(ord("E")) == NOCHAR &&
                    $m->to_char8(0x0395) == NOCHAR;
print "ok 9\n";

print "---\n";

print "not " unless $m->to16("abc") eq "";  # all unmapped
print "ok 10\n";

$m->default_to16(ord("X"));
$m->default_to8(ord("x"));

print "not " unless $m->default_to16 == ord("X") &&
                    $m->default_to8  == ord("x");
print "ok 11\n";


print "not " unless $m->to16("Dabc") eq "\x03\x94\0X\0X\0X" &&
                    $m->to8("\x03\x94\0a\0b\0c") eq "Dxxx";

print "ok 12\n";

#dump_map($m);

$m->nostrict;
print "not " unless $m->to16("Dabc") eq "\x03\x94\0a\0b\0c" &&
                    $m->to8("\x03\x94\0a\0b\0c") eq "Dabc";
print "ok 13\n";

print "not " if $m->_empty_block(0) && !$m->_empty_block(1);
print "ok 14\n";
undef($m);

# Test parsing of text files
open(T, ">map-$$.txt") or die;
print T <<EOT;
  # foo
#bar

0x01 0x0001 # foo
  0x2 0x3#foo
# This is a stupid mapping file
   # mostly made for testing puposes
           	     0x03  	    0x00033
0x333 0x333
FF FFFF
#EOT
0xAB 0xABCD
EOT
close(T);

$m = Unicode::Map8->new("./map-$$.txt");
unlink("map-$$.txt");

if ($m) {
    print "ok 15\n";
    dump_map($m);
    print "not " unless $m->to_char8(1)    == 1 &&
	                $m->to_char16(1)   == 1 &&
			$m->to_char8(0x33) == 3 &&
	                $m->to_char16(0x3) == 0x33 &&
                        $m->to_char8(0xABCD) == 0xAB &&
                        $m->to_char8(10)   == NOCHAR;
    print "ok 16\n";
    print "not " unless $m->recode8($m, "\0\1\2\3\4") eq "\1\2\3";
    print "ok 17\n";
} else {
    my $test;
    for $test (15 .. 17) {
	print "not ok $test\n";
    }
}

print "not " if Unicode::Map8->new("NOT_FOUND");
print "ok 18\n";


#---------------------------------------------------

sub dump_map
{
    my $m = shift;
    for (my $i = 0; $i < 256; $i++) {
	my $u = $m->to_char16($i);
	next if $u == NOCHAR;
	printf "0x%02X 0x%04X\n", $i, $u;
    }
    for (my $block = 0; $block < 256; $block++) {
	next if $m->_empty_block($block);
	print "# BLOCK $block\n";
	for (my $i = 0; $i < 256; $i++) {
	    my $u = $block*256 + $i;
	    my $c = $m->to_char8($u);
	    next if $c == NOCHAR;
	    printf "0x%04X 0x%02X\n", $u, $c;
	}
    }
}