trackler 2.0.0.3 → 2.0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/common/CONTRIBUTING.md +1 -1
  3. data/common/README.md +4 -4
  4. data/common/exercises/bowling/canonical-data.json +8 -0
  5. data/common/exercises/hello-world/description.md +1 -1
  6. data/lib/trackler/version.rb +1 -1
  7. data/tracks/c/.gitignore +1 -0
  8. data/tracks/c/bin/run-tests +3 -0
  9. data/tracks/c/config.json +9 -0
  10. data/tracks/c/exercises/clock/makefile +16 -0
  11. data/tracks/c/exercises/clock/src/clock.h +11 -0
  12. data/tracks/c/exercises/clock/src/example.c +31 -0
  13. data/tracks/c/exercises/clock/test/test_clock.c +489 -0
  14. data/tracks/c/exercises/clock/test/vendor/unity.c +1300 -0
  15. data/tracks/c/exercises/clock/test/vendor/unity.h +274 -0
  16. data/tracks/c/exercises/clock/test/vendor/unity_internals.h +701 -0
  17. data/tracks/coldfusion/config.json +2 -1
  18. data/tracks/coldfusion/img/icon.png +0 -0
  19. data/tracks/crystal/Makefile +11 -15
  20. data/tracks/crystal/SETUP.md +1 -1
  21. data/tracks/crystal/docs/LEARNING.md +5 -3
  22. data/tracks/crystal/docs/TESTS.md +24 -3
  23. data/tracks/crystal/exercises/anagram/{anagram_spec.cr → spec/anagram_spec.cr} +1 -1
  24. data/tracks/crystal/exercises/anagram/{example.cr → src/example.cr} +0 -0
  25. data/tracks/crystal/exercises/atbash-cipher/{atbash_cipher_spec.cr → spec/atbash_cipher_spec.cr} +1 -1
  26. data/tracks/crystal/exercises/atbash-cipher/{example.cr → src/example.cr} +0 -0
  27. data/tracks/crystal/exercises/bob/{bob_spec.cr → spec/bob_spec.cr} +1 -1
  28. data/tracks/crystal/exercises/bob/{example.cr → src/example.cr} +0 -0
  29. data/tracks/crystal/exercises/bracket-push/{bracket_push_spec.cr → spec/bracket_push_spec.cr} +1 -1
  30. data/tracks/crystal/exercises/bracket-push/{example.cr → src/example.cr} +0 -0
  31. data/tracks/crystal/exercises/gigasecond/{gigasecond_spec.cr → spec/gigasecond_spec.cr} +1 -1
  32. data/tracks/crystal/exercises/gigasecond/{example.cr → src/example.cr} +0 -0
  33. data/tracks/crystal/exercises/hamming/{hamming_spec.cr → spec/hamming_spec.cr} +1 -1
  34. data/tracks/crystal/exercises/hamming/{example.cr → src/example.cr} +0 -0
  35. data/tracks/crystal/exercises/hello-world/HINTS.md +32 -0
  36. data/tracks/crystal/exercises/hello-world/{hello_world_spec.cr → spec/hello_world_spec.cr} +1 -1
  37. data/tracks/crystal/exercises/hello-world/{example.cr → src/example.cr} +0 -0
  38. data/tracks/crystal/exercises/largest-series-product/{largest_series_product_spec.cr → spec/largest_series_product_spec.cr} +1 -1
  39. data/tracks/crystal/exercises/largest-series-product/{example.cr → src/example.cr} +0 -0
  40. data/tracks/crystal/exercises/leap/{leap_spec.cr → spec/leap_spec.cr} +1 -1
  41. data/tracks/crystal/exercises/leap/{example.cr → src/example.cr} +0 -0
  42. data/tracks/crystal/exercises/pangram/{pangram_spec.cr → spec/pangram_spec.cr} +1 -1
  43. data/tracks/crystal/exercises/pangram/{example.cr → src/example.cr} +0 -0
  44. data/tracks/crystal/exercises/raindrops/{raindrops_spec.cr → spec/raindrops_spec.cr} +1 -1
  45. data/tracks/crystal/exercises/raindrops/{example.cr → src/example.cr} +0 -0
  46. data/tracks/crystal/exercises/react/{react_spec.cr → spec/react_spec.cr} +1 -1
  47. data/tracks/crystal/exercises/react/{example.cr → src/example.cr} +0 -0
  48. data/tracks/crystal/exercises/rna-transcription/{rna_transcription_spec.cr → spec/rna_transcription_spec.cr} +1 -1
  49. data/tracks/crystal/exercises/rna-transcription/{example.cr → src/example.cr} +0 -0
  50. data/tracks/crystal/exercises/roman-numerals/{roman_numerals_spec.cr → spec/roman_numerals_spec.cr} +1 -1
  51. data/tracks/crystal/exercises/roman-numerals/{example.cr → src/example.cr} +0 -0
  52. data/tracks/crystal/exercises/sieve/{sieve_spec.cr → spec/sieve_spec.cr} +1 -1
  53. data/tracks/crystal/exercises/sieve/{example.cr → src/example.cr} +0 -0
  54. data/tracks/haskell/.travis.yml +4 -2
  55. data/tracks/haskell/config.json +6 -6
  56. data/tracks/haskell/exercises/alphametics/package.yaml +0 -1
  57. data/tracks/haskell/exercises/atbash-cipher/package.yaml +0 -1
  58. data/tracks/haskell/exercises/bank-account/package.yaml +0 -1
  59. data/tracks/haskell/exercises/binary-search-tree/HINTS.md +3 -2
  60. data/tracks/haskell/exercises/binary-search-tree/src/BST.hs +2 -0
  61. data/tracks/haskell/exercises/change/test/Tests.hs +2 -1
  62. data/tracks/haskell/exercises/connect/package.yaml +0 -1
  63. data/tracks/haskell/exercises/crypto-square/package.yaml +0 -1
  64. data/tracks/haskell/exercises/custom-set/HINTS.md +3 -2
  65. data/tracks/haskell/exercises/custom-set/src/CustomSet.hs +3 -2
  66. data/tracks/haskell/exercises/food-chain/package.yaml +0 -1
  67. data/tracks/haskell/exercises/forth/HINTS.md +3 -2
  68. data/tracks/haskell/exercises/forth/src/Forth.hs +2 -0
  69. data/tracks/haskell/exercises/go-counting/package.yaml +0 -1
  70. data/tracks/haskell/exercises/grade-school/package.yaml +0 -1
  71. data/tracks/haskell/exercises/grains/src/Grains.hs +3 -1
  72. data/tracks/haskell/exercises/kindergarten-garden/package.yaml +0 -1
  73. data/tracks/haskell/exercises/largest-series-product/package.yaml +0 -1
  74. data/tracks/haskell/exercises/lens-person/package.yaml +0 -1
  75. data/tracks/haskell/exercises/linked-list/package.yaml +0 -1
  76. data/tracks/haskell/exercises/ocr-numbers/package.yaml +0 -2
  77. data/tracks/haskell/exercises/parallel-letter-frequency/package.yaml +0 -1
  78. data/tracks/haskell/exercises/rna-transcription/package.yaml +0 -1
  79. data/tracks/haskell/exercises/robot-name/package.yaml +0 -1
  80. data/tracks/haskell/exercises/saddle-points/package.yaml +0 -1
  81. data/tracks/haskell/exercises/say/package.yaml +0 -1
  82. data/tracks/haskell/exercises/scrabble-score/package.yaml +0 -1
  83. data/tracks/haskell/exercises/series/HINTS.md +23 -0
  84. data/tracks/haskell/exercises/series/examples/success-byteseqs/package.yaml +19 -0
  85. data/tracks/haskell/exercises/series/examples/success-byteseqs/src/Series.hs +26 -0
  86. data/tracks/haskell/exercises/series/src/Series.hs +2 -1
  87. data/tracks/haskell/exercises/series/test/Tests.hs +16 -11
  88. data/tracks/haskell/exercises/sgf-parsing/package.yaml +0 -1
  89. data/tracks/haskell/exercises/sieve/package.yaml +0 -1
  90. data/tracks/haskell/exercises/simple-cipher/package.yaml +0 -1
  91. data/tracks/haskell/exercises/triangle/package.yaml +0 -1
  92. data/tracks/haskell/exercises/word-count/examples/success-newtype/src/WordCount.hs +7 -4
  93. data/tracks/haskell/exercises/word-count/examples/success-simple/src/WordCount.hs +6 -2
  94. data/tracks/haskell/exercises/word-count/test/Tests.hs +30 -1
  95. data/tracks/haskell/exercises/wordy/package.yaml +0 -2
  96. data/tracks/java/docs/INSTALLATION.md +2 -0
  97. data/tracks/java/exercises/_template/build.gradle +1 -1
  98. data/tracks/java/exercises/accumulate/build.gradle +1 -1
  99. data/tracks/java/exercises/acronym/build.gradle +1 -1
  100. data/tracks/java/exercises/allergies/build.gradle +1 -1
  101. data/tracks/java/exercises/anagram/build.gradle +1 -1
  102. data/tracks/java/exercises/atbash-cipher/build.gradle +1 -1
  103. data/tracks/java/exercises/beer-song/build.gradle +1 -1
  104. data/tracks/java/exercises/binary/build.gradle +1 -1
  105. data/tracks/java/exercises/bob/build.gradle +1 -1
  106. data/tracks/java/exercises/crypto-square/build.gradle +1 -1
  107. data/tracks/java/exercises/etl/build.gradle +1 -1
  108. data/tracks/java/exercises/gigasecond/build.gradle +1 -1
  109. data/tracks/java/exercises/grade-school/build.gradle +1 -1
  110. data/tracks/java/exercises/hamming/build.gradle +1 -1
  111. data/tracks/java/exercises/hello-world/build.gradle +1 -1
  112. data/tracks/java/exercises/hexadecimal/build.gradle +1 -1
  113. data/tracks/java/exercises/linked-list/build.gradle +1 -1
  114. data/tracks/java/exercises/luhn/build.gradle +1 -1
  115. data/tracks/java/exercises/meetup/build.gradle +1 -1
  116. data/tracks/java/exercises/nth-prime/build.gradle +1 -1
  117. data/tracks/java/exercises/nucleotide-count/build.gradle +1 -1
  118. data/tracks/java/exercises/octal/build.gradle +1 -1
  119. data/tracks/java/exercises/pangram/build.gradle +1 -1
  120. data/tracks/java/exercises/pascals-triangle/build.gradle +1 -1
  121. data/tracks/java/exercises/phone-number/build.gradle +1 -1
  122. data/tracks/java/exercises/pig-latin/build.gradle +1 -1
  123. data/tracks/java/exercises/raindrops/build.gradle +1 -1
  124. data/tracks/java/exercises/rna-transcription/build.gradle +1 -1
  125. data/tracks/java/exercises/robot-name/build.gradle +1 -1
  126. data/tracks/java/exercises/roman-numerals/build.gradle +1 -1
  127. data/tracks/java/exercises/scrabble-score/build.gradle +1 -1
  128. data/tracks/java/exercises/sieve/build.gradle +1 -1
  129. data/tracks/java/exercises/simple-cipher/build.gradle +1 -1
  130. data/tracks/java/exercises/simple-linked-list/build.gradle +1 -1
  131. data/tracks/java/exercises/space-age/build.gradle +1 -1
  132. data/tracks/java/exercises/strain/build.gradle +1 -1
  133. data/tracks/java/exercises/triangle/build.gradle +1 -1
  134. data/tracks/java/exercises/trinary/build.gradle +1 -1
  135. data/tracks/java/exercises/word-count/build.gradle +1 -1
  136. data/tracks/ocaml/.travis-ci.sh +1 -1
  137. data/tracks/ocaml/.travis.yml +1 -1
  138. data/tracks/ocaml/README.md +1 -1
  139. data/tracks/ocaml/exercises/hamming/hamming.mli +1 -3
  140. data/tracks/ruby/exercises/leap/.version +1 -1
  141. data/tracks/ruby/exercises/leap/example.tt +3 -3
  142. data/tracks/ruby/exercises/leap/leap_test.rb +3 -4
  143. data/tracks/ruby/lib/leap_cases.rb +2 -2
  144. data/tracks/rust/exercises/bowling/tests/bowling.rs +29 -0
  145. data/tracks/swift/.gitignore +1 -0
  146. data/tracks/swift/.swift-version +1 -0
  147. data/tracks/swift/exercises/bowling/BowlingExample.swift +2 -2
  148. data/tracks/swift/exercises/bowling/BowlingTest.swift +84 -94
  149. data/tracks/swift/exercises/palindrome-products/PalindromeProductsExample.swift +19 -16
  150. data/tracks/tcl/README.md +3 -0
  151. data/tracks/tcl/config.json +2 -1
  152. data/tracks/tcl/img/icon.png +0 -0
  153. metadata +46 -33
  154. 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: 13d90971009884bd820bdbe76a985c6a084b4a71
