The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl

use utf8;
use 5.008001;

use strict;
use warnings;

use Readonly;

use version; our $VERSION = qv('v1.2.0');

use Test::More;

use PPIx::Shorthand qw< get_ppi_class >;

Readonly my $EMPTY_STRING => q<>;

# Note that Structure is not included below because it doesn't have a
# unique base name.
Readonly my @CLASS_NAME_COMPONENTS => (
    [ qw< Element > ],
        [ qw< Node > ],
        [ qw< Document > ],
            [ qw< Document Fragment > ],
        [ qw< Statement > ],
            [ qw< Statement Package > ],
            [ qw< Statement Include > ],
            [ qw< Statement Sub > ],
                [ qw< Statement Scheduled > ],
            [ qw< Statement Compound > ],
            [ qw< Statement Break > ],
            [ qw< Statement Given > ],
            [ qw< Statement When > ],
            [ qw< Statement Data > ],
            [ qw< Statement End > ],
            [ qw< Statement Expression > ],
                [ qw< Statement Variable > ],
            [ qw< Statement Null > ],
            [ qw< Statement UnmatchedBrace > ],
            [ qw< Statement Unknown > ],

            [ qw< Structure Block > ],
            [ qw< Structure Subscript > ],
            [ qw< Structure Constructor > ],
            [ qw< Structure Condition > ],
            [ qw< Structure List > ],
            [ qw< Structure For > ],
            [ qw< Structure Given > ],
            [ qw< Structure When > ],
            [ qw< Structure Unknown > ],
        [ qw< Token > ],
        [ qw< Token Whitespace > ],
        [ qw< Token Comment > ],
        [ qw< Token Pod > ],
        [ qw< Token Number > ],
            [ qw< Token Number Binary > ],
            [ qw< Token Number Octal > ],
            [ qw< Token Number Hex > ],
            [ qw< Token Number Float > ],
                [ qw< Token Number Exp > ],
            [ qw< Token Number Version > ],
        [ qw< Token Word > ],
        [ qw< Token DashedWord > ],
        [ qw< Token Symbol > ],
            [ qw< Token Magic > ],
        [ qw< Token ArrayIndex > ],
        [ qw< Token Operator > ],
        [ qw< Token Quote > ],
            [ qw< Token Quote Single > ],
            [ qw< Token Quote Double > ],
            [ qw< Token Quote Literal > ],
            [ qw< Token Quote Interpolate > ],
        [ qw< Token QuoteLike > ],
            [ qw< Token QuoteLike Backtick > ],
            [ qw< Token QuoteLike Command > ],
            [ qw< Token QuoteLike Regexp > ],
            [ qw< Token QuoteLike Words > ],
            [ qw< Token QuoteLike Readline > ],
        [ qw< Token Regexp > ],
            [ qw< Token Regexp Match > ],
            [ qw< Token Regexp Substitute > ],
            [ qw< Token Regexp Transliterate > ],
        [ qw< Token HereDoc > ],
        [ qw< Token Cast > ],
        [ qw< Token Structure > ],
        [ qw< Token Label > ],
        [ qw< Token Separator > ],
        [ qw< Token Data > ],
        [ qw< Token End > ],
        [ qw< Token Prototype > ],
        [ qw< Token Attribute > ],
        [ qw< Token Unknown > ],
);

Readonly my @SEPARATORS => ( qw< _ - . : >, $EMPTY_STRING );

Readonly my @TRANSFORMS => (
    sub { return $_[0]         },
    sub { return lc $_[0]      },
    sub { return lcfirst $_[0] },
    sub { return uc $_[0]      },
    sub { return ucfirst $_[0] },
);


plan tests => @TRANSFORMS * @SEPARATORS * @CLASS_NAME_COMPONENTS;


foreach my $name_components (@CLASS_NAME_COMPONENTS) {
    my $class = join q<::>, 'PPI', @{$name_components};

    foreach my $separator ( @SEPARATORS ) {
        my $shorthand = join $separator, @{$name_components};

        foreach my $transform (@TRANSFORMS) {
            my $transformed = $transform->($shorthand);

            is(
                get_ppi_class($transformed),
                $class,
                "$transformed should map to $class",
            );
        } # end foreach
    } # end foreach
} # end foreach


# setup vim: set filetype=perl tabstop=4 softtabstop=4 expandtab :
# setup vim: set shiftwidth=4 shiftround textwidth=78 nowrap autoindent :
# setup vim: set foldmethod=indent foldlevel=0 :