trackler 2.0.8.28 → 2.0.8.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
}
|