trackler 2.0.5.1 → 2.0.5.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (246) hide show
  1. checksums.yaml +4 -4
  2. data/common/exercises/tree-building/description.md +15 -3
  3. data/lib/trackler/version.rb +1 -1
  4. data/tracks/ecmascript/exercises/queen-attack/queen-attack.spec.js +1 -1
  5. data/tracks/elm/.gitignore +1 -0
  6. data/tracks/elm/.travis.yml +3 -3
  7. data/tracks/elm/SETUP.md +16 -3
  8. data/tracks/elm/bin/build.sh +10 -10
  9. data/tracks/elm/bin/install-elm-format +1 -1
  10. data/tracks/elm/docs/INSTALLATION.md +2 -2
  11. data/tracks/elm/docs/TESTS.md +3 -3
  12. data/tracks/elm/elm-package.json +5 -5
  13. data/tracks/elm/exercises/accumulate/{Accumulate.example → Accumulate.example.elm} +0 -0
  14. data/tracks/elm/exercises/accumulate/{AccumulateTests.elm → Tests.elm} +2 -2
  15. data/tracks/elm/exercises/accumulate/elm-package.json +4 -4
  16. data/tracks/elm/exercises/accumulate/package.json +13 -0
  17. data/tracks/elm/exercises/allergies/{Allergies.example → Allergies.example.elm} +2 -2
  18. data/tracks/elm/exercises/allergies/{AllergiesTests.elm → Tests.elm} +2 -2
  19. data/tracks/elm/exercises/allergies/elm-package.json +4 -4
  20. data/tracks/elm/exercises/allergies/package.json +13 -0
  21. data/tracks/elm/exercises/anagram/{Anagram.example → Anagram.example.elm} +0 -0
  22. data/tracks/elm/exercises/anagram/{AnagramTests.elm → Tests.elm} +2 -2
  23. data/tracks/elm/exercises/anagram/elm-package.json +4 -4
  24. data/tracks/elm/exercises/anagram/package.json +13 -0
  25. data/tracks/elm/exercises/atbash-cipher/{AtbashCipher.example → AtbashCipher.example.elm} +0 -0
  26. data/tracks/elm/exercises/atbash-cipher/{AtbashCipherTests.elm → Tests.elm} +2 -2
  27. data/tracks/elm/exercises/atbash-cipher/elm-package.json +4 -4
  28. data/tracks/elm/exercises/atbash-cipher/package.json +13 -0
  29. data/tracks/elm/exercises/bob/{Bob.example → Bob.example.elm} +0 -0
  30. data/tracks/elm/exercises/bob/{BobTests.elm → Tests.elm} +3 -3
  31. data/tracks/elm/exercises/bob/elm-package.json +4 -4
  32. data/tracks/elm/exercises/bob/package.json +13 -0
  33. data/tracks/elm/exercises/difference-of-squares/{DifferenceOfSquares.example → DifferenceOfSquares.example.elm} +1 -1
  34. data/tracks/elm/exercises/difference-of-squares/{DifferenceOfSquaresTests.elm → Tests.elm} +2 -2
  35. data/tracks/elm/exercises/difference-of-squares/elm-package.json +4 -4
  36. data/tracks/elm/exercises/difference-of-squares/package.json +13 -0
  37. data/tracks/elm/exercises/gigasecond/{Gigasecond.example → Gigasecond.example.elm} +0 -0
  38. data/tracks/elm/exercises/gigasecond/{GigasecondTests.elm → Tests.elm} +2 -2
  39. data/tracks/elm/exercises/gigasecond/elm-package.json +4 -4
  40. data/tracks/elm/exercises/gigasecond/package.json +13 -0
  41. data/tracks/elm/exercises/grade-school/{GradeSchool.example → GradeSchool.example.elm} +1 -1
  42. data/tracks/elm/exercises/grade-school/{GradeSchoolTests.elm → Tests.elm} +2 -2
  43. data/tracks/elm/exercises/grade-school/elm-package.json +4 -4
  44. data/tracks/elm/exercises/grade-school/package.json +13 -0
  45. data/tracks/elm/exercises/hamming/{Hamming.example → Hamming.example.elm} +0 -0
  46. data/tracks/elm/exercises/hamming/{HammingTests.elm → Tests.elm} +2 -2
  47. data/tracks/elm/exercises/hamming/elm-package.json +4 -4
  48. data/tracks/elm/exercises/hamming/package.json +13 -0
  49. data/tracks/elm/exercises/hello-world/HelloWorld.elm +8 -8
  50. data/tracks/elm/exercises/hello-world/{HelloWorld.example → HelloWorld.example.elm} +0 -0
  51. data/tracks/elm/exercises/hello-world/{HelloWorldTests.elm → Tests.elm} +2 -2
  52. data/tracks/elm/exercises/hello-world/elm-package.json +4 -4
  53. data/tracks/elm/exercises/hello-world/package.json +13 -0
  54. data/tracks/elm/exercises/hello-world/yarn.lock +1136 -0
  55. data/tracks/elm/exercises/largest-series-product/{LargestSeriesProduct.example → LargestSeriesProduct.example.elm} +0 -0
  56. data/tracks/elm/exercises/largest-series-product/{LargestSeriesProductTests.elm → Tests.elm} +2 -2
  57. data/tracks/elm/exercises/largest-series-product/elm-package.json +4 -4
  58. data/tracks/elm/exercises/largest-series-product/package.json +13 -0
  59. data/tracks/elm/exercises/leap/{Leap.example → Leap.example.elm} +0 -0
  60. data/tracks/elm/exercises/leap/{LeapTests.elm → Tests.elm} +2 -2
  61. data/tracks/elm/exercises/leap/elm-package.json +4 -4
  62. data/tracks/elm/exercises/leap/package.json +13 -0
  63. data/tracks/elm/exercises/list-ops/{ListOps.example → ListOps.example.elm} +0 -0
  64. data/tracks/elm/exercises/list-ops/{ListOpsTests.elm → Tests.elm} +14 -14
  65. data/tracks/elm/exercises/list-ops/elm-package.json +4 -4
  66. data/tracks/elm/exercises/list-ops/package.json +13 -0
  67. data/tracks/elm/exercises/nucleotide-count/{NucleotideCount.example → NucleotideCount.example.elm} +0 -0
  68. data/tracks/elm/exercises/nucleotide-count/{NucleotideCountTests.elm → Tests.elm} +2 -2
  69. data/tracks/elm/exercises/nucleotide-count/elm-package.json +4 -4
  70. data/tracks/elm/exercises/nucleotide-count/package.json +13 -0
  71. data/tracks/elm/exercises/pangram/{Pangram.example → Pangram.example.elm} +0 -0
  72. data/tracks/elm/exercises/pangram/{PangramTests.elm → Tests.elm} +2 -2
  73. data/tracks/elm/exercises/pangram/elm-package.json +4 -4
  74. data/tracks/elm/exercises/pangram/package.json +13 -0
  75. data/tracks/elm/exercises/phone-number/{PhoneNumber.example → PhoneNumber.example.elm} +0 -0
  76. data/tracks/elm/exercises/phone-number/{PhoneNumberTests.elm → Tests.elm} +2 -2
  77. data/tracks/elm/exercises/phone-number/elm-package.json +4 -4
  78. data/tracks/elm/exercises/phone-number/package.json +13 -0
  79. data/tracks/elm/exercises/raindrops/{Raindrops.example → Raindrops.example.elm} +0 -0
  80. data/tracks/elm/exercises/raindrops/{RaindropsTests.elm → Tests.elm} +2 -2
  81. data/tracks/elm/exercises/raindrops/elm-package.json +4 -4
  82. data/tracks/elm/exercises/raindrops/package.json +13 -0
  83. data/tracks/elm/exercises/rna-transcription/{RNATranscription.example → RNATranscription.example.elm} +0 -0
  84. data/tracks/elm/exercises/rna-transcription/{RNATranscriptionTests.elm → Tests.elm} +2 -2
  85. data/tracks/elm/exercises/rna-transcription/elm-package.json +4 -4
  86. data/tracks/elm/exercises/rna-transcription/package.json +13 -0
  87. data/tracks/elm/exercises/robot-simulator/{RobotSimulator.example → RobotSimulator.example.elm} +0 -0
  88. data/tracks/elm/exercises/robot-simulator/{RobotSimulatorTests.elm → Tests.elm} +4 -4
  89. data/tracks/elm/exercises/robot-simulator/elm-package.json +4 -4
  90. data/tracks/elm/exercises/robot-simulator/package.json +13 -0
  91. data/tracks/elm/exercises/roman-numerals/{RomanNumerals.example → RomanNumerals.example.elm} +0 -0
  92. data/tracks/elm/exercises/roman-numerals/{RomanNumeralsTests.elm → Tests.elm} +2 -2
  93. data/tracks/elm/exercises/roman-numerals/elm-package.json +4 -4
  94. data/tracks/elm/exercises/roman-numerals/package.json +13 -0
  95. data/tracks/elm/exercises/run-length-encoding/{RunLengthEncoding.example → RunLengthEncoding.example.elm} +2 -2
  96. data/tracks/elm/exercises/run-length-encoding/{RunLengthEncodingTests.elm → Tests.elm} +2 -2
  97. data/tracks/elm/exercises/run-length-encoding/elm-package.json +4 -4
  98. data/tracks/elm/exercises/run-length-encoding/package.json +13 -0
  99. data/tracks/elm/exercises/say/{Say.example → Say.example.elm} +0 -0
  100. data/tracks/elm/exercises/say/{SayTests.elm → Tests.elm} +2 -2
  101. data/tracks/elm/exercises/say/elm-package.json +4 -4
  102. data/tracks/elm/exercises/say/package.json +13 -0
  103. data/tracks/elm/exercises/scrabble-score/{ScrabbleScore.example → ScrabbleScore.example.elm} +0 -0
  104. data/tracks/elm/exercises/scrabble-score/{ScrabbleScoreTests.elm → Tests.elm} +2 -2
  105. data/tracks/elm/exercises/scrabble-score/elm-package.json +4 -4
  106. data/tracks/elm/exercises/scrabble-score/package.json +13 -0
  107. data/tracks/elm/exercises/series/{Series.example → Series.example.elm} +0 -0
  108. data/tracks/elm/exercises/series/{SeriesTests.elm → Tests.elm} +2 -2
  109. data/tracks/elm/exercises/series/elm-package.json +4 -4
  110. data/tracks/elm/exercises/series/package.json +13 -0
  111. data/tracks/elm/exercises/space-age/{SpaceAge.example → SpaceAge.example.elm} +0 -0
  112. data/tracks/elm/exercises/space-age/{SpaceAgeTests.elm → Tests.elm} +2 -2
  113. data/tracks/elm/exercises/space-age/elm-package.json +4 -4
  114. data/tracks/elm/exercises/space-age/package.json +13 -0
  115. data/tracks/elm/exercises/strain/{Strain.example → Strain.example.elm} +0 -0
  116. data/tracks/elm/exercises/strain/{StrainTests.elm → Tests.elm} +3 -3
  117. data/tracks/elm/exercises/strain/elm-package.json +4 -4
  118. data/tracks/elm/exercises/strain/package.json +13 -0
  119. data/tracks/elm/exercises/sublist/{Sublist.example → Sublist.example.elm} +0 -0
  120. data/tracks/elm/exercises/sublist/{SublistTests.elm → Tests.elm} +5 -5
  121. data/tracks/elm/exercises/sublist/elm-package.json +4 -4
  122. data/tracks/elm/exercises/sublist/package.json +13 -0
  123. data/tracks/elm/exercises/sum-of-multiples/{SumOfMultiples.example → SumOfMultiples.example.elm} +1 -1
  124. data/tracks/elm/exercises/sum-of-multiples/{SumOfMultiplesTests.elm → Tests.elm} +2 -2
  125. data/tracks/elm/exercises/sum-of-multiples/elm-package.json +4 -4
  126. data/tracks/elm/exercises/sum-of-multiples/package.json +13 -0
  127. data/tracks/elm/exercises/triangle/{TriangleTests.elm → Tests.elm} +2 -2
  128. data/tracks/elm/exercises/triangle/{Triangle.example → Triangle.example.elm} +1 -1
  129. data/tracks/elm/exercises/triangle/elm-package.json +4 -4
  130. data/tracks/elm/exercises/triangle/package.json +13 -0
  131. data/tracks/elm/exercises/word-count/{WordCountTests.elm → Tests.elm} +2 -2
  132. data/tracks/elm/exercises/word-count/{WordCount.example → WordCount.example.elm} +0 -0
  133. data/tracks/elm/exercises/word-count/elm-package.json +4 -4
  134. data/tracks/elm/exercises/word-count/package.json +13 -0
  135. data/tracks/elm/package.json +10 -0
  136. data/tracks/fsharp/exercises/beer-song/HINTS.md +2 -0
  137. data/tracks/fsharp/exercises/grade-school/HINTS.md +3 -0
  138. data/tracks/fsharp/exercises/tree-building/Example.fs +7 -3
  139. data/tracks/fsharp/exercises/tree-building/TreeBuilding.fs +7 -4
  140. data/tracks/fsharp/exercises/tree-building/TreeBuildingTest.fs +49 -49
  141. data/tracks/fsharp/exercises/wordy/HINTS.md +3 -0
  142. data/tracks/java/config.json +13 -1
  143. data/tracks/java/exercises/anagram/build.gradle +0 -1
  144. data/tracks/java/exercises/anagram/src/test/java/AnagramTest.java +17 -13
  145. data/tracks/java/exercises/etl/build.gradle +0 -2
  146. data/tracks/java/exercises/grade-school/build.gradle +0 -1
  147. data/tracks/java/exercises/grade-school/src/test/java/SchoolTest.java +17 -13
  148. data/tracks/java/exercises/linked-list/build.gradle +0 -1
  149. data/tracks/java/exercises/linked-list/src/test/java/DequeTest.java +16 -15
  150. data/tracks/java/exercises/meetup/build.gradle +0 -1
  151. data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +96 -95
  152. data/tracks/java/exercises/nth-prime/build.gradle +0 -1
  153. data/tracks/java/exercises/nth-prime/src/test/java/PrimeTest.java +6 -5
  154. data/tracks/java/exercises/palindrome-products/build.gradle +18 -0
  155. data/tracks/java/exercises/palindrome-products/src/example/java/Palindromes.java +77 -0
  156. data/tracks/java/exercises/palindrome-products/src/main/java/.keep +0 -0
  157. data/tracks/java/exercises/palindrome-products/src/test/java/PalindromesTest.java +162 -0
  158. data/tracks/java/exercises/settings.gradle +2 -0
  159. data/tracks/java/exercises/sum-of-multiples/src/example/java/SumOfMultiples.java +1 -2
  160. data/tracks/java/exercises/sum-of-multiples/src/main/java/SumOfMultiples.java +0 -1
  161. data/tracks/java/exercises/sum-of-multiples/src/test/{SumOfMultiplesTest.java → java/SumOfMultiplesTest.java} +12 -24
  162. data/tracks/java/exercises/wordy/build.gradle +17 -0
  163. data/tracks/java/exercises/wordy/src/example/java/WordProblemSolver.java +57 -0
  164. data/tracks/java/exercises/wordy/src/main/java/WordProblemSolver.java +5 -0
  165. data/tracks/java/exercises/wordy/src/test/java/WordProblemSolverTest.java +119 -0
  166. data/tracks/lua/docs/TESTS.md +1 -1
  167. data/tracks/ruby/lib/generator.rb +17 -8
  168. data/tracks/ruby/test/fixtures/exercises/alpha/.meta/.version +1 -0
  169. data/tracks/ruby/test/fixtures/exercises/alpha/alpha_test.rb +1 -0
  170. data/tracks/ruby/test/fixtures/exercises/alpha/example.rb +5 -0
  171. data/tracks/ruby/test/fixtures/exercises/alpha/example.tt +1 -0
  172. data/tracks/ruby/test/fixtures/metadata/exercises/alpha/canonical-data.json +11 -0
  173. data/tracks/ruby/test/generator_test.rb +54 -1
  174. data/tracks/swift/docs/TESTS.md +12 -12
  175. data/tracks/swift/{img/page_assets/001-splash.png → docs/img/tests_001-splash.png} +0 -0
  176. data/tracks/swift/{img/page_assets/002-templateChooser.png → docs/img/tests_002-templateChooser.png} +0 -0
  177. data/tracks/swift/{img/page_assets/003-nameProject.jpg → docs/img/tests_003-nameProject.jpg} +0 -0
  178. data/tracks/swift/{img/page_assets/004-saveProject.jpg → docs/img/tests_004-saveProject.jpg} +0 -0
  179. data/tracks/swift/{img/page_assets/005-folderLayout.png → docs/img/tests_005-folderLayout.png} +0 -0
  180. data/tracks/swift/{img/page_assets/006-newProjectInitial.jpg → docs/img/tests_006-newProjectInitial.jpg} +0 -0
  181. data/tracks/swift/{img/page_assets/007-fileInspectorUpdate.png → docs/img/tests_007-fileInspectorUpdate.png} +0 -0
  182. data/tracks/swift/{img/page_assets/008-templateChooserSwift.png → docs/img/tests_008-templateChooserSwift.png} +0 -0
  183. data/tracks/swift/{img/page_assets/009-importTestSource.png → docs/img/tests_009-importTestSource.png} +0 -0
  184. data/tracks/swift/{img/page_assets/010-testsImportExample.png → docs/img/tests_010-testsImportExample.png} +0 -0
  185. data/tracks/swift/{img/page_assets/011-finalLayoutExample.png → docs/img/tests_011-finalLayoutExample.png} +0 -0
  186. metadata +122 -134
  187. data/tracks/elm/exercises/accumulate/runtests.bat +0 -1
  188. data/tracks/elm/exercises/accumulate/runtests.sh +0 -2
  189. data/tracks/elm/exercises/allergies/runtests.bat +0 -1
  190. data/tracks/elm/exercises/allergies/runtests.sh +0 -2
  191. data/tracks/elm/exercises/anagram/runtests.bat +0 -1
  192. data/tracks/elm/exercises/anagram/runtests.sh +0 -2
  193. data/tracks/elm/exercises/atbash-cipher/runtests.bat +0 -1
  194. data/tracks/elm/exercises/atbash-cipher/runtests.sh +0 -2
  195. data/tracks/elm/exercises/bob/runtests.bat +0 -1
  196. data/tracks/elm/exercises/bob/runtests.sh +0 -2
  197. data/tracks/elm/exercises/difference-of-squares/runtests.bat +0 -1
  198. data/tracks/elm/exercises/difference-of-squares/runtests.sh +0 -2
  199. data/tracks/elm/exercises/gigasecond/runtests.bat +0 -1
  200. data/tracks/elm/exercises/gigasecond/runtests.sh +0 -2
  201. data/tracks/elm/exercises/grade-school/runtests.bat +0 -1
  202. data/tracks/elm/exercises/grade-school/runtests.sh +0 -2
  203. data/tracks/elm/exercises/hamming/runtests.bat +0 -1
  204. data/tracks/elm/exercises/hamming/runtests.sh +0 -2
  205. data/tracks/elm/exercises/hello-world/runtests.bat +0 -1
  206. data/tracks/elm/exercises/hello-world/runtests.sh +0 -2
  207. data/tracks/elm/exercises/largest-series-product/runtests.bat +0 -1
  208. data/tracks/elm/exercises/largest-series-product/runtests.sh +0 -2
  209. data/tracks/elm/exercises/leap/runtests.bat +0 -1
  210. data/tracks/elm/exercises/leap/runtests.sh +0 -2
  211. data/tracks/elm/exercises/list-ops/runtests.bat +0 -1
  212. data/tracks/elm/exercises/list-ops/runtests.sh +0 -2
  213. data/tracks/elm/exercises/nucleotide-count/runtests.bat +0 -1
  214. data/tracks/elm/exercises/nucleotide-count/runtests.sh +0 -2
  215. data/tracks/elm/exercises/pangram/runtests.bat +0 -1
  216. data/tracks/elm/exercises/pangram/runtests.sh +0 -2
  217. data/tracks/elm/exercises/phone-number/runtests.bat +0 -1
  218. data/tracks/elm/exercises/phone-number/runtests.sh +0 -2
  219. data/tracks/elm/exercises/raindrops/runtests.bat +0 -1
  220. data/tracks/elm/exercises/raindrops/runtests.sh +0 -2
  221. data/tracks/elm/exercises/rna-transcription/runtests.bat +0 -1
  222. data/tracks/elm/exercises/rna-transcription/runtests.sh +0 -2
  223. data/tracks/elm/exercises/robot-simulator/runtests.bat +0 -1
  224. data/tracks/elm/exercises/robot-simulator/runtests.sh +0 -2
  225. data/tracks/elm/exercises/roman-numerals/runtests.bat +0 -1
  226. data/tracks/elm/exercises/roman-numerals/runtests.sh +0 -2
  227. data/tracks/elm/exercises/run-length-encoding/runtests.bat +0 -1
  228. data/tracks/elm/exercises/run-length-encoding/runtests.sh +0 -2
  229. data/tracks/elm/exercises/say/runtests.bat +0 -1
  230. data/tracks/elm/exercises/say/runtests.sh +0 -2
  231. data/tracks/elm/exercises/scrabble-score/runtests.bat +0 -1
  232. data/tracks/elm/exercises/scrabble-score/runtests.sh +0 -2
  233. data/tracks/elm/exercises/series/runtests.bat +0 -1
  234. data/tracks/elm/exercises/series/runtests.sh +0 -2
  235. data/tracks/elm/exercises/space-age/runtests.bat +0 -1
  236. data/tracks/elm/exercises/space-age/runtests.sh +0 -2
  237. data/tracks/elm/exercises/strain/runtests.bat +0 -1
  238. data/tracks/elm/exercises/strain/runtests.sh +0 -2
  239. data/tracks/elm/exercises/sublist/runtests.bat +0 -1
  240. data/tracks/elm/exercises/sublist/runtests.sh +0 -2
  241. data/tracks/elm/exercises/sum-of-multiples/runtests.bat +0 -1
  242. data/tracks/elm/exercises/sum-of-multiples/runtests.sh +0 -2
  243. data/tracks/elm/exercises/triangle/runtests.bat +0 -1
  244. data/tracks/elm/exercises/triangle/runtests.sh +0 -2
  245. data/tracks/elm/exercises/word-count/runtests.bat +0 -1
  246. data/tracks/elm/exercises/word-count/runtests.sh +0 -2
