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
@@ -1,30 +1,6 @@
1
- use v6;
1
+ unit module Phone:ver<1>;
2
2
 
3
- class X::Phone::Invalid is Exception {
4
- has $.payload;
5
- method message {"'$!payload' is not valid."}
3
+ sub clean-number ($number is copy) is export {
4
+ $number ~~ /<:L>/ ?? return Nil !! $number ~~ s:g/<:!Nd>//;
5
+ $number ~~ /^ 1? (<:Nd> ** 10) $/ ?? ~$0 !! Nil;
6
6
  }
7
-
8
- class Phone is export {
9
- has $.number;
10
-
11
- method new (:$number!) {
12
- my $validated = $number;
13
- $validated ~~ s:g/<:!Decimal_Number>//;
14
- $validated ~~ /^ 1? (\d ** 10) $/ ?? ($validated = ~$0) !! X::Phone::Invalid.new(payload => $number).throw;
15
- self.bless(number => $validated);
16
- }
17
-
18
- method area-code {
19
- $!number ~~ /\d**3/ and return ~$/;
20
- }
21
-
22
- method pretty {
23
- $!number ~~ /
24
- $<area-code> = \d**3
25
- $<central-office-code> = \d**3
26
- $<station-number> = \d**4
27
- / and return "($<area-code>) $<central-office-code>-$<station-number>";
28
- }
29
- }
30
-
@@ -0,0 +1,4 @@
1
+ unit module Phone:ver<1>;
2
+
3
+ sub clean-number ($number) is export {
4
+ }
@@ -1,84 +1,121 @@
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
- use lib $?FILE.IO.dirname;
6
6
 
7
- plan 12;
8
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'Phone';
9
- use-ok $module;
10
- require ::($module) <Phone>;
7
+ my $exercise = 'Phone';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 13;
11
11
 
12
- my %cases;
13
- subtest 'number, area-code and pretty methods', {
14
- plan 3;
15
- ok Phone.can('number'), 'can Phone.number';
16
- ok Phone.can('area-code'), 'can Phone.area-code';
17
- ok Phone.can('pretty'), 'can Phone.pretty';
18
- } or fail 'Missing method(s).';
12
+ use-ok $module or bail-out;
13
+ require ::($module);
19
14
 
20
- for @(%cases<valid>) {
21
- my $phone = Phone.new(number => .<input>);
22
- my $msg = 'for ' ~ .<test>;
23
- is $phone.number, .<number>, "number $msg";
24
- is $phone.area-code, .<area-code>, "area-code $msg";
25
- is $phone.pretty, .<pretty>, "pretty $msg";
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>;
26
20
  }
27
21
 
28
- todo 'Optional Exception Tests' unless %*ENV<EXERCISM>; # Remove this line for invalid input tests
29
- subtest 'Throw exceptions for invalid input', {
30
- plan 5;
31
- throws-like {Phone.new(number => .<input>)}, Exception, .<test> for @(%cases<invalid>);
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;
29
+
30
+ for @(my $c-data.<cases>.[0].<cases>) {
31
+ if .<expected> {
32
+ is clean-number(.<phrase>), |.<expected description>;
33
+ } else {
34
+ nok clean-number(.<phrase>), .<description>;
35
+ }
32
36
  }
33
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
+
34
42
  done-testing;
35
43
 
36
44
  INIT {
37
- %cases := from-json 「
45
+ $c-data := from-json 「
38
46
  {
39
- "valid": [
40
- {
41
- "input": 1234567890,
42
- "number": "1234567890",
43
- "area-code": "123",
44
- "pretty": "(123) 456-7890",
45
- "test": "10 digit integer"
46
- },
47
- {
48
- "input": "+1 (234) 555-6789",
49
- "number": "2345556789",
50
- "area-code": "234",
51
- "pretty": "(234) 555-6789",
52
- "test": "11 digit formatted number"
53
- },
54
- {
55
- "input": "1.379.555.2468",
56
- "number": "3795552468",
57
- "area-code": "379",
58
- "pretty": "(379) 555-2468",
59
- "test": "11 digit number containing separators"
60
- }
61
- ],
62
- "invalid": [
63
- {
64
- "input": "",
65
- "test": "empty input"
66
- },
67
- {
68
- "input": "13579",
69
- "test": "5 digit number"
70
- },
71
- {
72
- "input": "123456789011",
73
- "test": "12 digit number"
74
- },
75
- {
76
- "input": "+2 (468) 555-1379",
77
- "test": "11 digit number not beginning with 1"
78
- },
47
+ "exercise": "phone-number",
48
+ "version": "1.0.2",
49
+ "cases": [
79
50
  {
80
- "input": "phone number",
81
- "test": "not a number"
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
+ ]
82
119
  }
83
120
  ]
84
121
  }
@@ -1,9 +1,11 @@
1
- class Raindrops is export {
2
- method convert (Int:D $num --> Str:D) {
3
- my $str = '';
4
- $str ~= "Pling" if $num % 3 == 0;
5
- $str ~= "Plang" if $num % 5 == 0;
6
- $str ~= "Plong" if $num % 7 == 0;
7
- return $str ?? $str !! $num.Str;
8
- }
1
+ unit module Raindrops:ver<1>;
2
+
3
+ sub convert (Int:D $num --> Str:D) is export {
4
+ my $str = '';
5
+ given $num {
6
+ when * %% 3 {$str ~= 'Pling'; proceed}
7
+ when * %% 5 {$str ~= 'Plang'; proceed}
8
+ when * %% 7 {$str ~= 'Plong'}
9
+ }
10
+ return $str ?? $str !! $num.Str;
9
11
  }
@@ -0,0 +1,4 @@
1
+ unit module Raindrops:ver<1>;
2
+
3
+ sub convert ($num) is export {
4
+ }
@@ -1,28 +1,161 @@
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 23;
7
- my $module = %*ENV<EXERCISM> ?? 'Example' !! 'Raindrops';
8
- use-ok $module;
9
- require ::($module) <Raindrops>;
7
+ my $exercise = 'Raindrops';
8
+ my $version = v1;
9
+ my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
10
+ plan 21;
10
11
 
11
- ok Raindrops.can('convert'), 'Class Raindrops has convert method';
12
+ use-ok $module or bail-out;
13
+ require ::($module);
12
14
 
13
- my @ints = 1, 8, 52;
14
- my @plings = 3, 6, 9, 27;
15
- my @plangs = 5, 10, 25, 3125;
16
- my @plongs = 7, 14, 49;
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 = <&convert> };
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
+ subtest {
32
+ plan 2;
33
+ is .<number>.&convert, |.<expected description>;
34
+ isa-ok .<number>.&convert, Str;
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;
17
43
 
18
- for @ints {
19
- is Raindrops.convert($_), $_, "$_ is not a factor of 3, 5 or 7";
20
- isa-ok Raindrops.convert($_), Str, "$_ gives a string";
44
+ INIT {
45
+ $c-data := from-json
46
+ {
47
+ "exercise": "raindrops",
48
+ "version": "1.0.0",
49
+ "cases": [
50
+ {
51
+ "description": "the sound for 1 is 1",
52
+ "property": "convert",
53
+ "number": 1,
54
+ "expected": "1"
55
+ },
56
+ {
57
+ "description": "the sound for 3 is Pling",
58
+ "property": "convert",
59
+ "number": 3,
60
+ "expected": "Pling"
61
+ },
62
+ {
63
+ "description": "the sound for 5 is Plang",
64
+ "property": "convert",
65
+ "number": 5,
66
+ "expected": "Plang"
67
+ },
68
+ {
69
+ "description": "the sound for 7 is Plong",
70
+ "property": "convert",
71
+ "number": 7,
72
+ "expected": "Plong"
73
+ },
74
+ {
75
+ "description": "the sound for 6 is Pling as it has a factor 3",
76
+ "property": "convert",
77
+ "number": 6,
78
+ "expected": "Pling"
79
+ },
80
+ {
81
+ "description": "2 to the power 3 does not make a raindrop sound as 3 is the exponent not the base",
82
+ "property": "convert",
83
+ "number": 8,
84
+ "expected": "8"
85
+ },
86
+ {
87
+ "description": "the sound for 9 is Pling as it has a factor 3",
88
+ "property": "convert",
89
+ "number": 9,
90
+ "expected": "Pling"
91
+ },
92
+ {
93
+ "description": "the sound for 10 is Plang as it has a factor 5",
94
+ "property": "convert",
95
+ "number": 10,
96
+ "expected": "Plang"
97
+ },
98
+ {
99
+ "description": "the sound for 14 is Plong as it has a factor of 7",
100
+ "property": "convert",
101
+ "number": 14,
102
+ "expected": "Plong"
103
+ },
104
+ {
105
+ "description": "the sound for 15 is PlingPlang as it has factors 3 and 5",
106
+ "property": "convert",
107
+ "number": 15,
108
+ "expected": "PlingPlang"
109
+ },
110
+ {
111
+ "description": "the sound for 21 is PlingPlong as it has factors 3 and 7",
112
+ "property": "convert",
113
+ "number": 21,
114
+ "expected": "PlingPlong"
115
+ },
116
+ {
117
+ "description": "the sound for 25 is Plang as it has a factor 5",
118
+ "property": "convert",
119
+ "number": 25,
120
+ "expected": "Plang"
121
+ },
122
+ {
123
+ "description": "the sound for 27 is Pling as it has a factor 3",
124
+ "property": "convert",
125
+ "number": 27,
126
+ "expected": "Pling"
127
+ },
128
+ {
129
+ "description": "the sound for 35 is PlangPlong as it has factors 5 and 7",
130
+ "property": "convert",
131
+ "number": 35,
132
+ "expected": "PlangPlong"
133
+ },
134
+ {
135
+ "description": "the sound for 49 is Plong as it has a factor 7",
136
+ "property": "convert",
137
+ "number": 49,
138
+ "expected": "Plong"
139
+ },
140
+ {
141
+ "description": "the sound for 52 is 52",
142
+ "property": "convert",
143
+ "number": 52,
144
+ "expected": "52"
145
+ },
146
+ {
147
+ "description": "the sound for 105 is PlingPlangPlong as it has factors 3, 5 and 7",
148
+ "property": "convert",
149
+ "number": 105,
150
+ "expected": "PlingPlangPlong"
151
+ },
152
+ {
153
+ "description": "the sound for 3125 is Plang as it has a factor 5",
154
+ "property": "convert",
155
+ "number": 3125,
156
+ "expected": "Plang"
157
+ }
158
+ ]
159
+ }
160
+
21
161
  }
22
- is Raindrops.convert($_), 'Pling', "$_ is a factor of 3, not 5 or 7" for @plings;
23
- is Raindrops.convert($_), 'Plang', "$_ is a factor of 5, not 3 or 7" for @plangs;
24
- is Raindrops.convert($_), 'Plong', "$_ is a factor of 7, not 3 or 5" for @plongs;
25
- is Raindrops.convert(15), 'PlingPlang', '15 is a factor of 3 and 5, not 7';
26
- is Raindrops.convert(21), 'PlingPlong', '21 is a factor of 3 and 7, not 5';
27
- is Raindrops.convert(35), 'PlangPlong', '35 is a factor of 5 and 7, not 3';
28
- is Raindrops.convert(105), 'PlingPlangPlong', '105 is a factor of 3, 5 and 7';
@@ -1,8 +1,6 @@
1
- class RNA_Transcription is export {
2
- method to_rna ($dna) {
3
- $dna.trans( 'A' => 'U',
4
- 'G' => 'C',
5
- 'C' => 'G',
6
- 'T' => 'A');
7
- }
1
+ unit module RNA:ver<1>;
2
+
3
+ sub to-rna ($dna) is export {
4
+ fail if $dna ~~ /<-[AGCT]>/;
5
+ $dna.trans(<A G C T> => <U C G A>);
8
6
  }