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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/java/exercises/difference-of-squares/src/test/java/DifferenceOfSquaresCalculatorTest.java +9 -9
- data/tracks/java/exercises/gigasecond/src/test/java/GigasecondTest.java +4 -4
- data/tracks/java/exercises/pangram/src/test/java/PangramCheckerTest.java +10 -10
- data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +12 -12
- data/tracks/java/exercises/saddle-points/src/test/java/MatrixTest.java +4 -4
- data/tracks/java/exercises/secret-handshake/src/test/java/HandshakeCalculatorTest.java +11 -11
- data/tracks/java/exercises/space-age/src/test/java/SpaceAgeTest.java +8 -8
- data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +1 -1
- data/tracks/perl6/.travis.yml +1 -1
- data/tracks/perl6/exercises/bob/example.yaml +19 -0
- data/tracks/perl6/exercises/clock/clock.t +17 -10
- data/tracks/perl6/exercises/clock/example.yaml +7 -5
- data/tracks/perl6/exercises/grade-school/example.yaml +23 -0
- data/tracks/perl6/exercises/leap/example.yaml +6 -0
- data/tracks/perl6/exercises/phone-number/Example.pm +2 -2
- data/tracks/perl6/exercises/phone-number/PhoneNumber.pm6 +1 -1
- data/tracks/perl6/exercises/phone-number/example.yaml +12 -0
- data/tracks/perl6/exercises/phone-number/phone-number.t +100 -85
- data/tracks/perl6/exercises/space-age/Example.pm +13 -15
- data/tracks/ruby/README.md +22 -10
- data/tracks/ruby/{HINTS.md → exercises/accumulate/HINTS.md} +0 -0
- data/tracks/ruby/exercises/accumulate/accumulate_test.rb +0 -1
- data/tracks/ruby/exercises/acronym/.meta/generator/acronym_cases.rb +1 -1
- data/tracks/ruby/exercises/acronym/acronym_test.rb +1 -2
- data/tracks/ruby/exercises/all-your-base/.meta/generator/all_your_base_cases.rb +1 -1
- data/tracks/ruby/exercises/all-your-base/all_your_base_test.rb +1 -2
- data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
- data/tracks/ruby/exercises/alphametics/.meta/generator/alphametics_cases.rb +1 -1
- data/tracks/ruby/exercises/alphametics/.meta/generator/test_template.erb +1 -2
- data/tracks/ruby/exercises/alphametics/alphametics_test.rb +1 -2
- data/tracks/ruby/exercises/anagram/.meta/generator/anagram_cases.rb +1 -1
- data/tracks/ruby/exercises/anagram/anagram_test.rb +1 -2
- data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
- data/tracks/ruby/exercises/beer-song/.meta/generator/beer_song_cases.rb +1 -1
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
- data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +0 -1
- data/tracks/ruby/exercises/binary-search/binary_search_test.rb +0 -1
- data/tracks/ruby/exercises/binary/.meta/generator/binary_cases.rb +1 -1
- data/tracks/ruby/exercises/binary/binary_test.rb +1 -2
- data/tracks/ruby/exercises/bob/bob_test.rb +0 -1
- data/tracks/ruby/exercises/bowling/.meta/generator/bowling_cases.rb +1 -1
- data/tracks/ruby/exercises/bowling/.meta/generator/test_template.erb +1 -2
- data/tracks/ruby/exercises/bowling/bowling_test.rb +1 -2
- data/tracks/ruby/exercises/bracket-push/.meta/generator/bracket_push_cases.rb +1 -1
- data/tracks/ruby/exercises/bracket-push/bracket_push_test.rb +1 -2
- data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -1
- data/tracks/ruby/exercises/clock/.meta/generator/clock_cases.rb +1 -1
- data/tracks/ruby/exercises/clock/clock_test.rb +1 -2
- data/tracks/ruby/exercises/connect/.meta/generator/connect_cases.rb +1 -1
- data/tracks/ruby/exercises/connect/.meta/generator/test_template.erb +1 -2
- data/tracks/ruby/exercises/connect/connect_test.rb +1 -2
- data/tracks/ruby/exercises/crypto-square/crypto_square_test.rb +0 -1
- data/tracks/ruby/exercises/custom-set/.meta/generator/custom_set_cases.rb +1 -1
- data/tracks/ruby/exercises/custom-set/custom_set_test.rb +1 -2
- data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
- data/tracks/ruby/exercises/difference-of-squares/.meta/generator/difference_of_squares_cases.rb +1 -1
- data/tracks/ruby/exercises/difference-of-squares/difference_of_squares_test.rb +1 -2
- data/tracks/ruby/exercises/dominoes/.meta/generator/dominoes_cases.rb +1 -1
- data/tracks/ruby/exercises/dominoes/.meta/generator/test_template.erb +1 -2
- data/tracks/ruby/exercises/dominoes/dominoes_test.rb +1 -2
- data/tracks/ruby/exercises/etl/.meta/generator/etl_cases.rb +1 -1
- data/tracks/ruby/exercises/etl/etl_test.rb +1 -2
- data/tracks/ruby/exercises/flatten-array/flatten_array_test.rb +0 -1
- data/tracks/ruby/exercises/food-chain/food_chain_test.rb +0 -1
- data/tracks/ruby/exercises/gigasecond/.meta/generator/gigasecond_cases.rb +1 -1
- data/tracks/ruby/exercises/gigasecond/gigasecond_test.rb +1 -2
- data/tracks/ruby/exercises/grade-school/grade_school_test.rb +0 -1
- data/tracks/ruby/exercises/grains/.meta/generator/grains_cases.rb +1 -1
- data/tracks/ruby/exercises/grains/grains_test.rb +1 -2
- data/tracks/ruby/exercises/hamming/.meta/generator/hamming_cases.rb +1 -1
- data/tracks/ruby/exercises/hamming/hamming_test.rb +1 -2
- data/tracks/ruby/exercises/hello-world/.meta/generator/hello_world_cases.rb +1 -1
- data/tracks/ruby/exercises/hello-world/.meta/generator/test_template.erb +1 -1
- data/tracks/ruby/exercises/hello-world/hello_world_test.rb +1 -1
- data/tracks/ruby/exercises/hexadecimal/hexadecimal_test.rb +0 -1
- data/tracks/ruby/exercises/house/house_test.rb +0 -1
- data/tracks/ruby/exercises/isogram/.meta/generator/isogram_cases.rb +1 -1
- data/tracks/ruby/exercises/isogram/isogram_test.rb +1 -2
- data/tracks/ruby/exercises/kindergarten-garden/kindergarten_garden_test.rb +0 -1
- data/tracks/ruby/exercises/largest-series-product/.meta/generator/largest_series_product_cases.rb +1 -1
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +1 -2
- data/tracks/ruby/exercises/leap/.meta/generator/leap_cases.rb +1 -1
- data/tracks/ruby/exercises/leap/.meta/generator/test_template.erb +1 -2
- data/tracks/ruby/exercises/leap/leap_test.rb +1 -2
- data/tracks/ruby/exercises/linked-list/linked_list_test.rb +0 -1
- data/tracks/ruby/exercises/list-ops/list_ops_test.rb +0 -1
- data/tracks/ruby/exercises/luhn/.meta/generator/luhn_cases.rb +1 -1
- data/tracks/ruby/exercises/luhn/luhn_test.rb +1 -2
- data/tracks/ruby/exercises/matrix/matrix_test.rb +0 -1
- data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
- data/tracks/ruby/exercises/minesweeper/minesweeper_test.rb +0 -1
- data/tracks/ruby/exercises/nth-prime/.meta/generator/nth_prime_cases.rb +1 -1
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +1 -2
- data/tracks/ruby/exercises/nucleotide-count/nucleotide_count_test.rb +0 -1
- data/tracks/ruby/exercises/ocr-numbers/.meta/generator/ocr_numbers_cases.rb +1 -1
- data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
- data/tracks/ruby/exercises/octal/octal_test.rb +0 -1
- data/tracks/ruby/exercises/palindrome-products/palindrome_products_test.rb +0 -1
- data/tracks/ruby/exercises/pangram/.meta/generator/pangram_cases.rb +1 -1
- data/tracks/ruby/exercises/pangram/pangram_test.rb +1 -2
- data/tracks/ruby/exercises/pascals-triangle/pascals_triangle_test.rb +0 -1
- data/tracks/ruby/exercises/perfect-numbers/perfect_numbers_test.rb +0 -1
- data/tracks/ruby/exercises/phone-number/.meta/.version +1 -0
- data/tracks/ruby/exercises/phone-number/.meta/generator/phone_number_cases.rb +7 -0
- data/tracks/ruby/exercises/phone-number/example.rb +21 -37
- data/tracks/ruby/exercises/phone-number/phone_number_test.rb +47 -43
- data/tracks/ruby/exercises/pig-latin/.meta/generator/pig_latin_cases.rb +1 -1
- data/tracks/ruby/exercises/pig-latin/pig_latin_test.rb +1 -2
- data/tracks/ruby/exercises/point-mutations/point_mutations_test.rb +0 -1
- data/tracks/ruby/exercises/poker/poker_test.rb +0 -1
- data/tracks/ruby/exercises/prime-factors/prime_factors_test.rb +0 -1
- data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
- data/tracks/ruby/exercises/proverb/proverb_test.rb +0 -1
- data/tracks/ruby/exercises/pythagorean-triplet/pythagorean_triplet_test.rb +0 -1
- data/tracks/ruby/exercises/queen-attack/.meta/generator/queen_attack_cases.rb +1 -1
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +1 -2
- data/tracks/ruby/exercises/rail-fence-cipher/rail_fence_cipher_test.rb +0 -1
- data/tracks/ruby/exercises/raindrops/.meta/generator/raindrops_cases.rb +1 -1
- data/tracks/ruby/exercises/raindrops/raindrops_test.rb +1 -2
- data/tracks/ruby/exercises/rna-transcription/.meta/generator/rna_transcription_cases.rb +1 -1
- data/tracks/ruby/exercises/rna-transcription/rna_transcription_test.rb +1 -2
- data/tracks/ruby/exercises/robot-name/robot_name_test.rb +0 -1
- data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +0 -1
- data/tracks/ruby/exercises/roman-numerals/.meta/generator/roman_numerals_cases.rb +1 -1
- data/tracks/ruby/exercises/roman-numerals/roman_numerals_test.rb +1 -2
- data/tracks/ruby/exercises/run-length-encoding/.meta/generator/run_length_encoding_cases.rb +5 -1
- data/tracks/ruby/exercises/run-length-encoding/run_length_encoding_test.rb +14 -15
- data/tracks/ruby/exercises/saddle-points/saddle_points_test.rb +0 -1
- data/tracks/ruby/exercises/say/.meta/generator/say_cases.rb +1 -1
- data/tracks/ruby/exercises/say/say_test.rb +1 -2
- data/tracks/ruby/exercises/scale-generator/scale_generator_test.rb +0 -1
- data/tracks/ruby/exercises/scrabble-score/scrabble_score_test.rb +0 -1
- data/tracks/ruby/exercises/secret-handshake/secret_handshake_test.rb +0 -1
- data/tracks/ruby/exercises/series/series_test.rb +0 -1
- data/tracks/ruby/exercises/sieve/.meta/generator/sieve_cases.rb +1 -1
- data/tracks/ruby/exercises/sieve/sieve_test.rb +1 -2
- data/tracks/ruby/exercises/simple-cipher/simple_cipher_test.rb +0 -1
- data/tracks/ruby/exercises/space-age/space_age_test.rb +0 -1
- data/tracks/ruby/exercises/strain/strain_test.rb +0 -1
- data/tracks/ruby/exercises/sum-of-multiples/sum_of_multiples_test.rb +0 -1
- data/tracks/ruby/exercises/tournament/.meta/.version +1 -1
- data/tracks/ruby/exercises/tournament/.meta/generator/tournament_cases.rb +1 -1
- data/tracks/ruby/exercises/tournament/example.rb +4 -2
- data/tracks/ruby/exercises/tournament/tournament_test.rb +20 -3
- data/tracks/ruby/exercises/transpose/.meta/generator/transpose_cases.rb +1 -1
- data/tracks/ruby/exercises/transpose/transpose_test.rb +1 -2
- data/tracks/ruby/exercises/triangle/.meta/generator/triangle_cases.rb +1 -1
- data/tracks/ruby/exercises/triangle/triangle_test.rb +1 -2
- data/tracks/ruby/exercises/trinary/trinary_test.rb +0 -1
- data/tracks/ruby/exercises/twelve-days/twelve_days_test.rb +0 -1
- data/tracks/ruby/exercises/two-bucket/.meta/.version +1 -1
- data/tracks/ruby/exercises/two-bucket/.meta/generator/two_bucket_cases.rb +1 -1
- data/tracks/ruby/exercises/two-bucket/example.rb +1 -1
- data/tracks/ruby/exercises/two-bucket/two_bucket_test.rb +18 -3
- data/tracks/ruby/exercises/word-count/.meta/generator/word_count_cases.rb +1 -1
- data/tracks/ruby/exercises/word-count/word_count_test.rb +1 -2
- data/tracks/ruby/exercises/wordy/.meta/generator/wordy_cases.rb +1 -1
- data/tracks/ruby/exercises/wordy/wordy_test.rb +1 -2
- data/tracks/ruby/lib/generator/{exercise_cases.rb → exercise_case.rb} +0 -0
- data/tracks/ruby/lib/generator/exercise_case/assertion.rb +2 -1
- data/tracks/ruby/lib/generator/files/track_files.rb +15 -10
- data/tracks/ruby/lib/generator/template_values.rb +4 -2
- data/tracks/ruby/lib/generator/test_template.erb +1 -2
- data/tracks/ruby/lib/tasks/exercise.rb +9 -1
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/.meta/generator/test_template.erb +0 -1
- data/tracks/ruby/test/fixtures/xruby/exercises/alpha/{example.rb → .meta/solutions/alpha.rb} +0 -0
- data/tracks/ruby/test/fixtures/xruby/exercises/beta/.meta/generator/beta_cases.rb +1 -1
- data/tracks/ruby/test/fixtures/xruby/exercises/beta/example.tt +0 -1
- data/tracks/ruby/test/fixtures/xruby/lib/generator/test_template.erb +0 -1
- data/tracks/ruby/test/generator/exercise_case/assertion_test.rb +6 -0
- data/tracks/ruby/test/generator/{exercise_cases_test.rb → exercise_case_test.rb} +0 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +14 -18
- data/tracks/ruby/test/generator/template_values_test.rb +2 -0
- data/tracks/ruby/test/tasks/exercise_test.rb +6 -0
- data/tracks/ruby/test/tasks/exercise_tests_runner_legacy_test.rb +64 -0
- data/tracks/ruby/test/tasks/exercise_tests_runner_test.rb +2 -2
- 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
|
14
|
+
public void equilateralTrianglesHaveEqualSides() throws TriangleException {
|
15
15
|
Triangle triangle = new Triangle(2, 2, 2);
|
16
16
|
|
17
17
|
assertEquals(TriangleKind.EQUILATERAL, triangle.getKind());
|
data/tracks/perl6/.travis.yml
CHANGED
@@ -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]
|
29
|
-
|
30
|
-
|
31
|
-
|
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>[
|
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.
|
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": "
|
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": "
|
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": "
|
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]
|
8
|
-
|
9
|
-
|
10
|
-
|
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>[
|
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';
|
@@ -1,6 +1,6 @@
|
|
1
|
-
unit module Phone:ver<
|
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> **
|
5
|
+
$number ~~ /^ 1? ( [ <[2..9]> <:Nd> ** 2 ] ** 2 <:Nd> ** 4 ) $/ ?? ~$0 !! Nil;
|
6
6
|
}
|
@@ -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 =
|
8
|
+
my $version = v2;
|
9
9
|
my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
|
10
|
-
plan
|
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
|
-
|
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
|
-
|
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 =
|
39
|
-
|
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
|
-
|
40
|
+
$c-data := from-json q:to/END/;
|
41
|
+
|
42
|
+
{
|
43
|
+
"exercise": "phone-number",
|
44
|
+
"version": "1.1.0",
|
45
|
+
"cases": [
|
46
46
|
{
|
47
|
-
"
|
48
|
-
"
|
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": "
|
52
|
-
"
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
"
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
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
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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) {
|