The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use utf8;
use Test::More tests => 1+4+3+3+6;
BEGIN { use_ok('Text::VisualWidth::PP') };

binmode STDOUT, ":encoding(utf8)";

ok( Text::VisualWidth::PP::width("123abcパピプパピプ") == 18, 'Normal width');
is( Text::VisualWidth::PP::trim("123パピプパピプ",7), '123パピ', 'Halfwidth Kana trim');
is( Text::VisualWidth::PP::trim("123パピプパピプ",8), '123パピ', 'Halfwidth Kana trim');
is( Text::VisualWidth::PP::trim("123パピプパピプ",9), '123パピプ', 'Halfwidth Kana trim');

sub kana {
    my $X_KANA = shift;
    map  { @$_ }
    grep { defined $_->[1] }
    map  { [ $_->[0], eval "\"$_->[1]\"" ] }	# "\N{NAME}"
    map  { [ $_->[0], "\\N{$_->[1]}" ] }	# \N{NAME}
    map  {					# UNICODE NAME
	( [ $_,    "$X_KANA LETTER $_" ],
	  [ "x$_", "$X_KANA LETTER SMALL $_" ] )
    }
    map  {					# KA KI KU KE KO SA ...
	my $c = $_;
	map { "$c$_" } qw(A I U E O);
    }
    'KSTNHMYRW GZDBP' =~ /\A|\w/g;
}
my %k = kana "KATAKANA";
my %h = kana "HIRAGANA";
my %m = (
    'CT' => "\N{COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK}",
    'CM' => "\N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK}",
    'T'  => "\N{KATAKANA-HIRAGANA VOICED SOUND MARK}",
    'M'  => "\N{KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK}",
    );

# ハ゜ヒ゜フ゜
my $c_papipu = "$k{HA}$m{CM}$k{HI}$m{CM}$k{HU}$m{CM}";
ok( Text::VisualWidth::PP::width("123abc${c_papipu}パピプ") == 18, 'Combined width');
is( Text::VisualWidth::PP::trim("123${c_papipu}パピプ",11),
    "123${c_papipu}パ",
    'Combined trim');
is( Text::VisualWidth::PP::trim("123${c_papipu}パピプ",8),
    "123\x{30cf}\x{309a}\x{30d2}\x{309a}",
    'Combined trim');

# マ゛ミ゛
my $c_mami = "$k{MA}$m{CT}$k{MI}$m{CT}";
is( Text::VisualWidth::PP::trim("${c_mami}",4),
    "${c_mami}",
    'Combined trim');
is( Text::VisualWidth::PP::trim("${c_mami}",3),
    "$k{MA}$m{CT}",
    'Combined trim');
is( Text::VisualWidth::PP::trim("${c_mami}",2),
    "$k{MA}$m{CT}",
    'Combined trim');

# Vietnamese
ok( Text::VisualWidth::PP::width("Mọi người") == 9, 'VI width');
is( Text::VisualWidth::PP::trim("Mọi người",2), "Mọ", 'VI trim');
is( Text::VisualWidth::PP::trim("Mọi người",8), "Mọi ngườ", 'VI trim');

ok( Text::VisualWidth::PP::width("Mọi người") == 9, 'VI combined width');
is( Text::VisualWidth::PP::trim("Mọi người",2), "Mọ", 'VI combined trim');
is( Text::VisualWidth::PP::trim("Mọi người",8), "Mọi ngườ", 'VI decomp trim');

done_testing;