trackler 2.0.8.28 → 2.0.8.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/common/CONTRIBUTING.md +4 -1
- data/common/README.md +52 -0
- data/lib/trackler/version.rb +1 -1
- data/tracks/ecmascript/config.json +7 -0
- data/tracks/ecmascript/exercises/perfect-numbers/example.js +68 -0
- data/tracks/ecmascript/exercises/perfect-numbers/gulpfile.js +89 -0
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +28 -0
- data/tracks/ecmascript/exercises/perfect-numbers/perfect-numbers.spec.js +75 -0
- data/tracks/erlang/exercises/accumulate/src/accumulate.app.src +1 -1
- data/tracks/erlang/exercises/all-your-base/src/all_your_base.app.src +1 -1
- data/tracks/erlang/exercises/allergies/src/allergies.app.src +1 -1
- data/tracks/erlang/exercises/anagram/src/anagram.app.src +1 -1
- data/tracks/erlang/exercises/atbash-cipher/src/atbash_cipher.app.src +1 -1
- data/tracks/erlang/exercises/bank-account/src/bank_account.app.src +1 -1
- data/tracks/erlang/exercises/beer-song/src/beer_song.app.src +1 -1
- data/tracks/erlang/exercises/bob/src/bob.app.src +1 -1
- data/tracks/erlang/exercises/circular-buffer/src/circular_buffer.app.src +1 -1
- data/tracks/erlang/exercises/clock/src/clock.app.src +1 -1
- data/tracks/erlang/exercises/difference-of-squares/src/difference_of_squares.app.src +1 -1
- data/tracks/erlang/exercises/etl/src/etl.app.src +1 -1
- data/tracks/erlang/exercises/gigasecond/src/gigasecond.app.src +1 -1
- data/tracks/erlang/exercises/grade-school/src/grade_school.app.src +1 -1
- data/tracks/erlang/exercises/grains/src/grains.app.src +1 -1
- data/tracks/erlang/exercises/hamming/src/hamming.app.src +1 -1
- data/tracks/erlang/exercises/hello-world/src/hello_world.app.src +1 -1
- data/tracks/erlang/exercises/largest-series-product/src/largest_series_product.app.src +1 -1
- data/tracks/erlang/exercises/leap/src/leap.app.src +1 -1
- data/tracks/erlang/exercises/luhn/src/luhn.app.src +1 -1
- data/tracks/erlang/exercises/meetup/src/meetup.app.src +1 -1
- data/tracks/erlang/exercises/nucleotide-count/src/nucleotide_count.app.src +1 -1
- data/tracks/erlang/exercises/parallel-letter-frequency/src/parallel_letter_frequency.app.src +1 -1
- data/tracks/erlang/exercises/phone-number/src/phone_number.app.src +1 -1
- data/tracks/erlang/exercises/rna-transcription/src/rna_transcription.app.src +1 -1
- data/tracks/erlang/exercises/robot-simulator/src/robot_simulator.app.src +1 -1
- data/tracks/erlang/exercises/roman-numerals/src/roman_numerals.app.src +1 -1
- data/tracks/erlang/exercises/rotational-cipher/src/rotational_cipher.app.src +1 -1
- data/tracks/erlang/exercises/scrabble-score/src/scrabble_score.app.src +1 -1
- data/tracks/erlang/exercises/series/src/series.app.src +1 -1
- data/tracks/erlang/exercises/space-age/src/space_age.app.src +1 -1
- data/tracks/erlang/exercises/strain/src/strain.app.src +1 -1
- data/tracks/erlang/exercises/sum-of-multiples/src/sum_of_multiples.app.src +1 -1
- data/tracks/erlang/exercises/triangle/src/triangle.app.src +1 -1
- data/tracks/erlang/exercises/word-count/src/word_count.app.src +1 -1
- data/tracks/erlang/exercises/zipper/src/zipper.app.src +1 -1
- data/tracks/go/exercises/hello-world/hello_world.go +10 -1
- data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/package.yaml +1 -0
- data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/src/LinkedList.hs +1 -0
- data/tracks/haskell/exercises/simple-linked-list/package.yaml +1 -0
- data/tracks/haskell/exercises/simple-linked-list/src/LinkedList.hs +1 -1
- data/tracks/haskell/exercises/simple-linked-list/test/Tests.hs +37 -1
- data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +13 -6
- data/tracks/java/exercises/secret-handshake/src/test/java/HandshakeCalculatorTest.java +21 -13
- data/tracks/objective-c/exercises/atbash-cipher/AtbashCipherExample.m +1 -1
- data/tracks/objective-c/exercises/beer-song/BeerSongExample.m +1 -1
- data/tracks/objective-c/exercises/beer-song/BeerSongTest.m +4 -4
- data/tracks/objective-c/exercises/binary-search/BinarySearchExample.m +1 -1
- data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.h +2 -1
- data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.m +12 -25
- data/tracks/objective-c/exercises/flatten-array/FlattenArrayTest.m +32 -80
- data/tracks/objective-c/exercises/sublist/SublistTest.m +47 -70
- data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -0
- data/tracks/perl6/exercises/allergies/Example.pm +3 -1
- data/tracks/perl6/exercises/allergies/allergies.t +187 -137
- data/tracks/perl6/exercises/anagram/Anagram.pm6 +1 -0
- data/tracks/perl6/exercises/anagram/Example.pm +15 -15
- data/tracks/perl6/exercises/anagram/anagram.t +164 -15
- data/tracks/perl6/exercises/atbash-cipher/AtbashCipher.pm6 +1 -0
- data/tracks/perl6/exercises/atbash-cipher/Example.pm +2 -0
- data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +109 -86
- data/tracks/perl6/exercises/grains/Example.pm +10 -9
- data/tracks/perl6/exercises/grains/Grains.pm6 +1 -0
- data/tracks/perl6/exercises/grains/grains.t +126 -18
- data/tracks/perl6/exercises/leap/Example.pm +9 -9
- data/tracks/perl6/exercises/leap/Leap.pm6 +4 -0
- data/tracks/perl6/exercises/leap/leap.t +61 -17
- data/tracks/perl6/exercises/phone-number/Example.pm +4 -28
- data/tracks/perl6/exercises/phone-number/PhoneNumber.pm6 +4 -0
- data/tracks/perl6/exercises/phone-number/phone-number.t +102 -65
- data/tracks/perl6/exercises/raindrops/Example.pm +10 -8
- data/tracks/perl6/exercises/raindrops/Raindrops.pm6 +4 -0
- data/tracks/perl6/exercises/raindrops/raindrops.t +153 -20
- data/tracks/perl6/exercises/rna-transcription/Example.pm +5 -7
- data/tracks/perl6/exercises/rna-transcription/RNA.pm6 +4 -0
- data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +107 -11
- data/tracks/perl6/exercises/scrabble-score/Example.pm +14 -19
- data/tracks/perl6/exercises/scrabble-score/Scrabble.pm6 +4 -0
- data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +106 -15
- data/tracks/perl6/exercises/space-age/Example.pm +29 -13
- data/tracks/perl6/exercises/space-age/SpaceAge.pm6 +22 -0
- data/tracks/perl6/exercises/space-age/space-age.t +90 -52
- data/tracks/perl6/exercises/word-count/Example.pm +4 -8
- data/tracks/perl6/exercises/word-count/WordCount.pm6 +4 -0
- data/tracks/perl6/exercises/word-count/word-count.t +149 -16
- data/tracks/perl6/exercises/wordy/Example.pm +13 -13
- data/tracks/perl6/exercises/wordy/Wordy.pm6 +4 -0
- data/tracks/perl6/exercises/wordy/wordy.t +140 -97
- data/tracks/purescript/config.json +7 -0
- data/tracks/purescript/exercises/atbash-cipher/bower.json +18 -0
- data/tracks/purescript/exercises/atbash-cipher/examples/src/AtbashCipher.purs +41 -0
- data/tracks/purescript/exercises/atbash-cipher/src/AtbashCipher.purs +4 -0
- data/tracks/purescript/exercises/atbash-cipher/test/Main.purs +64 -0
- data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +2 -0
- data/tracks/swift/exercises/grade-school/Tests/GradeSchoolTests/GradeSchoolTests.swift +1 -1
- metadata +22 -2
@@ -1,17 +1,113 @@
|
|
1
1
|
#!/usr/bin/env perl6
|
2
2
|
use v6;
|
3
3
|
use Test;
|
4
|
-
use lib
|
4
|
+
use lib my $dir = $?FILE.IO.dirname;
|
5
|
+
use JSON::Tiny;
|
5
6
|
|
6
|
-
|
7
|
-
my $
|
8
|
-
|
9
|
-
|
7
|
+
my $exercise = 'RNA';
|
8
|
+
my $version = v1;
|
9
|
+
my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
|
10
|
+
plan 11;
|
10
11
|
|
11
|
-
ok
|
12
|
+
use-ok $module or bail-out;
|
13
|
+
require ::($module);
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
is
|
16
|
-
is
|
17
|
-
|
15
|
+
if ::($exercise).^ver !~~ $version {
|
16
|
+
warn "\nExercise version mismatch. Further tests may fail!"
|
17
|
+
~ "\n$exercise is $(::($exercise).^ver.gist). "
|
18
|
+
~ "Test is $($version.gist).\n";
|
19
|
+
bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
|
20
|
+
}
|
21
|
+
|
22
|
+
my @subs;
|
23
|
+
BEGIN { @subs = <&to-rna> };
|
24
|
+
subtest 'Subroutine(s)', {
|
25
|
+
plan 1;
|
26
|
+
eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
|
27
|
+
} or bail-out 'All subroutines must be defined and exported.';
|
28
|
+
require ::($module) @subs.eager;
|
29
|
+
|
30
|
+
for @(my $c-data.<cases>) {
|
31
|
+
if .<expected> {
|
32
|
+
is .<dna>.&to-rna, |.<expected description>;
|
33
|
+
} else {
|
34
|
+
throws-like {.<dna>.&to-rna}, Exception;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
|
39
|
+
is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
|
40
|
+
} else { skip }
|
41
|
+
|
42
|
+
done-testing;
|
43
|
+
|
44
|
+
INIT {
|
45
|
+
$c-data := from-json 「
|
46
|
+
{
|
47
|
+
"exercise": "rna-transcription",
|
48
|
+
"version": "1.0.0",
|
49
|
+
"comments": [
|
50
|
+
"Language implementations vary on the issue of invalid input data.",
|
51
|
+
"A language may elect to simplify this task by only presenting valid",
|
52
|
+
"test cases. For languages handling invalid input data as",
|
53
|
+
"error conditions, invalid test cases are included here and are",
|
54
|
+
"indicated with an expected value of null. Note however that null is",
|
55
|
+
"simply an indication here in the JSON. Actually returning null from",
|
56
|
+
"a rna-transcription function may or may not be idiomatic in a language.",
|
57
|
+
"Language idioms of errors or exceptions should be followed.",
|
58
|
+
"Alternative interpretations such as ignoring excess length at the end",
|
59
|
+
"are not represented here."
|
60
|
+
],
|
61
|
+
"cases": [
|
62
|
+
{
|
63
|
+
"description": "rna complement of cytosine is guanine",
|
64
|
+
"property": "toRna",
|
65
|
+
"dna": "C",
|
66
|
+
"expected": "G"
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"description": "rna complement of guanine is cytosine",
|
70
|
+
"property": "toRna",
|
71
|
+
"dna": "G",
|
72
|
+
"expected": "C"
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"description": "rna complement of thymine is adenine",
|
76
|
+
"property": "toRna",
|
77
|
+
"dna": "T",
|
78
|
+
"expected": "A"
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"description": "rna complement of adenine is uracil",
|
82
|
+
"property": "toRna",
|
83
|
+
"dna": "A",
|
84
|
+
"expected": "U"
|
85
|
+
},
|
86
|
+
{
|
87
|
+
"description": "rna complement",
|
88
|
+
"property": "toRna",
|
89
|
+
"dna": "ACGTGGTCTTAA",
|
90
|
+
"expected": "UGCACCAGAAUU"
|
91
|
+
},
|
92
|
+
{
|
93
|
+
"description": "dna correctly handles invalid input",
|
94
|
+
"property": "toRna",
|
95
|
+
"dna": "U",
|
96
|
+
"expected": null
|
97
|
+
},
|
98
|
+
{
|
99
|
+
"description": "dna correctly handles completely invalid input",
|
100
|
+
"property": "toRna",
|
101
|
+
"dna": "XXX",
|
102
|
+
"expected": null
|
103
|
+
},
|
104
|
+
{
|
105
|
+
"description": "dna correctly handles partially invalid input",
|
106
|
+
"property": "toRna",
|
107
|
+
"dna": "ACGTXXXCTTAA",
|
108
|
+
"expected": null
|
109
|
+
}
|
110
|
+
]
|
111
|
+
}
|
112
|
+
」
|
113
|
+
}
|
@@ -1,22 +1,17 @@
|
|
1
|
-
|
2
|
-
has %.values = (
|
3
|
-
aeioulnrst => 1,
|
4
|
-
dg => 2,
|
5
|
-
bcmp => 3,
|
6
|
-
fhvwy => 4,
|
7
|
-
k => 5,
|
8
|
-
jx => 8,
|
9
|
-
qz => 10,
|
10
|
-
ZERO => 0,
|
11
|
-
);
|
1
|
+
unit module Scrabble:ver<1>;
|
12
2
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
3
|
+
sub score (Str:D $word --> Int:D) is export {
|
4
|
+
my $score = 0;
|
5
|
+
for $word.lc.split('',:skip-empty) -> $letter {
|
6
|
+
given $letter {
|
7
|
+
when * ~~ /<[aeioulnrst]>/ { $score += 1 }
|
8
|
+
when * ~~ /<[dg]>/ { $score += 2 }
|
9
|
+
when * ~~ /<[bcmp]>/ { $score += 3 }
|
10
|
+
when * ~~ /<[fhvwy]>/ { $score += 4 }
|
11
|
+
when * ~~ /k/ { $score += 5 }
|
12
|
+
when * ~~ /<[jx]>/ { $score += 8 }
|
13
|
+
when * ~~ /<[qz]>/ { $score += 10 }
|
21
14
|
}
|
15
|
+
}
|
16
|
+
return $score;
|
22
17
|
}
|
@@ -1,22 +1,113 @@
|
|
1
1
|
#!/usr/bin/env perl6
|
2
2
|
use v6;
|
3
3
|
use Test;
|
4
|
-
use lib
|
4
|
+
use lib my $dir = $?FILE.IO.dirname;
|
5
|
+
use JSON::Tiny;
|
5
6
|
|
6
|
-
|
7
|
-
my $
|
8
|
-
|
9
|
-
|
7
|
+
my $exercise = 'Scrabble';
|
8
|
+
my $version = v1;
|
9
|
+
my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
|
10
|
+
plan 14;
|
10
11
|
|
11
|
-
ok
|
12
|
+
use-ok $module or bail-out;
|
13
|
+
require ::($module);
|
12
14
|
|
13
|
-
|
15
|
+
if ::($exercise).^ver !~~ $version {
|
16
|
+
warn "\nExercise version mismatch. Further tests may fail!"
|
17
|
+
~ "\n$exercise is $(::($exercise).^ver.gist). "
|
18
|
+
~ "Test is $($version.gist).\n";
|
19
|
+
bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
|
20
|
+
}
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
22
|
+
my @subs;
|
23
|
+
BEGIN { @subs = <&score> };
|
24
|
+
subtest 'Subroutine(s)', {
|
25
|
+
plan 1;
|
26
|
+
eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
|
27
|
+
} or bail-out 'All subroutines must be defined and exported.';
|
28
|
+
require ::($module) @subs.eager;
|
29
|
+
|
30
|
+
is .<input>.&score, |.<expected description> for @(my $c-data.<cases>);
|
31
|
+
|
32
|
+
if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
|
33
|
+
is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
|
34
|
+
} else { skip }
|
35
|
+
|
36
|
+
done-testing;
|
37
|
+
|
38
|
+
INIT {
|
39
|
+
$c-data := from-json 「
|
40
|
+
{
|
41
|
+
"exercise": "scrabble-score",
|
42
|
+
"version": "1.0.0",
|
43
|
+
"cases": [
|
44
|
+
{
|
45
|
+
"description": "lowercase letter",
|
46
|
+
"property": "score",
|
47
|
+
"input": "a",
|
48
|
+
"expected": 1
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"description": "uppercase letter",
|
52
|
+
"property": "score",
|
53
|
+
"input": "A",
|
54
|
+
"expected": 1
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"description": "valuable letter",
|
58
|
+
"property": "score",
|
59
|
+
"input": "f",
|
60
|
+
"expected": 4
|
61
|
+
},
|
62
|
+
{
|
63
|
+
"description": "short word",
|
64
|
+
"property": "score",
|
65
|
+
"input": "at",
|
66
|
+
"expected": 2
|
67
|
+
},
|
68
|
+
{
|
69
|
+
"description": "short, valuable word",
|
70
|
+
"property": "score",
|
71
|
+
"input": "zoo",
|
72
|
+
"expected": 12
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"description": "medium word",
|
76
|
+
"property": "score",
|
77
|
+
"input": "street",
|
78
|
+
"expected": 6
|
79
|
+
},
|
80
|
+
{
|
81
|
+
"description": "medium, valuable word",
|
82
|
+
"property": "score",
|
83
|
+
"input": "quirky",
|
84
|
+
"expected": 22
|
85
|
+
},
|
86
|
+
{
|
87
|
+
"description": "long, mixed-case word",
|
88
|
+
"property": "score",
|
89
|
+
"input": "OxyphenButazone",
|
90
|
+
"expected": 41
|
91
|
+
},
|
92
|
+
{
|
93
|
+
"description": "english-like word",
|
94
|
+
"property": "score",
|
95
|
+
"input": "pinata",
|
96
|
+
"expected": 8
|
97
|
+
},
|
98
|
+
{
|
99
|
+
"description": "empty input",
|
100
|
+
"property": "score",
|
101
|
+
"input": "",
|
102
|
+
"expected": 0
|
103
|
+
},
|
104
|
+
{
|
105
|
+
"description": "entire alphabet available",
|
106
|
+
"property": "score",
|
107
|
+
"input": "abcdefghijklmnopqrstuvwxyz",
|
108
|
+
"expected": 87
|
109
|
+
}
|
110
|
+
]
|
111
|
+
}
|
112
|
+
」
|
113
|
+
}
|
@@ -1,16 +1,32 @@
|
|
1
|
-
|
1
|
+
unit module SpaceAge:ver<1>;
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
3
|
+
role Planet {
|
4
|
+
method age-on ($seconds) {
|
5
|
+
($seconds / self.orbital-period).round(0.01);
|
6
|
+
}
|
7
|
+
}
|
8
|
+
|
9
|
+
class Earth does Planet is export {
|
10
|
+
my $.orbital-period = 31557600;
|
11
|
+
}
|
12
|
+
|
13
|
+
my package EXPORT::DEFAULT {
|
14
|
+
my %planets = (
|
15
|
+
:Mercury(0.2408467),
|
16
|
+
:Venus(0.61519726),
|
17
|
+
:Mars(1.8808158),
|
18
|
+
:Jupiter(11.862615),
|
19
|
+
:Saturn(29.447498),
|
20
|
+
:Uranus(84.016846),
|
21
|
+
:Neptune(164.79132),
|
22
|
+
);
|
23
|
+
for %planets.kv -> $planet, $relative {
|
24
|
+
OUR::{$planet} := EVAL 'class :: does Planet {
|
25
|
+
my $.orbital-period = calculate-orbital-period $relative
|
26
|
+
}';
|
27
|
+
}
|
28
|
+
}
|
13
29
|
|
14
|
-
sub
|
15
|
-
|
30
|
+
sub calculate-orbital-period ($relative-to-earth) {
|
31
|
+
Earth.orbital-period * $relative-to-earth;
|
16
32
|
}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
unit module SpaceAge:ver<1>;
|
2
|
+
|
3
|
+
role Planet {
|
4
|
+
method age-on ($seconds) {
|
5
|
+
}
|
6
|
+
}
|
7
|
+
|
8
|
+
class Earth does Planet is export {
|
9
|
+
my $.orbital-period = 31557600;
|
10
|
+
}
|
11
|
+
|
12
|
+
=for comment
|
13
|
+
---
|
14
|
+
Orbital periods relative to Earth:
|
15
|
+
Mercury: 0.2408467
|
16
|
+
Venus: 0.61519726
|
17
|
+
Mars: 1.8808158
|
18
|
+
Jupiter: 11.862615
|
19
|
+
Saturn: 29.447498
|
20
|
+
Uranus: 84.016846
|
21
|
+
Neptune: 164.79132
|
22
|
+
...
|
@@ -1,65 +1,103 @@
|
|
1
1
|
#!/usr/bin/env perl6
|
2
|
-
|
2
|
+
use v6;
|
3
3
|
use Test;
|
4
|
+
use lib my $dir = $?FILE.IO.dirname;
|
4
5
|
use JSON::Tiny;
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
my $module = %*ENV<EXERCISM> ?? 'Example' !!
|
9
|
-
|
7
|
+
my $exercise = 'SpaceAge';
|
8
|
+
my $version = v1;
|
9
|
+
my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
|
10
|
+
plan 11;
|
10
11
|
|
11
|
-
|
12
|
+
use-ok $module or bail-out;
|
13
|
+
require ::($module);
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
15
|
+
if ::($exercise).^ver !~~ $version {
|
16
|
+
warn "\nExercise version mismatch. Further tests may fail!"
|
17
|
+
~ "\n$exercise is $(::($exercise).^ver.gist). "
|
18
|
+
~ "Test is $($version.gist).\n";
|
19
|
+
bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
|
16
20
|
}
|
17
21
|
|
22
|
+
my @classes;
|
23
|
+
BEGIN { @classes = <Mercury Venus Earth Mars Jupiter Saturn Uranus Neptune> };
|
24
|
+
subtest 'Class(es)', {
|
25
|
+
plan 8;
|
26
|
+
eval-lives-ok "use $module; ::('$_').new or die 'Could not call .new on $_\.'", $_ for @classes;
|
27
|
+
} or bail-out 'All classes must be defined and exported.';
|
28
|
+
require ::($module) @classes.eager;
|
29
|
+
|
30
|
+
is (age-on ::(.<planet>): .<seconds>), |.<expected description> for @(my $c-data.<cases>);
|
31
|
+
|
32
|
+
if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
|
33
|
+
is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
|
34
|
+
} else { skip }
|
35
|
+
|
18
36
|
done-testing;
|
19
37
|
|
20
38
|
INIT {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
39
|
+
$c-data := from-json 「
|
40
|
+
{
|
41
|
+
"exercise": "space-age",
|
42
|
+
"version": "1.0.0",
|
43
|
+
"cases": [
|
44
|
+
{
|
45
|
+
"description": "age on Earth",
|
46
|
+
"property": "age",
|
47
|
+
"planet": "Earth",
|
48
|
+
"seconds": 1000000000,
|
49
|
+
"expected": 31.69
|
50
|
+
},
|
51
|
+
{
|
52
|
+
"description": "age on Mercury",
|
53
|
+
"property": "age",
|
54
|
+
"planet": "Mercury",
|
55
|
+
"seconds": 2134835688,
|
56
|
+
"expected": 280.88
|
57
|
+
},
|
58
|
+
{
|
59
|
+
"description": "age on Venus",
|
60
|
+
"property": "age",
|
61
|
+
"planet": "Venus",
|
62
|
+
"seconds": 189839836,
|
63
|
+
"expected": 9.78
|
64
|
+
},
|
65
|
+
{
|
66
|
+
"description": "age on Mars",
|
67
|
+
"property": "age",
|
68
|
+
"planet": "Mars",
|
69
|
+
"seconds": 2329871239,
|
70
|
+
"expected": 39.25
|
71
|
+
},
|
72
|
+
{
|
73
|
+
"description": "age on Jupiter",
|
74
|
+
"property": "age",
|
75
|
+
"planet": "Jupiter",
|
76
|
+
"seconds": 901876382,
|
77
|
+
"expected": 2.41
|
78
|
+
},
|
79
|
+
{
|
80
|
+
"description": "age on Saturn",
|
81
|
+
"property": "age",
|
82
|
+
"planet": "Saturn",
|
83
|
+
"seconds": 3000000000,
|
84
|
+
"expected": 3.23
|
85
|
+
},
|
86
|
+
{
|
87
|
+
"description": "age on Uranus",
|
88
|
+
"property": "age",
|
89
|
+
"planet": "Uranus",
|
90
|
+
"seconds": 3210123456,
|
91
|
+
"expected": 1.21
|
92
|
+
},
|
93
|
+
{
|
94
|
+
"description": "age on Neptune",
|
95
|
+
"property": "age",
|
96
|
+
"planet": "Neptune",
|
97
|
+
"seconds": 8210123456,
|
98
|
+
"expected": 1.58
|
99
|
+
}
|
100
|
+
]
|
101
|
+
}
|
64
102
|
」
|
65
103
|
}
|