The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use utf8;
use Test::More;
use Encode;

BEGIN
{
    use_ok("Text::MeCab");
}

my $data = {
    taro => encode(Text::MeCab::ENCODING, "太郎は次郎が持っている本を花子に渡した。"),
    sumomo => encode(Text::MeCab::ENCODING, "すもももももももものうち。"),
};

my $mecab = Text::MeCab->new;

my ($node_A, $node_B);
{
    my $node_A_orig = $mecab->parse($data->{taro});
    ok($node_A_orig, "Original node A OK");
    $node_A = $node_A_orig->dclone;
    ok $node_A, "Clone Node A successful";

    my $node = $node_A;
    while ( $node_A_orig ) {
        check_node( $node, $node_A_orig );
        $node = $node->next;
        $node_A_orig = $node_A_orig->next;
    }
}

{
    my $node_B_orig = $mecab->parse($data->{sumomo});
    ok($node_B_orig, "Original node B OK");
    $node_B = $node_B_orig->dclone;
    ok $node_B, "Clone Node B successful";

    my $node = $node_B;
    while ( $node_B_orig ) {
        check_node( $node, $node_B_orig );
        $node = $node->next;
        $node_B_orig = $node_B_orig->next;
    }
}

# finally, make sure that node_A, node_B are NOT identical
ok $node_A;
ok $node_B;
isnt $node_A->surface, $node_B->surface;

done_testing();

sub check_node {
    my ($clone, $orig) = @_;
    if (ok($clone, "Deep clone node OK")) {
        note $clone->surface;
    }
    isa_ok($clone, "Text::MeCab::Node::Cloned", "Deep clone node isa OK");
    is $clone->surface, $orig->surface;
}