trackler 2.1.0.7 → 2.1.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (179) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/java/exercises/difference-of-squares/src/test/java/DifferenceOfSquaresCalculatorTest.java +9 -9
  4. data/tracks/java/exercises/gigasecond/src/test/java/GigasecondTest.java +4 -4
  5. data/tracks/java/exercises/pangram/src/test/java/PangramCheckerTest.java +10 -10
  6. data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +12 -12
  7. data/tracks/java/exercises/saddle-points/src/test/java/MatrixTest.java +4 -4
  8. data/tracks/java/exercises/secret-handshake/src/test/java/HandshakeCalculatorTest.java +11 -11
  9. data/tracks/java/exercises/space-age/src/test/java/SpaceAgeTest.java +8 -8
  10. data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +1 -1
  11. data/tracks/perl6/.travis.yml +1 -1
  12. data/tracks/perl6/exercises/bob/example.yaml +19 -0
  13. data/tracks/perl6/exercises/clock/clock.t +17 -10
  14. data/tracks/perl6/exercises/clock/example.yaml +7 -5
  15. data/tracks/perl6/exercises/grade-school/example.yaml +23 -0
  16. data/tracks/perl6/exercises/leap/example.yaml +6 -0
  17. data/tracks/perl6/exercises/phone-number/Example.pm +2 -2
  18. data/tracks/perl6/exercises/phone-number/PhoneNumber.pm6 +1 -1
  19. data/tracks/perl6/exercises/phone-number/example.yaml +12 -0
  20. data/tracks/perl6/exercises/phone-number/phone-number.t +100 -85
  21. data/tracks/perl6/exercises/space-age/Example.pm +13 -15
  22. data/tracks/ruby/README.md +22 -10
  23. data/tracks/ruby/{HINTS.md → exercises/accumulate/HINTS.md} +0 -0
  24. data/tracks/ruby/exercises/accumulate/accumulate_test.rb +0 -1
  25. data/tracks/ruby/exercises/acronym/.meta/generator/acronym_cases.rb +1 -1
  26. data/tracks/ruby/exercises/acronym/acronym_test.rb +1 -2
  27. data/tracks/ruby/exercises/all-your-base/.meta/generator/all_your_base_cases.rb +1 -1
  28. data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +1 -2
  29. data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
  30. data/tracks/ruby/exercises/alphametics/.meta/generator/alphametics_cases.rb +1 -1
  31. data/tracks/ruby/exercises/alphametics/.meta/generator/test_template.erb +1 -2
  32. data/tracks/ruby/exercises/alphametics/alphametics_test.rb +1 -2
  33. data/tracks/ruby/exercises/anagram/.meta/generator/anagram_cases.rb +1 -1
  34. data/tracks/ruby/exercises/anagram/anagram_test.rb +1 -2
  35. data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
  36. data/tracks/ruby/exercises/beer-song/.meta/generator/beer_song_cases.rb +1 -1
  37. data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
  38. data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +0 -1
  39. data/tracks/ruby/exercises/binary-search/binary_search_test.rb +0 -1
  40. data/tracks/ruby/exercises/binary/.meta/generator/binary_cases.rb +1 -1
  41. data/tracks/ruby/exercises/binary/binary_test.rb +1 -2
  42. data/tracks/ruby/exercises/bob/bob_test.rb +0 -1
  43. data/tracks/ruby/exercises/bowling/.meta/generator/bowling_cases.rb +1 -1
  44. data/tracks/ruby/exercises/bowling/.meta/generator/test_template.erb +1 -2
  45. data/tracks/ruby/exercises/bowling/bowling_test.rb +1 -2
  46. data/tracks/ruby/exercises/bracket-push/.meta/generator/bracket_push_cases.rb +1 -1
  47. data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +1 -2
  48. data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -1
  49. data/tracks/ruby/exercises/clock/.meta/generator/clock_cases.rb +1 -1
  50. data/tracks/ruby/exercises/clock/clock_test.rb +1 -2
  51. data/tracks/ruby/exercises/connect/.meta/generator/connect_cases.rb +1 -1
  52. data/tracks/ruby/exercises/connect/.meta/generator/test_template.erb +1 -2
  53. data/tracks/ruby/exercises/connect/connect_test.rb +1 -2
  54. data/tracks/ruby/exercises/crypto-square/crypto_square_test.rb +0 -1
  55. data/tracks/ruby/exercises/custom-set/.meta/generator/custom_set_cases.rb +1 -1
  56. data/tracks/ruby/exercises/custom-set/custom_set_test.rb +1 -2
  57. data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
  58. data/tracks/ruby/exercises/difference-of-squares/.meta/generator/difference_of_squares_cases.rb +1 -1
  59. data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +1 -2
  60. data/tracks/ruby/exercises/dominoes/.meta/generator/dominoes_cases.rb +1 -1
  61. data/tracks/ruby/exercises/dominoes/.meta/generator/test_template.erb +1 -2
  62. data/tracks/ruby/exercises/dominoes/dominoes_test.rb +1 -2
  63. data/tracks/ruby/exercises/etl/.meta/generator/etl_cases.rb +1 -1
  64. data/tracks/ruby/exercises/etl/etl_test.rb +1 -2
  65. data/tracks/ruby/exercises/flatten-array/flatten_array_test.rb +0 -1
  66. data/tracks/ruby/exercises/food-chain/food_chain_test.rb +0 -1
  67. data/tracks/ruby/exercises/gigasecond/.meta/generator/gigasecond_cases.rb +1 -1
  68. data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +1 -2
  69. data/tracks/ruby/exercises/grade-school/grade_school_test.rb +0 -1
  70. data/tracks/ruby/exercises/grains/.meta/generator/grains_cases.rb +1 -1
  71. data/tracks/ruby/exercises/grains/grains_test.rb +1 -2
  72. data/tracks/ruby/exercises/hamming/.meta/generator/hamming_cases.rb +1 -1
  73. data/tracks/ruby/exercises/hamming/hamming_test.rb +1 -2
  74. data/tracks/ruby/exercises/hello-world/.meta/generator/hello_world_cases.rb +1 -1
  75. data/tracks/ruby/exercises/hello-world/.meta/generator/test_template.erb +1 -1
  76. data/tracks/ruby/exercises/hello-world/hello_world_test.rb +1 -1
  77. data/tracks/ruby/exercises/hexadecimal/hexadecimal_test.rb +0 -1
  78. data/tracks/ruby/exercises/house/house_test.rb +0 -1
  79. data/tracks/ruby/exercises/isogram/.meta/generator/isogram_cases.rb +1 -1
  80. data/tracks/ruby/exercises/isogram/isogram_test.rb +1 -2
  81. data/tracks/ruby/exercises/kindergarten-garden/kindergarten_garden_test.rb +0 -1
  82. data/tracks/ruby/exercises/largest-series-product/.meta/generator/largest_series_product_cases.rb +1 -1
  83. data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +1 -2
  84. data/tracks/ruby/exercises/leap/.meta/generator/leap_cases.rb +1 -1
  85. data/tracks/ruby/exercises/leap/.meta/generator/test_template.erb +1 -2
  86. data/tracks/ruby/exercises/leap/leap_test.rb +1 -2
  87. data/tracks/ruby/exercises/linked-list/linked_list_test.rb +0 -1
  88. data/tracks/ruby/exercises/list-ops/list_ops_test.rb +0 -1
  89. data/tracks/ruby/exercises/luhn/.meta/generator/luhn_cases.rb +1 -1
  90. data/tracks/ruby/exercises/luhn/luhn_test.rb +1 -2
  91. data/tracks/ruby/exercises/matrix/matrix_test.rb +0 -1
  92. data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
  93. data/tracks/ruby/exercises/minesweeper/minesweeper_test.rb +0 -1
  94. data/tracks/ruby/exercises/nth-prime/.meta/generator/nth_prime_cases.rb +1 -1
  95. data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +1 -2
  96. data/tracks/ruby/exercises/nucleotide-count/nucleotide_count_test.rb +0 -1
  97. data/tracks/ruby/exercises/ocr-numbers/.meta/generator/ocr_numbers_cases.rb +1 -1
  98. data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
  99. data/tracks/ruby/exercises/octal/octal_test.rb +0 -1
  100. data/tracks/ruby/exercises/palindrome-products/palindrome_products_test.rb +0 -1
  101. data/tracks/ruby/exercises/pangram/.meta/generator/pangram_cases.rb +1 -1
  102. data/tracks/ruby/exercises/pangram/pangram_test.rb +1 -2
  103. data/tracks/ruby/exercises/pascals-triangle/pascals_triangle_test.rb +0 -1
  104. data/tracks/ruby/exercises/perfect-numbers/perfect_numbers_test.rb +0 -1
  105. data/tracks/ruby/exercises/phone-number/.meta/.version +1 -0
  106. data/tracks/ruby/exercises/phone-number/.meta/generator/phone_number_cases.rb +7 -0
  107. data/tracks/ruby/exercises/phone-number/example.rb +21 -37
  108. data/tracks/ruby/exercises/phone-number/phone_number_test.rb +47 -43
  109. data/tracks/ruby/exercises/pig-latin/.meta/generator/pig_latin_cases.rb +1 -1
  110. data/tracks/ruby/exercises/pig-latin/pig_latin_test.rb +1 -2
  111. data/tracks/ruby/exercises/point-mutations/point_mutations_test.rb +0 -1
  112. data/tracks/ruby/exercises/poker/poker_test.rb +0 -1
  113. data/tracks/ruby/exercises/prime-factors/prime_factors_test.rb +0 -1
  114. data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
  115. data/tracks/ruby/exercises/proverb/proverb_test.rb +0 -1
  116. data/tracks/ruby/exercises/pythagorean-triplet/pythagorean_triplet_test.rb +0 -1
  117. data/tracks/ruby/exercises/queen-attack/.meta/generator/queen_attack_cases.rb +1 -1
  118. data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +1 -2
  119. data/tracks/ruby/exercises/rail-fence-cipher/rail_fence_cipher_test.rb +0 -1
  120. data/tracks/ruby/exercises/raindrops/.meta/generator/raindrops_cases.rb +1 -1
  121. data/tracks/ruby/exercises/raindrops/raindrops_test.rb +1 -2
  122. data/tracks/ruby/exercises/rna-transcription/.meta/generator/rna_transcription_cases.rb +1 -1
  123. data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +1 -2
  124. data/tracks/ruby/exercises/robot-name/robot_name_test.rb +0 -1
  125. data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +0 -1
  126. data/tracks/ruby/exercises/roman-numerals/.meta/generator/roman_numerals_cases.rb +1 -1
  127. data/tracks/ruby/exercises/roman-numerals/roman_numerals_test.rb +1 -2
  128. data/tracks/ruby/exercises/run-length-encoding/.meta/generator/run_length_encoding_cases.rb +5 -1
  129. data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +14 -15
  130. data/tracks/ruby/exercises/saddle-points/saddle_points_test.rb +0 -1
  131. data/tracks/ruby/exercises/say/.meta/generator/say_cases.rb +1 -1
  132. data/tracks/ruby/exercises/say/say_test.rb +1 -2
  133. data/tracks/ruby/exercises/scale-generator/scale_generator_test.rb +0 -1
  134. data/tracks/ruby/exercises/scrabble-score/scrabble_score_test.rb +0 -1
  135. data/tracks/ruby/exercises/secret-handshake/secret_handshake_test.rb +0 -1
  136. data/tracks/ruby/exercises/series/series_test.rb +0 -1
  137. data/tracks/ruby/exercises/sieve/.meta/generator/sieve_cases.rb +1 -1
  138. data/tracks/ruby/exercises/sieve/sieve_test.rb +1 -2
  139. data/tracks/ruby/exercises/simple-cipher/simple_cipher_test.rb +0 -1
  140. data/tracks/ruby/exercises/space-age/space_age_test.rb +0 -1
  141. data/tracks/ruby/exercises/strain/strain_test.rb +0 -1
  142. data/tracks/ruby/exercises/sum-of-multiples/sum_of_multiples_test.rb +0 -1
  143. data/tracks/ruby/exercises/tournament/.meta/.version +1 -1
  144. data/tracks/ruby/exercises/tournament/.meta/generator/tournament_cases.rb +1 -1
  145. data/tracks/ruby/exercises/tournament/example.rb +4 -2
  146. data/tracks/ruby/exercises/tournament/tournament_test.rb +20 -3
  147. data/tracks/ruby/exercises/transpose/.meta/generator/transpose_cases.rb +1 -1
  148. data/tracks/ruby/exercises/transpose/transpose_test.rb +1 -2
  149. data/tracks/ruby/exercises/triangle/.meta/generator/triangle_cases.rb +1 -1
  150. data/tracks/ruby/exercises/triangle/triangle_test.rb +1 -2
  151. data/tracks/ruby/exercises/trinary/trinary_test.rb +0 -1
  152. data/tracks/ruby/exercises/twelve-days/twelve_days_test.rb +0 -1
  153. data/tracks/ruby/exercises/two-bucket/.meta/.version +1 -1
  154. data/tracks/ruby/exercises/two-bucket/.meta/generator/two_bucket_cases.rb +1 -1
  155. data/tracks/ruby/exercises/two-bucket/example.rb +1 -1
  156. data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +18 -3
  157. data/tracks/ruby/exercises/word-count/.meta/generator/word_count_cases.rb +1 -1
  158. data/tracks/ruby/exercises/word-count/word_count_test.rb +1 -2
  159. data/tracks/ruby/exercises/wordy/.meta/generator/wordy_cases.rb +1 -1
  160. data/tracks/ruby/exercises/wordy/wordy_test.rb +1 -2
  161. data/tracks/ruby/lib/generator/{exercise_cases.rb → exercise_case.rb} +0 -0
  162. data/tracks/ruby/lib/generator/exercise_case/assertion.rb +2 -1
  163. data/tracks/ruby/lib/generator/files/track_files.rb +15 -10
  164. data/tracks/ruby/lib/generator/template_values.rb +4 -2
  165. data/tracks/ruby/lib/generator/test_template.erb +1 -2
  166. data/tracks/ruby/lib/tasks/exercise.rb +9 -1
  167. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/test_template.erb +0 -1
  168. data/tracks/ruby/test/fixtures/xruby/exercises/alpha/{example.rb → .meta/solutions/alpha.rb} +0 -0
  169. data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/beta_cases.rb +1 -1
  170. data/tracks/ruby/test/fixtures/xruby/exercises/beta/example.tt +0 -1
  171. data/tracks/ruby/test/fixtures/xruby/lib/generator/test_template.erb +0 -1
  172. data/tracks/ruby/test/generator/exercise_case/assertion_test.rb +6 -0
  173. data/tracks/ruby/test/generator/{exercise_cases_test.rb → exercise_case_test.rb} +0 -0
  174. data/tracks/ruby/test/generator/files/track_files_test.rb +14 -18
  175. data/tracks/ruby/test/generator/template_values_test.rb +2 -0
  176. data/tracks/ruby/test/tasks/exercise_test.rb +6 -0
  177. data/tracks/ruby/test/tasks/exercise_tests_runner_legacy_test.rb +64 -0
  178. data/tracks/ruby/test/tasks/exercise_tests_runner_test.rb +2 -2
  179. metadata +13 -6
