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.
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
  }