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

use 5.010001;
use strict;
use warnings;
use utf8;
use constant NL => "\n";

use POSIX;
use Test::More 0.98;
use Text::WideChar::Util qw(wrap mbwrap);

# XXX test flindent opt is wider than width
# XXX test flindent from text is wider than width

{
    my $u = <<_;
I dont wan't to go home. Where do you want to go? I'll keep you company. Mr Goh,
I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    my $w = <<_;
I dont wan't to go home. Where do you
want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me
company.
_
    is(wrap($u, 40), $w, "single paragraph");
}

{
    my $u = <<_;
I dont wan't to go home.
Where do you want to go?
I'll keep you company.
Mr Goh, I'm fine. You
don't have to keep me
company.
_
#--------1---------2---------3---------4
    my $w = <<_;
I dont wan't to go home. Where do you
want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me
company.
_
    is(wrap($u, 40), $w, "reflow");
}

{
    my $u = "I dont wan't to go home.
Where do you want to go?
I'll keep you company.
Mr Goh, I'm fine. You
don't have to keep me
company.";
#--------1---------2---------3---------4
    my $w = "I dont wan't to go home. Where do you
want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me
company.";
    is(wrap($u, 40), $w, "trailing newline state is preserved (no newline)");
}

subtest "paragraph break characters are maintained" => sub {
    is(wrap("a\n\nb", 40), "a\n\nb", "\\n\\n");
    is(wrap("a\n\n\nb", 40), "a\n\n\nb", "\\n\\n\\n");
    is(wrap("a\n \nb", 40), "a\n \nb", "\\n \\n");
    is(wrap("a\n\n\nb\n\n", 40), "a\n\n\nb\n\n", "\\n\\n at the end");
};

subtest "flindent & slindent deduced from text" => sub {
    my $u = <<_;
  I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    my $w = <<_;
  I dont wan't to go home. Where do you
want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me
company.
_
    is(wrap($u, 40), $w, "flindent");

    $u = <<_;
  I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
    Goh, I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    $w = <<_;
  I dont wan't to go home. Where do you
    want to go? I'll keep you company.
    Mr Goh, I'm fine. You don't have to
    keep me company.
_
    is(wrap($u, 40), $w, "flindent + slindent");

#--------1---------2---------3---------4
    $u = <<_;
I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
    Goh, I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    $w = <<_;
I dont wan't to go home. Where do you
    want to go? I'll keep you company.
    Mr Goh, I'm fine. You don't have to
    keep me company.
_
    is(wrap($u, 40), $w, "slindent");

    $u = <<_;
  I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
    Goh, I'm fine. You don't have to keep me company.

    I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    $w = <<_;
  I dont wan't to go home. Where do you
    want to go? I'll keep you company.
    Mr Goh, I'm fine. You don't have to
    keep me company.

    I dont wan't to go home. Where do
you want to go? I'll keep you company.
Mr Goh, I'm fine. You don't have to keep
me company.
_
    is(wrap($u, 40), $w, "flindent + slindent is reset every para");
};

subtest "flindent & slindent option" => sub {
    my $u = <<_;
I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    my $w = <<_;
  I dont wan't to go home. Where do you
 want to go? I'll keep you company. Mr
 Goh, I'm fine. You don't have to keep
 me company.
_
    is(wrap($u, 40, {flindent=>'  ', slindent=>' '}), $w,
       "flindent + slindent");

    $u = <<_;
I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
Goh, I'm fine. You don't have to keep me company.

  I dont wan't to go home. Where do you want to go? I'll keep you company. Mr
    Goh, I'm fine. You don't have to keep me company.
_
#--------1---------2---------3---------4
    $w = <<_;
  I dont wan't to go home. Where do you
 want to go? I'll keep you company. Mr
 Goh, I'm fine. You don't have to keep
 me company.

  I dont wan't to go home. Where do you
 want to go? I'll keep you company. Mr
 Goh, I'm fine. You don't have to keep
 me company.
_
    is(wrap($u, 40, {flindent=>'  ', slindent=>' '}), $w,
       "flindent + slindent is the same at every para");
};

subtest "tab_width option (flindent)" => sub {
# --------1---------2
    my $u0 = "I don't want to go home.\n";
    is(wrap($u0, 20, {flindent=>"\t"}), "\tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>" \t"}), " \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"  \t"}), "  \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"   \t"}), "   \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"    \t"}), "    \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"     \t"}), "     \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"      \t"}), "      \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"       \t"}), "       \tI don't want\nto go home.\n");
    is(wrap($u0, 20, {flindent=>"        \t"}), "        \tI\ndon't want to go\nhome.\n");
};

# TODO: tab_width option (slindent)

subtest "chop long word" => sub {
    is(wrap("1234567890",  5), "12345\n67890");
    is(wrap("12345678901", 5), "12345\n67890\n1");
    is(wrap("  12345678901", 5), "  \n12345\n67890\n1");
    is(wrap("  12345678901", 5, {slindent=>" "}), "  \n 1234\n 5678\n 901");
};

subtest "chop long word (mb)" => sub {
    is(mbwrap("1234567890",  5), "12345\n67890");
    is(mbwrap("12345678901", 5), "12345\n67890\n1");
    is(mbwrap("  12345678901", 5), "  \n12345\n67890\n1");
    is(mbwrap("  12345678901", 5, {slindent=>" "}), "  \n 1234\n 5678\n 901");
};

subtest "opt return_stats" => sub {
    is_deeply(wrap("12345 123", 10, {return_stats=>1}),
              ["12345 123", {max_word_width=>5, min_word_width=>3}],
              "opt return_stats");
};

subtest "chinese text" => sub {
    my $input = <<'_';
存储和信息管理公司Iron Mountain位于阿根廷首都布宜诺斯艾利斯的一个大数据中心周三遭大火烧毁,九名消防员在救火中丧生,2人失踪,7人受伤。数据中心储存了阿根廷央行和企业档案,因此损失可能非常巨大。这个数据中心配备了私人的救火队,自动喷水灭火系统,火灾控制系统以及其它火灾预防的措施。但即便如此,仍然没有预防灾难的发生。目前还不清楚数据中心起火的原因。
_
    my $res = <<'_';
存储和信息管理公司
Iron Mountain位于阿
根廷首都布宜诺斯艾利
斯的一个大数据中心周
三遭大火烧毁,九名消
防员在救火中丧生,2
人失踪,7人受伤。数
据中心储存了阿根廷央
行和企业档案,因此损
失可能非常巨大。这个
数据中心配备了私人的
救火队,自动喷水灭火
系统,火灾控制系统以
及其它火灾预防的措施
。但即便如此,仍然没
有预防灾难的发生。目
前还不清楚数据中心起
火的原因。
_
    is(mbwrap($input, 20), $res);
};

subtest "long cjk word is not truncated before line-broken" => sub {
    my $input = <<'_';
aku mau 吃饭吃饭吃饭吃饭 kuingat kamu.
_
    my $res = <<'_';
aku mau 吃饭吃
饭吃饭吃饭
kuingat kamu.
_
    is(mbwrap($input, 15), $res);
};

DONE_TESTING:
done_testing();