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.
- checksums.yaml +4 -4
- data/common/exercises/tree-building/description.md +15 -3
- data/lib/trackler/version.rb +1 -1
- data/tracks/ecmascript/exercises/queen-attack/queen-attack.spec.js +1 -1
- data/tracks/elm/.gitignore +1 -0
- data/tracks/elm/.travis.yml +3 -3
- data/tracks/elm/SETUP.md +16 -3
- data/tracks/elm/bin/build.sh +10 -10
- data/tracks/elm/bin/install-elm-format +1 -1
- data/tracks/elm/docs/INSTALLATION.md +2 -2
- data/tracks/elm/docs/TESTS.md +3 -3
- data/tracks/elm/elm-package.json +5 -5
- data/tracks/elm/exercises/accumulate/{Accumulate.example → Accumulate.example.elm} +0 -0
- data/tracks/elm/exercises/accumulate/{AccumulateTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/accumulate/elm-package.json +4 -4
- data/tracks/elm/exercises/accumulate/package.json +13 -0
- data/tracks/elm/exercises/allergies/{Allergies.example → Allergies.example.elm} +2 -2
- data/tracks/elm/exercises/allergies/{AllergiesTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/allergies/elm-package.json +4 -4
- data/tracks/elm/exercises/allergies/package.json +13 -0
- data/tracks/elm/exercises/anagram/{Anagram.example → Anagram.example.elm} +0 -0
- data/tracks/elm/exercises/anagram/{AnagramTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/anagram/elm-package.json +4 -4
- data/tracks/elm/exercises/anagram/package.json +13 -0
- data/tracks/elm/exercises/atbash-cipher/{AtbashCipher.example → AtbashCipher.example.elm} +0 -0
- data/tracks/elm/exercises/atbash-cipher/{AtbashCipherTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/atbash-cipher/elm-package.json +4 -4
- data/tracks/elm/exercises/atbash-cipher/package.json +13 -0
- data/tracks/elm/exercises/bob/{Bob.example → Bob.example.elm} +0 -0
- data/tracks/elm/exercises/bob/{BobTests.elm → Tests.elm} +3 -3
- data/tracks/elm/exercises/bob/elm-package.json +4 -4
- data/tracks/elm/exercises/bob/package.json +13 -0
- data/tracks/elm/exercises/difference-of-squares/{DifferenceOfSquares.example → DifferenceOfSquares.example.elm} +1 -1
- data/tracks/elm/exercises/difference-of-squares/{DifferenceOfSquaresTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/difference-of-squares/elm-package.json +4 -4
- data/tracks/elm/exercises/difference-of-squares/package.json +13 -0
- data/tracks/elm/exercises/gigasecond/{Gigasecond.example → Gigasecond.example.elm} +0 -0
- data/tracks/elm/exercises/gigasecond/{GigasecondTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/gigasecond/elm-package.json +4 -4
- data/tracks/elm/exercises/gigasecond/package.json +13 -0
- data/tracks/elm/exercises/grade-school/{GradeSchool.example → GradeSchool.example.elm} +1 -1
- data/tracks/elm/exercises/grade-school/{GradeSchoolTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/grade-school/elm-package.json +4 -4
- data/tracks/elm/exercises/grade-school/package.json +13 -0
- data/tracks/elm/exercises/hamming/{Hamming.example → Hamming.example.elm} +0 -0
- data/tracks/elm/exercises/hamming/{HammingTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/hamming/elm-package.json +4 -4
- data/tracks/elm/exercises/hamming/package.json +13 -0
- data/tracks/elm/exercises/hello-world/HelloWorld.elm +8 -8
- data/tracks/elm/exercises/hello-world/{HelloWorld.example → HelloWorld.example.elm} +0 -0
- data/tracks/elm/exercises/hello-world/{HelloWorldTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/hello-world/elm-package.json +4 -4
- data/tracks/elm/exercises/hello-world/package.json +13 -0
- data/tracks/elm/exercises/hello-world/yarn.lock +1136 -0
- data/tracks/elm/exercises/largest-series-product/{LargestSeriesProduct.example → LargestSeriesProduct.example.elm} +0 -0
- data/tracks/elm/exercises/largest-series-product/{LargestSeriesProductTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/largest-series-product/elm-package.json +4 -4
- data/tracks/elm/exercises/largest-series-product/package.json +13 -0
- data/tracks/elm/exercises/leap/{Leap.example → Leap.example.elm} +0 -0
- data/tracks/elm/exercises/leap/{LeapTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/leap/elm-package.json +4 -4
- data/tracks/elm/exercises/leap/package.json +13 -0
- data/tracks/elm/exercises/list-ops/{ListOps.example → ListOps.example.elm} +0 -0
- data/tracks/elm/exercises/list-ops/{ListOpsTests.elm → Tests.elm} +14 -14
- data/tracks/elm/exercises/list-ops/elm-package.json +4 -4
- data/tracks/elm/exercises/list-ops/package.json +13 -0
- data/tracks/elm/exercises/nucleotide-count/{NucleotideCount.example → NucleotideCount.example.elm} +0 -0
- data/tracks/elm/exercises/nucleotide-count/{NucleotideCountTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/nucleotide-count/elm-package.json +4 -4
- data/tracks/elm/exercises/nucleotide-count/package.json +13 -0
- data/tracks/elm/exercises/pangram/{Pangram.example → Pangram.example.elm} +0 -0
- data/tracks/elm/exercises/pangram/{PangramTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/pangram/elm-package.json +4 -4
- data/tracks/elm/exercises/pangram/package.json +13 -0
- data/tracks/elm/exercises/phone-number/{PhoneNumber.example → PhoneNumber.example.elm} +0 -0
- data/tracks/elm/exercises/phone-number/{PhoneNumberTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/phone-number/elm-package.json +4 -4
- data/tracks/elm/exercises/phone-number/package.json +13 -0
- data/tracks/elm/exercises/raindrops/{Raindrops.example → Raindrops.example.elm} +0 -0
- data/tracks/elm/exercises/raindrops/{RaindropsTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/raindrops/elm-package.json +4 -4
- data/tracks/elm/exercises/raindrops/package.json +13 -0
- data/tracks/elm/exercises/rna-transcription/{RNATranscription.example → RNATranscription.example.elm} +0 -0
- data/tracks/elm/exercises/rna-transcription/{RNATranscriptionTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/rna-transcription/elm-package.json +4 -4
- data/tracks/elm/exercises/rna-transcription/package.json +13 -0
- data/tracks/elm/exercises/robot-simulator/{RobotSimulator.example → RobotSimulator.example.elm} +0 -0
- data/tracks/elm/exercises/robot-simulator/{RobotSimulatorTests.elm → Tests.elm} +4 -4
- data/tracks/elm/exercises/robot-simulator/elm-package.json +4 -4
- data/tracks/elm/exercises/robot-simulator/package.json +13 -0
- data/tracks/elm/exercises/roman-numerals/{RomanNumerals.example → RomanNumerals.example.elm} +0 -0
- data/tracks/elm/exercises/roman-numerals/{RomanNumeralsTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/roman-numerals/elm-package.json +4 -4
- data/tracks/elm/exercises/roman-numerals/package.json +13 -0
- data/tracks/elm/exercises/run-length-encoding/{RunLengthEncoding.example → RunLengthEncoding.example.elm} +2 -2
- data/tracks/elm/exercises/run-length-encoding/{RunLengthEncodingTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/run-length-encoding/elm-package.json +4 -4
- data/tracks/elm/exercises/run-length-encoding/package.json +13 -0
- data/tracks/elm/exercises/say/{Say.example → Say.example.elm} +0 -0
- data/tracks/elm/exercises/say/{SayTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/say/elm-package.json +4 -4
- data/tracks/elm/exercises/say/package.json +13 -0
- data/tracks/elm/exercises/scrabble-score/{ScrabbleScore.example → ScrabbleScore.example.elm} +0 -0
- data/tracks/elm/exercises/scrabble-score/{ScrabbleScoreTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/scrabble-score/elm-package.json +4 -4
- data/tracks/elm/exercises/scrabble-score/package.json +13 -0
- data/tracks/elm/exercises/series/{Series.example → Series.example.elm} +0 -0
- data/tracks/elm/exercises/series/{SeriesTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/series/elm-package.json +4 -4
- data/tracks/elm/exercises/series/package.json +13 -0
- data/tracks/elm/exercises/space-age/{SpaceAge.example → SpaceAge.example.elm} +0 -0
- data/tracks/elm/exercises/space-age/{SpaceAgeTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/space-age/elm-package.json +4 -4
- data/tracks/elm/exercises/space-age/package.json +13 -0
- data/tracks/elm/exercises/strain/{Strain.example → Strain.example.elm} +0 -0
- data/tracks/elm/exercises/strain/{StrainTests.elm → Tests.elm} +3 -3
- data/tracks/elm/exercises/strain/elm-package.json +4 -4
- data/tracks/elm/exercises/strain/package.json +13 -0
- data/tracks/elm/exercises/sublist/{Sublist.example → Sublist.example.elm} +0 -0
- data/tracks/elm/exercises/sublist/{SublistTests.elm → Tests.elm} +5 -5
- data/tracks/elm/exercises/sublist/elm-package.json +4 -4
- data/tracks/elm/exercises/sublist/package.json +13 -0
- data/tracks/elm/exercises/sum-of-multiples/{SumOfMultiples.example → SumOfMultiples.example.elm} +1 -1
- data/tracks/elm/exercises/sum-of-multiples/{SumOfMultiplesTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/sum-of-multiples/elm-package.json +4 -4
- data/tracks/elm/exercises/sum-of-multiples/package.json +13 -0
- data/tracks/elm/exercises/triangle/{TriangleTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/triangle/{Triangle.example → Triangle.example.elm} +1 -1
- data/tracks/elm/exercises/triangle/elm-package.json +4 -4
- data/tracks/elm/exercises/triangle/package.json +13 -0
- data/tracks/elm/exercises/word-count/{WordCountTests.elm → Tests.elm} +2 -2
- data/tracks/elm/exercises/word-count/{WordCount.example → WordCount.example.elm} +0 -0
- data/tracks/elm/exercises/word-count/elm-package.json +4 -4
- data/tracks/elm/exercises/word-count/package.json +13 -0
- data/tracks/elm/package.json +10 -0
- data/tracks/fsharp/exercises/beer-song/HINTS.md +2 -0
- data/tracks/fsharp/exercises/grade-school/HINTS.md +3 -0
- data/tracks/fsharp/exercises/tree-building/Example.fs +7 -3
- data/tracks/fsharp/exercises/tree-building/TreeBuilding.fs +7 -4
- data/tracks/fsharp/exercises/tree-building/TreeBuildingTest.fs +49 -49
- data/tracks/fsharp/exercises/wordy/HINTS.md +3 -0
- data/tracks/java/config.json +13 -1
- data/tracks/java/exercises/anagram/build.gradle +0 -1
- data/tracks/java/exercises/anagram/src/test/java/AnagramTest.java +17 -13
- data/tracks/java/exercises/etl/build.gradle +0 -2
- data/tracks/java/exercises/grade-school/build.gradle +0 -1
- data/tracks/java/exercises/grade-school/src/test/java/SchoolTest.java +17 -13
- data/tracks/java/exercises/linked-list/build.gradle +0 -1
- data/tracks/java/exercises/linked-list/src/test/java/DequeTest.java +16 -15
- data/tracks/java/exercises/meetup/build.gradle +0 -1
- data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +96 -95
- data/tracks/java/exercises/nth-prime/build.gradle +0 -1
- data/tracks/java/exercises/nth-prime/src/test/java/PrimeTest.java +6 -5
- data/tracks/java/exercises/palindrome-products/build.gradle +18 -0
- data/tracks/java/exercises/palindrome-products/src/example/java/Palindromes.java +77 -0
- data/tracks/java/exercises/palindrome-products/src/main/java/.keep +0 -0
- data/tracks/java/exercises/palindrome-products/src/test/java/PalindromesTest.java +162 -0
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/java/exercises/sum-of-multiples/src/example/java/SumOfMultiples.java +1 -2
- data/tracks/java/exercises/sum-of-multiples/src/main/java/SumOfMultiples.java +0 -1
- data/tracks/java/exercises/sum-of-multiples/src/test/{SumOfMultiplesTest.java → java/SumOfMultiplesTest.java} +12 -24
- data/tracks/java/exercises/wordy/build.gradle +17 -0
- data/tracks/java/exercises/wordy/src/example/java/WordProblemSolver.java +57 -0
- data/tracks/java/exercises/wordy/src/main/java/WordProblemSolver.java +5 -0
- data/tracks/java/exercises/wordy/src/test/java/WordProblemSolverTest.java +119 -0
- data/tracks/lua/docs/TESTS.md +1 -1
- data/tracks/ruby/lib/generator.rb +17 -8
- data/tracks/ruby/test/fixtures/exercises/alpha/.meta/.version +1 -0
- data/tracks/ruby/test/fixtures/exercises/alpha/alpha_test.rb +1 -0
- data/tracks/ruby/test/fixtures/exercises/alpha/example.rb +5 -0
- data/tracks/ruby/test/fixtures/exercises/alpha/example.tt +1 -0
- data/tracks/ruby/test/fixtures/metadata/exercises/alpha/canonical-data.json +11 -0
- data/tracks/ruby/test/generator_test.rb +54 -1
- data/tracks/swift/docs/TESTS.md +12 -12
- data/tracks/swift/{img/page_assets/001-splash.png → docs/img/tests_001-splash.png} +0 -0
- data/tracks/swift/{img/page_assets/002-templateChooser.png → docs/img/tests_002-templateChooser.png} +0 -0
- data/tracks/swift/{img/page_assets/003-nameProject.jpg → docs/img/tests_003-nameProject.jpg} +0 -0
- data/tracks/swift/{img/page_assets/004-saveProject.jpg → docs/img/tests_004-saveProject.jpg} +0 -0
- data/tracks/swift/{img/page_assets/005-folderLayout.png → docs/img/tests_005-folderLayout.png} +0 -0
- data/tracks/swift/{img/page_assets/006-newProjectInitial.jpg → docs/img/tests_006-newProjectInitial.jpg} +0 -0
- data/tracks/swift/{img/page_assets/007-fileInspectorUpdate.png → docs/img/tests_007-fileInspectorUpdate.png} +0 -0
- data/tracks/swift/{img/page_assets/008-templateChooserSwift.png → docs/img/tests_008-templateChooserSwift.png} +0 -0
- data/tracks/swift/{img/page_assets/009-importTestSource.png → docs/img/tests_009-importTestSource.png} +0 -0
- data/tracks/swift/{img/page_assets/010-testsImportExample.png → docs/img/tests_010-testsImportExample.png} +0 -0
- data/tracks/swift/{img/page_assets/011-finalLayoutExample.png → docs/img/tests_011-finalLayoutExample.png} +0 -0
- metadata +122 -134
- data/tracks/elm/exercises/accumulate/runtests.bat +0 -1
- data/tracks/elm/exercises/accumulate/runtests.sh +0 -2
- data/tracks/elm/exercises/allergies/runtests.bat +0 -1
- data/tracks/elm/exercises/allergies/runtests.sh +0 -2
- data/tracks/elm/exercises/anagram/runtests.bat +0 -1
- data/tracks/elm/exercises/anagram/runtests.sh +0 -2
- data/tracks/elm/exercises/atbash-cipher/runtests.bat +0 -1
- data/tracks/elm/exercises/atbash-cipher/runtests.sh +0 -2
- data/tracks/elm/exercises/bob/runtests.bat +0 -1
- data/tracks/elm/exercises/bob/runtests.sh +0 -2
- data/tracks/elm/exercises/difference-of-squares/runtests.bat +0 -1
- data/tracks/elm/exercises/difference-of-squares/runtests.sh +0 -2
- data/tracks/elm/exercises/gigasecond/runtests.bat +0 -1
- data/tracks/elm/exercises/gigasecond/runtests.sh +0 -2
- data/tracks/elm/exercises/grade-school/runtests.bat +0 -1
- data/tracks/elm/exercises/grade-school/runtests.sh +0 -2
- data/tracks/elm/exercises/hamming/runtests.bat +0 -1
- data/tracks/elm/exercises/hamming/runtests.sh +0 -2
- data/tracks/elm/exercises/hello-world/runtests.bat +0 -1
- data/tracks/elm/exercises/hello-world/runtests.sh +0 -2
- data/tracks/elm/exercises/largest-series-product/runtests.bat +0 -1
- data/tracks/elm/exercises/largest-series-product/runtests.sh +0 -2
- data/tracks/elm/exercises/leap/runtests.bat +0 -1
- data/tracks/elm/exercises/leap/runtests.sh +0 -2
- data/tracks/elm/exercises/list-ops/runtests.bat +0 -1
- data/tracks/elm/exercises/list-ops/runtests.sh +0 -2
- data/tracks/elm/exercises/nucleotide-count/runtests.bat +0 -1
- data/tracks/elm/exercises/nucleotide-count/runtests.sh +0 -2
- data/tracks/elm/exercises/pangram/runtests.bat +0 -1
- data/tracks/elm/exercises/pangram/runtests.sh +0 -2
- data/tracks/elm/exercises/phone-number/runtests.bat +0 -1
- data/tracks/elm/exercises/phone-number/runtests.sh +0 -2
- data/tracks/elm/exercises/raindrops/runtests.bat +0 -1
- data/tracks/elm/exercises/raindrops/runtests.sh +0 -2
- data/tracks/elm/exercises/rna-transcription/runtests.bat +0 -1
- data/tracks/elm/exercises/rna-transcription/runtests.sh +0 -2
- data/tracks/elm/exercises/robot-simulator/runtests.bat +0 -1
- data/tracks/elm/exercises/robot-simulator/runtests.sh +0 -2
- data/tracks/elm/exercises/roman-numerals/runtests.bat +0 -1
- data/tracks/elm/exercises/roman-numerals/runtests.sh +0 -2
- data/tracks/elm/exercises/run-length-encoding/runtests.bat +0 -1
- data/tracks/elm/exercises/run-length-encoding/runtests.sh +0 -2
- data/tracks/elm/exercises/say/runtests.bat +0 -1
- data/tracks/elm/exercises/say/runtests.sh +0 -2
- data/tracks/elm/exercises/scrabble-score/runtests.bat +0 -1
- data/tracks/elm/exercises/scrabble-score/runtests.sh +0 -2
- data/tracks/elm/exercises/series/runtests.bat +0 -1
- data/tracks/elm/exercises/series/runtests.sh +0 -2
- data/tracks/elm/exercises/space-age/runtests.bat +0 -1
- data/tracks/elm/exercises/space-age/runtests.sh +0 -2
- data/tracks/elm/exercises/strain/runtests.bat +0 -1
- data/tracks/elm/exercises/strain/runtests.sh +0 -2
- data/tracks/elm/exercises/sublist/runtests.bat +0 -1
- data/tracks/elm/exercises/sublist/runtests.sh +0 -2
- data/tracks/elm/exercises/sum-of-multiples/runtests.bat +0 -1
- data/tracks/elm/exercises/sum-of-multiples/runtests.sh +0 -2
- data/tracks/elm/exercises/triangle/runtests.bat +0 -1
- data/tracks/elm/exercises/triangle/runtests.sh +0 -2
- data/tracks/elm/exercises/word-count/runtests.bat +0 -1
- 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,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
|
+
}
|
data/tracks/lua/docs/TESTS.md
CHANGED
@@ -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(
|
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
|
-
|
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
|
-
|
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
|
+
1
|
@@ -0,0 +1 @@
|
|
1
|
+
This is an example
|
@@ -0,0 +1 @@
|
|
1
|
+
This is an example
|
@@ -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
|
data/tracks/swift/docs/TESTS.md
CHANGED
@@ -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
|
-
![
|
21
|
+
![tests_011-finalLayoutExample](/docs/img/tests_011-finalLayoutExample.png)
|
22
22
|
|
23
23
|
### Create A New Xcode Project
|
24
24
|
|
25
|
-
![
|
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
|
-
![
|
30
|
+
![tests_002-templatechooser](/docs/img/tests_002-templateChooser.png)
|
31
31
|
|
32
32
|
#### Name The Project
|
33
|
-
![
|
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
|
-
![
|
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
|
-
![
|
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
|
-
![
|
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
|
-
![
|
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
|
-
![
|
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
|
-
![
|
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
|
-
![
|
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/
|
87
|
+
![011-finallayoutexample](/docs/img/011-finalLayoutExample.png)
|
88
88
|
|
89
89
|
The housekeeping is finished and Xcode is ready! To review:
|
90
90
|
|