The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use FindBin qw($Bin);
use lib "$Bin/../lib";

use Text::Glob::Expand qw(explode);
use Test::More tests => 35;

my @cases = (
    ["aaa" => ["aaa"],
     ".%0." => [".aaa."]],
    ["a{a}a" => ["aaa"],
     ".%0.%1." => [".aaa.a."]],
    ["a{a}a{b}" => ["aaab"],
     ".%0.%1.%2" => [qw(.aaab.a.b)]],
    ["a{a,b}a{b,a}" => [qw(aaab aaaa abab abaa)],
     ".%0.%1.%2." => [qw(.aaab.a.b. .aaaa.a.a. .abab.b.b. .abaa.b.a.)]],
    ["a{a,a{b,a}}" => [qw(aa aab aaa)],
     ".%0.%1." => [qw(.aa.a. .aab.ab. .aaa.aa.)]],
    ["a{a{},a{b,a}}" => [qw(aa aab aaa)],
     ".%0.%1.%1.1." => [qw(.aa.a.. .aab.ab.b. .aaa.aa.a.)]],
    ["a{a{b,c},d{e,f}}" => [qw(aab aac ade adf)],
     ".%0.%1.%1.1." => [qw(.aab.ab.b. .aac.ac.c. .ade.de.e. .adf.df.f.)]],
#    ["a{a,b{a{b,a}}" => qw(aaab aaaa abab abaa)], # FIXME add this error case
);


for my $case (@cases) {
    my ($expr, $expected) = splice @$case, 0, 2;

    # check a simple glob expansion
#    my $glob = Text::Glob::Expand->parse($expr);
#    isa_ok $glob, "Text::Glob::Expand";
#    my $result = $glob->explode;
#    is_deeply $result, $expected, "simple case: $expr ok";

#    is_deeply [explode $expr], $expected, "simple functional case: $expr ok";


    # check the structured glob expansion is equivalent
    my $glob = Text::Glob::Expand->parse($expr);
    isa_ok $glob, "Text::Glob::Expand";
    my $result = $glob->explode;
    my $text_result = [map { $_->text } @$result];
    is_deeply $text_result, $expected, "structured case: $expr ok";

    # check the structured glob formatting
    while(my ($format, $fmt_expected) = splice @$case, 0, 2) {
        my $fmt_result = [map { $_->expand($format) } @$result];
        is_deeply $fmt_result, $fmt_expected, "formatting case: $format => $expr ok";

        my $hash_result = $glob->explode_format($format);

        is_deeply [sort keys %$hash_result], [sort @$expected], 
            "hashed keys match: $format => $expr ok"; 
        is_deeply [sort values %$hash_result], [sort @$fmt_expected], 
            "hashed values match: $format => $expr ok"; 

 #       is_deeply [explode $expr, $format], $expected, "formatting functional case: $format => $expr ok";
    }

}