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.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +4 -1
  3. data/common/README.md +52 -0
  4. data/lib/trackler/version.rb +1 -1
  5. data/tracks/ecmascript/config.json +7 -0
  6. data/tracks/ecmascript/exercises/perfect-numbers/example.js +68 -0
  7. data/tracks/ecmascript/exercises/perfect-numbers/gulpfile.js +89 -0
  8. data/tracks/ecmascript/exercises/perfect-numbers/package.json +28 -0
  9. data/tracks/ecmascript/exercises/perfect-numbers/perfect-numbers.spec.js +75 -0
  10. data/tracks/erlang/exercises/accumulate/src/accumulate.app.src +1 -1
  11. data/tracks/erlang/exercises/all-your-base/src/all_your_base.app.src +1 -1
  12. data/tracks/erlang/exercises/allergies/src/allergies.app.src +1 -1
  13. data/tracks/erlang/exercises/anagram/src/anagram.app.src +1 -1
  14. data/tracks/erlang/exercises/atbash-cipher/src/atbash_cipher.app.src +1 -1
  15. data/tracks/erlang/exercises/bank-account/src/bank_account.app.src +1 -1
  16. data/tracks/erlang/exercises/beer-song/src/beer_song.app.src +1 -1
  17. data/tracks/erlang/exercises/bob/src/bob.app.src +1 -1
  18. data/tracks/erlang/exercises/circular-buffer/src/circular_buffer.app.src +1 -1
  19. data/tracks/erlang/exercises/clock/src/clock.app.src +1 -1
  20. data/tracks/erlang/exercises/difference-of-squares/src/difference_of_squares.app.src +1 -1
  21. data/tracks/erlang/exercises/etl/src/etl.app.src +1 -1
  22. data/tracks/erlang/exercises/gigasecond/src/gigasecond.app.src +1 -1
  23. data/tracks/erlang/exercises/grade-school/src/grade_school.app.src +1 -1
  24. data/tracks/erlang/exercises/grains/src/grains.app.src +1 -1
  25. data/tracks/erlang/exercises/hamming/src/hamming.app.src +1 -1
  26. data/tracks/erlang/exercises/hello-world/src/hello_world.app.src +1 -1
  27. data/tracks/erlang/exercises/largest-series-product/src/largest_series_product.app.src +1 -1
  28. data/tracks/erlang/exercises/leap/src/leap.app.src +1 -1
  29. data/tracks/erlang/exercises/luhn/src/luhn.app.src +1 -1
  30. data/tracks/erlang/exercises/meetup/src/meetup.app.src +1 -1
  31. data/tracks/erlang/exercises/nucleotide-count/src/nucleotide_count.app.src +1 -1
  32. data/tracks/erlang/exercises/parallel-letter-frequency/src/parallel_letter_frequency.app.src +1 -1
  33. data/tracks/erlang/exercises/phone-number/src/phone_number.app.src +1 -1
  34. data/tracks/erlang/exercises/rna-transcription/src/rna_transcription.app.src +1 -1
  35. data/tracks/erlang/exercises/robot-simulator/src/robot_simulator.app.src +1 -1
  36. data/tracks/erlang/exercises/roman-numerals/src/roman_numerals.app.src +1 -1
  37. data/tracks/erlang/exercises/rotational-cipher/src/rotational_cipher.app.src +1 -1
  38. data/tracks/erlang/exercises/scrabble-score/src/scrabble_score.app.src +1 -1
  39. data/tracks/erlang/exercises/series/src/series.app.src +1 -1
  40. data/tracks/erlang/exercises/space-age/src/space_age.app.src +1 -1
  41. data/tracks/erlang/exercises/strain/src/strain.app.src +1 -1
  42. data/tracks/erlang/exercises/sum-of-multiples/src/sum_of_multiples.app.src +1 -1
  43. data/tracks/erlang/exercises/triangle/src/triangle.app.src +1 -1
  44. data/tracks/erlang/exercises/word-count/src/word_count.app.src +1 -1
  45. data/tracks/erlang/exercises/zipper/src/zipper.app.src +1 -1
  46. data/tracks/go/exercises/hello-world/hello_world.go +10 -1
  47. data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/package.yaml +1 -0
  48. data/tracks/haskell/exercises/simple-linked-list/examples/success-standard/src/LinkedList.hs +1 -0
  49. data/tracks/haskell/exercises/simple-linked-list/package.yaml +1 -0
  50. data/tracks/haskell/exercises/simple-linked-list/src/LinkedList.hs +1 -1
  51. data/tracks/haskell/exercises/simple-linked-list/test/Tests.hs +37 -1
  52. data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +13 -6
  53. data/tracks/java/exercises/secret-handshake/src/test/java/HandshakeCalculatorTest.java +21 -13
  54. data/tracks/objective-c/exercises/atbash-cipher/AtbashCipherExample.m +1 -1
  55. data/tracks/objective-c/exercises/beer-song/BeerSongExample.m +1 -1
  56. data/tracks/objective-c/exercises/beer-song/BeerSongTest.m +4 -4
  57. data/tracks/objective-c/exercises/binary-search/BinarySearchExample.m +1 -1
  58. data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.h +2 -1
  59. data/tracks/objective-c/exercises/flatten-array/FlattenArrayExample.m +12 -25
  60. data/tracks/objective-c/exercises/flatten-array/FlattenArrayTest.m +32 -80
  61. data/tracks/objective-c/exercises/sublist/SublistTest.m +47 -70
  62. data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -0
  63. data/tracks/perl6/exercises/allergies/Example.pm +3 -1
  64. data/tracks/perl6/exercises/allergies/allergies.t +187 -137
  65. data/tracks/perl6/exercises/anagram/Anagram.pm6 +1 -0
  66. data/tracks/perl6/exercises/anagram/Example.pm +15 -15
  67. data/tracks/perl6/exercises/anagram/anagram.t +164 -15
  68. data/tracks/perl6/exercises/atbash-cipher/AtbashCipher.pm6 +1 -0
  69. data/tracks/perl6/exercises/atbash-cipher/Example.pm +2 -0
  70. data/tracks/perl6/exercises/atbash-cipher/atbash-cipher.t +109 -86
  71. data/tracks/perl6/exercises/grains/Example.pm +10 -9
  72. data/tracks/perl6/exercises/grains/Grains.pm6 +1 -0
  73. data/tracks/perl6/exercises/grains/grains.t +126 -18
  74. data/tracks/perl6/exercises/leap/Example.pm +9 -9
  75. data/tracks/perl6/exercises/leap/Leap.pm6 +4 -0
  76. data/tracks/perl6/exercises/leap/leap.t +61 -17
  77. data/tracks/perl6/exercises/phone-number/Example.pm +4 -28
  78. data/tracks/perl6/exercises/phone-number/PhoneNumber.pm6 +4 -0
  79. data/tracks/perl6/exercises/phone-number/phone-number.t +102 -65
  80. data/tracks/perl6/exercises/raindrops/Example.pm +10 -8
  81. data/tracks/perl6/exercises/raindrops/Raindrops.pm6 +4 -0
  82. data/tracks/perl6/exercises/raindrops/raindrops.t +153 -20
  83. data/tracks/perl6/exercises/rna-transcription/Example.pm +5 -7
  84. data/tracks/perl6/exercises/rna-transcription/RNA.pm6 +4 -0
  85. data/tracks/perl6/exercises/rna-transcription/rna-transcription.t +107 -11
  86. data/tracks/perl6/exercises/scrabble-score/Example.pm +14 -19
  87. data/tracks/perl6/exercises/scrabble-score/Scrabble.pm6 +4 -0
  88. data/tracks/perl6/exercises/scrabble-score/scrabble-score.t +106 -15
  89. data/tracks/perl6/exercises/space-age/Example.pm +29 -13
  90. data/tracks/perl6/exercises/space-age/SpaceAge.pm6 +22 -0
  91. data/tracks/perl6/exercises/space-age/space-age.t +90 -52
  92. data/tracks/perl6/exercises/word-count/Example.pm +4 -8
  93. data/tracks/perl6/exercises/word-count/WordCount.pm6 +4 -0
  94. data/tracks/perl6/exercises/word-count/word-count.t +149 -16
  95. data/tracks/perl6/exercises/wordy/Example.pm +13 -13
  96. data/tracks/perl6/exercises/wordy/Wordy.pm6 +4 -0
  97. data/tracks/perl6/exercises/wordy/wordy.t +140 -97
  98. data/tracks/purescript/config.json +7 -0
  99. data/tracks/purescript/exercises/atbash-cipher/bower.json +18 -0
  100. data/tracks/purescript/exercises/atbash-cipher/examples/src/AtbashCipher.purs +41 -0
  101. data/tracks/purescript/exercises/atbash-cipher/src/AtbashCipher.purs +4 -0
  102. data/tracks/purescript/exercises/atbash-cipher/test/Main.purs +64 -0
  103. data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +2 -0
  104. data/tracks/swift/exercises/grade-school/Tests/GradeSchoolTests/GradeSchoolTests.swift +1 -1
  105. metadata +22 -2
