#!/usr/bin/env perl6 use v6; use Test; use lib my $dir = $?FILE.IO.dirname; use JSON::Fast; my Str:D $exercise := 'WordCount'; my Version:D $version = v2; my Str $module //= $exercise; plan 13; use-ok $module or bail-out; require ::($module); 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; } require ::($module) <&count-words>; my $c-data = from-json $=pod.pop.contents; is-deeply (% = ..&count-words), |. for @($c-data); =head2 Canonical Data =begin code { "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 } }, { "description": "multiple spaces not detected as a word", "property": "countwords", "input": " multiple whitespaces", "expected": { "multiple": 1, "whitespaces": 1 } } ] } =end code unless %*ENV { skip-rest 'exercism tests'; exit; } subtest 'canonical-data' => { (my $c-data-file = "$dir/../../problem-specifications/exercises/{ $dir.IO.resolve.basename }/canonical-data.json".IO.resolve) ~~ :f ?? is-deeply $c-data, EVAL('from-json $c-data-file.slurp'), 'match problem-specifications' !! flunk 'problem-specifications file not found'; } INIT { $module = 'Example' if %*ENV }