trackler 2.0.0.3 → 2.0.0.4
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.
- checksums.yaml +4 -4
- data/common/CONTRIBUTING.md +1 -1
- data/common/README.md +4 -4
- data/common/exercises/bowling/canonical-data.json +8 -0
- data/common/exercises/hello-world/description.md +1 -1
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/.gitignore +1 -0
- data/tracks/c/bin/run-tests +3 -0
- data/tracks/c/config.json +9 -0
- data/tracks/c/exercises/clock/makefile +16 -0
- data/tracks/c/exercises/clock/src/clock.h +11 -0
- data/tracks/c/exercises/clock/src/example.c +31 -0
- data/tracks/c/exercises/clock/test/test_clock.c +489 -0
- data/tracks/c/exercises/clock/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/clock/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/clock/test/vendor/unity_internals.h +701 -0
- data/tracks/coldfusion/config.json +2 -1
- data/tracks/coldfusion/img/icon.png +0 -0
- data/tracks/crystal/Makefile +11 -15
- data/tracks/crystal/SETUP.md +1 -1
- data/tracks/crystal/docs/LEARNING.md +5 -3
- data/tracks/crystal/docs/TESTS.md +24 -3
- data/tracks/crystal/exercises/anagram/{anagram_spec.cr → spec/anagram_spec.cr} +1 -1
- data/tracks/crystal/exercises/anagram/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/atbash-cipher/{atbash_cipher_spec.cr → spec/atbash_cipher_spec.cr} +1 -1
- data/tracks/crystal/exercises/atbash-cipher/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/bob/{bob_spec.cr → spec/bob_spec.cr} +1 -1
- data/tracks/crystal/exercises/bob/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/bracket-push/{bracket_push_spec.cr → spec/bracket_push_spec.cr} +1 -1
- data/tracks/crystal/exercises/bracket-push/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/gigasecond/{gigasecond_spec.cr → spec/gigasecond_spec.cr} +1 -1
- data/tracks/crystal/exercises/gigasecond/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/hamming/{hamming_spec.cr → spec/hamming_spec.cr} +1 -1
- data/tracks/crystal/exercises/hamming/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/hello-world/HINTS.md +32 -0
- data/tracks/crystal/exercises/hello-world/{hello_world_spec.cr → spec/hello_world_spec.cr} +1 -1
- data/tracks/crystal/exercises/hello-world/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/largest-series-product/{largest_series_product_spec.cr → spec/largest_series_product_spec.cr} +1 -1
- data/tracks/crystal/exercises/largest-series-product/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/leap/{leap_spec.cr → spec/leap_spec.cr} +1 -1
- data/tracks/crystal/exercises/leap/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/pangram/{pangram_spec.cr → spec/pangram_spec.cr} +1 -1
- data/tracks/crystal/exercises/pangram/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/raindrops/{raindrops_spec.cr → spec/raindrops_spec.cr} +1 -1
- data/tracks/crystal/exercises/raindrops/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/react/{react_spec.cr → spec/react_spec.cr} +1 -1
- data/tracks/crystal/exercises/react/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/rna-transcription/{rna_transcription_spec.cr → spec/rna_transcription_spec.cr} +1 -1
- data/tracks/crystal/exercises/rna-transcription/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/roman-numerals/{roman_numerals_spec.cr → spec/roman_numerals_spec.cr} +1 -1
- data/tracks/crystal/exercises/roman-numerals/{example.cr → src/example.cr} +0 -0
- data/tracks/crystal/exercises/sieve/{sieve_spec.cr → spec/sieve_spec.cr} +1 -1
- data/tracks/crystal/exercises/sieve/{example.cr → src/example.cr} +0 -0
- data/tracks/haskell/.travis.yml +4 -2
- data/tracks/haskell/config.json +6 -6
- data/tracks/haskell/exercises/alphametics/package.yaml +0 -1
- data/tracks/haskell/exercises/atbash-cipher/package.yaml +0 -1
- data/tracks/haskell/exercises/bank-account/package.yaml +0 -1
- data/tracks/haskell/exercises/binary-search-tree/HINTS.md +3 -2
- data/tracks/haskell/exercises/binary-search-tree/src/BST.hs +2 -0
- data/tracks/haskell/exercises/change/test/Tests.hs +2 -1
- data/tracks/haskell/exercises/connect/package.yaml +0 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +0 -1
- data/tracks/haskell/exercises/custom-set/HINTS.md +3 -2
- data/tracks/haskell/exercises/custom-set/src/CustomSet.hs +3 -2
- data/tracks/haskell/exercises/food-chain/package.yaml +0 -1
- data/tracks/haskell/exercises/forth/HINTS.md +3 -2
- data/tracks/haskell/exercises/forth/src/Forth.hs +2 -0
- data/tracks/haskell/exercises/go-counting/package.yaml +0 -1
- data/tracks/haskell/exercises/grade-school/package.yaml +0 -1
- data/tracks/haskell/exercises/grains/src/Grains.hs +3 -1
- data/tracks/haskell/exercises/kindergarten-garden/package.yaml +0 -1
- data/tracks/haskell/exercises/largest-series-product/package.yaml +0 -1
- data/tracks/haskell/exercises/lens-person/package.yaml +0 -1
- data/tracks/haskell/exercises/linked-list/package.yaml +0 -1
- data/tracks/haskell/exercises/ocr-numbers/package.yaml +0 -2
- data/tracks/haskell/exercises/parallel-letter-frequency/package.yaml +0 -1
- data/tracks/haskell/exercises/rna-transcription/package.yaml +0 -1
- data/tracks/haskell/exercises/robot-name/package.yaml +0 -1
- data/tracks/haskell/exercises/saddle-points/package.yaml +0 -1
- data/tracks/haskell/exercises/say/package.yaml +0 -1
- data/tracks/haskell/exercises/scrabble-score/package.yaml +0 -1
- data/tracks/haskell/exercises/series/HINTS.md +23 -0
- data/tracks/haskell/exercises/series/examples/success-byteseqs/package.yaml +19 -0
- data/tracks/haskell/exercises/series/examples/success-byteseqs/src/Series.hs +26 -0
- data/tracks/haskell/exercises/series/src/Series.hs +2 -1
- data/tracks/haskell/exercises/series/test/Tests.hs +16 -11
- data/tracks/haskell/exercises/sgf-parsing/package.yaml +0 -1
- data/tracks/haskell/exercises/sieve/package.yaml +0 -1
- data/tracks/haskell/exercises/simple-cipher/package.yaml +0 -1
- data/tracks/haskell/exercises/triangle/package.yaml +0 -1
- data/tracks/haskell/exercises/word-count/examples/success-newtype/src/WordCount.hs +7 -4
- data/tracks/haskell/exercises/word-count/examples/success-simple/src/WordCount.hs +6 -2
- data/tracks/haskell/exercises/word-count/test/Tests.hs +30 -1
- data/tracks/haskell/exercises/wordy/package.yaml +0 -2
- data/tracks/java/docs/INSTALLATION.md +2 -0
- data/tracks/java/exercises/_template/build.gradle +1 -1
- data/tracks/java/exercises/accumulate/build.gradle +1 -1
- data/tracks/java/exercises/acronym/build.gradle +1 -1
- data/tracks/java/exercises/allergies/build.gradle +1 -1
- data/tracks/java/exercises/anagram/build.gradle +1 -1
- data/tracks/java/exercises/atbash-cipher/build.gradle +1 -1
- data/tracks/java/exercises/beer-song/build.gradle +1 -1
- data/tracks/java/exercises/binary/build.gradle +1 -1
- data/tracks/java/exercises/bob/build.gradle +1 -1
- data/tracks/java/exercises/crypto-square/build.gradle +1 -1
- data/tracks/java/exercises/etl/build.gradle +1 -1
- data/tracks/java/exercises/gigasecond/build.gradle +1 -1
- data/tracks/java/exercises/grade-school/build.gradle +1 -1
- data/tracks/java/exercises/hamming/build.gradle +1 -1
- data/tracks/java/exercises/hello-world/build.gradle +1 -1
- data/tracks/java/exercises/hexadecimal/build.gradle +1 -1
- data/tracks/java/exercises/linked-list/build.gradle +1 -1
- data/tracks/java/exercises/luhn/build.gradle +1 -1
- data/tracks/java/exercises/meetup/build.gradle +1 -1
- data/tracks/java/exercises/nth-prime/build.gradle +1 -1
- data/tracks/java/exercises/nucleotide-count/build.gradle +1 -1
- data/tracks/java/exercises/octal/build.gradle +1 -1
- data/tracks/java/exercises/pangram/build.gradle +1 -1
- data/tracks/java/exercises/pascals-triangle/build.gradle +1 -1
- data/tracks/java/exercises/phone-number/build.gradle +1 -1
- data/tracks/java/exercises/pig-latin/build.gradle +1 -1
- data/tracks/java/exercises/raindrops/build.gradle +1 -1
- data/tracks/java/exercises/rna-transcription/build.gradle +1 -1
- data/tracks/java/exercises/robot-name/build.gradle +1 -1
- data/tracks/java/exercises/roman-numerals/build.gradle +1 -1
- data/tracks/java/exercises/scrabble-score/build.gradle +1 -1
- data/tracks/java/exercises/sieve/build.gradle +1 -1
- data/tracks/java/exercises/simple-cipher/build.gradle +1 -1
- data/tracks/java/exercises/simple-linked-list/build.gradle +1 -1
- data/tracks/java/exercises/space-age/build.gradle +1 -1
- data/tracks/java/exercises/strain/build.gradle +1 -1
- data/tracks/java/exercises/triangle/build.gradle +1 -1
- data/tracks/java/exercises/trinary/build.gradle +1 -1
- data/tracks/java/exercises/word-count/build.gradle +1 -1
- data/tracks/ocaml/.travis-ci.sh +1 -1
- data/tracks/ocaml/.travis.yml +1 -1
- data/tracks/ocaml/README.md +1 -1
- data/tracks/ocaml/exercises/hamming/hamming.mli +1 -3
- data/tracks/ruby/exercises/leap/.version +1 -1
- data/tracks/ruby/exercises/leap/example.tt +3 -3
- data/tracks/ruby/exercises/leap/leap_test.rb +3 -4
- data/tracks/ruby/lib/leap_cases.rb +2 -2
- data/tracks/rust/exercises/bowling/tests/bowling.rs +29 -0
- data/tracks/swift/.gitignore +1 -0
- data/tracks/swift/.swift-version +1 -0
- data/tracks/swift/exercises/bowling/BowlingExample.swift +2 -2
- data/tracks/swift/exercises/bowling/BowlingTest.swift +84 -94
- data/tracks/swift/exercises/palindrome-products/PalindromeProductsExample.swift +19 -16
- data/tracks/tcl/README.md +3 -0
- data/tracks/tcl/config.json +2 -1
- data/tracks/tcl/img/icon.png +0 -0
- metadata +46 -33
- data/tracks/crystal/exercises/hello-world/GETTING_STARTED.md +0 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 930373b0c5670419a14e779c478608d57004bd93
|
|
4
|
+
data.tar.gz: 0f5bd0b92f26975bfa7a090b7b4b16bb4824f52f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 626a0ea3510ad74ff08a010e9f3539fb8b9e128a1921953994ffa9755051712c23e123f808300c75d4c1d9e2d7e835d3580e13e23697183ac792c163624e9854
|
|
7
|
+
data.tar.gz: 961075ac95564c32b9ac6eaf618c2f9765961c06c13caa9d12bbbd6b9458be177fe0105d644e61efab7bc964002358d3f56a85caafbdd9585de19df7c9888c53
|
data/common/CONTRIBUTING.md
CHANGED
|
@@ -352,7 +352,7 @@ You can fetch the problem directly using the CLI:
|
|
|
352
352
|
$ exercism fetch <track_id> <slug>
|
|
353
353
|
```
|
|
354
354
|
|
|
355
|
-
Go ahead submit the reference solution that you wrote when creating the problem.
|
|
355
|
+
Go ahead and submit the reference solution that you wrote when creating the problem.
|
|
356
356
|
Remember to archive it if you don't want other people to comment on it.
|
|
357
357
|
|
|
358
358
|
## Implementing a Completely New Exercise
|
data/common/README.md
CHANGED
|
@@ -46,10 +46,10 @@ mainstream implementation path, this information can also document significant
|
|
|
46
46
|
variations.
|
|
47
47
|
|
|
48
48
|
Each test case has the the following keys:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
- description: which will be used to name each generated test
|
|
50
|
+
- 'variable names': one or more variable names with values which will be passed to the solution method
|
|
51
|
+
- expected: the expected result (this would be -1 when we expect an exception)
|
|
52
|
+
- msg: a nice message for the failing case
|
|
53
53
|
|
|
54
54
|
## Automated Tests
|
|
55
55
|
|
|
@@ -85,6 +85,10 @@
|
|
|
85
85
|
"description": "two rolls in a frame can not score more than 10 points",
|
|
86
86
|
"rolls": [5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
87
87
|
"expected": -1
|
|
88
|
+
}, {
|
|
89
|
+
"description": "bonus roll after a strike in the last frame can not score more than 10 points",
|
|
90
|
+
"rolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11],
|
|
91
|
+
"expected": -1
|
|
88
92
|
}, {
|
|
89
93
|
"description": "two bonus rolls after a strike in the last frame can not score more than 10 points",
|
|
90
94
|
"rolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 6],
|
|
@@ -97,6 +101,10 @@
|
|
|
97
101
|
"description": "the second bonus rolls after a strike in the last frame can not be a strike if the first one is not a strike",
|
|
98
102
|
"rolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 6, 10],
|
|
99
103
|
"expected": -1
|
|
104
|
+
}, {
|
|
105
|
+
"description": "second bonus roll after a strike in the last frame can not score than 10 points",
|
|
106
|
+
"rolls": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 11],
|
|
107
|
+
"expected": -1
|
|
100
108
|
}, {
|
|
101
109
|
"description": "an unstarted game can not be scored",
|
|
102
110
|
"rolls": [],
|
data/lib/trackler/version.rb
CHANGED
data/tracks/c/.gitignore
CHANGED
data/tracks/c/bin/run-tests
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
|
+
set -e
|
|
2
3
|
|
|
3
4
|
for D in exercises/*; do
|
|
4
5
|
CURRENT_DIR=$(pwd)
|
|
@@ -26,6 +27,8 @@ for D in exercises/*; do
|
|
|
26
27
|
make clean >> /dev/null;
|
|
27
28
|
if make | grep FAIL: ; then
|
|
28
29
|
exit 1
|
|
30
|
+
elif [ ${PIPESTATUS[0]} -ne 0 ]; then
|
|
31
|
+
exit 1
|
|
29
32
|
fi
|
|
30
33
|
cd ${CURRENT_DIR};
|
|
31
34
|
}
|
data/tracks/c/config.json
CHANGED
|
@@ -162,6 +162,15 @@
|
|
|
162
162
|
"control-flow (loops)",
|
|
163
163
|
"control-flow (if-else statements)"
|
|
164
164
|
]
|
|
165
|
+
}, {
|
|
166
|
+
"difficulty": 1,
|
|
167
|
+
"slug": "clock",
|
|
168
|
+
"topics": [
|
|
169
|
+
"control-flow (if-statements)",
|
|
170
|
+
"strings",
|
|
171
|
+
"text formatting",
|
|
172
|
+
"preprocessor (x-macros in test)"
|
|
173
|
+
]
|
|
165
174
|
}],
|
|
166
175
|
"deprecated": [
|
|
167
176
|
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
CFLAGS = -std=c99
|
|
2
|
+
CFLAGS += -Wall
|
|
3
|
+
CFLAGS += -Wextra
|
|
4
|
+
CFLAGS += -pedantic
|
|
5
|
+
CFLAGS += -Werror
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
test: tests.out
|
|
9
|
+
@./tests.out
|
|
10
|
+
|
|
11
|
+
clean:
|
|
12
|
+
rm -f *.o *.out
|
|
13
|
+
|
|
14
|
+
tests.out: test/test_clock.c src/clock.c src/clock.h
|
|
15
|
+
@echo Compiling $@
|
|
16
|
+
@cc $(CFLAGS) src/clock.c test/vendor/unity.c test/test_clock.c -o tests.out
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#include <stdio.h>
|
|
2
|
+
#include "clock.h"
|
|
3
|
+
|
|
4
|
+
static void normalize_clock(int *hour, int *minute)
|
|
5
|
+
{
|
|
6
|
+
while (*minute < 0) {
|
|
7
|
+
*minute += 60;
|
|
8
|
+
*hour -= 1;
|
|
9
|
+
}
|
|
10
|
+
*hour += *minute / 60;
|
|
11
|
+
while (*hour < 0) {
|
|
12
|
+
*hour += 24;
|
|
13
|
+
}
|
|
14
|
+
*hour %= 24;
|
|
15
|
+
*minute %= 60;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
void clock(time_text_t time_text, int hour, int minute)
|
|
19
|
+
{
|
|
20
|
+
normalize_clock(&hour, &minute);
|
|
21
|
+
sprintf(time_text, "%02d:%02d", hour, minute);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
void clock_add(time_text_t time_text, int minute_offset)
|
|
25
|
+
{
|
|
26
|
+
int hour;
|
|
27
|
+
int minute;
|
|
28
|
+
sscanf(time_text, "%02d:%02d", &hour, &minute);
|
|
29
|
+
minute += minute_offset;
|
|
30
|
+
clock(time_text, hour, minute);
|
|
31
|
+
}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
#include <stdbool.h>
|
|
2
|
+
#include <stdlib.h>
|
|
3
|
+
#include <string.h>
|
|
4
|
+
|
|
5
|
+
#include "vendor/unity.h"
|
|
6
|
+
#include "../src/clock.h"
|
|
7
|
+
|
|
8
|
+
time_text_t actual_time_text;
|
|
9
|
+
time_text_t actual_time_text2;
|
|
10
|
+
|
|
11
|
+
// general routines that test expected results
|
|
12
|
+
void test_expected_value(const char *expected_clock_text, int hour, int minute)
|
|
13
|
+
{
|
|
14
|
+
memset(actual_time_text, '\0', sizeof(actual_time_text));
|
|
15
|
+
clock(actual_time_text, hour, minute);
|
|
16
|
+
TEST_ASSERT_EQUAL_STRING(expected_clock_text, actual_time_text);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
void test_time_add_expected_value(const char *expected_clock_text, int hour,
|
|
20
|
+
int minute, int minute_offset)
|
|
21
|
+
{
|
|
22
|
+
memset(actual_time_text, '\0', sizeof(actual_time_text));
|
|
23
|
+
clock(actual_time_text, hour, minute);
|
|
24
|
+
clock_add(actual_time_text, minute_offset);
|
|
25
|
+
|
|
26
|
+
TEST_ASSERT_EQUAL_STRING(expected_clock_text, actual_time_text);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
void test_time_expected_equality(int hour1, int minute1, int hour2, int minute2,
|
|
30
|
+
bool expected_equality)
|
|
31
|
+
{
|
|
32
|
+
memset(actual_time_text, '\0', sizeof(actual_time_text));
|
|
33
|
+
memset(actual_time_text2, '\0', sizeof(actual_time_text2));
|
|
34
|
+
|
|
35
|
+
clock(actual_time_text, hour1, minute1);
|
|
36
|
+
clock(actual_time_text2, hour2, minute2);
|
|
37
|
+
|
|
38
|
+
if (expected_equality) {
|
|
39
|
+
TEST_ASSERT_EQUAL_STRING(actual_time_text, actual_time_text2);
|
|
40
|
+
} else {
|
|
41
|
+
bool result = (0 == strcmp(actual_time_text, actual_time_text2));
|
|
42
|
+
|
|
43
|
+
TEST_ASSERT_EQUAL(0, result);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// the tests
|
|
48
|
+
void test_on_the_hour(void)
|
|
49
|
+
{
|
|
50
|
+
int hour = 8;
|
|
51
|
+
int minute = 0;
|
|
52
|
+
char *expected_clock_text = "08:00";
|
|
53
|
+
|
|
54
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
void test_past_the_hour(void)
|
|
58
|
+
{
|
|
59
|
+
int hour = 11;
|
|
60
|
+
int minute = 9;
|
|
61
|
+
char *expected_clock_text = "11:09";
|
|
62
|
+
|
|
63
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
void test_midnight_is_zero_hours(void)
|
|
67
|
+
{
|
|
68
|
+
int hour = 24;
|
|
69
|
+
int minute = 0;
|
|
70
|
+
char *expected_clock_text = "00:00";
|
|
71
|
+
|
|
72
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void test_hour_rolls_over(void)
|
|
76
|
+
{
|
|
77
|
+
int hour = 25;
|
|
78
|
+
int minute = 0;
|
|
79
|
+
char *expected_clock_text = "01:00";
|
|
80
|
+
|
|
81
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
void test_hour_rolls_over_continuously(void)
|
|
85
|
+
{
|
|
86
|
+
int hour = 100;
|
|
87
|
+
int minute = 0;
|
|
88
|
+
char *expected_clock_text = "04:00";
|
|
89
|
+
|
|
90
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void test_sixty_minutes_is_next_hour(void)
|
|
94
|
+
{
|
|
95
|
+
int hour = 1;
|
|
96
|
+
int minute = 60;
|
|
97
|
+
char *expected_clock_text = "02:00";
|
|
98
|
+
|
|
99
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void test_minutes_roll_over(void)
|
|
103
|
+
{
|
|
104
|
+
int hour = 0;
|
|
105
|
+
int minute = 160;
|
|
106
|
+
char *expected_clock_text = "02:40";
|
|
107
|
+
|
|
108
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
void test_minutes_roll_over_continuously(void)
|
|
112
|
+
{
|
|
113
|
+
int hour = 0;
|
|
114
|
+
int minute = 1723;
|
|
115
|
+
char *expected_clock_text = "04:43";
|
|
116
|
+
|
|
117
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
void test_hour_and_minutes_roll_over(void)
|
|
121
|
+
{
|
|
122
|
+
int hour = 25;
|
|
123
|
+
int minute = 160;
|
|
124
|
+
char *expected_clock_text = "03:40";
|
|
125
|
+
|
|
126
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
void test_hour_and_minutes_roll_over_continuously(void)
|
|
130
|
+
{
|
|
131
|
+
int hour = 201;
|
|
132
|
+
int minute = 3001;
|
|
133
|
+
char *expected_clock_text = "11:01";
|
|
134
|
+
|
|
135
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
void test_hour_and_minutes_roll_over_to_exactly_midnight(void)
|
|
139
|
+
{
|
|
140
|
+
int hour = 72;
|
|
141
|
+
int minute = 8640;
|
|
142
|
+
char *expected_clock_text = "00:00";
|
|
143
|
+
|
|
144
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
void test_negative_hour(void)
|
|
148
|
+
{
|
|
149
|
+
int hour = -1;
|
|
150
|
+
int minute = 15;
|
|
151
|
+
char *expected_clock_text = "23:15";
|
|
152
|
+
|
|
153
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
void test_negative_hour_rolls_over(void)
|
|
157
|
+
{
|
|
158
|
+
int hour = -25;
|
|
159
|
+
int minute = 0;
|
|
160
|
+
char *expected_clock_text = "23:00";
|
|
161
|
+
|
|
162
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
void test_negative_hour_rolls_over_continuously(void)
|
|
166
|
+
{
|
|
167
|
+
int hour = -91;
|
|
168
|
+
int minute = 0;
|
|
169
|
+
char *expected_clock_text = "05:00";
|
|
170
|
+
|
|
171
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
void test_negative_minutes(void)
|
|
175
|
+
{
|
|
176
|
+
int hour = 1;
|
|
177
|
+
int minute = -40;
|
|
178
|
+
char *expected_clock_text = "00:20";
|
|
179
|
+
|
|
180
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
void test_negative_minutes_roll_over(void)
|
|
184
|
+
{
|
|
185
|
+
int hour = 1;
|
|
186
|
+
int minute = -160;
|
|
187
|
+
char *expected_clock_text = "22:20";
|
|
188
|
+
|
|
189
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
void test_negative_minutes_roll_over_continuously(void)
|
|
193
|
+
{
|
|
194
|
+
int hour = 1;
|
|
195
|
+
int minute = -4820;
|
|
196
|
+
char *expected_clock_text = "16:40";
|
|
197
|
+
|
|
198
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
void test_negative_hour_and_minutes_both_roll_over(void)
|
|
202
|
+
{
|
|
203
|
+
int hour = -25;
|
|
204
|
+
int minute = -160;
|
|
205
|
+
char *expected_clock_text = "20:20";
|
|
206
|
+
|
|
207
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
void test_negative_hour_and_minutes_both_roll_over_continuously(void)
|
|
211
|
+
{
|
|
212
|
+
int hour = -121;
|
|
213
|
+
int minute = -5810;
|
|
214
|
+
char *expected_clock_text = "22:10";
|
|
215
|
+
|
|
216
|
+
test_expected_value(expected_clock_text, hour, minute);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
void test_add_minutes(void)
|
|
220
|
+
{
|
|
221
|
+
int hour = 10;
|
|
222
|
+
int minute = 0;
|
|
223
|
+
int minute_offset = 3;
|
|
224
|
+
char *expected_clock_text = "10:03";
|
|
225
|
+
|
|
226
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
227
|
+
minute_offset);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
void test_add_no_minutes(void)
|
|
231
|
+
{
|
|
232
|
+
int hour = 6;
|
|
233
|
+
int minute = 41;
|
|
234
|
+
int minute_offset = 0;
|
|
235
|
+
char *expected_clock_text = "06:41";
|
|
236
|
+
|
|
237
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
238
|
+
minute_offset);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
void test_add_to_next_hour(void)
|
|
242
|
+
{
|
|
243
|
+
int hour = 0;
|
|
244
|
+
int minute = 45;
|
|
245
|
+
int minute_offset = 40;
|
|
246
|
+
char *expected_clock_text = "01:25";
|
|
247
|
+
|
|
248
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
249
|
+
minute_offset);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
void test_add_more_than_one_hour(void)
|
|
253
|
+
{
|
|
254
|
+
int hour = 10;
|
|
255
|
+
int minute = 0;
|
|
256
|
+
int minute_offset = 61;
|
|
257
|
+
char *expected_clock_text = "11:01";
|
|
258
|
+
|
|
259
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
260
|
+
minute_offset);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
void test_add_more_than_two_hours_with_carry(void)
|
|
264
|
+
{
|
|
265
|
+
int hour = 0;
|
|
266
|
+
int minute = 45;
|
|
267
|
+
int minute_offset = 160;
|
|
268
|
+
char *expected_clock_text = "03:25";
|
|
269
|
+
|
|
270
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
271
|
+
minute_offset);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
void test_add_across_midnight(void)
|
|
275
|
+
{
|
|
276
|
+
int hour = 23;
|
|
277
|
+
int minute = 59;
|
|
278
|
+
int minute_offset = 2;
|
|
279
|
+
char *expected_clock_text = "00:01";
|
|
280
|
+
|
|
281
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
282
|
+
minute_offset);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
void test_add_more_than_one_day(void)
|
|
286
|
+
{
|
|
287
|
+
int hour = 5;
|
|
288
|
+
int minute = 32;
|
|
289
|
+
int minute_offset = 1500;
|
|
290
|
+
char *expected_clock_text = "06:32";
|
|
291
|
+
|
|
292
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
293
|
+
minute_offset);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
void test_add_more_than_two_days(void)
|
|
297
|
+
{
|
|
298
|
+
int hour = 1;
|
|
299
|
+
int minute = 1;
|
|
300
|
+
int minute_offset = 3500;
|
|
301
|
+
char *expected_clock_text = "11:21";
|
|
302
|
+
|
|
303
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
304
|
+
minute_offset);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
void test_subtract_minutes(void)
|
|
308
|
+
{
|
|
309
|
+
int hour = 10;
|
|
310
|
+
int minute = 3;
|
|
311
|
+
int minute_offset = -3;
|
|
312
|
+
char *expected_clock_text = "10:00";
|
|
313
|
+
|
|
314
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
315
|
+
minute_offset);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
void test_subtract_to_previous_hour(void)
|
|
319
|
+
{
|
|
320
|
+
int hour = 10;
|
|
321
|
+
int minute = 3;
|
|
322
|
+
int minute_offset = -30;
|
|
323
|
+
char *expected_clock_text = "09:33";
|
|
324
|
+
|
|
325
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
326
|
+
minute_offset);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
void test_subtract_more_than_an_hour(void)
|
|
330
|
+
{
|
|
331
|
+
int hour = 10;
|
|
332
|
+
int minute = 3;
|
|
333
|
+
int minute_offset = -70;
|
|
334
|
+
char *expected_clock_text = "08:53";
|
|
335
|
+
|
|
336
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
337
|
+
minute_offset);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
void test_subtract_across_midnight(void)
|
|
341
|
+
{
|
|
342
|
+
int hour = 0;
|
|
343
|
+
int minute = 3;
|
|
344
|
+
int minute_offset = -4;
|
|
345
|
+
char *expected_clock_text = "23:59";
|
|
346
|
+
|
|
347
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
348
|
+
minute_offset);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
void test_subtract_more_than_two_hours(void)
|
|
352
|
+
{
|
|
353
|
+
int hour = 0;
|
|
354
|
+
int minute = 0;
|
|
355
|
+
int minute_offset = -160;
|
|
356
|
+
char *expected_clock_text = "21:20";
|
|
357
|
+
|
|
358
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
359
|
+
minute_offset);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
void test_subtract_more_than_two_hours_with_borrow(void)
|
|
363
|
+
{
|
|
364
|
+
int hour = 6;
|
|
365
|
+
int minute = 15;
|
|
366
|
+
int minute_offset = -160;
|
|
367
|
+
char *expected_clock_text = "03:35";
|
|
368
|
+
|
|
369
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
370
|
+
minute_offset);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
void test_subtract_more_than_one_day(void)
|
|
374
|
+
{
|
|
375
|
+
int hour = 5;
|
|
376
|
+
int minute = 32;
|
|
377
|
+
int minute_offset = -1500;
|
|
378
|
+
char *expected_clock_text = "04:32";
|
|
379
|
+
|
|
380
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
381
|
+
minute_offset);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
void test_subtract_more_than_two_days(void)
|
|
385
|
+
{
|
|
386
|
+
int hour = 2;
|
|
387
|
+
int minute = 20;
|
|
388
|
+
int minute_offset = -3000;
|
|
389
|
+
char *expected_clock_text = "00:20";
|
|
390
|
+
|
|
391
|
+
test_time_add_expected_value(expected_clock_text, hour, minute,
|
|
392
|
+
minute_offset);
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// these tests check equality.
|
|
396
|
+
// Part of standard test collection
|
|
397
|
+
// Included even though they don't make much sense in C
|
|
398
|
+
|
|
399
|
+
// // trying it with XMACROS !
|
|
400
|
+
#define EXPAND_EQUALITY_TEST_AS_TEST(test_name, hour1, minute1, hour2, minute2, expected_equality)\
|
|
401
|
+
void test_name(void)\
|
|
402
|
+
{\
|
|
403
|
+
test_time_expected_equality(hour1, minute1, hour2, minute2, expected_equality);\
|
|
404
|
+
}\
|
|
405
|
+
|
|
406
|
+
// below expands to multiple routines...that are all designed to test the equality of 2 different
|
|
407
|
+
// clock representations to see if they are the same or not
|
|
408
|
+
// that 2 clocks are equal...
|
|
409
|
+
// the fields are:
|
|
410
|
+
// test name, time1_hour, time1_minute, time2_hour, time2_minute, (time1 == time2)
|
|
411
|
+
|
|
412
|
+
#define EQUALITY_TESTS(ENTRY) \
|
|
413
|
+
ENTRY(test_clocks_with_same_time, 15, 37, 15, 37, true)\
|
|
414
|
+
ENTRY(test_clocks_a_minute_apart, 15, 36, 15, 37, false)\
|
|
415
|
+
ENTRY(test_clocks_an_hour_apart, 15, 37, 14, 37, false)\
|
|
416
|
+
ENTRY(test_clocks_with_hour_overflow, 10, 37, 34, 37, true)\
|
|
417
|
+
ENTRY(test_clocks_with_hour_overflow_by_several_days, 3, 11, 99, 11, true)\
|
|
418
|
+
ENTRY(test_clocks_with_negative_hour, 22, 40, -2, 40, true)\
|
|
419
|
+
ENTRY(test_clocks_with_negative_hour_that_wraps, 17, 3, -31, 3, true)\
|
|
420
|
+
ENTRY(test_clocks_with_negative_hour_that_wraps_multiple_times, 13, 49, -83, 49, true)\
|
|
421
|
+
ENTRY(test_clocks_with_minute_overflow, 0, 1, 0, 1441, true)\
|
|
422
|
+
ENTRY(test_clocks_with_minute_overflow_by_several_days, 2, 2, 2, 4322, true)\
|
|
423
|
+
ENTRY(test_clocks_with_negative_minute, 2, 40, 3, -20, true)\
|
|
424
|
+
ENTRY(test_clocks_with_negative_minute_that_wraps, 4, 10, 5, -1490, true)\
|
|
425
|
+
ENTRY(test_clocks_with_negative_minute_that_wraps_multiple_times, 6, 15, 6, -4305, true)\
|
|
426
|
+
ENTRY(test_clocks_with_negative_hours_and_minutes, 7, 32, -12, -268, true)\
|
|
427
|
+
ENTRY(test_clocks_with_negative_hours_and_minutes_that_wrap, 18, 7, -54, -11513, true)\
|
|
428
|
+
|
|
429
|
+
EQUALITY_TESTS(EXPAND_EQUALITY_TEST_AS_TEST)
|
|
430
|
+
|
|
431
|
+
int main(void)
|
|
432
|
+
{
|
|
433
|
+
UnityBegin("clock.c");
|
|
434
|
+
|
|
435
|
+
RUN_TEST(test_on_the_hour);
|
|
436
|
+
RUN_TEST(test_past_the_hour);
|
|
437
|
+
RUN_TEST(test_midnight_is_zero_hours);
|
|
438
|
+
RUN_TEST(test_hour_rolls_over);
|
|
439
|
+
RUN_TEST(test_hour_rolls_over_continuously);
|
|
440
|
+
RUN_TEST(test_sixty_minutes_is_next_hour);
|
|
441
|
+
RUN_TEST(test_minutes_roll_over);
|
|
442
|
+
RUN_TEST(test_minutes_roll_over_continuously);
|
|
443
|
+
RUN_TEST(test_hour_and_minutes_roll_over);
|
|
444
|
+
RUN_TEST(test_hour_and_minutes_roll_over_continuously);
|
|
445
|
+
RUN_TEST(test_hour_and_minutes_roll_over_to_exactly_midnight);
|
|
446
|
+
RUN_TEST(test_negative_hour);
|
|
447
|
+
RUN_TEST(test_negative_hour_rolls_over);
|
|
448
|
+
RUN_TEST(test_negative_hour_rolls_over_continuously);
|
|
449
|
+
RUN_TEST(test_negative_minutes);
|
|
450
|
+
RUN_TEST(test_negative_minutes_roll_over);
|
|
451
|
+
RUN_TEST(test_negative_minutes_roll_over_continuously);
|
|
452
|
+
RUN_TEST(test_negative_hour_and_minutes_both_roll_over);
|
|
453
|
+
RUN_TEST(test_negative_hour_and_minutes_both_roll_over_continuously);
|
|
454
|
+
RUN_TEST(test_add_minutes);
|
|
455
|
+
RUN_TEST(test_add_no_minutes);
|
|
456
|
+
RUN_TEST(test_add_to_next_hour);
|
|
457
|
+
RUN_TEST(test_add_more_than_one_hour);
|
|
458
|
+
RUN_TEST(test_add_more_than_two_hours_with_carry);
|
|
459
|
+
RUN_TEST(test_add_across_midnight);
|
|
460
|
+
RUN_TEST(test_add_more_than_one_day);
|
|
461
|
+
RUN_TEST(test_add_more_than_two_days);
|
|
462
|
+
RUN_TEST(test_subtract_minutes);
|
|
463
|
+
RUN_TEST(test_subtract_to_previous_hour);
|
|
464
|
+
RUN_TEST(test_subtract_more_than_an_hour);
|
|
465
|
+
RUN_TEST(test_subtract_across_midnight);
|
|
466
|
+
RUN_TEST(test_subtract_more_than_two_hours);
|
|
467
|
+
RUN_TEST(test_subtract_more_than_two_hours_with_borrow);
|
|
468
|
+
RUN_TEST(test_subtract_more_than_one_day);
|
|
469
|
+
RUN_TEST(test_subtract_more_than_two_days);
|
|
470
|
+
|
|
471
|
+
RUN_TEST(test_clocks_with_same_time);
|
|
472
|
+
RUN_TEST(test_clocks_a_minute_apart);
|
|
473
|
+
RUN_TEST(test_clocks_an_hour_apart);
|
|
474
|
+
RUN_TEST(test_clocks_with_hour_overflow);
|
|
475
|
+
RUN_TEST(test_clocks_with_hour_overflow_by_several_days);
|
|
476
|
+
RUN_TEST(test_clocks_with_negative_hour);
|
|
477
|
+
RUN_TEST(test_clocks_with_negative_hour_that_wraps);
|
|
478
|
+
RUN_TEST(test_clocks_with_negative_hour_that_wraps_multiple_times);
|
|
479
|
+
RUN_TEST(test_clocks_with_minute_overflow);
|
|
480
|
+
RUN_TEST(test_clocks_with_minute_overflow_by_several_days);
|
|
481
|
+
RUN_TEST(test_clocks_with_negative_minute);
|
|
482
|
+
RUN_TEST(test_clocks_with_negative_minute_that_wraps);
|
|
483
|
+
RUN_TEST(test_clocks_with_negative_minute_that_wraps_multiple_times);
|
|
484
|
+
RUN_TEST(test_clocks_with_negative_hours_and_minutes);
|
|
485
|
+
RUN_TEST(test_clocks_with_negative_hours_and_minutes_that_wrap);
|
|
486
|
+
|
|
487
|
+
UnityEnd();
|
|
488
|
+
return 0;
|
|
489
|
+
}
|