PPIx-Utils

 view release on metacpan or  search on metacpan

t/split_ppi_node_by_namespace.t  view on Meta::CPAN

[   20,   6,   6 ]     PPI::Token::Whitespace   '\n'
END_EXPECTED_FOO
<<'END_EXPECTED_FOO',
                    PPI::Document::Fragment
                        PPI::Statement::Package
[   12,  13,  13 ]         PPI::Token::Word     'package'
[   12,  20,  20 ]         PPI::Token::Whitespace   ' '
[   12,  21,  21 ]         PPI::Token::Word     'Foo'
[   12,  24,  24 ]         PPI::Token::Structure    ';'
[   12,  25,  25 ]     PPI::Token::Whitespace   '\n'
[   13,   1,   1 ]     PPI::Token::Whitespace   '            '
                        PPI::Statement::Package
[   14,  13,  13 ]         PPI::Token::Word     'package'
[   14,  20,  20 ]         PPI::Token::Whitespace   ' '
[   14,  21,  21 ]         PPI::Token::Word     'Foo'
[   14,  24,  24 ]         PPI::Token::Structure    ';'
[   14,  25,  25 ]     PPI::Token::Whitespace   '\n'
[   15,   1,   1 ]     PPI::Token::Whitespace   '            '
END_EXPECTED_FOO
<<'END_EXPECTED_FOO',
                    PPI::Document::Fragment
                        PPI::Statement::Package
[   17,  17,  17 ]         PPI::Token::Word     'package'
[   17,  24,  24 ]         PPI::Token::Whitespace   ' '
[   17,  25,  25 ]         PPI::Token::Word     'Foo'
[   17,  28,  28 ]         PPI::Token::Structure    ';'
[   17,  29,  29 ]     PPI::Token::Whitespace   '\n'
[   18,   1,   1 ]     PPI::Token::Whitespace   '            '
END_EXPECTED_FOO
        ],

        Bar => [ <<'END_EXPECTED_BAR' ],
                    PPI::Document::Fragment
                        PPI::Statement::Package
[   13,  13,  13 ]         PPI::Token::Word     'package'
[   13,  20,  20 ]         PPI::Token::Whitespace   ' '
[   13,  21,  21 ]         PPI::Token::Word     'Bar'
[   13,  24,  24 ]         PPI::Token::Structure    ';'
[   13,  25,  25 ]     PPI::Token::Whitespace   '\n'
[   14,   1,   1 ]     PPI::Token::Whitespace   '            '
END_EXPECTED_BAR
    );

    _test(
        $source,
        \%expected,
        'Heavilly nested namespaces.',
    );
}


sub _test {
    my ($source, $expected_ref, $test_name) = @_;

    my $document = PPI::Document->new(\$source);

    my %expanded_expected;
    foreach my $namespace ( keys %{$expected_ref} ) {
        my $strings = $expected_ref->{$namespace};
        $expanded_expected{$namespace} =
            [ map { [ split m/ \n /x ] } @{$strings} ];
    }

    my $got = split_ppi_node_by_namespace($document);
    my %got_expanded;
    foreach my $namespace ( keys %{$got} ) {
        my $ppi_doms = $got->{$namespace};
        $got_expanded{$namespace} =
            [
                map {
                        [ map { _expand_tabs($_) } _new_dumper($_)->list() ]
                    }
                    @{$ppi_doms}
            ];
    }

    is_deeply(\%got_expanded, \%expanded_expected, $test_name)
        or diag(
            Data::Dumper->Dump(
                [\%got_expanded, \%expanded_expected],
                [ qw<got_expanded expanded_expected> ],
            )
        );

    return;
}


sub _new_dumper {
    my ($node) = @_;

    return PPI::Dumper->new($node, indent => $DUMP_INDENT, locations => 1);
}


# Why Adam had to put @#$^@#$&^ hard tabs in his dumper output, I don't know.
sub _expand_tabs {
    my ($string) = @_;

    while (
        $string =~
            s< \A ( [^\t]* ) ( \t+ )                          >
             <$1 . ( ' ' x (length($2) * $DUMP_INDENT - length($1) % $DUMP_INDENT) )>xe
    ) {
        # Nothing here.
    }

    return $string;
}

done_testing;



( run in 2.403 seconds using v1.01-cache-2.11-cpan-71847e10f99 )