@@ -0,0 +1,4 @@
1
+ unit module RNA:ver<1>;
2
+
3
+ sub to-rna ($dna) is export {
4
+ }
@@ -1,17 +1,113 @@
1
1
  #!/usr/bin/env perl6
2
2
  use v6;
3
3
  use Test;
4
- use lib IO::Path.new($?FILE).parent.path;
4
+ use lib my $dir = $?FILE.IO.dirname;
5
+ use JSON::Tiny;
5
6
 
6
- plan 7;
7
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'RNA_Transcription';
8
- use-ok $module;
9
- require ::($module) <RNA_Transcription>;
7
+ my $exercise = 'RNA';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 11;
10
11
 
11
- ok RNA_Transcription.can('to_rna'), 'Class RNA_Transcription has to_rna() method';
12
+ use-ok $module or bail-out;
13
+ require ::($module);
12
14
 
13
- is RNA_Transcription.to_rna('C'), 'G', 'RNA complement of cytosine is guanine';
14
- is RNA_Transcription.to_rna('G'), 'C', 'RNA complement of guanine is cytosine';
15
- is RNA_Transcription.to_rna('T'), 'A', 'RNA complement of thymine is adenine';
16
- is RNA_Transcription.to_rna('A'), 'U', 'RNA complement of adenine is uracil';
17
- is RNA_Transcription.to_rna('ACGTGGTCTTAA'), 'UGCACCAGAAUU', 'transcribes all occurences';
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
- class Scrabble is export {
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
- method score ($word) {
14
- my $score = 0;
15
-
16
- for $word.lc.split('',:skip-empty) -> $letter {
17
- $score
18
- += self.values{ self.values.keys.first(/$letter/) or 'ZERO' };
19
- }
20
- return $score;
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
  }
@@ -0,0 +1,4 @@
1
+ unit module Scrabble:ver<1>;
2
+
3
+ sub score ($word) is export {
4
+ }
@@ -1,22 +1,113 @@
1
1
  #!/usr/bin/env perl6
2
2
  use v6;
3
3
  use Test;
4
- use lib IO::Path.new($?FILE).parent.path;
4
+ use lib my $dir = $?FILE.IO.dirname;
5
+ use JSON::Tiny;
5
6
 
6
- plan 10;
7
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'Scrabble';
8
- use-ok $module;
9
- require ::($module) <Scrabble>;
7
+ my $exercise = 'Scrabble';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 14;
10
11
 
11
- ok Scrabble.can('score'), 'Scrabble class has score() method';
12
+ use-ok $module or bail-out;
13
+ require ::($module);
12
14
 
13
- my $scrabble = Scrabble.new();
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
- is $scrabble.score(""), 0, "empty word scores 0";
16
- is $scrabble.score(" \t\n"), 0, "whitespace scores 0";
17
- is $scrabble.score("a"), 1, "a scores 1";
18
- is $scrabble.score("f"), 4, "f scores 4";
19
- is $scrabble.score("street"), 6, "street scores 6";
20
- is $scrabble.score("alacrity"), 13, "alacrity scores 13";
21
- is $scrabble.score("OXYPHENBUTAZONE"), 41, "OXYPHENBUTAZONE scores 41";
22
- is $scrabble.score("quirky"), 22, "quirky scores 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
- our $earth_revolution = 31557600;
1
+ unit module SpaceAge:ver<1>;
2
2
 
3
- our %planets = (
4
- mercury => 0.2408467,
5
- venus => 0.61519726,
6
- mars => 1.8808158,
7
- jupiter => 11.862615,
8
- saturn => 29.447498,
9
- uranus => 84.016846,
10
- neptune => 164.79132,
11
- earth => 1,
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 age-on( $planet, $seconds ) is export {
15
- ( $seconds / %planets{$planet.lc} / $earth_revolution ).round(0.01);
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
- use lib $?FILE.IO.dirname;
7
-
8
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'SpaceAge';
9
- require ::($module) <&age-on>;
7
+ my $exercise = 'SpaceAge';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 11;
10
11
 
11
- plan 8;
12
+ use-ok $module or bail-out;
13
+ require ::($module);
12
14
 
13
- for my @cases -> %case {
14
- is age-on( |%case<planet seconds>), %case{'expected'},
15
- %case<planet seconds>.gist;
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
- @cases := from-json 「
22
- [
23
- {
24
- "planet": "Earth",
25
- "seconds": 1000000000,
26
- "expected": 31.69
27
- },
28
- {
29
- "planet": "Mercury",
30
- "seconds": 2134835688,
31
- "expected": 280.88
32
- },
33
- {
34
- "planet": "Venus",
35
- "seconds": 189839836,
36
- "expected": 9.78
37
- },
38
- {
39
- "planet": "Mars",
40
- "seconds": 2329871239,
41
- "expected": 39.25
42
- },
43
- {
44
- "planet": "Jupiter",
45
- "seconds": 901876382,
46
- "expected": 2.41
47
- },
48
- {
49
- "planet": "Saturn",
50
- "seconds": 3000000000,
51
- "expected": 3.23
52
- },
53
- {
54
- "planet": "Uranus",
55
- "seconds": 3210123456,
56
- "expected": 1.21
57
- },
58
- {
59
- "planet": "Neptune",
60
- "seconds": 8210123456,
61
- "expected": 1.58
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
  }