trackler 2.0.1.1 → 2.0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/update +4 -0
- data/common/exercises/minesweeper/canonical-data.json +3 -3
- data/fixtures/common/exercises/imbe/description.md +2 -0
- data/fixtures/common/exercises/imbe/metadata.yml +3 -0
- data/fixtures/common/exercises/no-metadata/description.md +1 -0
- data/fixtures/tracks/fruit/exercises/imbe/.meta/everything_in_meta_is_ignored.txt +0 -0
- data/fixtures/tracks/fruit/exercises/imbe/CaSe_iNSeNSiTiVe_eXaMPLe.TXT +0 -0
- data/fixtures/tracks/fruit/exercises/imbe/HINTS.md +1 -0
- data/fixtures/tracks/fruit/exercises/imbe/also_an_example.txt +1 -0
- data/fixtures/tracks/fruit/exercises/imbe/example.ext +1 -0
- data/fixtures/tracks/fruit/exercises/imbe/imbe.txt +1 -0
- data/lib/trackler/file_bundle.rb +27 -9
- data/lib/trackler/implementation.rb +7 -6
- data/lib/trackler/problem.rb +62 -37
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/config.json +9 -0
- data/tracks/c/exercises/series/makefile +16 -0
- data/tracks/c/exercises/series/src/example.c +24 -0
- data/tracks/c/exercises/series/src/series.h +28 -0
- data/tracks/c/exercises/series/test/test_series.c +63 -0
- data/tracks/c/exercises/series/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/series/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/series/test/vendor/unity_internals.h +701 -0
- data/tracks/crystal/src/generator/exercises/binary.cr +3 -3
- data/tracks/crystal/src/generator/exercises/forth.cr +3 -3
- data/tracks/crystal/src/generator/exercises/hello_world.cr +1 -1
- data/tracks/haskell/exercises/bob/test/Tests.hs +2 -10
- data/tracks/haskell/exercises/sublist/test/Tests.hs +6 -1
- data/tracks/java/config.json +13 -1
- data/tracks/java/exercises/bracket-push/build.gradle +17 -0
- data/tracks/java/exercises/bracket-push/src/example/java/BracketChecker.java +45 -0
- data/tracks/java/exercises/bracket-push/src/main/java/BracketChecker.java +5 -0
- data/tracks/java/exercises/bracket-push/src/test/java/BracketCheckerTest.java +102 -0
- data/tracks/java/exercises/robot-simulator/build.gradle +17 -0
- data/tracks/java/exercises/robot-simulator/src/example/java/GridPosition.java +1 -0
- data/tracks/java/exercises/robot-simulator/src/example/java/Orientation.java +1 -0
- data/tracks/java/exercises/robot-simulator/src/example/java/Robot.java +71 -0
- data/tracks/java/exercises/robot-simulator/src/main/java/GridPosition.java +29 -0
- data/tracks/java/exercises/robot-simulator/src/main/java/Orientation.java +5 -0
- data/tracks/java/exercises/robot-simulator/src/main/java/Robot.java +5 -0
- data/tracks/java/exercises/robot-simulator/src/test/java/RobotTest.java +244 -0
- data/tracks/java/exercises/settings.gradle +2 -0
- data/tracks/ocaml/exercises/say/test.ml +52 -56
- data/tracks/ocaml/tools/test-generator/src/codegen.ml +2 -1
- data/tracks/ocaml/tools/test-generator/src/special_cases.ml +10 -4
- data/tracks/ocaml/tools/test-generator/src/test_generator.ml +5 -0
- data/tracks/ocaml/tools/test-generator/templates/say/template.ml +21 -0
- data/tracks/ocaml/tools/test-generator/test/special_cases_test.ml +2 -2
- metadata +30 -1
@@ -16,16 +16,16 @@ end
|
|
16
16
|
class BinaryTestCase < ExerciseTestCase
|
17
17
|
private getter binary : JSON::Any
|
18
18
|
private getter description : JSON::Any
|
19
|
-
private getter expected : JSON::Any
|
19
|
+
private getter expected : JSON::Any?
|
20
20
|
|
21
21
|
def initialize(test_case)
|
22
22
|
@binary = test_case["binary"]
|
23
23
|
@description = test_case["description"]
|
24
|
-
@expected = test_case["expected"]
|
24
|
+
@expected = test_case["expected"]?
|
25
25
|
end
|
26
26
|
|
27
27
|
def workload
|
28
|
-
if
|
28
|
+
if expected
|
29
29
|
"Binary.to_decimal(\"#{binary}\").should eq(#{expected})"
|
30
30
|
else
|
31
31
|
<<-WL
|
@@ -22,16 +22,16 @@ end
|
|
22
22
|
class ForthTestCase < ExerciseTestCase
|
23
23
|
private getter input : JSON::Any | String
|
24
24
|
private getter description : JSON::Any
|
25
|
-
private getter expected : JSON::Any
|
25
|
+
private getter expected : JSON::Any?
|
26
26
|
|
27
27
|
def initialize(test_case)
|
28
28
|
@input = test_case["input"].as_a.join
|
29
29
|
@description = test_case["description"]
|
30
|
-
@expected = fix_empty_array(test_case["expected"])
|
30
|
+
@expected = fix_empty_array(test_case["expected"]?)
|
31
31
|
end
|
32
32
|
|
33
33
|
def workload
|
34
|
-
if
|
34
|
+
if expected
|
35
35
|
"Forth.evaluate(#{input.inspect}).should eq(#{expected})"
|
36
36
|
else
|
37
37
|
<<-WL
|
@@ -15,7 +15,7 @@ specs = describe "bob" $
|
|
15
15
|
where
|
16
16
|
test Case{..} = it description $ responseFor input `shouldBe` expected
|
17
17
|
|
18
|
-
-- Test cases adapted from `exercism/x-common/bob.json` on 2016-
|
18
|
+
-- Test cases adapted from `exercism/x-common/bob.json` on 2016-11-29.
|
19
19
|
|
20
20
|
data Case = Case { description :: String
|
21
21
|
, input :: String
|
@@ -75,14 +75,6 @@ cases = [ Case { description = "stating something"
|
|
75
75
|
, input = "ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!"
|
76
76
|
, expected = "Whoa, chill out!"
|
77
77
|
}
|
78
|
-
, Case { description = "shouting with umlauts"
|
79
|
-
, input = "ÜMLÄÜTS!"
|
80
|
-
, expected = "Whoa, chill out!"
|
81
|
-
}
|
82
|
-
, Case { description = "calmly speaking with umlauts"
|
83
|
-
, input = "ÜMLäÜTS!"
|
84
|
-
, expected = "Whatever."
|
85
|
-
}
|
86
78
|
, Case { description = "shouting with no exclamation mark"
|
87
79
|
, input = "I HATE YOU"
|
88
80
|
, expected = "Whoa, chill out!"
|
@@ -124,7 +116,7 @@ cases = [ Case { description = "stating something"
|
|
124
116
|
, expected = "Sure."
|
125
117
|
}
|
126
118
|
, Case { description = "other whitespace"
|
127
|
-
, input = "\n\r \t
|
119
|
+
, input = "\n\r \t"
|
128
120
|
, expected = "Fine. Be that way!"
|
129
121
|
}
|
130
122
|
, Case { description = "non-question ending with whitespace"
|
@@ -42,7 +42,7 @@ specs = describe "sublist" $ do
|
|
42
42
|
, "-"
|
43
43
|
, description ]
|
44
44
|
|
45
|
-
-- Test cases adapted from `exercism/x-common/sublist.json` on 2016-
|
45
|
+
-- Test cases adapted from `exercism/x-common/sublist.json` on 2016-11-29.
|
46
46
|
|
47
47
|
data Case = Case { description :: String
|
48
48
|
, listOne :: [Integer]
|
@@ -131,4 +131,9 @@ cases = [ Case { description = "empty lists"
|
|
131
131
|
, listTwo = [3, 2, 1]
|
132
132
|
, expectation = Unequal
|
133
133
|
}
|
134
|
+
, Case { description = "same digits but different numbers"
|
135
|
+
, listOne = [1, 0, 1]
|
136
|
+
, listTwo = [10, 1]
|
137
|
+
, expectation = Unequal
|
138
|
+
}
|
134
139
|
]
|
data/tracks/java/config.json
CHANGED
@@ -48,7 +48,9 @@
|
|
48
48
|
"largest-series-product",
|
49
49
|
"queen-attack",
|
50
50
|
"minesweeper",
|
51
|
-
"series"
|
51
|
+
"series",
|
52
|
+
"robot-simulator",
|
53
|
+
"bracket-push"
|
52
54
|
],
|
53
55
|
"exercises": [
|
54
56
|
{
|
@@ -275,6 +277,16 @@
|
|
275
277
|
"slug": "series",
|
276
278
|
"difficulty": 1,
|
277
279
|
"topics": []
|
280
|
+
},
|
281
|
+
{
|
282
|
+
"slug": "robot-simulator",
|
283
|
+
"difficulty": 1,
|
284
|
+
"topics": []
|
285
|
+
},
|
286
|
+
{
|
287
|
+
"slug": "bracket-push",
|
288
|
+
"difficulty": 1,
|
289
|
+
"topics": []
|
278
290
|
}
|
279
291
|
],
|
280
292
|
"deprecated": [
|
@@ -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,45 @@
|
|
1
|
+
import java.util.*;
|
2
|
+
|
3
|
+
final class BracketChecker {
|
4
|
+
|
5
|
+
private static final Map<Character, Character> BRACKET_PAIR_MAP = new HashMap<Character, Character>() {{
|
6
|
+
put('[', ']');
|
7
|
+
put('{', '}');
|
8
|
+
put('(', ')');
|
9
|
+
}};
|
10
|
+
|
11
|
+
private static boolean isOpeningBracket(final char character) {
|
12
|
+
return BRACKET_PAIR_MAP.keySet().contains(character);
|
13
|
+
}
|
14
|
+
|
15
|
+
private static boolean isClosingBracket(final char character) {
|
16
|
+
return BRACKET_PAIR_MAP.values().contains(character);
|
17
|
+
}
|
18
|
+
|
19
|
+
private final String expression;
|
20
|
+
|
21
|
+
BracketChecker(final String expression) {
|
22
|
+
this.expression = expression;
|
23
|
+
}
|
24
|
+
|
25
|
+
boolean areBracketsMatchedAndNestedCorrectly() {
|
26
|
+
final Stack<Character> bracketsStack = new Stack<>();
|
27
|
+
|
28
|
+
for (final char character : expression.toCharArray()) {
|
29
|
+
if (isOpeningBracket(character)) {
|
30
|
+
bracketsStack.push(character);
|
31
|
+
} else if (isClosingBracket(character)) {
|
32
|
+
if (bracketsStack.isEmpty()) {
|
33
|
+
return false;
|
34
|
+
}
|
35
|
+
|
36
|
+
if (!BRACKET_PAIR_MAP.get(bracketsStack.pop()).equals(character)) {
|
37
|
+
return false;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
return bracketsStack.isEmpty();
|
43
|
+
}
|
44
|
+
|
45
|
+
}
|
@@ -0,0 +1,102 @@
|
|
1
|
+
import org.junit.Ignore;
|
2
|
+
import org.junit.Test;
|
3
|
+
|
4
|
+
import static org.junit.Assert.assertEquals;
|
5
|
+
import static org.junit.Assert.assertFalse;
|
6
|
+
import static org.junit.Assert.assertTrue;
|
7
|
+
|
8
|
+
public final class BracketCheckerTest {
|
9
|
+
|
10
|
+
@Test
|
11
|
+
public void testPairedSquareBrackets() {
|
12
|
+
final BracketChecker bracketChecker = new BracketChecker("[]");
|
13
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
14
|
+
}
|
15
|
+
|
16
|
+
@Ignore
|
17
|
+
@Test
|
18
|
+
public void testEmptyString() {
|
19
|
+
final BracketChecker bracketChecker = new BracketChecker("");
|
20
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
21
|
+
}
|
22
|
+
|
23
|
+
@Ignore
|
24
|
+
@Test
|
25
|
+
public void testUnpairedBrackets() {
|
26
|
+
final BracketChecker bracketChecker = new BracketChecker("[[");
|
27
|
+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
28
|
+
}
|
29
|
+
|
30
|
+
@Ignore
|
31
|
+
@Test
|
32
|
+
public void testIncorrectlyOrderedBrackets() {
|
33
|
+
final BracketChecker bracketChecker = new BracketChecker("}{");
|
34
|
+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
35
|
+
}
|
36
|
+
|
37
|
+
@Ignore
|
38
|
+
@Test
|
39
|
+
public void testPairedBracketsWithWhitespace() {
|
40
|
+
final BracketChecker bracketChecker = new BracketChecker("{ }");
|
41
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
42
|
+
}
|
43
|
+
|
44
|
+
@Ignore
|
45
|
+
@Test
|
46
|
+
public void testSimpleNestedBrackets() {
|
47
|
+
final BracketChecker bracketChecker = new BracketChecker("{[]}");
|
48
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
49
|
+
}
|
50
|
+
|
51
|
+
@Ignore
|
52
|
+
@Test
|
53
|
+
public void testSeveralPairedBrackets() {
|
54
|
+
final BracketChecker bracketChecker = new BracketChecker("{}[]");
|
55
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
56
|
+
}
|
57
|
+
|
58
|
+
@Ignore
|
59
|
+
@Test
|
60
|
+
public void testPairedAndNestedBrackets() {
|
61
|
+
final BracketChecker bracketChecker = new BracketChecker("([{}({}[])])");
|
62
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
63
|
+
}
|
64
|
+
|
65
|
+
@Ignore
|
66
|
+
@Test
|
67
|
+
public void testUnopenedClosingBracket() {
|
68
|
+
final BracketChecker bracketChecker = new BracketChecker("{[)][]}");
|
69
|
+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
70
|
+
}
|
71
|
+
|
72
|
+
@Ignore
|
73
|
+
@Test
|
74
|
+
public void testUnpairedAndNestedBracket() {
|
75
|
+
final BracketChecker bracketChecker = new BracketChecker("([{])");
|
76
|
+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
77
|
+
}
|
78
|
+
|
79
|
+
@Ignore
|
80
|
+
@Test
|
81
|
+
public void testPairedAndIncorrectlyNestedBrackets() {
|
82
|
+
final BracketChecker bracketChecker = new BracketChecker("[({]})");
|
83
|
+
assertFalse(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
84
|
+
}
|
85
|
+
|
86
|
+
@Ignore
|
87
|
+
@Test
|
88
|
+
public void testValidMathExpression() {
|
89
|
+
final BracketChecker bracketChecker = new BracketChecker("(((185 + 223.85) * 15) - 543)/2");
|
90
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
91
|
+
}
|
92
|
+
|
93
|
+
@Ignore
|
94
|
+
@Test
|
95
|
+
public void testValidComplexLaTeXExpression() {
|
96
|
+
final BracketChecker bracketChecker = new BracketChecker(
|
97
|
+
"\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)");
|
98
|
+
|
99
|
+
assertTrue(bracketChecker.areBracketsMatchedAndNestedCorrectly());
|
100
|
+
}
|
101
|
+
|
102
|
+
}
|
@@ -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 @@
|
|
1
|
+
tracks/java/exercises/robot-simulator/src/example/java/../../main/java/GridPosition.java
|
@@ -0,0 +1 @@
|
|
1
|
+
tracks/java/exercises/robot-simulator/src/example/java/../../main/java/Orientation.java
|
@@ -0,0 +1,71 @@
|
|
1
|
+
final class Robot {
|
2
|
+
|
3
|
+
private GridPosition gridPosition;
|
4
|
+
|
5
|
+
private Orientation orientation;
|
6
|
+
|
7
|
+
Robot(final GridPosition initialGridPosition, final Orientation initialOrientation) {
|
8
|
+
this.gridPosition = initialGridPosition;
|
9
|
+
this.orientation = initialOrientation;
|
10
|
+
}
|
11
|
+
|
12
|
+
GridPosition getGridPosition() {
|
13
|
+
return gridPosition;
|
14
|
+
}
|
15
|
+
|
16
|
+
Orientation getOrientation() {
|
17
|
+
return orientation;
|
18
|
+
}
|
19
|
+
|
20
|
+
Robot advance() {
|
21
|
+
switch (orientation) {
|
22
|
+
case NORTH:
|
23
|
+
gridPosition = new GridPosition(gridPosition.x, gridPosition.y + 1);
|
24
|
+
break;
|
25
|
+
case EAST:
|
26
|
+
gridPosition = new GridPosition(gridPosition.x + 1, gridPosition.y);
|
27
|
+
break;
|
28
|
+
case SOUTH:
|
29
|
+
gridPosition = new GridPosition(gridPosition.x, gridPosition.y - 1);
|
30
|
+
break;
|
31
|
+
case WEST:
|
32
|
+
gridPosition = new GridPosition(gridPosition.x - 1, gridPosition.y);
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
|
36
|
+
return this;
|
37
|
+
}
|
38
|
+
|
39
|
+
Robot simulate(final String instructions) {
|
40
|
+
for (final char instruction : instructions.toCharArray()) {
|
41
|
+
switch (instruction) {
|
42
|
+
case 'A':
|
43
|
+
advance();
|
44
|
+
break;
|
45
|
+
case 'R':
|
46
|
+
turnRight();
|
47
|
+
break;
|
48
|
+
case 'L':
|
49
|
+
turnLeft();
|
50
|
+
break;
|
51
|
+
default:
|
52
|
+
throw new IllegalArgumentException(String.format("Invalid instruction: '%s'", instruction));
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
return this;
|
57
|
+
}
|
58
|
+
|
59
|
+
Robot turnLeft() {
|
60
|
+
final int newOrientationOrdinal = Math.floorMod(orientation.ordinal() - 1, Orientation.values().length);
|
61
|
+
orientation = Orientation.values()[newOrientationOrdinal];
|
62
|
+
return this;
|
63
|
+
}
|
64
|
+
|
65
|
+
Robot turnRight() {
|
66
|
+
final int newOrientationOrdinal = Math.floorMod(orientation.ordinal() + 1, Orientation.values().length);
|
67
|
+
orientation = Orientation.values()[newOrientationOrdinal];
|
68
|
+
return this;
|
69
|
+
}
|
70
|
+
|
71
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
final class GridPosition {
|
2
|
+
|
3
|
+
final int x;
|
4
|
+
|
5
|
+
final int y;
|
6
|
+
|
7
|
+
GridPosition(final int x, final int y) {
|
8
|
+
this.x = x;
|
9
|
+
this.y = y;
|
10
|
+
}
|
11
|
+
|
12
|
+
/*
|
13
|
+
* This equals method is of deliberately narrow scope (only allows comparison with another GridPosition) to increase
|
14
|
+
* readability. In general, one should provide a full implementation of Object.equals(Object obj) and a
|
15
|
+
* corresponding implementation of Object.hashCode(). See
|
16
|
+
*
|
17
|
+
* https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)
|
18
|
+
*
|
19
|
+
* and
|
20
|
+
*
|
21
|
+
* https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()
|
22
|
+
*
|
23
|
+
* for more information.
|
24
|
+
*/
|
25
|
+
boolean equals(final GridPosition gridPosition) {
|
26
|
+
return this.x == gridPosition.x && this.y == gridPosition.y;
|
27
|
+
}
|
28
|
+
|
29
|
+
}
|