trackler 2.2.1.59 → 2.2.1.60
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/problem-specifications/exercises/food-chain/canonical-data.json +31 -23
- data/problem-specifications/exercises/house/canonical-data.json +45 -33
- data/problem-specifications/exercises/house/description.md +1 -1
- data/problem-specifications/exercises/kindergarten-garden/description.md +3 -3
- data/problem-specifications/exercises/nucleotide-count/description.md +2 -2
- data/problem-specifications/exercises/palindrome-products/description.md +1 -1
- data/problem-specifications/exercises/rectangles/description.md +9 -9
- data/problem-specifications/exercises/twelve-days/canonical-data.json +171 -0
- data/problem-specifications/exercises/two-bucket/description.md +7 -7
- data/tracks/c/docs/CONTRIBUTING.md +88 -39
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +33 -29
- data/tracks/c/exercises/triangle/src/example.c +12 -12
- data/tracks/c/exercises/triangle/src/example.h +3 -3
- data/tracks/c/exercises/triangle/test/test_triangle.c +16 -16
- data/tracks/c/exercises/word-count/src/example.c +12 -3
- data/tracks/c/exercises/word-count/src/word_count.h +10 -5
- data/tracks/c/exercises/word-count/test/test_word_count.c +248 -58
- data/tracks/ceylon/exercises/hamming/source/hamming/HammingTest.ceylon +3 -3
- data/tracks/ceylon/exercises/leap/source/leap/LeapTest.ceylon +2 -2
- data/tracks/dart/exercises/phone-number/README.md +1 -1
- data/tracks/dart/exercises/phone-number/test/phone_number_test.dart +5 -5
- data/tracks/gnu-apl/.dockerignore +5 -0
- data/tracks/gnu-apl/.travis.yml +9 -4
- data/tracks/gnu-apl/Dockerfiles/release.dockerfile +15 -0
- data/tracks/gnu-apl/Dockerfiles/svn.dockerfile +22 -0
- data/tracks/gnu-apl/README.md +1 -1
- data/tracks/gnu-apl/bin/install-apl +26 -0
- data/tracks/gnu-apl/test.apl +7 -6
- data/tracks/go/docs/TESTS.md +1 -1
- data/tracks/haskell/.travis.yml +1 -1
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/package.yaml +1 -1
- data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
- data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/examples/success-standard/src/Alphametics.hs +2 -1
- data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
- data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary/stack.yaml +1 -1
- data/tracks/haskell/exercises/bob/stack.yaml +1 -1
- data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
- data/tracks/haskell/exercises/change/stack.yaml +1 -1
- data/tracks/haskell/exercises/clock/stack.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
- data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/connect/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/test/Tests.hs +9 -5
- data/tracks/haskell/exercises/custom-set/package.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/README.md +3 -3
- data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
- data/tracks/haskell/exercises/etl/stack.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
- data/tracks/haskell/exercises/forth/stack.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
- data/tracks/haskell/exercises/grains/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/package.yaml +1 -1
- data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/test/Tests.hs +4 -4
- data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
- data/tracks/haskell/exercises/house/README.md +1 -1
- data/tracks/haskell/exercises/house/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/README.md +96 -0
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +10 -0
- data/tracks/haskell/exercises/isbn-verifier/package.yaml +20 -0
- data/tracks/haskell/exercises/isbn-verifier/src/IsbnVerifier.hs +4 -0
- data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -0
- data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +74 -0
- data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/README.md +3 -3
- data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/package.yaml +1 -1
- data/tracks/haskell/exercises/leap/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
- data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/package.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/README.md +2 -2
- data/tracks/haskell/exercises/nucleotide-count/package.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/test/Tests.hs +6 -0
- data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/octal/stack.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/README.md +1 -1
- data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/package.yaml +1 -1
- data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/test/Tests.hs +6 -2
- data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/README.md +1 -1
- data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
- data/tracks/haskell/exercises/pov/stack.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
- data/tracks/haskell/exercises/say/stack.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
- data/tracks/haskell/exercises/series/stack.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
- data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
- data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/strain/stack.yaml +1 -1
- data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
- data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
- data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/wordy/examples/success-standard/src/WordProblem.hs +6 -5
- data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/package.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
- data/tracks/haskell/exercises/zipper/README.md +1 -1
- data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
- data/tracks/javascript/.eslintignore +43 -0
- data/tracks/javascript/.travis.yml +2 -1
- data/tracks/javascript/exercises/bowling/README.md +5 -5
- data/tracks/javascript/exercises/crypto-square/example.js +2 -1
- data/tracks/javascript/exercises/diffie-hellman/diffie-hellman.spec.js +20 -20
- data/tracks/javascript/exercises/diffie-hellman/example.js +10 -10
- data/tracks/javascript/exercises/largest-series-product/example.js +2 -1
- data/tracks/javascript/exercises/sieve/example.js +5 -2
- data/tracks/javascript/package-lock.json +129 -76
- data/tracks/javascript/package.json +6 -5
- data/tracks/ocaml/config.json +10 -0
- data/tracks/ocaml/exercises/hamming/test.ml +3 -3
- data/tracks/ocaml/exercises/leap/test.ml +2 -2
- data/tracks/ocaml/exercises/pangram/test.ml +3 -3
- data/tracks/ocaml/exercises/rectangles/.merlin +5 -0
- data/tracks/ocaml/exercises/rectangles/Makefile +11 -0
- data/tracks/ocaml/exercises/rectangles/example.ml +30 -0
- data/tracks/ocaml/exercises/rectangles/rectangles.mli +1 -0
- data/tracks/ocaml/exercises/rectangles/test.ml +72 -0
- data/tracks/ocaml/tools/test-generator/templates/ocaml/leap/test.ml +1 -1
- data/tracks/ocaml/tools/test-generator/templates/ocaml/rectangles/test.ml +15 -0
- data/tracks/pony/README.md +1 -1
- data/tracks/pony/exercises/atbash-cipher/example.pony +6 -10
- data/tracks/pony/exercises/difference-of-squares/example.pony +3 -7
- data/tracks/rust/_test/count-ignores.sh +2 -2
- data/tracks/rust/config.json +24 -0
- data/tracks/rust/config/maintainers.json +10 -0
- data/tracks/rust/exercises/acronym/README.md +0 -1
- data/tracks/rust/exercises/all-your-base/README.md +1 -1
- data/tracks/rust/exercises/allergies/README.md +0 -1
- data/tracks/rust/exercises/alphametics/README.md +2 -2
- data/tracks/rust/exercises/atbash-cipher/README.md +2 -1
- data/tracks/rust/exercises/beer-song/README.md +1 -1
- data/tracks/rust/exercises/bowling/README.md +20 -6
- data/tracks/rust/exercises/circular-buffer/README.md +13 -6
- data/tracks/rust/exercises/crypto-square/README.md +10 -8
- data/tracks/rust/exercises/dominoes/Cargo.toml +1 -1
- data/tracks/rust/exercises/etl/README.md +2 -0
- data/tracks/rust/exercises/grade-school/README.md +0 -1
- data/tracks/rust/exercises/grains/README.md +0 -1
- data/tracks/rust/exercises/isbn-verifier/Cargo.lock +4 -0
- data/tracks/rust/exercises/isbn-verifier/Cargo.toml +3 -0
- data/tracks/rust/exercises/isbn-verifier/README.md +74 -0
- data/tracks/rust/exercises/isbn-verifier/example.rs +44 -0
- data/tracks/rust/exercises/isbn-verifier/src/lib.rs +4 -0
- data/tracks/rust/exercises/isbn-verifier/tests/isbn-verifier.rs +83 -0
- data/tracks/rust/exercises/isogram/README.md +3 -2
- data/tracks/rust/exercises/leap/README.md +1 -1
- data/tracks/rust/exercises/luhn/README.md +7 -7
- data/tracks/rust/exercises/nucleotide-count/README.md +8 -22
- data/tracks/rust/exercises/ocr-numbers/README.md +5 -5
- data/tracks/rust/exercises/pangram/README.md +1 -1
- data/tracks/rust/exercises/pascals-triangle/README.md +1 -1
- data/tracks/rust/exercises/perfect-numbers/README.md +2 -2
- data/tracks/rust/exercises/phone-number/README.md +3 -2
- data/tracks/rust/exercises/protein-translation/README.md +4 -5
- data/tracks/rust/exercises/proverb/README.md +13 -11
- data/tracks/rust/exercises/proverb/example.rs +14 -15
- data/tracks/rust/exercises/proverb/tests/proverb.rs +40 -13
- data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -3
- data/tracks/rust/exercises/queen-attack/README.md +1 -1
- data/tracks/rust/exercises/rectangles/README.md +7 -7
- data/tracks/rust/exercises/roman-numerals/README.md +1 -1
- data/tracks/rust/exercises/rotational-cipher/README.md +2 -1
- data/tracks/rust/exercises/run-length-encoding/README.md +4 -4
- data/tracks/rust/exercises/scrabble-score/README.md +3 -1
- data/tracks/rust/exercises/space-age/README.md +1 -1
- data/tracks/rust/exercises/tournament/README.md +5 -5
- data/tracks/rust/exercises/triangle/README.md +9 -6
- data/tracks/rust/exercises/two-bucket/Cargo.lock +4 -0
- data/tracks/rust/exercises/two-bucket/Cargo.toml +3 -0
- data/tracks/rust/exercises/two-bucket/README.md +69 -0
- data/tracks/rust/exercises/two-bucket/example.rs +129 -0
- data/tracks/rust/exercises/two-bucket/src/lib.rs +26 -0
- data/tracks/rust/exercises/two-bucket/tests/two-bucket.rs +68 -0
- data/tracks/rust/exercises/variable-length-quantity/README.md +6 -7
- data/tracks/rust/exercises/word-count/README.md +1 -2
- data/tracks/rust/exercises/wordy/README.md +0 -5
- metadata +33 -4
- data/tracks/go/.github/PULL_REQUEST_TEMPLATE.md +0 -23
- data/tracks/ruby/.github/PULL_REQUEST_TEMPLATE.md +0 -40
@@ -20,7 +20,7 @@ static int word_match(char *testWord, int current_word_count,
|
|
20
20
|
return match_index;
|
21
21
|
}
|
22
22
|
|
23
|
-
int word_count(char *input_text, word_count_word_t words
|
23
|
+
int word_count(const char *input_text, word_count_word_t * words)
|
24
24
|
{
|
25
25
|
int index;
|
26
26
|
int unique_words = 0;
|
@@ -36,7 +36,7 @@ int word_count(char *input_text, word_count_word_t words[MAX_WORDS])
|
|
36
36
|
lower_case_input_text[index] = '\0';
|
37
37
|
|
38
38
|
// start with known results...
|
39
|
-
memset(words, 0, sizeof(word_count_word_t));
|
39
|
+
memset(words, 0, sizeof(word_count_word_t) * MAX_WORDS);
|
40
40
|
|
41
41
|
test_word = strtok(lower_case_input_text, delimiters);
|
42
42
|
while (test_word != NULL) {
|
@@ -50,8 +50,17 @@ int word_count(char *input_text, word_count_word_t words[MAX_WORDS])
|
|
50
50
|
|
51
51
|
// add if not yet counted else increment count.
|
52
52
|
if (-1 == index) {
|
53
|
+
// reject anything that would overrun buffers
|
54
|
+
if (MAX_WORD_LENGTH < strlen(test_word)) {
|
55
|
+
unique_words = EXCESSIVE_LENGTH_WORD;
|
56
|
+
break;
|
57
|
+
}
|
58
|
+
if (MAX_WORDS == unique_words) {
|
59
|
+
unique_words = EXCESSIVE_NUMBER_OF_WORDS;
|
60
|
+
break;
|
61
|
+
}
|
53
62
|
words[unique_words].count = 1;
|
54
|
-
|
63
|
+
strncpy(words[unique_words].text, test_word, MAX_WORD_LENGTH);
|
55
64
|
unique_words++;
|
56
65
|
} else {
|
57
66
|
words[index].count++;
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#ifndef WORD_COUNT_H
|
2
2
|
#define WORD_COUNT_H
|
3
3
|
|
4
|
-
#define MAX_WORDS 20 // at most MAX_WORDS
|
5
|
-
#define MAX_WORD_LENGTH 50 // no individual word
|
4
|
+
#define MAX_WORDS 20 // at most MAX_WORDS can be found in the test input string
|
5
|
+
#define MAX_WORD_LENGTH 50 // no individual word can exceed this length
|
6
6
|
|
7
7
|
// results structure
|
8
8
|
typedef struct word_count_word {
|
@@ -10,13 +10,18 @@ typedef struct word_count_word {
|
|
10
10
|
int count;
|
11
11
|
} word_count_word_t;
|
12
12
|
|
13
|
+
#define EXCESSIVE_LENGTH_WORD -1
|
14
|
+
#define EXCESSIVE_NUMBER_OF_WORDS -2
|
15
|
+
|
13
16
|
// word_count - routine to classify the unique words and their frequency in a test input string
|
14
17
|
// inputs:
|
15
|
-
// input_text =
|
16
|
-
// words = allocated structure to record the words fourn and their frequency
|
18
|
+
// input_text = a null-terminated string containing that is analyzed
|
17
19
|
//
|
18
20
|
// outputs:
|
21
|
+
// words = allocated structure to record the words found and their frequency
|
19
22
|
// uniqueWords - number of words in the words structure
|
20
|
-
|
23
|
+
// returns a negative number if an error.
|
24
|
+
// words will contain the results up to that point.
|
25
|
+
int word_count(const char *input_text, word_count_word_t * words);
|
21
26
|
|
22
27
|
#endif
|
@@ -5,7 +5,7 @@
|
|
5
5
|
#include "../src/word_count.h"
|
6
6
|
|
7
7
|
word_count_word_t actual_solution[MAX_WORDS];
|
8
|
-
|
8
|
+
word_count_word_t expected_solution[MAX_WORDS];
|
9
9
|
void setUp(void)
|
10
10
|
{
|
11
11
|
}
|
@@ -14,28 +14,24 @@ void tearDown(void)
|
|
14
14
|
{
|
15
15
|
}
|
16
16
|
|
17
|
-
static void
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
static void check_solution(word_count_word_t * expected_solution,
|
18
|
+
int expected_word_count,
|
19
|
+
word_count_word_t * actual_solution,
|
20
|
+
int actual_word_count)
|
21
21
|
{
|
22
22
|
// All words counted?
|
23
23
|
TEST_ASSERT_EQUAL(expected_word_count, actual_word_count);
|
24
24
|
|
25
25
|
// now test the word count for the words...
|
26
|
-
for (int index = 0; index <
|
26
|
+
for (int index = 0; index < MAX_WORDS; index++) {
|
27
27
|
TEST_ASSERT_EQUAL(expected_solution[index].count,
|
28
28
|
actual_solution[index].count);
|
29
|
-
|
30
|
-
|
29
|
+
TEST_ASSERT_EQUAL_UINT8_ARRAY(expected_solution[index].text,
|
30
|
+
actual_solution[index].text,
|
31
|
+
MAX_WORD_LENGTH);
|
31
32
|
}
|
32
33
|
}
|
33
34
|
|
34
|
-
static void reset_actual_solution(void)
|
35
|
-
{
|
36
|
-
memset(actual_solution, 0, sizeof(actual_solution));
|
37
|
-
}
|
38
|
-
|
39
35
|
// Tests Start here
|
40
36
|
void test_word_count_one_word(void)
|
41
37
|
{
|
@@ -43,7 +39,6 @@ void test_word_count_one_word(void)
|
|
43
39
|
int actual_word_count;
|
44
40
|
char *input_text = "word";
|
45
41
|
const int expected_word_count = 1;
|
46
|
-
word_count_word_t expected_solution[expected_word_count];
|
47
42
|
|
48
43
|
// build the expected solution
|
49
44
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -52,12 +47,10 @@ void test_word_count_one_word(void)
|
|
52
47
|
expected_solution[index].count = 1;
|
53
48
|
strncpy(expected_solution[index++].text, "word", MAX_WORD_LENGTH);
|
54
49
|
|
55
|
-
reset_actual_solution();
|
56
|
-
|
57
50
|
actual_word_count = word_count(input_text, actual_solution);
|
58
51
|
|
59
|
-
|
60
|
-
|
52
|
+
check_solution(expected_solution,
|
53
|
+
expected_word_count, actual_solution, actual_word_count);
|
61
54
|
}
|
62
55
|
|
63
56
|
void test_word_count_one_of_each_word(void)
|
@@ -67,7 +60,6 @@ void test_word_count_one_of_each_word(void)
|
|
67
60
|
int actual_word_count;
|
68
61
|
char *input_text = "one of each";
|
69
62
|
const int expected_word_count = 3;
|
70
|
-
word_count_word_t expected_solution[expected_word_count];
|
71
63
|
|
72
64
|
// build the expected solution
|
73
65
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -82,11 +74,10 @@ void test_word_count_one_of_each_word(void)
|
|
82
74
|
expected_solution[index].count = 1;
|
83
75
|
strncpy(expected_solution[index++].text, "each", MAX_WORD_LENGTH);
|
84
76
|
|
85
|
-
reset_actual_solution();
|
86
77
|
actual_word_count = word_count(input_text, actual_solution);
|
87
78
|
|
88
|
-
|
89
|
-
|
79
|
+
check_solution(expected_solution,
|
80
|
+
expected_word_count, actual_solution, actual_word_count);
|
90
81
|
}
|
91
82
|
|
92
83
|
void test_word_count_multiple_occurrences_of_a_word(void)
|
@@ -96,7 +87,6 @@ void test_word_count_multiple_occurrences_of_a_word(void)
|
|
96
87
|
int actual_word_count;
|
97
88
|
char *input_text = "one fish two fish red fish blue fish";
|
98
89
|
const int expected_word_count = 5;
|
99
|
-
word_count_word_t expected_solution[expected_word_count];
|
100
90
|
|
101
91
|
// build the expected solution
|
102
92
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -116,11 +106,10 @@ void test_word_count_multiple_occurrences_of_a_word(void)
|
|
116
106
|
expected_solution[index].count = 1;
|
117
107
|
strncpy(expected_solution[index++].text, "blue", MAX_WORD_LENGTH);
|
118
108
|
|
119
|
-
reset_actual_solution();
|
120
109
|
actual_word_count = word_count(input_text, actual_solution);
|
121
110
|
|
122
|
-
|
123
|
-
|
111
|
+
check_solution(expected_solution,
|
112
|
+
expected_word_count, actual_solution, actual_word_count);
|
124
113
|
}
|
125
114
|
|
126
115
|
void test_word_count_handles_cramped_lists(void)
|
@@ -130,7 +119,6 @@ void test_word_count_handles_cramped_lists(void)
|
|
130
119
|
int actual_word_count;
|
131
120
|
char *input_text = "one,two,three";
|
132
121
|
const int expected_word_count = 3;
|
133
|
-
word_count_word_t expected_solution[expected_word_count];
|
134
122
|
|
135
123
|
// build the expected solution
|
136
124
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -144,11 +132,10 @@ void test_word_count_handles_cramped_lists(void)
|
|
144
132
|
expected_solution[index].count = 1;
|
145
133
|
strncpy(expected_solution[index++].text, "three", MAX_WORD_LENGTH);
|
146
134
|
|
147
|
-
reset_actual_solution();
|
148
135
|
actual_word_count = word_count(input_text, actual_solution);
|
149
136
|
|
150
|
-
|
151
|
-
|
137
|
+
check_solution(expected_solution,
|
138
|
+
expected_word_count, actual_solution, actual_word_count);
|
152
139
|
}
|
153
140
|
|
154
141
|
void test_word_count_handles_expanded_lists(void)
|
@@ -158,7 +145,6 @@ void test_word_count_handles_expanded_lists(void)
|
|
158
145
|
int actual_word_count;
|
159
146
|
char *input_text = "one,\ntwo,\nthree";
|
160
147
|
const int expected_word_count = 3;
|
161
|
-
word_count_word_t expected_solution[expected_word_count];
|
162
148
|
|
163
149
|
// build the expected solution
|
164
150
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -172,11 +158,10 @@ void test_word_count_handles_expanded_lists(void)
|
|
172
158
|
expected_solution[index].count = 1;
|
173
159
|
strncpy(expected_solution[index++].text, "three", MAX_WORD_LENGTH);
|
174
160
|
|
175
|
-
reset_actual_solution();
|
176
161
|
actual_word_count = word_count(input_text, actual_solution);
|
177
162
|
|
178
|
-
|
179
|
-
|
163
|
+
check_solution(expected_solution,
|
164
|
+
expected_word_count, actual_solution, actual_word_count);
|
180
165
|
}
|
181
166
|
|
182
167
|
void test_word_count_ignore_punctuation(void)
|
@@ -186,7 +171,6 @@ void test_word_count_ignore_punctuation(void)
|
|
186
171
|
int actual_word_count;
|
187
172
|
char *input_text = "car: carpet as java: javascript!!&@$%^&";
|
188
173
|
const int expected_word_count = 5;
|
189
|
-
word_count_word_t expected_solution[expected_word_count];
|
190
174
|
|
191
175
|
// build the expected solution
|
192
176
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -206,11 +190,10 @@ void test_word_count_ignore_punctuation(void)
|
|
206
190
|
expected_solution[index].count = 1;
|
207
191
|
strncpy(expected_solution[index++].text, "javascript", MAX_WORD_LENGTH);
|
208
192
|
|
209
|
-
reset_actual_solution();
|
210
193
|
actual_word_count = word_count(input_text, actual_solution);
|
211
194
|
|
212
|
-
|
213
|
-
|
195
|
+
check_solution(expected_solution,
|
196
|
+
expected_word_count, actual_solution, actual_word_count);
|
214
197
|
}
|
215
198
|
|
216
199
|
void test_word_count_include_numbers(void)
|
@@ -220,7 +203,6 @@ void test_word_count_include_numbers(void)
|
|
220
203
|
int actual_word_count;
|
221
204
|
char *input_text = "testing, 1, 2 testing";
|
222
205
|
const int expected_word_count = 3;
|
223
|
-
word_count_word_t expected_solution[expected_word_count];
|
224
206
|
|
225
207
|
// build the expected solution
|
226
208
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -234,11 +216,10 @@ void test_word_count_include_numbers(void)
|
|
234
216
|
expected_solution[index].count = 1;
|
235
217
|
strncpy(expected_solution[index++].text, "2", MAX_WORD_LENGTH);
|
236
218
|
|
237
|
-
reset_actual_solution();
|
238
219
|
actual_word_count = word_count(input_text, actual_solution);
|
239
220
|
|
240
|
-
|
241
|
-
|
221
|
+
check_solution(expected_solution,
|
222
|
+
expected_word_count, actual_solution, actual_word_count);
|
242
223
|
}
|
243
224
|
|
244
225
|
void test_word_count_normalize_case(void)
|
@@ -248,7 +229,6 @@ void test_word_count_normalize_case(void)
|
|
248
229
|
int actual_word_count;
|
249
230
|
char *input_text = "go Go GO Stop stop";
|
250
231
|
const int expected_word_count = 2;
|
251
|
-
word_count_word_t expected_solution[expected_word_count];
|
252
232
|
|
253
233
|
// build the expected solution
|
254
234
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -259,11 +239,10 @@ void test_word_count_normalize_case(void)
|
|
259
239
|
expected_solution[index].count = 2;
|
260
240
|
strncpy(expected_solution[index++].text, "stop", MAX_WORD_LENGTH);
|
261
241
|
|
262
|
-
reset_actual_solution();
|
263
242
|
actual_word_count = word_count(input_text, actual_solution);
|
264
243
|
|
265
|
-
|
266
|
-
|
244
|
+
check_solution(expected_solution,
|
245
|
+
expected_word_count, actual_solution, actual_word_count);
|
267
246
|
}
|
268
247
|
|
269
248
|
void test_word_count_with_apostrophes(void)
|
@@ -273,7 +252,6 @@ void test_word_count_with_apostrophes(void)
|
|
273
252
|
int actual_word_count;
|
274
253
|
char *input_text = "First: don't laugh. Then: don't cry.";
|
275
254
|
const int expected_word_count = 5;
|
276
|
-
word_count_word_t expected_solution[expected_word_count];
|
277
255
|
|
278
256
|
// build the expected solution
|
279
257
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -293,11 +271,10 @@ void test_word_count_with_apostrophes(void)
|
|
293
271
|
expected_solution[index].count = 1;
|
294
272
|
strncpy(expected_solution[index++].text, "cry", MAX_WORD_LENGTH);
|
295
273
|
|
296
|
-
reset_actual_solution();
|
297
274
|
actual_word_count = word_count(input_text, actual_solution);
|
298
275
|
|
299
|
-
|
300
|
-
|
276
|
+
check_solution(expected_solution,
|
277
|
+
expected_word_count, actual_solution, actual_word_count);
|
301
278
|
}
|
302
279
|
|
303
280
|
void test_word_count_with_quotation(void)
|
@@ -307,7 +284,6 @@ void test_word_count_with_quotation(void)
|
|
307
284
|
int actual_word_count;
|
308
285
|
char *input_text = "Joe can't tell between 'large' and large.";
|
309
286
|
const int expected_word_count = 6;
|
310
|
-
word_count_word_t expected_solution[expected_word_count];
|
311
287
|
|
312
288
|
// build the expected solution
|
313
289
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -330,11 +306,10 @@ void test_word_count_with_quotation(void)
|
|
330
306
|
expected_solution[index].count = 1;
|
331
307
|
strncpy(expected_solution[index++].text, "and", MAX_WORD_LENGTH);
|
332
308
|
|
333
|
-
reset_actual_solution();
|
334
309
|
actual_word_count = word_count(input_text, actual_solution);
|
335
310
|
|
336
|
-
|
337
|
-
|
311
|
+
check_solution(expected_solution,
|
312
|
+
expected_word_count, actual_solution, actual_word_count);
|
338
313
|
}
|
339
314
|
|
340
315
|
void test_word_count_from_example(void)
|
@@ -344,7 +319,6 @@ void test_word_count_from_example(void)
|
|
344
319
|
int actual_word_count;
|
345
320
|
char *input_text = "olly olly in come free";
|
346
321
|
const int expected_word_count = 4;
|
347
|
-
word_count_word_t expected_solution[expected_word_count];
|
348
322
|
|
349
323
|
// build the expected solution
|
350
324
|
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
@@ -361,11 +335,223 @@ void test_word_count_from_example(void)
|
|
361
335
|
expected_solution[index].count = 1;
|
362
336
|
strncpy(expected_solution[index++].text, "free", MAX_WORD_LENGTH);
|
363
337
|
|
364
|
-
reset_actual_solution();
|
365
338
|
actual_word_count = word_count(input_text, actual_solution);
|
366
339
|
|
367
|
-
|
368
|
-
|
340
|
+
check_solution(expected_solution,
|
341
|
+
expected_word_count, actual_solution, actual_word_count);
|
342
|
+
}
|
343
|
+
|
344
|
+
void test_max_length_word(void)
|
345
|
+
{
|
346
|
+
TEST_IGNORE();
|
347
|
+
int actual_word_count;
|
348
|
+
int index = 0;
|
349
|
+
char *input_text =
|
350
|
+
"Look thisisaninsanelylongwordtypedwithoutusinganyspaces and look again, thisisaninsanelylongwordtypedwithoutusinganyspaces";
|
351
|
+
|
352
|
+
const int expected_word_count = 4;
|
353
|
+
|
354
|
+
// build the expected solution
|
355
|
+
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
356
|
+
|
357
|
+
expected_solution[index].count = 2;
|
358
|
+
strncpy(expected_solution[index++].text, "look", MAX_WORD_LENGTH);
|
359
|
+
|
360
|
+
expected_solution[index].count = 2;
|
361
|
+
strncpy(expected_solution[index++].text,
|
362
|
+
"thisisaninsanelylongwordtypedwithoutusinganyspaces",
|
363
|
+
MAX_WORD_LENGTH);
|
364
|
+
|
365
|
+
expected_solution[index].count = 1;
|
366
|
+
strncpy(expected_solution[index++].text, "and", MAX_WORD_LENGTH);
|
367
|
+
|
368
|
+
expected_solution[index].count = 1;
|
369
|
+
strncpy(expected_solution[index++].text, "again", MAX_WORD_LENGTH);
|
370
|
+
|
371
|
+
actual_word_count = word_count(input_text, actual_solution);
|
372
|
+
|
373
|
+
check_solution(expected_solution,
|
374
|
+
expected_word_count, actual_solution, actual_word_count);
|
375
|
+
}
|
376
|
+
|
377
|
+
void test_excessive_length_word(void)
|
378
|
+
{
|
379
|
+
TEST_IGNORE();
|
380
|
+
int actual_word_count;
|
381
|
+
int index = 0;
|
382
|
+
char *input_text =
|
383
|
+
"Look thisisanexcessivelylongwordthatsomeonetypedwithoutusingthespacebar enough";
|
384
|
+
|
385
|
+
const int expected_word_count = EXCESSIVE_LENGTH_WORD;
|
386
|
+
word_count_word_t expected_solution[MAX_WORDS];
|
387
|
+
|
388
|
+
// build the expected solution
|
389
|
+
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
390
|
+
expected_solution[index].count = 1;
|
391
|
+
strncpy(expected_solution[index++].text, "look", MAX_WORD_LENGTH);
|
392
|
+
|
393
|
+
actual_word_count = word_count(input_text, actual_solution);
|
394
|
+
|
395
|
+
check_solution(expected_solution,
|
396
|
+
expected_word_count, actual_solution, actual_word_count);
|
397
|
+
}
|
398
|
+
|
399
|
+
void test_max_number_words(void)
|
400
|
+
{
|
401
|
+
TEST_IGNORE();
|
402
|
+
int actual_word_count;
|
403
|
+
int index = 0;
|
404
|
+
char *input_text =
|
405
|
+
"Once upon a time, a long while in the past, there lived a strange little man who could spin straw into gold";
|
406
|
+
|
407
|
+
const int expected_word_count = 20;
|
408
|
+
|
409
|
+
// build the expected solution
|
410
|
+
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
411
|
+
|
412
|
+
expected_solution[index].count = 1;
|
413
|
+
strncpy(expected_solution[index++].text, "once", MAX_WORD_LENGTH);
|
414
|
+
|
415
|
+
expected_solution[index].count = 1;
|
416
|
+
strncpy(expected_solution[index++].text, "upon", MAX_WORD_LENGTH);
|
417
|
+
|
418
|
+
expected_solution[index].count = 3;
|
419
|
+
strncpy(expected_solution[index++].text, "a", MAX_WORD_LENGTH);
|
420
|
+
|
421
|
+
expected_solution[index].count = 1;
|
422
|
+
strncpy(expected_solution[index++].text, "time", MAX_WORD_LENGTH);
|
423
|
+
|
424
|
+
expected_solution[index].count = 1;
|
425
|
+
strncpy(expected_solution[index++].text, "long", MAX_WORD_LENGTH);
|
426
|
+
|
427
|
+
expected_solution[index].count = 1;
|
428
|
+
strncpy(expected_solution[index++].text, "while", MAX_WORD_LENGTH);
|
429
|
+
|
430
|
+
expected_solution[index].count = 1;
|
431
|
+
strncpy(expected_solution[index++].text, "in", MAX_WORD_LENGTH);
|
432
|
+
|
433
|
+
expected_solution[index].count = 1;
|
434
|
+
strncpy(expected_solution[index++].text, "the", MAX_WORD_LENGTH);
|
435
|
+
|
436
|
+
expected_solution[index].count = 1;
|
437
|
+
strncpy(expected_solution[index++].text, "past", MAX_WORD_LENGTH);
|
438
|
+
|
439
|
+
expected_solution[index].count = 1;
|
440
|
+
strncpy(expected_solution[index++].text, "there", MAX_WORD_LENGTH);
|
441
|
+
|
442
|
+
expected_solution[index].count = 1;
|
443
|
+
strncpy(expected_solution[index++].text, "lived", MAX_WORD_LENGTH);
|
444
|
+
|
445
|
+
expected_solution[index].count = 1;
|
446
|
+
strncpy(expected_solution[index++].text, "strange", MAX_WORD_LENGTH);
|
447
|
+
|
448
|
+
expected_solution[index].count = 1;
|
449
|
+
strncpy(expected_solution[index++].text, "little", MAX_WORD_LENGTH);
|
450
|
+
|
451
|
+
expected_solution[index].count = 1;
|
452
|
+
strncpy(expected_solution[index++].text, "man", MAX_WORD_LENGTH);
|
453
|
+
|
454
|
+
expected_solution[index].count = 1;
|
455
|
+
strncpy(expected_solution[index++].text, "who", MAX_WORD_LENGTH);
|
456
|
+
|
457
|
+
expected_solution[index].count = 1;
|
458
|
+
strncpy(expected_solution[index++].text, "could", MAX_WORD_LENGTH);
|
459
|
+
|
460
|
+
expected_solution[index].count = 1;
|
461
|
+
strncpy(expected_solution[index++].text, "spin", MAX_WORD_LENGTH);
|
462
|
+
|
463
|
+
expected_solution[index].count = 1;
|
464
|
+
strncpy(expected_solution[index++].text, "straw", MAX_WORD_LENGTH);
|
465
|
+
|
466
|
+
expected_solution[index].count = 1;
|
467
|
+
strncpy(expected_solution[index++].text, "into", MAX_WORD_LENGTH);
|
468
|
+
|
469
|
+
expected_solution[index].count = 1;
|
470
|
+
strncpy(expected_solution[index++].text, "gold", MAX_WORD_LENGTH);
|
471
|
+
|
472
|
+
actual_word_count = word_count(input_text, actual_solution);
|
473
|
+
|
474
|
+
check_solution(expected_solution,
|
475
|
+
expected_word_count, actual_solution, actual_word_count);
|
476
|
+
}
|
477
|
+
|
478
|
+
void test_excessive_number_words(void)
|
479
|
+
{
|
480
|
+
TEST_IGNORE();
|
481
|
+
int actual_word_count;
|
482
|
+
int index = 0;
|
483
|
+
char *input_text =
|
484
|
+
"Once upon a time, a long while in the past, there lived a strange little man who could spin straw into gold. His name was...";
|
485
|
+
|
486
|
+
const int expected_word_count = EXCESSIVE_NUMBER_OF_WORDS;
|
487
|
+
|
488
|
+
// build the expected solution
|
489
|
+
memset(expected_solution, 0, sizeof(expected_solution)); // clear to start with a known value
|
490
|
+
|
491
|
+
expected_solution[index].count = 1;
|
492
|
+
strncpy(expected_solution[index++].text, "once", MAX_WORD_LENGTH);
|
493
|
+
|
494
|
+
expected_solution[index].count = 1;
|
495
|
+
strncpy(expected_solution[index++].text, "upon", MAX_WORD_LENGTH);
|
496
|
+
|
497
|
+
expected_solution[index].count = 3;
|
498
|
+
strncpy(expected_solution[index++].text, "a", MAX_WORD_LENGTH);
|
499
|
+
|
500
|
+
expected_solution[index].count = 1;
|
501
|
+
strncpy(expected_solution[index++].text, "time", MAX_WORD_LENGTH);
|
502
|
+
|
503
|
+
expected_solution[index].count = 1;
|
504
|
+
strncpy(expected_solution[index++].text, "long", MAX_WORD_LENGTH);
|
505
|
+
|
506
|
+
expected_solution[index].count = 1;
|
507
|
+
strncpy(expected_solution[index++].text, "while", MAX_WORD_LENGTH);
|
508
|
+
|
509
|
+
expected_solution[index].count = 1;
|
510
|
+
strncpy(expected_solution[index++].text, "in", MAX_WORD_LENGTH);
|
511
|
+
|
512
|
+
expected_solution[index].count = 1;
|
513
|
+
strncpy(expected_solution[index++].text, "the", MAX_WORD_LENGTH);
|
514
|
+
|
515
|
+
expected_solution[index].count = 1;
|
516
|
+
strncpy(expected_solution[index++].text, "past", MAX_WORD_LENGTH);
|
517
|
+
|
518
|
+
expected_solution[index].count = 1;
|
519
|
+
strncpy(expected_solution[index++].text, "there", MAX_WORD_LENGTH);
|
520
|
+
|
521
|
+
expected_solution[index].count = 1;
|
522
|
+
strncpy(expected_solution[index++].text, "lived", MAX_WORD_LENGTH);
|
523
|
+
|
524
|
+
expected_solution[index].count = 1;
|
525
|
+
strncpy(expected_solution[index++].text, "strange", MAX_WORD_LENGTH);
|
526
|
+
|
527
|
+
expected_solution[index].count = 1;
|
528
|
+
strncpy(expected_solution[index++].text, "little", MAX_WORD_LENGTH);
|
529
|
+
|
530
|
+
expected_solution[index].count = 1;
|
531
|
+
strncpy(expected_solution[index++].text, "man", MAX_WORD_LENGTH);
|
532
|
+
|
533
|
+
expected_solution[index].count = 1;
|
534
|
+
strncpy(expected_solution[index++].text, "who", MAX_WORD_LENGTH);
|
535
|
+
|
536
|
+
expected_solution[index].count = 1;
|
537
|
+
strncpy(expected_solution[index++].text, "could", MAX_WORD_LENGTH);
|
538
|
+
|
539
|
+
expected_solution[index].count = 1;
|
540
|
+
strncpy(expected_solution[index++].text, "spin", MAX_WORD_LENGTH);
|
541
|
+
|
542
|
+
expected_solution[index].count = 1;
|
543
|
+
strncpy(expected_solution[index++].text, "straw", MAX_WORD_LENGTH);
|
544
|
+
|
545
|
+
expected_solution[index].count = 1;
|
546
|
+
strncpy(expected_solution[index++].text, "into", MAX_WORD_LENGTH);
|
547
|
+
|
548
|
+
expected_solution[index].count = 1;
|
549
|
+
strncpy(expected_solution[index++].text, "gold", MAX_WORD_LENGTH);
|
550
|
+
|
551
|
+
actual_word_count = word_count(input_text, actual_solution);
|
552
|
+
|
553
|
+
check_solution(expected_solution,
|
554
|
+
expected_word_count, actual_solution, actual_word_count);
|
369
555
|
}
|
370
556
|
|
371
557
|
int main(void)
|
@@ -383,6 +569,10 @@ int main(void)
|
|
383
569
|
RUN_TEST(test_word_count_with_apostrophes);
|
384
570
|
RUN_TEST(test_word_count_with_quotation);
|
385
571
|
RUN_TEST(test_word_count_from_example);
|
572
|
+
RUN_TEST(test_max_length_word);
|
573
|
+
RUN_TEST(test_excessive_length_word);
|
574
|
+
RUN_TEST(test_max_number_words);
|
575
|
+
RUN_TEST(test_excessive_number_words);
|
386
576
|
|
387
577
|
UnityEnd();
|
388
578
|
|