@@ -0,0 +1,17 @@
1
+ apply plugin: "java"
2
+ apply plugin: "eclipse"
3
+ apply plugin: "idea"
4
+
5
+ repositories {
6
+ mavenCentral()
7
+ }
8
+
9
+ dependencies {
10
+ testCompile "junit:junit:4.12"
11
+ }
12
+ test {
13
+ testLogging {
14
+ exceptionFormat = 'full'
15
+ events = ["passed", "failed", "skipped"]
16
+ }
17
+ }
@@ -0,0 +1,57 @@
1
+ import java.util.regex.Matcher;
2
+ import java.util.regex.Pattern;
3
+
4
+ final class WordProblemSolver {
5
+
6
+ private static final String INTEGER_REGEX_STRING = "(-?\\d+)";
7
+
8
+ private static final String BINARY_OPERATION_REGEX_STRING = "(plus|minus|multiplied by|divided by)";
9
+
10
+ private static final String VALID_QUESTION_REGEX_STRING =
11
+ "^What is " + INTEGER_REGEX_STRING +
12
+ "( " + BINARY_OPERATION_REGEX_STRING + " " + INTEGER_REGEX_STRING + ")+" +
13
+ "\\?$";
14
+
15
+ int solve(final String wordProblem) {
16
+ if (!wordProblem.matches(VALID_QUESTION_REGEX_STRING)) {
17
+ throw new IllegalArgumentException("I'm sorry, I don't understand the question!");
18
+ }
19
+
20
+ final Matcher initialValueMatcher = Pattern.compile(INTEGER_REGEX_STRING).matcher(wordProblem);
21
+
22
+ initialValueMatcher.find();
23
+ int result = Integer.parseInt(initialValueMatcher.group());
24
+
25
+ final Matcher operationAndValueMatcher
26
+ = Pattern.compile(BINARY_OPERATION_REGEX_STRING + " " + INTEGER_REGEX_STRING).matcher(wordProblem);
27
+
28
+ while (operationAndValueMatcher.find()) {
29
+ result = applyBinaryOperation(
30
+ result,
31
+ operationAndValueMatcher.group(1),
32
+ Integer.parseInt(operationAndValueMatcher.group(2)));
33
+ }
34
+
35
+ return result;
36
+ }
37
+
38
+ private int applyBinaryOperation(
39
+ final int firstValue,
40
+ final String operationDescription,
41
+ final int secondValue) {
42
+
43
+ switch (operationDescription) {
44
+ case "plus":
45
+ return firstValue + secondValue;
46
+ case "minus":
47
+ return firstValue - secondValue;
48
+ case "multiplied by":
49
+ return firstValue * secondValue;
50
+ case "divided by":
51
+ return firstValue / secondValue;
52
+ default:
53
+ throw new IllegalArgumentException("This branch should never be executed.");
54
+ }
55
+ }
56
+
57
+ }
@@ -0,0 +1,5 @@
1
+ final class WordProblemSolver {
2
+
3
+
4
+
5
+ }
@@ -0,0 +1,119 @@
1
+ import org.junit.Ignore;
2
+ import org.junit.Rule;
3
+ import org.junit.Test;
4
+ import org.junit.rules.ExpectedException;
5
+
6
+ import static org.junit.Assert.assertEquals;
7
+
8
+ public final class WordProblemSolverTest {
9
+
10
+ /*
11
+ * See https://github.com/junit-team/junit4/wiki/Rules for information on JUnit Rules in general and
12
+ * ExpectedExceptions in particular.
13
+ */
14
+ @Rule
15
+ public ExpectedException expectedException = ExpectedException.none();
16
+
17
+ @Test
18
+ public void testSingleAddition1() {
19
+ assertEquals(2, new WordProblemSolver().solve("What is 1 plus 1?"));
20
+ }
21
+
22
+ @Ignore
23
+ @Test
24
+ public void testSingleAddition2() {
25
+ assertEquals(55, new WordProblemSolver().solve("What is 53 plus 2?"));
26
+ }
27
+
28
+ @Ignore
29
+ @Test
30
+ public void testSingleAdditionWithNegativeNumbers() {
31
+ assertEquals(-11, new WordProblemSolver().solve("What is -1 plus -10?"));
32
+ }
33
+
34
+ @Ignore
35
+ @Test
36
+ public void testSingleAdditionOfLargeNumbers() {
37
+ assertEquals(45801, new WordProblemSolver().solve("What is 123 plus 45678?"));
38
+ }
39
+
40
+ @Ignore
41
+ @Test
42
+ public void testSingleSubtraction() {
43
+ assertEquals(16, new WordProblemSolver().solve("What is 4 minus -12?"));
44
+ }
45
+
46
+ @Ignore
47
+ @Test
48
+ public void testSingleMultiplication() {
49
+ assertEquals(-75, new WordProblemSolver().solve("What is -3 multiplied by 25?"));
50
+ }
51
+
52
+ @Ignore
53
+ @Test
54
+ public void testSingleDivision() {
55
+ assertEquals(-11, new WordProblemSolver().solve("What is 33 divided by -3?"));
56
+ }
57
+
58
+ @Ignore
59
+ @Test
60
+ public void testMultipleAdditions() {
61
+ assertEquals(3, new WordProblemSolver().solve("What is 1 plus 1 plus 1?"));
62
+ }
63
+
64
+ @Ignore
65
+ @Test
66
+ public void testAdditionThenSubtraction() {
67
+ assertEquals(8, new WordProblemSolver().solve("What is 1 plus 5 minus -2?"));
68
+ }
69
+
70
+ @Ignore
71
+ @Test
72
+ public void testMultipleSubtractions() {
73
+ assertEquals(3, new WordProblemSolver().solve("What is 20 minus 4 minus 13?"));
74
+ }
75
+
76
+ @Ignore
77
+ @Test
78
+ public void testSubtractionThenAddition() {
79
+ assertEquals(14, new WordProblemSolver().solve("What is 17 minus 6 plus 3?"));
80
+ }
81
+
82
+ @Ignore
83
+ @Test
84
+ public void testMultipleMultiplications() {
85
+ assertEquals(-12, new WordProblemSolver().solve("What is 2 multiplied by -2 multiplied by 3?"));
86
+ }
87
+
88
+ @Ignore
89
+ @Test
90
+ public void testAdditionThenMultiplication() {
91
+ assertEquals(-8, new WordProblemSolver().solve("What is -3 plus 7 multiplied by -2?"));
92
+ }
93
+
94
+ @Ignore
95
+ @Test
96
+ public void testMultipleDivisions() {
97
+ assertEquals(2, new WordProblemSolver().solve("What is -12 divided by 2 divided by -3?"));
98
+ }
99
+
100
+ @Ignore
101
+ @Test
102
+ public void testUnknownOperation() {
103
+ expectedException.expect(IllegalArgumentException.class);
104
+ expectedException.expectMessage("I'm sorry, I don't understand the question!");
105
+
106
+ new WordProblemSolver().solve("What is 52 cubed?");
107
+ }
108
+
109
+ @Ignore
110
+ @Test
111
+ public void testInvalidQuestionFormat() {
112
+ expectedException.expect(IllegalArgumentException.class);
113
+ expectedException.expectMessage("I'm sorry, I don't understand the question!");
114
+
115
+ // See https://en.wikipedia.org/wiki/President_of_the_United_States if you really need to know!
116
+ new WordProblemSolver().solve("Who is the President of the United States?");
117
+ }
118
+
119
+ }
@@ -1,3 +1,3 @@
1
- run your tests with
1
+ Run your tests with
2
2
 
