tracks/perl6/exercises/word-count/word-count.t in trackler-2.0.8.28 vs tracks/perl6/exercises/word-count/word-count.t in trackler-2.0.8.29
- old
+ new
@@ -1,24 +1,157 @@
#!/usr/bin/env perl6
use v6;
use Test;
-use lib IO::Path.new($?FILE).parent.path;
+use lib my $dir = $?FILE.IO.dirname;
+use JSON::Tiny;
-plan 8;
-my $module = %*ENV<EXERCISM> ?? 'Example' !! 'Word_Counter';
-use-ok $module;
-require ::($module) <Word_Counter>;
+my $exercise = 'WordCount';
+my $version = v1;
+my $module = %*ENV<EXERCISM> ?? 'Example' !! $exercise;
+plan 13;
-ok Word_Counter.can('count_words'), 'Class Word_Counter has count_words method';
+use-ok $module or bail-out;
+require ::($module);
-is-deeply Word_Counter.count_words('word'), {word => 1}, 'one word';
-is-deeply Word_Counter.count_words('one of each'), {one => 1, of => 1, each => 1}, 'one of each';
-is-deeply Word_Counter.count_words('one fish two fish red fish blue fish'),
- {one => 1, fish => 4, two => 1, red => 1, blue => 1},
- 'multiple occurences';
-is-deeply Word_Counter.count_words('car : carpet as java : javascript!!&@$%^&'),
- {car => 1, carpet => 1, as => 1, java => 1, javascript => 1},
- 'ignore punctuation';
-is-deeply Word_Counter.count_words('testing, 1, 2 testing'), {testing => 2, 1 => 1, 2 => 1}, 'include numbers';
-is-deeply Word_Counter.count_words('go Go GO'), {go => 3}, 'normalize case';
+if ::($exercise).^ver !~~ $version {
+ warn "\nExercise version mismatch. Further tests may fail!"
+ ~ "\n$exercise is $(::($exercise).^ver.gist). "
+ ~ "Test is $($version.gist).\n";
+ bail-out 'Example version must match test version.' if %*ENV<EXERCISM>;
+}
+my @subs;
+BEGIN { @subs = <&count-words> };
+subtest 'Subroutine(s)', {
+ plan 1;
+ eval-lives-ok "use $module; ::('$_').defined or die '$_ is not defined.'", $_ for @subs;
+} or bail-out 'All subroutines must be defined and exported.';
+require ::($module) @subs.eager;
+is-deeply (% = .<input>.&count-words), |.<expected description> for @(my $c-data.<cases>);
+
+if %*ENV<EXERCISM> && (my $c-data-file = "$dir/../../x-common/exercises/{$dir.IO.basename}/canonical-data.json".IO.resolve) ~~ :f {
+ is-deeply $c-data, from-json($c-data-file.slurp), 'canonical-data'
+} else { skip }
+
+done-testing;
+
+INIT {
+ $c-data := from-json 「
+ {
+ "exercise": "word-count",
+ "version": "1.0.0",
+ "comments": [
+ "For each word in the input, count the number of times it appears in the",
+ "entire sentence."
+ ],
+ "cases": [
+ {
+ "description": "count one word",
+ "property": "countwords",
+ "input": "word",
+ "expected": {
+ "word": 1
+ }
+ },
+ {
+ "description": "count one of each word",
+ "property": "countwords",
+ "input": "one of each",
+ "expected": {
+ "one": 1,
+ "of": 1,
+ "each": 1
+ }
+ },
+ {
+ "description": "multiple occurrences of a word",
+ "property": "countwords",
+ "input": "one fish two fish red fish blue fish",
+ "expected": {
+ "one": 1,
+ "fish": 4,
+ "two": 1,
+ "red": 1,
+ "blue": 1
+ }
+ },
+ {
+ "description": "handles cramped lists",
+ "property": "countwords",
+ "input": "one,two,three",
+ "expected": {
+ "one": 1,
+ "two": 1,
+ "three": 1
+ }
+ },
+ {
+ "description": "handles expanded lists",
+ "property": "countwords",
+ "input": "one,\ntwo,\nthree",
+ "expected": {
+ "one": 1,
+ "two": 1,
+ "three": 1
+ }
+ },
+ {
+ "description": "ignore punctuation",
+ "property": "countwords",
+ "input": "car: carpet as java: javascript!!&@$%^&",
+ "expected": {
+ "car": 1,
+ "carpet": 1,
+ "as": 1,
+ "java": 1,
+ "javascript": 1
+ }
+ },
+ {
+ "description": "include numbers",
+ "property": "countwords",
+ "input": "testing, 1, 2 testing",
+ "expected": {
+ "testing": 2,
+ "1": 1,
+ "2": 1
+ }
+ },
+ {
+ "description": "normalize case",
+ "property": "countwords",
+ "input": "go Go GO Stop stop",
+ "expected": {
+ "go": 3,
+ "stop": 2
+ }
+ },
+ {
+ "description": "with apostrophes",
+ "property": "countwords",
+ "input": "First: don't laugh. Then: don't cry.",
+ "expected": {
+ "first": 1,
+ "don't": 2,
+ "laugh": 1,
+ "then": 1,
+ "cry": 1
+ }
+ },
+ {
+ "description": "with quotations",
+ "property": "countwords",
+ "input": "Joe can't tell between 'large' and large.",
+ "expected": {
+ "joe": 1,
+ "can't": 1,
+ "tell": 1,
+ "between": 1,
+ "large": 2,
+ "and": 1
+ }
+ }
+ ]
+ }
+ 」
+}