@@ -11,7 +11,7 @@ public class TriangleTest {
11
11
  public final ExpectedException thrown = ExpectedException.none();
12
12
 
13
13
  @Test
14
- public void equilateralTriangleHaveEqualSides() throws TriangleException {
14
+ public void equilateralTrianglesHaveEqualSides() throws TriangleException {
15
15
  Triangle triangle = new Triangle(2, 2, 2);
16
16
 
17
17
  assertEquals(TriangleKind.EQUILATERAL, triangle.getKind());
@@ -3,7 +3,7 @@ sudo: false
3
3
  language: perl6
4
4
  perl6:
5
5
  - latest
6
- - '2017.01' # Latest Rakudo Star
6
+ - '2017.04.3' # Latest Rakudo Star
7
7
  install:
8
8
  - rakudobrew build zef
9
9
  - zef install JSON::Tiny
@@ -0,0 +1,19 @@
1
+ exercise: Bob
2
+ version: 1
3
+ plan: 28
4
+ methods: hey
5
+ tests: |
6
+ #`[Go through all of the cases (hiding at the bottom of this file)
7
+ and check that Bob gives us the correct response for each one.]
8
+ is ::($exercise).?hey(.<input>), |.<expected description> for @($c-data<cases>);
9
+
10
+ exercise_comment: The name of this exercise.
11
+ module_comment: "%*ENV<EXERCISM> is for tests not directly for the exercise, don't worry about these :)"
12
+ version_comment: The version we will be matching against the exercise.
13
+ plan_comment: This is how many tests we expect to run.
14
+ use_test_comment: Check that the module can be use-d.
15
+ version_test_comment: "If the exercise is updated, we want to make sure other people testing\nyour code don't think you've made a mistake if things have changed!"
16
+ methods_comment: "Check that the class 'Bob' can use all of the methods\nneeded in the tests (only 'hey' for this one)."
17
+ cdata_test_comment: Ignore this for your exercise! Tells Exercism folks when exercise cases become out of date.
18
+ done_testing_comment: There are no more tests after this :)
19
+ INIT_comment: "'INIT' is a phaser, it makes sure that the test data is available before everything else\nstarts running (otherwise we'd have to shove the test data into the middle of the file!)"
@@ -25,14 +25,16 @@ subtest 'Class methods', {
25
25
 
26
26
  my $c-data;
27
27
  is ::($exercise).new(hour => .<hour>, minute => .<minute>).?time, |.<expected description> for @($c-data<cases>[0]<cases>);
28
- for @($c-data<cases>[1]<cases>) {
29
- my $clock = ::($exercise).new(hour => .<hour>, minute => .<minute>);
30
- $clock.?add-minutes(.<add>);
31
- is $clock.?time, |.<expected description>;
28
+ for @($c-data<cases>[1,2]) {
29
+ for @(.<cases>) {
30
+ my $clock = ::($exercise).new(hour => .<hour>, minute => .<minute>);
31
+ $clock.?add-minutes(.<add>);
32
+ is $clock.?time, |.<expected description>;
33
+ }
32
34
  }
33
35
  is ::($exercise).new(hour => .<clock1><hour>, minute => .<clock1><minute>).?time eq
34
36
  ::($exercise).new(hour => .<clock2><hour>, minute => .<clock2><minute>).?time,
35
- |.<expected description> for @($c-data<cases>[2]<cases>);
37
+ |.<expected description> for @($c-data<cases>[3]<cases>);
36
38
  todo 'optional test' unless %*ENV<EXERCISM>;
37
39
  is ::($exercise).new(:0hour,:0minute).?add-minutes(65).?time, '01:05', 'add-minutes method can be chained';
38
40
 
@@ -47,7 +49,7 @@ $c-data := from-json q:to/END/;
47
49
 
48
50
  {
49
51
  "exercise": "clock",
50
- "version": "1.0.0",
52
+ "version": "1.0.1",
51
53
  "comments": [
52
54
  "Most languages require constructing a clock with initial values,",
53
55
  "adding a positive or negative number of minutes, and testing equality",
@@ -57,7 +59,7 @@ $c-data := from-json q:to/END/;
57
59
  ],
58
60
  "cases": [
59
61
  {
60
- "description": "Test creating a new clock with an initial time.",
62
+ "description": "Create a new clock with an initial time",
61
63
  "cases": [
62
64
  {
63
65
  "description": "on the hour",
@@ -195,7 +197,7 @@ $c-data := from-json q:to/END/;
195
197
  ]
196
198
  },
197
199
  {
198
- "description": "Test adding and subtracting minutes.",
200
+ "description": "Add minutes",
199
201
  "cases": [
200
202
  {
201
203
  "description": "add minutes",
@@ -260,7 +262,12 @@ $c-data := from-json q:to/END/;
260
262
  "minute": 1,
261
263
  "add": 3500,
262
264
  "expected": "11:21"
263
- },
265
+ }
266
+ ]
267
+ },
268
+ {
269
+ "description": "Subtract minutes",
270
+ "cases": [
264
271
  {
265
272
  "description": "subtract minutes",
266
273
  "property": "add",
@@ -328,7 +335,7 @@ $c-data := from-json q:to/END/;
328
335
  ]
329
336
  },
330
337
  {
331
- "description": "Construct two separate clocks, set times, test if they are equal.",
338
+ "description": "Compare two clocks for equality",
332
339
  "cases": [
333
340
  {
334
341
  "description": "clocks with same time",
@@ -4,13 +4,15 @@ methods: time add-minutes
4
4
  plan: 54
5
5
  tests: |
6
6
  is ::($exercise).new(hour => .<hour>, minute => .<minute>).?time, |.<expected description> for @($c-data<cases>[0]<cases>);
7
- for @($c-data<cases>[1]<cases>) {
8
- my $clock = ::($exercise).new(hour => .<hour>, minute => .<minute>);
9
- $clock.?add-minutes(.<add>);
10
- is $clock.?time, |.<expected description>;
7
+ for @($c-data<cases>[1,2]) {
8
+ for @(.<cases>) {
9
+ my $clock = ::($exercise).new(hour => .<hour>, minute => .<minute>);
10
+ $clock.?add-minutes(.<add>);
11
+ is $clock.?time, |.<expected description>;
12
+ }
11
13
  }
12
14
  is ::($exercise).new(hour => .<clock1><hour>, minute => .<clock1><minute>).?time eq
13
15
  ::($exercise).new(hour => .<clock2><hour>, minute => .<clock2><minute>).?time,
14
- |.<expected description> for @($c-data<cases>[2]<cases>);
16
+ |.<expected description> for @($c-data<cases>[3]<cases>);
15
17
  todo 'optional test' unless %*ENV<EXERCISM>;
16
18
  is ::($exercise).new(:0hour,:0minute).?add-minutes(65).?time, '01:05', 'add-minutes method can be chained';
@@ -0,0 +1,23 @@
1
+ exercise: GradeSchool
2
+ version: 1
3
+ plan: 10
4
+ imports: Roster
5
+ tests: |
6
+ subtest "Roster class methods", {
7
+ plan 3;
8
+ ok ::('Roster').can($_), $_ for <add-student list-grade list-all>;
9
+ }
10
+ my $roster = ::('Roster').new;
11
+ ok $roster.?add-student(:name('Jim'), :2grade), 'Add Jim to grade 2';
12
+ is $roster.?list-grade(2), <Jim>, 'List grade 2';
13
+ ok $roster.?add-student(:name('Zoe'), :2grade), 'Add Zoe to grade 2';
14
+ ok $roster.?add-student(:name('Barb'), :1grade), 'Add Barb to grade 1';
15
+ is $roster.?list-grade(2), <Jim Zoe>, 'List grade 2';
16
+ is $roster.?list-grade(1), <Barb>, 'List grade 1';
17
+ subtest 'Additional students', {
18
+ plan 6;
19
+ ok $roster.?add-student(:name($_), :1grade), "Add $_ to grade 1" for <Charlie Anna>;
20
+ ok $roster.?add-student(:name('Alex'), :2grade), 'Add Alex to grade 2';
21
+ ok $roster.?add-student(:name($_), :3grade), "Add $_ to grade 3" for <Tom Dick Harry>;
22
+ }
23
+ is $roster.?list-all, ('Grade 1', <Anna Barb Charlie>, 'Grade 2', <Alex Jim Zoe>, 'Grade 3', <Dick Harry Tom>), 'List all';
@@ -0,0 +1,6 @@
1
+ exercise: Leap
2
+ version: 1
3
+ plan: 6
4
+ imports: '&is-leap-year'
5
+ tests: |
6
+ is &::('is-leap-year')(.<input>), |.<expected description> for @($c-data<cases>);
@@ -1,6 +1,6 @@
1
- unit module Phone:ver<1>;
1
+ unit module Phone:ver<2>;
2
2
 
3
3
  sub clean-number ($number is copy) is export {
4
4
  $number ~~ /<:L>/ ?? return Nil !! $number ~~ s:g/<:!Nd>//;
5
- $number ~~ /^ 1? (<:Nd> ** 10) $/ ?? ~$0 !! Nil;
5
+ $number ~~ /^ 1? ( [ <[2..9]> <:Nd> ** 2 ] ** 2 <:Nd> ** 4 ) $/ ?? ~$0 !! Nil;
6
6
  }
@@ -1,4 +1,4 @@
1
- unit module Phone:ver<1>;
1
+ unit module Phone:ver<2>;
2
2
 
3
3
  sub clean-number ($number) is export {
4
4
  }
@@ -0,0 +1,12 @@
1
+ exercise: Phone
2
+ version: 2
3
+ plan: 15
4
+ imports: '&clean-number'
5
+ tests: |
6
+ for @($c-data<cases>[0]<cases>) {
7
+ if .<expected> {
8
+ is clean-number(.<phrase>), |.<expected description>;
9
+ } else {
10
+ nok clean-number(.<phrase>), .<description>;
11
+ }
12
+ }
@@ -5,9 +5,9 @@ use lib my $dir = $?FILE.IO.dirname;
5
5
  use JSON::Tiny;
6
6
 
7
7
  my $exercise = 'Phone';
8
- my $version = v1;
8
+ my $version = v2;
9
9
  my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
- plan 13;
10
+ plan 15;
11
11
 
12
12
  use-ok $module or bail-out;
13
13
  require ::($module);
@@ -19,15 +19,10 @@ if ::($exercise).^ver !~~ $version {
19
19
  bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
20
20
  }
21
21
 
22
- my @subs;
23
- BEGIN { @subs = <&clean-number> };
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;
22
+ require ::($module) <&clean-number>;
29
23
 
30
- for @(my $c-data.<cases>.[0].<cases>) {
24
+ my $c-data;
25
+ for @($c-data<cases>[0]<cases>) {
31
26
  if .<expected> {
32
27
  is clean-number(.<phrase>), |.<expected description>;
33
28
  } else {
@@ -35,89 +30,109 @@ for @(my $c-data.<cases>.[0].<cases>) {
35
30
  }
36
31
  }
37
32
 
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 }
33
+ if %*ENV<EXERCISM> && (my $c-data-file =
34
+ "$dir/../../x-common/exercises/{$dir.IO.resolve.basename}/canonical-data.json".IO.resolve) ~~ :f
35
+ { is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data' } else { skip }
41
36
 
42
37
  done-testing;
43
38
 
44
39
  INIT {
45
- $c-data := from-json
40
+ $c-data := from-json q:to/END/;
41
+
42
+ {
43
+ "exercise": "phone-number",
44
+ "version": "1.1.0",
45
+ "cases": [
46
46
  {
47
- "exercise": "phone-number",
48
- "version": "1.0.2",
47
+ "description": "Cleanup user-entered phone numbers",
48
+ "comments": [
49
+ " Returns the cleaned phone number if given number is valid, "
50
+ , " else returns nil. Note that number is not formatted, "
51
+ , " just a 10-digit number is returned. "
52
+ ],
49
53
  "cases": [
50
54
  {
51
- "description": "Cleanup user-entered phone numbers",
52
- "comments": [
53
- " Returns the cleaned phone number if given number is valid, "
54
- , " else returns nil. Note that number is not formatted, "
55
- , " just a 10-digit number is returned. "
56
- ],
57
- "cases": [
58
- {
59
- "description": "cleans the number",
60
- "property": "clean",
61
- "phrase": "(123) 456-7890",
62
- "expected": "1234567890"
63
- },
64
- {
65
- "description": "cleans numbers with dots",
66
- "property": "clean",
67
- "phrase": "123.456.7890",
68
- "expected": "1234567890"
69
- },
70
- {
71
- "description": "cleans numbers with multiple spaces",
72
- "property": "clean",
73
- "phrase": "123 456 7890 ",
74
- "expected": "1234567890"
75
- },
76
- {
77
- "description": "invalid when 9 digits",
78
- "property": "clean",
79
- "phrase": "123456789",
80
- "expected": null
81
- },
82
- {
83
- "description": "invalid when 11 digits does not start with a 1",
84
- "property": "clean",
85
- "phrase": "21234567890",
86
- "expected": null
87
- },
88
- {
89
- "description": "valid when 11 digits and starting with 1",
90
- "property": "clean",
91
- "phrase": "11234567890",
92
- "expected": "1234567890"
93
- },
94
- {
95
- "description": "invalid when more than 11 digits",
96
- "property": "clean",
97
- "phrase": "321234567890",
98
- "expected": null
99
- },
100
- {
101
- "description": "invalid with letters",
102
- "property": "clean",
103
- "phrase": "123-abc-7890",
104
- "expected": null
105
- },
106
- {
107
- "description": "invalid with punctuations",
108
- "property": "clean",
109
- "phrase": "123-@:!-7890",
110
- "expected": null
111
- },
112
- {
113
- "description": "invalid with right number of digits but letters mixed in",
114
- "property": "clean",
115
- "phrase": "1a2b3c4d5e6f7g8h9i0j",
116
- "expected": null
117
- }
118
- ]
55
+ "description": "cleans the number",
56
+ "property": "clean",
57
+ "phrase": "(223) 456-7890",
58
+ "expected": "2234567890"
59
+ },
60
+ {
61
+ "description": "cleans numbers with dots",
62
+ "property": "clean",
63
+ "phrase": "223.456.7890",
64
+ "expected": "2234567890"
65
+ },
66
+ {
67
+ "description": "cleans numbers with multiple spaces",
68
+ "property": "clean",
69
+ "phrase": "223 456 7890 ",
70
+ "expected": "2234567890"
71
+ },
72
+ {
73
+ "description": "invalid when 9 digits",
74
+ "property": "clean",
75
+ "phrase": "123456789",
76
+ "expected": null
77
+ },
78
+ {
79
+ "description": "invalid when 11 digits does not start with a 1",
80
+ "property": "clean",
81
+ "phrase": "22234567890",
82
+ "expected": null
83
+ },
84
+ {
85
+ "description": "valid when 11 digits and starting with 1",
86
+ "property": "clean",
87
+ "phrase": "12234567890",
88
+ "expected": "2234567890"
89
+ },
90
+ {
91
+ "description": "valid when 11 digits and starting with 1 even with punctuation",
92
+ "property": "clean",
93
+ "phrase": "+1 (223) 456-7890",
94
+ "expected": "2234567890"
95
+ },
96
+ {
97
+ "description": "invalid when more than 11 digits",
98
+ "property": "clean",
99
+ "phrase": "321234567890",
100
+ "expected": null
101
+ },
102
+ {
103
+ "description": "invalid with letters",
104
+ "property": "clean",
105
+ "phrase": "123-abc-7890",
106
+ "expected": null
107
+ },
108
+ {
109
+ "description": "invalid with punctuations",
110
+ "property": "clean",
111
+ "phrase": "123-@:!-7890",
112
+ "expected": null
113
+ },
114
+ {
115
+ "description": "invalid with right number of digits but letters mixed in",
116
+ "property": "clean",
117
+ "phrase": "1a2b3c4d5e6f7g8h9i0j",
118
+ "expected": null
119
+ },
120
+ {
121
+ "description": "invalid if area code does not start with 2-9",
122
+ "property": "clean",
123
+ "phrase": "(123) 456-7890",
124
+ "expected": null
125
+ },
126
+ {
127
+ "description": "invalid if exchange code does not start with 2-9",
128
+ "property": "clean",
129
+ "phrase": "(223) 056-7890",
130
+ "expected": null
119
131
  }
120
132
  ]
121
133
  }
122
-
134
+ ]
135
+ }
136
+
137
+ END
123
138
  }
@@ -10,21 +10,19 @@ class Earth does Planet is export {
10
10
  my $.orbital-period = 31557600;
11
11
  }
12
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
- }
13
+ my %planets = (
14
+ :Mercury(0.2408467),
15
+ :Venus(0.61519726),
16
+ :Mars(1.8808158),
17
+ :Jupiter(11.862615),
18
+ :Saturn(29.447498),
19
+ :Uranus(84.016846),
20
+ :Neptune(164.79132),
21
+ );
22
+ for %planets.kv -> $planet, $relative {
23
+ use MONKEY-SEE-NO-EVAL;
24
+ OUR::EXPORT::ALL::{$planet} := OUR::EXPORT::DEFAULT::{$planet} := EVAL "class $planet does Planet is export " ~
25
+ '{ my $.orbital-period = calculate-orbital-period $relative }';
28
26
  }
29
27
 
30
28
  sub calculate-orbital-period ($relative-to-earth) {