Benchmark-Perl-Formance-Cargo

 view release on metacpan or  search on metacpan

share/RegexpCommonTS/t/comment/nested.t  view on Meta::CPAN

;
                 

my @data = do {
    no warnings;
    (
        {
            nested_tokens  =>  [["(*" => "*)"]],
            languages      =>  [qw /Caml Modula-2 Modula-3/],
        },
        {
            start_tokens   =>  ["//"],
            nested_tokens  =>  [["/*" => "*/"]],
            languages      =>  [qw /Dylan/],
        },
        {
            start_tokens   =>  ["--", "---", "-----"],
            nested_tokens  =>  [["{-", "-}"]],
            languages      =>  [qw /Haskell/],
        },
        {
            start_tokens   =>  ["!"],    # Should not be followed by \
            nested_tokens  =>  [["!\\", "\\!"]],
            languages      =>  [qw /Hugo/],
        },
        {
            start_tokens   =>  ["#"],
            nested_tokens  =>  [["(*" => "*)"]],
            languages      =>  [qw /SLIDE/],
        },
        {
            nested_tokens  =>  [["-(-" => "-)-"]],
            languages      =>  [qw /fairy-language-1/],
        },
        {
            nested_tokens  =>  [["(" => ")"]],
            languages      =>  [qw /fairy-language-2/],
        },
    );
};

$$_ {start_tokens}  ||= [] for @data;
$$_ {nested_tokens} ||= [] for @data;

my @s_tokens = do {
    my %h;
    grep {!$h {$_} ++} map {@{$$_ {start_tokens}}} @data
};

my @pairs = do {
    my %h;
    grep {!$h {$$_ [0]} {$$_ [1]} ++} map {@{$$_ {nested_tokens}}} @data
};

#
# Create some comments.
#

my @comments = ("", "This is a comment", "This is a\nmultiline comment",
                "\n", map {" $_ "} @s_tokens);
my @no_eol   = grep {!/\n/} @comments;


my (%targets, @tests);
foreach my $s_token (@s_tokens) {
    my $pass_key = "start_pass_$s_token";
    my $fail_key = "start_fail_$s_token";

    $targets {$pass_key} = {
        list   =>  \@no_eol,
        query  =>  sub {$s_token . $_ [0] . "\n"},
    };

    # Build a list of "bad" comments.
    my @bad;
    # No trailing newline.
    push @bad => map {"$s_token$_"} @no_eol;
    # Double newline.
    push @bad => map {"$s_token$_\n\n"} @no_eol;
    # Double comment.
    push @bad => map {"$s_token$_\n" x 2} @no_eol;
    # Leading garbage.
    push @bad => map {ww (1, 10) . "$s_token$_\n"} @no_eol;
    # Trailing garbage.
    push @bad => map {"$s_token$_\n" . ww (1, 10)} @no_eol;

    $targets {$fail_key} = {
        list   => \@bad,
    };
}

my @parts = cross ["", "[]", "\n"],
                  ["", "7^%", "\n"],
                  ["", "comment", "\n"];

foreach my $pair (@pairs) {
    my ($start, $end) = @$pair;
    my $pass_key = "nested_pass_${start}_${end}";
    my $fail_key = "nested_fail_${start}_${end}";

    $targets {"${pass_key}_simple"} = {
        list   =>  \@comments,
        query  =>  sub {$start . $_ [0] . $end},
    };

    my @nested = map {$start . $$_ [0] . $start . $$_ [1] .
                      $end   . $$_ [2] . $end} @parts;

    $targets {"${pass_key}_nested"} = {
        list   =>  \@nested,
    };

    # Build a list of "bad" comments.
    my @bad;
    # No end token.
    push @bad => map {"$start$_"} @comments;
    # No begin token.
    push @bad => map {"$_$end"} @comments;
    # Double end token.
    push @bad => map {"$start$_$end$end"} @comments;
    # Double begin token.
    push @bad => map {"$start$start$_$end"} @comments;
    # Double comment.
    push @bad => map {"$start$_$end" x 2} @comments;
    # Leading garbage.
    push @bad => map {ww (1, 10) . "$start$_$end"} @comments;
    # Trailing garbage.
    push @bad => map {"$start$_$end" . ww (1, 10)} @comments;

    # Bad nested comments.
    # Extra start token.
    push @bad => map {"$start$_"} @nested;
    # Extra end token.
    push @bad => map {"$_$end"} @nested;
    # Leading garbage.
    push @bad => map {ww (1, 10) . $_} @nested;
    # Trailing garbage.
    push @bad => map {$_ . ww (1, 10)} @nested;
    # Double comment.
    push @bad => map {$_ x 2} @nested;

    $targets {$fail_key} = {
        list => \@bad
    };
}



( run in 0.554 second using v1.01-cache-2.11-cpan-98e64b0badf )