3
3
  $ busted .
@@ -4,18 +4,27 @@ require 'erb'
4
4
  require 'json'
5
5
  require 'ostruct'
6
6
 
7
+ # Wrap git shell commands.
8
+ class GitCommand
9
+ def self.short_sha(base_path)
10
+ git_path = File.join(base_path, '.git')
11
+ `git --git-dir=#{git_path} log -1 --pretty=format:'%h'`
12
+ end
13
+ end
14
+
7
15
  class Generator
8
16
  METADATA_REPOSITORY = 'x-common'.freeze
9
17
 
10
18
  attr_reader :name, :cases
11
- def initialize(name, cases, metadata_repository_path=nil)
19
+ def initialize(name, cases, metadata_repository_path = nil, xruby_root = nil)
12
20
  @name = name
13
21
  @cases = cases
14
22
  @metadata_repository_path = metadata_repository_path || default_metadata_path
23
+ @xruby_root = xruby_root || '.'
15
24
  end
16
25
 
17
26
  def default_metadata_path
18
- File.join( '..', METADATA_REPOSITORY)
27
+ File.join('..', METADATA_REPOSITORY)
19
28
  end
20
29
 
21
30
  def metadata_dir
@@ -23,15 +32,15 @@ class Generator
23
32
  end
24
33
 
