The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use perl5i::latest;
use Test::More;

foreach my $word ("hello", "goodbye!") {
    foreach my $separator ("\n", '!!', '@') {
        test_wrap($word, $separator);
    }
};

done_testing();

sub test_wrap {
    my ($word, $sep) = @_;
    my $txt  = ($word . ' ') x 14;

    is num_lines($txt), 1, "Unmodified string is one line long";
    is num_lines($txt->wrap(separator => $sep), $sep), 2, "Default wrapping gives two lines";

    is num_lines(
        $txt->wrap(width => length($word) + 1, separator => $sep),
        $sep
    ), 14, "One word per line";

    is num_lines(
        $txt->wrap(width => length($txt)  + 1, separator => $sep),
        $sep
    ),  1, "Excessive wrap length";

    is $txt->wrap(width => 0,  separator => $sep), $txt, "Zero wrap length";
    is $txt->wrap(width => -1, separator => $sep), $txt, "Negative wrap length";
}

sub num_lines {
    my ($txt, $separator) = @_;
    $separator //= "\n";

    my @lines = split($separator, $txt);

    return scalar @lines;
}