4
- data.tar.gz: 45d64cda7e36d7934c5fe4827525ff6aa0555eb6
3
+ metadata.gz: 930373b0c5670419a14e779c478608d57004bd93
4
+ data.tar.gz: 0f5bd0b92f26975bfa7a090b7b4b16bb4824f52f
5
5
  SHA512:
6
- metadata.gz: fb8974eb51e067fd796d4cc65ed3fe25df92f865ef5db6b24517036b3121ea31b73c5f62d4b49774c6dcf06b1d6fecbcad776dbb7a68f5d3ac98b4ef83f6fd6c
7
- data.tar.gz: fd4f843c2e21324070fab9e4925c40a85901e760d2a557b9e6088758304204328cc3a834fd1c705a72e8c9f76f197fe4f0e35cb87b35727eeb581d0007ecdbce
6
+ metadata.gz: 626a0ea3510ad74ff08a010e9f3539fb8b9e128a1921953994ffa9755051712c23e123f808300c75d4c1d9e2d7e835d3580e13e23697183ac792c163624e9854
7
+ data.tar.gz: 961075ac95564c32b9ac6eaf618c2f9765961c06c13caa9d12bbbd6b9458be177fe0105d644e61efab7bc964002358d3f56a85caafbdd9585de19df7c9888c53
@@ -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
- 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
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": [],
@@ -3,7 +3,7 @@ the traditional first program for beginning programming in a new language.
3
3
 
4
4
  **Note:** You can skip this exercise by running:
5
5
 
6
- exercism skip $LANGUAGE hello-world
6
+ exercism skip $TRACK_ID hello-world
7
7
 
8
8
  ## Specification
9
9
 
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.0.0.3"
2
+ VERSION = "2.0.0.4"
3
3
  end
data/tracks/c/.gitignore CHANGED
@@ -2,3 +2,4 @@ bin/configlet
2
2
  bin/configlet.exe
3
3
  **/*.out
4
4
  **/*.o
5
+ .DS_Store
@@ -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,11 @@
1
+ #ifndef _CLOCK_H
2
+ #define _CLOCK_H
3
+
4
+ #define MAX_STR_LEN (5 + 1) // "##:##\0"
5
+
6
+ typedef char time_text_t[MAX_STR_LEN];
7
+
8
+ void clock(time_text_t time_text, int hour, int minute);
9
+ void clock_add(time_text_t time_text, int minute_offset);
10
+
11
+ #endif
@@ -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
+ }