diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2022-10-04 19:36:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-10-04 19:36:26 +0100 |
| commit | 5701d1ff7a61d5992290615037c09ec36b41d859 (patch) | |
| tree | edeb1974b7dd3299d477b9661433c6ffd5ff1754 | |
| parent | 246b92ff736ce9669ae8c7faffb216997f36f520 (diff) | |
| parent | be04c0defecbe3f12698c536c3bda30442ea21c8 (diff) | |
| download | perlweeklychallenge-club-5701d1ff7a61d5992290615037c09ec36b41d859.tar.gz perlweeklychallenge-club-5701d1ff7a61d5992290615037c09ec36b41d859.tar.bz2 perlweeklychallenge-club-5701d1ff7a61d5992290615037c09ec36b41d859.zip | |
Merge pull request #6851 from happy-barney/happy-barney-contribution
Guest contribution - happy-barney - alternative mask code
| -rw-r--r-- | challenge-185/happy-barney/perl/ch-1-test-scenario.pl | 20 | ||||
| -rw-r--r-- | challenge-185/happy-barney/perl/ch-1.t | 9 | ||||
| -rw-r--r-- | challenge-185/happy-barney/perl/ch-2-split.pl | 14 | ||||
| -rw-r--r-- | challenge-185/happy-barney/perl/ch-2-test-scenario.pl | 20 | ||||
| -rw-r--r-- | challenge-185/happy-barney/perl/ch-2.t | 7 | ||||
| -rw-r--r-- | test/challenge-185/ch-1.yaml (renamed from challenge-185/happy-barney/perl/ch-1.yaml) | 0 | ||||
| -rw-r--r-- | test/challenge-185/ch-2.yaml (renamed from challenge-185/happy-barney/perl/ch-2.yaml) | 0 | ||||
| -rwxr-xr-x | test/test-challenge-perl.pl | 116 |
8 files changed, 130 insertions, 56 deletions
diff --git a/challenge-185/happy-barney/perl/ch-1-test-scenario.pl b/challenge-185/happy-barney/perl/ch-1-test-scenario.pl deleted file mode 100644 index a15e748021..0000000000 --- a/challenge-185/happy-barney/perl/ch-1-test-scenario.pl +++ /dev/null @@ -1,20 +0,0 @@ - -use strict; -use warnings; - -use Test::YAFT; -use YAML::Syck qw[ LoadFile ]; - -act { [ challenge_185_1 (@{ $_[0] }) ] } 'input'; - -my $plan = LoadFile "./ch-1.yaml"; -for my $message (sort keys %$plan) { - it $message - => with_input => $plan->{$message}{input}, - => expect => $plan->{$message}{expect}, - ; -} - -had_no_warnings; -done_testing; - diff --git a/challenge-185/happy-barney/perl/ch-1.t b/challenge-185/happy-barney/perl/ch-1.t deleted file mode 100644 index d9072dd26c..0000000000 --- a/challenge-185/happy-barney/perl/ch-1.t +++ /dev/null @@ -1,9 +0,0 @@ - -use strict; -use warnings; - -do "./ch-1.pl"; -die $@ if $@; - -do "./ch-1-test-scenario.pl"; -die $@ if $@; diff --git a/challenge-185/happy-barney/perl/ch-2-split.pl b/challenge-185/happy-barney/perl/ch-2-split.pl new file mode 100644 index 0000000000..d3d8c846a1 --- /dev/null +++ b/challenge-185/happy-barney/perl/ch-2-split.pl @@ -0,0 +1,14 @@ +#!/usr/bin/env perl + +use strict; +use warnings; + +sub challenge_185_2 { + my (@codes) = @_; + + my $count = 4; + my $mask = 'x'; + + map { join 'x', split qr/[a-z0-9]/, $_, 4 +1 } @codes; +} + diff --git a/challenge-185/happy-barney/perl/ch-2-test-scenario.pl b/challenge-185/happy-barney/perl/ch-2-test-scenario.pl deleted file mode 100644 index 32493363ca..0000000000 --- a/challenge-185/happy-barney/perl/ch-2-test-scenario.pl +++ /dev/null @@ -1,20 +0,0 @@ - -use strict; -use warnings; - -use Test::YAFT; -use YAML::Syck qw[ LoadFile ]; - -act { [ challenge_185_2 (@{ $_[0] }) ] } 'input'; - -my $plan = LoadFile "./ch-2.yaml"; -for my $message (sort keys %$plan) { - it $message - => with_input => $plan->{$message}{input}, - => expect => $plan->{$message}{expect}, - ; -} - -had_no_warnings; -done_testing; - diff --git a/challenge-185/happy-barney/perl/ch-2.t b/challenge-185/happy-barney/perl/ch-2.t deleted file mode 100644 index aac2cc2a14..0000000000 --- a/challenge-185/happy-barney/perl/ch-2.t +++ /dev/null @@ -1,7 +0,0 @@ - -use strict; -use warnings; - -do "./ch-2.pl"; -do "./ch-2-test-scenario.pl"; - diff --git a/challenge-185/happy-barney/perl/ch-1.yaml b/test/challenge-185/ch-1.yaml index a67855561e..a67855561e 100644 --- a/challenge-185/happy-barney/perl/ch-1.yaml +++ b/test/challenge-185/ch-1.yaml diff --git a/challenge-185/happy-barney/perl/ch-2.yaml b/test/challenge-185/ch-2.yaml index 9f0a299489..9f0a299489 100644 --- a/challenge-185/happy-barney/perl/ch-2.yaml +++ b/test/challenge-185/ch-2.yaml diff --git a/test/test-challenge-perl.pl b/test/test-challenge-perl.pl new file mode 100755 index 0000000000..c390a2b0a5 --- /dev/null +++ b/test/test-challenge-perl.pl @@ -0,0 +1,116 @@ +#!/usr/bin/env perl + +# Requirements: +# - contribution must be named `ch-1.pl`, `ch-2.pl`, `ch-1-variant.pl` ... +# - contribution must define one of functions +# - challenge_XXX_1 +# - challenge_XXX_2 + +# Usage: +# test-challenge-perl.pl +# test-challenge-perl.pl FILE(S) | DIR(S) + +# script walks through specified files / directories (`.` unless specified otherwise) +# and test contribution using challenge data + +use v5.10; +use strict; +use warnings; + +use Path::Tiny; +use Test::YAFT; +use YAML::Syck qw[ LoadFile ]; + +my $path = Path::Tiny->new (__FILE__)->parent; + +sub parse_challenge { + $_[0] =~ m(/challenge-(\d+)/([^/]+)/perl/ch-([1-2])(?:-([^/]+))?\.pl$); +} + +sub find_perl_contributions { + my (@source) = map { Path::Tiny->new ($_)->realpath } (@_ ? @_ : ('.')); + + my @contributions; + while (my $candidate = shift @source) { + if (-d $candidate) { + push @source, $candidate->children; + next; + } + + next + unless $candidate =~ m(/perl/ch-[12](?:-[^/]+)?\.pl$); + + push @contributions, $candidate; + } + + return sort @contributions; +} + +sub test_contributions { + my $stash = \%::; + + my %test_plan; + + my $coderef; + act { [ $coderef->(@{ $_[0] }) ] } 'input'; + + for my $contribution (find_perl_contributions @_) { + my ($challenge, $author, $number, $variant) = parse_challenge $contribution; + + my $message = "challenge $challenge/$number; contribution by $author"; + $message .= "; " . ($variant =~ s(\W+)( )gr) if $variant; + + my $code_name = "challenge_${challenge}_${number}"; + { + no warnings 'redefine'; + do $contribution; + } + + if ($@) { + fail $message + => diag => sub { "Contribution load failed: $@" } + ; + next; + } + + unless (exists $stash->{$code_name}) { + fail $message + => diag => sub { "Contribution doesn't contain expected function: $code_name" } + ; + next; + } + + $coderef = $stash->{$code_name}; + + my $plan_file = Path::Tiny->new (__FILE__) + ->parent + ->child ("challenge-$challenge") + ->child ("ch-$number.yaml") + ; + + unless (-e $plan_file) { + fail $message + => diag => sub { "test plan not found: $plan_file" } + ; + next; + } + + my $plan = $test_plan{$plan_file} = LoadFile $plan_file; + subtest $message => sub { + for my $message (sort keys %$plan) { + it $message + => with_input => $plan->{$message}{input}, + => expect => $plan->{$message}{expect}, + ; + } + }; + + delete $stash->{$code_name}; + } + + done_testing; +} + +test_contributions; + + |
