aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-10-04 19:36:26 +0100
committerGitHub <noreply@github.com>2022-10-04 19:36:26 +0100
commit5701d1ff7a61d5992290615037c09ec36b41d859 (patch)
treeedeb1974b7dd3299d477b9661433c6ffd5ff1754
parent246b92ff736ce9669ae8c7faffb216997f36f520 (diff)
parentbe04c0defecbe3f12698c536c3bda30442ea21c8 (diff)
downloadperlweeklychallenge-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.pl20
-rw-r--r--challenge-185/happy-barney/perl/ch-1.t9
-rw-r--r--challenge-185/happy-barney/perl/ch-2-split.pl14
-rw-r--r--challenge-185/happy-barney/perl/ch-2-test-scenario.pl20
-rw-r--r--challenge-185/happy-barney/perl/ch-2.t7
-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-xtest/test-challenge-perl.pl116
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;
+
+