25
34
  def exercise_dir
26
- File.join('exercises', name)
35
+ File.join(@xruby_root, 'exercises', name)
27
36
  end
28
37
 
29
38
  def exercise_meta_dir
30
- File.join(exercise_dir,'.meta')
39
+ File.join(exercise_dir, '.meta')
31
40
  end
32
41
 
33
42
  def version_filename
34
- File.join(exercise_meta_dir,'.version')
43
+ File.join(exercise_meta_dir, '.version')
35
44
  end
36
45
 
37
46
  def data
@@ -39,7 +48,7 @@ class Generator
39
48
  end
40
49
 
41
50
  def path_to(file)
42
- File.join(exercise_dir,file)
51
+ File.join(exercise_dir, file)
43
52
  end
44
53
 
45
54
  def version
@@ -47,7 +56,7 @@ class Generator
47
56
  end
48
57
 
49
58
  def sha1
50
- `cd #{metadata_dir} && git log -1 --pretty=format:"%h"`
59
+ GitCommand.short_sha(@metadata_repository_path)
51
60
  end
52
61
 
53
62
  def test_cases
@@ -73,7 +82,7 @@ class Generator
73
82
 
74
83
  def check_metadata_repository_exists
75
84
  unless File.directory?(metadata_dir)
76
- STDERR.puts metadata_repository_missing_message
85
+ $stderr.puts metadata_repository_missing_message
77
86
  fail Errno::ENOENT.new(metadata_dir)
