From 21a1b69f0166c2ac51582282d75e5095207e69c5 Mon Sep 17 00:00:00 2001 From: Branislav ZahradnĂ­k Date: Tue, 4 Oct 2022 19:44:35 +0200 Subject: Generic script to test perl contribution(s) Requirements: - contribution must be named `ch-1.pl`, `ch-1-variant.pl` - contribution must define function - challenge_XXX_1 - or challenge_XXX_2 --- .../happy-barney/perl/ch-1-test-scenario.pl | 20 ---- challenge-185/happy-barney/perl/ch-1.t | 9 -- challenge-185/happy-barney/perl/ch-1.yaml | 17 --- .../happy-barney/perl/ch-2-test-scenario.pl | 20 ---- challenge-185/happy-barney/perl/ch-2.t | 7 -- challenge-185/happy-barney/perl/ch-2.yaml | 15 --- test/challenge-185/ch-1.yaml | 17 +++ test/challenge-185/ch-2.yaml | 15 +++ test/test-challenge-perl.pl | 116 +++++++++++++++++++++ 9 files changed, 148 insertions(+), 88 deletions(-) delete mode 100644 challenge-185/happy-barney/perl/ch-1-test-scenario.pl delete mode 100644 challenge-185/happy-barney/perl/ch-1.t delete mode 100644 challenge-185/happy-barney/perl/ch-1.yaml delete mode 100644 challenge-185/happy-barney/perl/ch-2-test-scenario.pl delete mode 100644 challenge-185/happy-barney/perl/ch-2.t delete mode 100644 challenge-185/happy-barney/perl/ch-2.yaml create mode 100644 test/challenge-185/ch-1.yaml create mode 100644 test/challenge-185/ch-2.yaml create mode 100755 test/test-challenge-perl.pl 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-1.yaml b/challenge-185/happy-barney/perl/ch-1.yaml deleted file mode 100644 index a67855561e..0000000000 --- a/challenge-185/happy-barney/perl/ch-1.yaml +++ /dev/null @@ -1,17 +0,0 @@ -"should format dot-delimited mac-address": - input: - - '1ac2.34f0.b1c2' - expect: - - '1a:c2:34:f0:b1:c2' - -"should format already formatted mac address": - input: - - '1a:c2:34:f0:b1:c2' - expect: - - '1a:c2:34:f0:b1:c2' - -"should format mac address without separators": - input: - - '1ac234f0b1c2' - expect: - - '1a:c2:34:f0:b1:c2' 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-2.yaml b/challenge-185/happy-barney/perl/ch-2.yaml deleted file mode 100644 index 9f0a299489..0000000000 --- a/challenge-185/happy-barney/perl/ch-2.yaml +++ /dev/null @@ -1,15 +0,0 @@ -"should mask first 4 characters/letters": - input: - - 'ab-cde-123' - - '123.abc.420' - - '3abc-0010.xy' - - '1234567.a' - - 'a-1234-bc' - - 'a.b.c.d.e.f' - expect: - - 'xx-xxe-123' - - 'xxx.xbc.420' - - 'xxxx-0010.xy' - - 'xxxx567.a' - - 'x-xxx4-bc' - - 'x.x.x.x.e.f' diff --git a/test/challenge-185/ch-1.yaml b/test/challenge-185/ch-1.yaml new file mode 100644 index 0000000000..a67855561e --- /dev/null +++ b/test/challenge-185/ch-1.yaml @@ -0,0 +1,17 @@ +"should format dot-delimited mac-address": + input: + - '1ac2.34f0.b1c2' + expect: + - '1a:c2:34:f0:b1:c2' + +"should format already formatted mac address": + input: + - '1a:c2:34:f0:b1:c2' + expect: + - '1a:c2:34:f0:b1:c2' + +"should format mac address without separators": + input: + - '1ac234f0b1c2' + expect: + - '1a:c2:34:f0:b1:c2' diff --git a/test/challenge-185/ch-2.yaml b/test/challenge-185/ch-2.yaml new file mode 100644 index 0000000000..9f0a299489 --- /dev/null +++ b/test/challenge-185/ch-2.yaml @@ -0,0 +1,15 @@ +"should mask first 4 characters/letters": + input: + - 'ab-cde-123' + - '123.abc.420' + - '3abc-0010.xy' + - '1234567.a' + - 'a-1234-bc' + - 'a.b.c.d.e.f' + expect: + - 'xx-xxe-123' + - 'xxx.xbc.420' + - 'xxxx-0010.xy' + - 'xxxx567.a' + - 'x-xxx4-bc' + - 'x.x.x.x.e.f' 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; + + -- cgit From be04c0defecbe3f12698c536c3bda30442ea21c8 Mon Sep 17 00:00:00 2001 From: Branislav ZahradnĂ­k Date: Tue, 4 Oct 2022 19:52:42 +0200 Subject: Challenge 185 - happy-barney - alternative solution of mask-code --- challenge-185/happy-barney/perl/ch-2-split.pl | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 challenge-185/happy-barney/perl/ch-2-split.pl 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; +} + -- cgit