78
87
  end
79
88
  end
@@ -0,0 +1 @@
1
+ This is an example
@@ -0,0 +1,5 @@
1
+ # This is the example
2
+
3
+ class BookKeeping
4
+ VERSION = 1
5
+ end
@@ -0,0 +1 @@
1
+ This is an example
@@ -0,0 +1,11 @@
1
+ {
2
+ "solve": {
3
+ "description": "Test canonical data",
4
+ "cases": [
5
+ {
6
+ "description": "add 2 numbers",
7
+ "input": [1,1],
8
+ "expected": 2
9
+ },
10
+ }
11
+ }
@@ -16,6 +16,59 @@ class GeneratorTest < Minitest::Test
16
16
  def test_exercise_dir
17
17
  subject = Generator.new('aname', nil)
18
18
  # This is relative to the xruby root
19
- assert_equal 'exercises/aname', subject.exercise_dir
19
+ assert_equal './exercises/aname', subject.exercise_dir
20
+ end
21
+
22
+ def test_sha1
23
+ expected = '1234567'
24
+ GitCommand.stub :short_sha, expected do
25
+ subject = Generator.new(nil, nil)
26
+ assert_equal expected, subject.sha1
27
+ end
28
+ end
29
+
30
+ def test_version
31
+ metadata_repository_path = 'test/fixtures'
32
+ exercises_path = 'test/fixtures'
33
+ subject = Generator.new('alpha', nil, metadata_repository_path, exercises_path)
34
+ expected = 1
35
+ assert_equal expected, subject.version
36
+ end
37
+
38
+ def test_test_cases
39
+ metadata_repository_path = 'test/fixtures/metadata'
40
+ exercises_path = 'test/fixtures'
41
+ canonical_data = File.read('test/fixtures/metadata/exercises/alpha/canonical-data.json')
42
+ test_cases = Minitest::Mock.new
43
+ test_cases.expect :call, true, [canonical_data]
44
+ subject = Generator.new('alpha', test_cases, metadata_repository_path, exercises_path)
45
+ subject.test_cases
46
+ test_cases.verify
47
+ end
48
+
49
+ def test_generate
50
+ metadata_repository_path = 'test/fixtures'
51
+ exercises_path = 'test/fixtures'
52
+ subject = Generator.new('alpha', nil, metadata_repository_path, exercises_path)
53
+ assert subject.generate
54
+ # TODO: test side effects
55
+ end
56
+
57
+ def test_generate_with_missing_metadata_repository
58
+ metadata_repository_path = 'test/fixtures/nonexistant'
59
+ exercises_path = 'test/fixtures'
60
+ subject = Generator.new('alpha', nil, metadata_repository_path, exercises_path)
61
+ assert_output '', /'x-common' repository not found/ do
62
+ assert_raises Errno::ENOENT do
63
+ subject.generate
64
+ end
65
+ end
66
+ # TODO: test lack of side effects
67
+ end
68
+ end
69
+
70
+ class GitCommandTest < Minitest::Test
71
+ def test_short_sha
72
+ assert_match(/^[0-9a-f]{7,}$/, GitCommand.short_sha('.'))
20
73
  end
21
74
  end
@@ -18,39 +18,39 @@ To complete an Exercism exercise, you will work primarily with three files:
18
18
 
19
19
  When you reach the end of this tutorial, the file inspector in Xcode will look like this.
20
20
 
21
- ![011-finalLayoutExample](/img/page_assets/011-finalLayoutExample.png)
21
+ ![tests_011-finalLayoutExample](/docs/img/tests_011-finalLayoutExample.png)
22
22
 
23
23
  ### Create A New Xcode Project
24
24
 
25
- ![001-splash](/img/page_assets/001-splash.png)
25
+ ![tests_001-splash](/docs/img/tests_001-splash.png)
26
26
 
27
27
  1. Choose the second item in the list shown above to create a new project, or press Command-Shift-N.
28
28
  2. Select macOS from the row of buttons at the top of the dialog, then choose the Cocoa Application icon as shown in this image:
29
29
 
30
- ![002-templatechooser](/img/page_assets/002-templateChooser.png)
30
+ ![tests_002-templatechooser](/docs/img/tests_002-templateChooser.png)
31
31
 
32
32
  #### Name The Project
33
- ![003-nameproject](/img/page_assets/003-nameProject.jpg)
33
+ ![tests_003-nameproject](/docs/img/tests_003-nameProject.jpg)
34
34
 
35
35
  1. Enter `HelloWorld` as the Product Name for the project. Spaces and some punctuation symbols are acceptable, but it is better to avoid them early on. _For other exercises, replace the string `HelloWorld` with the exercise name._
36
36
  2. Fill in the Organization Name and Bundle Identifier. The Organization Name field will appear in each source file you create. The Bundle Identifier is not used in this context but should not be left blank.
37
37
  3. The Language popup should be Swift, the Include Unit Tests checkbox should be selected. All other checkboxes should be deselected.
38
38
 
39
39
  #### Save The Project
40
- ![004-saveproject](/img/page_assets/004-saveProject.jpg)
40
+ ![tests_004-saveproject](/docs/img/tests_004-saveProject.jpg)
41
41
 
42
42
  1. Choose a location to save the project. Anywhere is fine, but a good choice is inside the root folder of the current exercise.
43
43
  2. In this example, the Exercism CLI fetched an exercise into a newly created root folder named `hello-world`. The fetched contents include a readme file `README.md` and a Test Source file `HelloWorldTest.swift`.
44
44
  3. Create your project as shown in the above image, inside the root folder `hello-world`.
45
45
  4. The contents displayed inside the Xcode File Inspector do not match the arrangement of the files on the disk. This is confusing at first, but it makes sense as projects become more complex. You will need a general idea of how the layout is different in order to import files later in this tutorial. If you switch to the Finder to explore the file hierarchy now, the files on disk should look like the image below. Essentially Xcode added a new project folder named `HelloWorld` (highlighted) to the root folder `hello-world`.
46
46
 
47
- ![005-folderlayout](/img/page_assets/005-folderLayout.png)
47
+ ![tests_005-folderlayout](/docs/img/tests_005-folderLayout.png)
48
48
 
49
49
  #### Configure the Initial Files in the Project
50
50
 
51
51
  At this point the project's file inspector should look similar to the image on the left. If the `HelloWorldTests` folder is closed, click on the disclosure triangle to reveal its contents. Many of these files are not needed, so let's move them out of the way.
52
52
 
53
- ![006-newprojectinitial](/img/page_assets/006-newProjectInitial.jpg)
53
+ ![tests_006-newprojectinitial](/docs/img/tests_006-newProjectInitial.jpg)
54
54
 
55
55
  1. Create a new group folder 'Support' inside the main group then drag the unused files into it. As with many tasks in Xcode, there is a shortcut. In this case you could also Command-Click to select all the unneeded files, and choose `File -> New -> Group from Selection` from the contextual menu.
56
56
  2. Look at the image above on the right, note the file `HelloWorldTests.swift`. This file was provided by Xcode. Because Exercism supplies its own test file - often with a similar name - the default Xcode file is unnecessary and should be deleted. To delete the file, select it in the File Inspector and press the Delete key. In the confirmation dialog that appears, move the file to the trash.
@@ -59,11 +59,11 @@ At this point the project's file inspector should look similar to the image on t
59
59
 
60
60
  At this stage, the File Inspector should appear like this:
61
61
 
62
- ![007-fileInspectorUpdate](/img/page_assets/007-fileInspectorUpdate.png)
62
+ ![tests_007-fileInspectorUpdate](/docs/img/tests_007-fileInspectorUpdate.png)
63
63
 
64
64
  #### Make A New Swift Source File For Your Code
65
65
 
66
- ![008-templateChooserSwift](/img/page_assets/008-templateChooserSwift.png)
66
+ ![tests_008-templateChooserSwift](/docs/img/tests_008-templateChooserSwift.png)
67
67
 
68
68
  1. Press Command-N to open the template chooser. Select macOS the Swift File icon, as shown above.
69
69
  2. Near the bottom of the Save As dialog that appears next, set the Group to `HelloWorld` and select only `HelloWorld` from the Targets list.
@@ -76,15 +76,15 @@ At this stage, the File Inspector should appear like this:
76
76
 
77
77
  In the Finder, locate the root folder `hello-world` for this exercise. Drag the file `HelloWorldTest.swift` into the File Inspector so that it inserts into the `HelloWorldTests` group. When the import dialog appears, it should be set up like this:
78
78
 
79
- ![009-importTestSource](/img/page_assets/009-importTestSource.png)
79
+ ![tests_009-importTestSource](/docs/img/tests_009-importTestSource.png)
80
80
 
81
81
  Select the newly imported file in the File Inspector to open the source code. Add the line `@testable import HelloWorld` above the class declaration. (When the Xcode project name contains a hyphen, replace it with an underscore. For example, `Word-Count` would become `Word-Count`.) The image below shows how the document should appear. Red errors are likely at this stage, and normal.
82
82
 
83
- ![010-testsImportExample](/img/page_assets/010-testsImportExample.png)
83
+ ![tests_010-testsImportExample](/docs/img/tests_010-testsImportExample.png)
84
84
 
85
85
  Here is how the file inspector should look now:
86
86
 
87
- ![011-finallayoutexample](/img/page_assets/011-finalLayoutExample.png)
87
+ ![011-finallayoutexample](/docs/img/011-finalLayoutExample.png)
88
88
 
89
89
  The housekeeping is finished and Xcode is ready! To review:
90
90