trackler 2.2.1.137 → 2.2.1.138
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/diffie-hellman/canonical-data.json +72 -0
- data/problem-specifications/exercises/yacht/description.md +2 -2
- data/tracks/csharp/exercises/sgf-parsing/Example.cs +1 -1
- data/tracks/csharp/exercises/sgf-parsing/SgfParsingTest.cs +1 -1
- data/tracks/csharp/exercises/sublist/SublistTest.cs +37 -78
- data/tracks/csharp/generators/Exercises/Sublist.cs +32 -0
- data/tracks/elisp/exercises/bob/README.md +2 -0
- data/tracks/elisp/exercises/bob/bob-test.el +60 -15
- data/tracks/elisp/exercises/bob/example.el +15 -5
- data/tracks/elisp/exercises/hamming/hamming-test.el +1 -1
- data/tracks/fsharp/build.ps1 +3 -3
- data/tracks/fsharp/build.sh +3 -3
- data/tracks/fsharp/exercises/bracket-push/BracketPushTest.fs +5 -1
- data/tracks/fsharp/exercises/isbn-verifier/IsbnVerifierTest.fs +5 -1
- data/tracks/fsharp/exercises/kindergarten-garden/KindergartenGardenTest.fs +1 -1
- data/tracks/fsharp/exercises/pov/PovTest.fs +6 -1
- data/tracks/fsharp/exercises/react/Example.fs +2 -2
- data/tracks/fsharp/exercises/react/React.fsproj +1 -0
- data/tracks/fsharp/exercises/react/ReactTest.fs +55 -33
- data/tracks/fsharp/exercises/series/Example.fs +2 -12
- data/tracks/fsharp/exercises/series/SeriesTest.fs +33 -56
- data/tracks/fsharp/generators/Generators.fs +81 -46
- data/tracks/idris/exercises/rna-transcription/src/{example.idr → Example.idr} +0 -0
- data/tracks/java/config.json +14 -0
- data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +10 -10
- data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +39 -39
- data/tracks/java/exercises/grep/.meta/hints.md +58 -0
- data/tracks/java/exercises/grep/.meta/src/reference/java/GrepTool.java +65 -0
- data/tracks/java/exercises/grep/.meta/version +1 -0
- data/tracks/java/exercises/grep/README.md +145 -0
- data/tracks/java/exercises/grep/build.gradle +18 -0
- data/tracks/java/exercises/grep/src/main/java/.keep +0 -0
- data/tracks/java/exercises/grep/src/test/java/GrepToolTest.java +395 -0
- data/tracks/java/exercises/largest-series-product/src/test/java/LargestSeriesProductCalculatorTest.java +36 -36
- data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +36 -36
- data/tracks/java/exercises/phone-number/src/test/java/PhoneNumberTest.java +14 -14
- data/tracks/java/exercises/poker/src/test/java/PokerTest.java +40 -40
- data/tracks/java/exercises/pythagorean-triplet/src/test/java/PythagoreanTripletTest.java +10 -10
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/ocaml/exercises/anagram/example.ml +1 -1
- data/tracks/ocaml/exercises/change/example.ml +1 -1
- data/tracks/ocaml/exercises/custom-set/example.ml +4 -3
- data/tracks/ocaml/exercises/custom-set/test.ml +0 -1
- data/tracks/ocaml/exercises/dominoes/test.ml +1 -1
- data/tracks/ocaml/exercises/etl/example.ml +1 -1
- data/tracks/ocaml/exercises/grade-school/example.ml +1 -1
- data/tracks/ocaml/exercises/palindrome-products/example.ml +2 -2
- data/tracks/ocaml/exercises/prime-factors/example.ml +1 -1
- data/tracks/ocaml/exercises/robot-name/test.ml +1 -1
- data/tracks/ocaml/exercises/triangle/example.ml +1 -1
- data/tracks/ocaml/make-exercise.sh +1 -0
- data/tracks/ocaml/tools/test-generator/src/controller.ml +1 -1
- data/tracks/perl5/exercises/raindrops/.meta/solutions/Raindrops.pm +13 -12
- data/tracks/perl5/exercises/raindrops/raindrops.t +166 -111
- data/tracks/perl6/docs/INSTALLATION.md +1 -3
- data/tracks/perl6/exercises/raindrops/.meta/exercise-data.yaml +5 -5
- data/tracks/perl6/exercises/raindrops/.meta/solutions/Raindrops.pm6 +2 -2
- data/tracks/perl6/exercises/raindrops/Raindrops.pm6 +2 -2
- data/tracks/perl6/exercises/raindrops/raindrops.t +3 -3
- data/tracks/python/exercises/food-chain/example.py +11 -2
- data/tracks/python/exercises/food-chain/food_chain_test.py +48 -45
- data/tracks/python/exercises/pov/pov_test.py +12 -1
- data/tracks/python/exercises/series/README.md +6 -6
- data/tracks/python/exercises/series/example.py +2 -3
- data/tracks/python/exercises/series/series_test.py +27 -28
- data/tracks/python/exercises/sgf-parsing/example.py +1 -1
- data/tracks/python/exercises/sgf-parsing/sgf_parsing_test.py +1 -1
- data/tracks/python/exercises/yacht/README.md +2 -2
- data/tracks/ruby/Gemfile +0 -1
- data/tracks/ruby/README.md +23 -0
- data/tracks/ruby/bin/generate +1 -0
- data/tracks/ruby/exercises/complex-numbers/complex_numbers_test.rb +1 -1
- data/tracks/ruby/lib/generator.rb +1 -2
- data/tracks/ruby/lib/generator/command_line.rb +3 -0
- data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +1 -0
- data/tracks/ruby/lib/generator/exercise.rb +2 -0
- data/tracks/ruby/lib/generator/exercise_case.rb +3 -0
- data/tracks/ruby/lib/generator/files.rb +1 -0
- data/tracks/ruby/lib/generator/files/metadata_files.rb +2 -0
- data/tracks/ruby/lib/generator/files/track_files.rb +1 -0
- data/tracks/ruby/lib/generator/implementation.rb +1 -0
- data/tracks/ruby/lib/generator/repository.rb +3 -0
- data/tracks/ruby/lib/generator/template_values.rb +1 -0
- data/tracks/ruby/test/generator/case_values_test.rb +2 -0
- data/tracks/ruby/test/generator/command_line_test.rb +1 -0
- data/tracks/ruby/test/generator/files/metadata_files_test.rb +2 -0
- data/tracks/ruby/test/generator/files/track_files_test.rb +1 -0
- data/tracks/ruby/test/generator/implementation_test.rb +1 -0
- data/tracks/ruby/test/tasks/exercise_test.rb +1 -0
- data/tracks/ruby/test/tasks/exercise_test_tasks_test.rb +2 -0
- data/tracks/ruby/test/test_helper.rb +1 -3
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/exercises/atbash-cipher/src/lib.rs +9 -0
- data/tracks/rust/exercises/hamming/src/lib.rs +6 -0
- data/tracks/rust/exercises/isogram/src/lib.rs +3 -0
- data/tracks/rust/exercises/luhn/src/lib.rs +4 -0
- data/tracks/rust/exercises/palindrome-products/.meta/test-in-release-mode +1 -0
- data/tracks/rust/exercises/palindrome-products/Cargo.toml +6 -0
- data/tracks/rust/exercises/palindrome-products/README.md +72 -0
- data/tracks/rust/exercises/palindrome-products/example.rs +25 -0
- data/tracks/rust/exercises/palindrome-products/src/lib.rs +22 -0
- data/tracks/rust/exercises/palindrome-products/tests/palindrome-products.rs +57 -0
- data/tracks/rust/exercises/pangram/src/lib.rs +4 -0
- data/tracks/rust/exercises/run-length-encoding/src/lib.rs +7 -0
- data/tracks/rust/exercises/say/src/lib.rs +3 -4
- data/tracks/rust/exercises/scrabble-score/src/lib.rs +4 -0
- data/tracks/rust/exercises/word-count/src/lib.rs +6 -0
- data/tracks/scheme/exercises/hello-world/example.scm +1 -4
- data/tracks/scheme/exercises/hello-world/hello-world-test.scm +1 -5
- data/tracks/scheme/exercises/scrabble-score/scrabble-score-test.scm +2 -2
- data/tracks/typescript/config.json +30 -0
- data/tracks/typescript/exercises/queen-attack/README.md +59 -0
- data/tracks/typescript/exercises/queen-attack/package.json +36 -0
- data/tracks/typescript/exercises/queen-attack/queen-attack.example.ts +56 -0
- data/tracks/typescript/exercises/queen-attack/queen-attack.test.ts +71 -0
- data/tracks/typescript/exercises/queen-attack/queen-attack.ts +0 -0
- data/tracks/typescript/exercises/queen-attack/tsconfig.json +22 -0
- data/tracks/typescript/exercises/queen-attack/tslint.json +127 -0
- data/tracks/typescript/exercises/queen-attack/yarn.lock +2624 -0
- data/tracks/typescript/exercises/spiral-matrix/README.md +56 -0
- data/tracks/typescript/exercises/spiral-matrix/package.json +36 -0
- data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.example.ts +33 -0
- data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.test.ts +49 -0
- data/tracks/typescript/exercises/spiral-matrix/spiral-matrix.ts +0 -0
- data/tracks/typescript/exercises/spiral-matrix/tsconfig.json +22 -0
- data/tracks/typescript/exercises/spiral-matrix/tslint.json +127 -0
- data/tracks/typescript/exercises/spiral-matrix/yarn.lock +2624 -0
- metadata +35 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 904ea15d99f928d3a60c4a94f9f6f487b5c56bb4
|
4
|
+
data.tar.gz: 5e14581709b274c20adacd33233c8e268534c83e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e02921838fab6c43ad19a3eabbf7d832e1e6f6568065420af7fa31484393f601d6e990af8eacf8093e5e3caf7885c07aa2436d2eb417977bcebc68f7cac0f2de
|
7
|
+
data.tar.gz: cb188e5c1cea7a4e79f2e8bc6af2561c7b4113cbeef75feab4921d475cb5d3315a20929ade4f705a9c6a51bb1974ec6959a365065e1f7aefd6ae780c4a9f4533
|
data/lib/trackler/version.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
{
|
2
|
+
"exercise": "diffie-hellman",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"comments": [
|
5
|
+
"Optional tests to consider:",
|
6
|
+
"* Validation of parameters:",
|
7
|
+
" Validate that `p`, `g` are valid.",
|
8
|
+
" Validate that keys given as inputs are valid.",
|
9
|
+
" Resources that show what happens if parameters are not validated:",
|
10
|
+
" http://cryptopals.com/sets/5/challenges/34",
|
11
|
+
" http://cryptopals.com/sets/5/challenges/35",
|
12
|
+
"* Large numbers:",
|
13
|
+
" Although the calculations fundamentally do not require large numbers,",
|
14
|
+
" this is a reasonable real-world use for them",
|
15
|
+
" and it may be instructive to have an exercise on their use.",
|
16
|
+
" Consult tracks with this exercise (such as the Go track) for possible inputs to use."
|
17
|
+
],
|
18
|
+
"cases": [
|
19
|
+
{
|
20
|
+
"description": "private key is in range 1 .. p",
|
21
|
+
"property": "privateKeyIsInRange",
|
22
|
+
"input": {},
|
23
|
+
"expected": {
|
24
|
+
"greaterThan": 1,
|
25
|
+
"lessThan": "p"
|
26
|
+
}
|
27
|
+
},
|
28
|
+
{
|
29
|
+
"description": "private key is random",
|
30
|
+
"property": "privateKeyIsRandom",
|
31
|
+
"input": {},
|
32
|
+
"expected": {
|
33
|
+
"random": true
|
34
|
+
}
|
35
|
+
},
|
36
|
+
{
|
37
|
+
"description": "can calculate public key using private key",
|
38
|
+
"property": "publicKey",
|
39
|
+
"input": {
|
40
|
+
"p": 23,
|
41
|
+
"g": 5,
|
42
|
+
"privateKey": 6
|
43
|
+
},
|
44
|
+
"expected": 8
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"description": "can calculate secret using other party's public key",
|
48
|
+
"property": "secret",
|
49
|
+
"input": {
|
50
|
+
"p": 23,
|
51
|
+
"theirPublicKey": 19,
|
52
|
+
"myPrivateKey": 6
|
53
|
+
},
|
54
|
+
"expected": 2
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"description": "key exchange",
|
58
|
+
"property": "keyExchange",
|
59
|
+
"input": {
|
60
|
+
"p": 23,
|
61
|
+
"g": 5,
|
62
|
+
"alicePrivateKey": "privateKey(p)",
|
63
|
+
"bobPrivateKey": "privateKey(p)",
|
64
|
+
"alicePublicKey": "publicKey(p, g, alicePrivateKey)",
|
65
|
+
"bobPublicKey": "publicKey(p, g, bobPrivateKey)",
|
66
|
+
"secretA": "secret(p, bobPublicKey, alicePrivateKey)",
|
67
|
+
"secretB": "secret(p, alicePublicKey, bobPrivateKey)"
|
68
|
+
},
|
69
|
+
"expected": "secretA == secretB"
|
70
|
+
}
|
71
|
+
]
|
72
|
+
}
|
@@ -17,7 +17,7 @@ category chosen.
|
|
17
17
|
Sixes 6 × number of sixes 2 3 4 5 6 scores 6
|
18
18
|
Full House Total of the dice 3 3 3 5 5 scores 19
|
19
19
|
Four of a Kind Total of the four dice 4 4 4 4 6 scores 16
|
20
|
-
Little Straight 30 points 1 2 3 4 5 scores 30
|
20
|
+
Little Straight 30 points 1 2 3 4 5 scores 30
|
21
21
|
Big Straight 30 points 2 3 4 5 6 scores 30
|
22
22
|
Choice Sum of the dice 2 3 3 4 6 scores 18
|
23
23
|
Yacht 50 points 4 4 4 4 4 scores 50
|
@@ -26,7 +26,7 @@ If the dice do not satisfy the requirements of a category, the score is zero.
|
|
26
26
|
If, for example, *Four Of A Kind* is entered in the *Yacht* category, zero
|
27
27
|
points are scored. A *Yacht* scores zero if entered in the *Full House* category.
|
28
28
|
|
29
|
-
## Task
|
29
|
+
## Task
|
30
30
|
Given a list of values for five dice and a category, your solution should return
|
31
31
|
the score of the dice for that category. If the dice do not satisfy the requirements
|
32
32
|
of the category your solution should return 0. You can assume that five values
|
@@ -17,7 +17,7 @@ public SgfTree(IDictionary<string, string[]> data, params SgfTree[] children)
|
|
17
17
|
|
18
18
|
public static class SgfParser
|
19
19
|
{
|
20
|
-
private static char Unescape(char c) => c == 'n'
|
20
|
+
private static char Unescape(char c) => c == 'n' ? '\n' : c == 'r' || c == 't' ? ' ' : c;
|
21
21
|
private static string ToString(IEnumerable<char> chars) => new string(chars.ToArray());
|
22
22
|
|
23
23
|
private static readonly Parser<char> NormalChar = Parse.Char(c => c != '\\' && c != ']', "Normal char");
|
@@ -112,7 +112,7 @@ public void Multiple_properties()
|
|
112
112
|
public void Escaped_property()
|
113
113
|
{
|
114
114
|
const string input = @"(;A[\]b\nc\nd\t\te \n\]])";
|
115
|
-
var expected = TreeWithNoChildren(CreateData("A",
|
115
|
+
var expected = TreeWithNoChildren(CreateData("A", "]b\nc\nd e \n]"));
|
116
116
|
Assert.Equal(expected, SgfParser.ParseTree(input), SgfTreeEqualityComparer.Instance);
|
117
117
|
}
|
118
118
|
|
@@ -1,150 +1,109 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
// This file was auto-generated based on version 1.1.0 of the canonical data.
|
2
|
+
|
3
3
|
using Xunit;
|
4
|
+
using System.Collections.Generic;
|
4
5
|
|
5
6
|
public class SublistTest
|
6
7
|
{
|
7
8
|
[Fact]
|
8
|
-
public void
|
9
|
+
public void Empty_lists()
|
9
10
|
{
|
10
|
-
|
11
|
-
var list2 = new List<int>();
|
12
|
-
Assert.Equal(SublistType.Equal, Sublist.Classify(list1, list2));
|
11
|
+
Assert.Equal(SublistType.Equal, Sublist.Classify(new List<int>() { }, new List<int>() { }));
|
13
12
|
}
|
14
13
|
|
15
14
|
[Fact(Skip = "Remove to run test")]
|
16
|
-
public void
|
15
|
+
public void Empty_list_within_non_empty_list()
|
17
16
|
{
|
18
|
-
|
19
|
-
var list2 = new List<int> { 1, 2, 3, 4 };
|
20
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
17
|
+
Assert.Equal(SublistType.Sublist, Sublist.Classify(new List<int>() { }, new List<int>() { 1, 2, 3 }));
|
21
18
|
}
|
22
19
|
|
23
20
|
[Fact(Skip = "Remove to run test")]
|
24
|
-
public void
|
21
|
+
public void Non_empty_list_contains_empty_list()
|
25
22
|
{
|
26
|
-
|
27
|
-
var list2 = new List<int>();
|
28
|
-
Assert.Equal(SublistType.Superlist, Sublist.Classify(list1, list2));
|
23
|
+
Assert.Equal(SublistType.Superlist, Sublist.Classify(new List<int>() { 1, 2, 3 }, new List<int>() { }));
|
29
24
|
}
|
30
25
|
|
31
26
|
[Fact(Skip = "Remove to run test")]
|
32
|
-
public void
|
27
|
+
public void List_equals_itself()
|
33
28
|
{
|
34
|
-
|
35
|
-
var list2 = new List<int> { 2 };
|
36
|
-
Assert.Equal(SublistType.Unequal, Sublist.Classify(list1, list2));
|
29
|
+
Assert.Equal(SublistType.Equal, Sublist.Classify(new List<int>() { 1, 2, 3 }, new List<int>() { 1, 2, 3 }));
|
37
30
|
}
|
38
31
|
|
39
32
|
[Fact(Skip = "Remove to run test")]
|
40
|
-
public void
|
33
|
+
public void Different_lists()
|
41
34
|
{
|
42
|
-
|
43
|
-
var list2 = new List<char>(Enumerable.Repeat('x', 1000));
|
44
|
-
Assert.Equal(SublistType.Equal, Sublist.Classify(list1, list2));
|
35
|
+
Assert.Equal(SublistType.Unequal, Sublist.Classify(new List<int>() { 1, 2, 3 }, new List<int>() { 2, 3, 4 }));
|
45
36
|
}
|
46
37
|
|
47
38
|
[Fact(Skip = "Remove to run test")]
|
48
|
-
public void
|
39
|
+
public void False_start()
|
49
40
|
{
|
50
|
-
|
51
|
-
var list2 = new List<int> { 1, 2, 3, 4, 5 };
|
52
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
41
|
+
Assert.Equal(SublistType.Sublist, Sublist.Classify(new List<int>() { 1, 2, 5 }, new List<int>() { 0, 1, 2, 3, 1, 2, 5, 6 }));
|
53
42
|
}
|
54
43
|
|
55
44
|
[Fact(Skip = "Remove to run test")]
|
56
|
-
public void
|
45
|
+
public void Consecutive()
|
57
46
|
{
|
58
|
-
|
59
|
-
var list2 = new List<int> { 5, 4, 3, 2, 1 };
|
60
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
47
|
+
Assert.Equal(SublistType.Sublist, Sublist.Classify(new List<int>() { 1, 1, 2 }, new List<int>() { 0, 1, 1, 1, 2, 1, 2 }));
|
61
48
|
}
|
62
49
|
|
63
50
|
[Fact(Skip = "Remove to run test")]
|
64
|
-
public void
|
65
|
-
{
|
66
|
-
var list1 = new List<int> { 3, 4, 5 };
|
67
|
-
var list2 = new List<int> { 1, 2, 3, 4, 5 };
|
68
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
69
|
-
}
|
70
|
-
|
71
|
-
[Fact(Skip = "Remove to run test")]
|
72
|
-
public void Partially_matching_sublist_at_start()
|
51
|
+
public void Sublist_at_start()
|
73
52
|
{
|
74
|
-
|
75
|
-
var list2 = new List<int> { 1, 1, 1, 2 };
|
76
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
53
|
+
Assert.Equal(SublistType.Sublist, Sublist.Classify(new List<int>() { 0, 1, 2 }, new List<int>() { 0, 1, 2, 3, 4, 5 }));
|
77
54
|
}
|
78
55
|
|
79
56
|
[Fact(Skip = "Remove to run test")]
|
80
|
-
public void
|
57
|
+
public void Sublist_in_middle()
|
81
58
|
{
|
82
|
-
|
83
|
-
var list2 = new List<int>(Enumerable.Range(1, 1000000));
|
84
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
59
|
+
Assert.Equal(SublistType.Sublist, Sublist.Classify(new List<int>() { 2, 3, 4 }, new List<int>() { 0, 1, 2, 3, 4, 5 }));
|
85
60
|
}
|
86
61
|
|
87
62
|
[Fact(Skip = "Remove to run test")]
|
88
|
-
public void
|
63
|
+
public void Sublist_at_end()
|
89
64
|
{
|
90
|
-
|
91
|
-
var list2 = new List<int>(Enumerable.Range(1, 1000000));
|
92
|
-
Assert.Equal(SublistType.Unequal, Sublist.Classify(list1, list2));
|
65
|
+
Assert.Equal(SublistType.Sublist, Sublist.Classify(new List<int>() { 3, 4, 5 }, new List<int>() { 0, 1, 2, 3, 4, 5 }));
|
93
66
|
}
|
94
67
|
|
95
68
|
[Fact(Skip = "Remove to run test")]
|
96
|
-
public void
|
69
|
+
public void At_start_of_superlist()
|
97
70
|
{
|
98
|
-
|
99
|
-
var list2 = new List<int> { 1, 2, 3 };
|
100
|
-
Assert.Equal(SublistType.Superlist, Sublist.Classify(list1, list2));
|
71
|
+
Assert.Equal(SublistType.Superlist, Sublist.Classify(new List<int>() { 0, 1, 2, 3, 4, 5 }, new List<int>() { 0, 1, 2 }));
|
101
72
|
}
|
102
73
|
|
103
74
|
[Fact(Skip = "Remove to run test")]
|
104
|
-
public void
|
75
|
+
public void In_middle_of_superlist()
|
105
76
|
{
|
106
|
-
|
107
|
-
var list2 = new List<int> { 4, 3, 2 };
|
108
|
-
Assert.Equal(SublistType.Superlist, Sublist.Classify(list1, list2));
|
77
|
+
Assert.Equal(SublistType.Superlist, Sublist.Classify(new List<int>() { 0, 1, 2, 3, 4, 5 }, new List<int>() { 2, 3 }));
|
109
78
|
}
|
110
79
|
|
111
80
|
[Fact(Skip = "Remove to run test")]
|
112
|
-
public void
|
81
|
+
public void At_end_of_superlist()
|
113
82
|
{
|
114
|
-
|
115
|
-
var list2 = new List<int> { 3, 4, 5 };
|
116
|
-
Assert.Equal(SublistType.Superlist, Sublist.Classify(list1, list2));
|
83
|
+
Assert.Equal(SublistType.Superlist, Sublist.Classify(new List<int>() { 0, 1, 2, 3, 4, 5 }, new List<int>() { 3, 4, 5 }));
|
117
84
|
}
|
118
85
|
|
119
86
|
[Fact(Skip = "Remove to run test")]
|
120
|
-
public void
|
87
|
+
public void First_list_missing_element_from_second_list()
|
121
88
|
{
|
122
|
-
|
123
|
-
var list2 = new List<int> { 1, 1, 2 };
|
124
|
-
Assert.Equal(SublistType.Superlist, Sublist.Classify(list1, list2));
|
89
|
+
Assert.Equal(SublistType.Unequal, Sublist.Classify(new List<int>() { 1, 3 }, new List<int>() { 1, 2, 3 }));
|
125
90
|
}
|
126
91
|
|
127
92
|
[Fact(Skip = "Remove to run test")]
|
128
|
-
public void
|
93
|
+
public void Second_list_missing_element_from_first_list()
|
129
94
|
{
|
130
|
-
|
131
|
-
var list2 = new List<int> { 3, 4, 5 };
|
132
|
-
Assert.Equal(SublistType.Superlist, Sublist.Classify(list1, list2));
|
95
|
+
Assert.Equal(SublistType.Unequal, Sublist.Classify(new List<int>() { 1, 2, 3 }, new List<int>() { 1, 3 }));
|
133
96
|
}
|
134
97
|
|
135
98
|
[Fact(Skip = "Remove to run test")]
|
136
|
-
public void
|
99
|
+
public void Order_matters_to_a_list()
|
137
100
|
{
|
138
|
-
|
139
|
-
var list2 = new List<int> { 1, 2, 3, 1, 2, 1, 2, 3, 2, 1 };
|
140
|
-
Assert.Equal(SublistType.Sublist, Sublist.Classify(list1, list2));
|
101
|
+
Assert.Equal(SublistType.Unequal, Sublist.Classify(new List<int>() { 1, 2, 3 }, new List<int>() { 3, 2, 1 }));
|
141
102
|
}
|
142
103
|
|
143
104
|
[Fact(Skip = "Remove to run test")]
|
144
|
-
public void
|
105
|
+
public void Same_digits_but_different_numbers()
|
145
106
|
{
|
146
|
-
|
147
|
-
var list2 = new List<int> { 1, 2, 3, 1, 2, 3, 2, 3, 2, 1 };
|
148
|
-
Assert.Equal(SublistType.Unequal, Sublist.Classify(list1, list2));
|
107
|
+
Assert.Equal(SublistType.Unequal, Sublist.Classify(new List<int>() { 1, 0, 1 }, new List<int>() { 10, 1 }));
|
149
108
|
}
|
150
109
|
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Collections.Generic;
|
3
|
+
using Generators.Input;
|
4
|
+
using Generators.Output;
|
5
|
+
using Humanizer;
|
6
|
+
|
7
|
+
namespace Generators.Exercises
|
8
|
+
{
|
9
|
+
public class Sublist : GeneratorExercise
|
10
|
+
{
|
11
|
+
protected override HashSet<string> AddAdditionalNamespaces() => new HashSet<string>() { typeof(IList<int>).Namespace };
|
12
|
+
|
13
|
+
private UnescapedValue InputValues(int[] list)
|
14
|
+
{
|
15
|
+
var template = (list != null) ? string.Join(", ", Array.ConvertAll<int, string>(list, (x) => { return $"{x}"; })) : "";
|
16
|
+
return new UnescapedValue($"new List<int>() {{ {template} }}".Replace(" ", " "));
|
17
|
+
}
|
18
|
+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
19
|
+
{
|
20
|
+
foreach (var canonicalDataCase in canonicalData.Cases)
|
21
|
+
{
|
22
|
+
var input = canonicalDataCase.Properties["input"] as Dictionary<string, object>;
|
23
|
+
input["listOne"] = InputValues(input["listOne"] as int[]);
|
24
|
+
input["listTwo"] = InputValues(input["listTwo"] as int[]);
|
25
|
+
|
26
|
+
canonicalDataCase.Property = "classify";
|
27
|
+
canonicalDataCase.Properties["expected"] = new UnescapedValue($"SublistType.{(canonicalDataCase.Properties["expected"] as string).Dehumanize()}");
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
@@ -6,6 +6,8 @@ Bob answers 'Sure.' if you ask him a question.
|
|
6
6
|
|
7
7
|
He answers 'Whoa, chill out!' if you yell at him.
|
8
8
|
|
9
|
+
He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
|
10
|
+
|
9
11
|
He says 'Fine. Be that way!' if you address him without actually saying
|
10
12
|
anything.
|
11
13
|
|
@@ -1,43 +1,64 @@
|
|
1
1
|
;;; bob-test.el --- ERT tests for Bob (exercism)
|
2
2
|
|
3
3
|
;;; Commentary:
|
4
|
+
;; Common test data version: 1.2.0 6dc2014
|
4
5
|
|
5
6
|
;;; Code:
|
6
7
|
|
7
8
|
(load-file "bob.el")
|
8
9
|
|
9
10
|
|
10
|
-
(ert-deftest responds-to-something ()
|
11
|
+
(ert-deftest responds-to-stating-something ()
|
11
12
|
(should (string= "Whatever." (response-for "Tom-ay-to, tom-aaaah-to."))))
|
12
13
|
|
13
|
-
(ert-deftest responds-to-
|
14
|
+
(ert-deftest responds-to-shouting ()
|
14
15
|
(should
|
15
16
|
(string= "Whoa, chill out!" (response-for "WATCH OUT!"))))
|
16
17
|
|
17
|
-
(ert-deftest responds-to-
|
18
|
+
(ert-deftest responds-to-shouting-gibberish ()
|
19
|
+
(should
|
20
|
+
(string= "Whoa, chill out!" (response-for "FCECDFCAAB"))))
|
21
|
+
|
22
|
+
(ert-deftest responds-to-asking-a-question ()
|
18
23
|
(should
|
19
24
|
(string= "Sure." (response-for "Does this cryogenic chamber make me look fat?"))))
|
20
25
|
|
21
|
-
(ert-deftest responds-to-
|
26
|
+
(ert-deftest responds-to-asking-a-numeric-question ()
|
22
27
|
(should
|
23
|
-
(string= "
|
28
|
+
(string= "Sure." (response-for "You are, what, like 15?"))))
|
24
29
|
|
25
|
-
(ert-deftest responds-to-
|
30
|
+
(ert-deftest responds-to-asking-gibberish ()
|
26
31
|
(should
|
27
|
-
(string= "
|
32
|
+
(string= "Sure." (response-for "fffbbcbeab?"))))
|
28
33
|
|
29
|
-
(ert-deftest responds-to-
|
34
|
+
(ert-deftest responds-to-talking-forcefully ()
|
30
35
|
(should
|
31
|
-
(string= "
|
36
|
+
(string= "Whatever." (response-for "Let's go make out behind the gym!"))))
|
32
37
|
|
33
|
-
(ert-deftest responds-to-
|
38
|
+
(ert-deftest responds-to-using-acronyms-in-regular-speech ()
|
34
39
|
(should
|
35
|
-
(string= "
|
40
|
+
(string= "Whatever." (response-for "It's OK if you don't want to go to the DMV."))))
|
41
|
+
|
42
|
+
(ert-deftest responds-to-forceful-question ()
|
43
|
+
(should
|
44
|
+
(string= "Calm down, I know what I'm doing!" (response-for "WHAT THE HELL WERE YOU THINKING?"))))
|
36
45
|
|
37
46
|
(ert-deftest responds-to-shouting-numbers ()
|
38
47
|
(should
|
39
48
|
(string= "Whoa, chill out!" (response-for "1, 2, 3, GO!"))))
|
40
49
|
|
50
|
+
(ert-deftest responds-to-only-numbers ()
|
51
|
+
(should
|
52
|
+
(string= "Whatever." (response-for "1, 2, 3"))))
|
53
|
+
|
54
|
+
(ert-deftest responds-to-questions-with-only-numbers ()
|
55
|
+
(should
|
56
|
+
(string= "Sure." (response-for "4?"))))
|
57
|
+
|
58
|
+
(ert-deftest responds-to-shouting-with-special-chars ()
|
59
|
+
(should
|
60
|
+
(string= "Whoa, chill out!" (response-for "ZOMG THE %^*@#$(*^ ZOMBIES ARE COMING!!11!!1!"))))
|
61
|
+
|
41
62
|
(ert-deftest responds-to-shouting-with-no-exclamation-mark ()
|
42
63
|
(should
|
43
64
|
(string= "Whoa, chill out!" (response-for "I HATE YOU"))))
|
@@ -46,6 +67,14 @@
|
|
46
67
|
(should
|
47
68
|
(string= "Whatever." (response-for "Ending with ? means a question."))))
|
48
69
|
|
70
|
+
(ert-deftest responds-to-non-letters-with-question ()
|
71
|
+
(should
|
72
|
+
(string= "Sure." (response-for ":) ?"))))
|
73
|
+
|
74
|
+
(ert-deftest responds-to-prattling-on ()
|
75
|
+
(should
|
76
|
+
(string= "Sure." (response-for "Wait! Hang on. Are you going to be OK?"))))
|
77
|
+
|
49
78
|
(ert-deftest responds-to-silence ()
|
50
79
|
(should
|
51
80
|
(string= "Fine. Be that way!" (response-for ""))))
|
@@ -54,13 +83,29 @@
|
|
54
83
|
(should
|
55
84
|
(string= "Fine. Be that way!" (response-for " "))))
|
56
85
|
|
57
|
-
(ert-deftest responds-to-
|
86
|
+
(ert-deftest responds-to-alternate-silence ()
|
58
87
|
(should
|
59
|
-
(string= "
|
88
|
+
(string= "Fine. Be that way!" (response-for "\t\t\t\t\t\t\t\t\t\t"))))
|
60
89
|
|
61
|
-
(ert-deftest responds-to-
|
90
|
+
(ert-deftest responds-to-multiple-line-question ()
|
62
91
|
(should
|
63
|
-
(string= "
|
92
|
+
(string= "Whatever." (response-for "\nDoes this cryogenic chamber make me look fat?\nno"))))
|
93
|
+
|
94
|
+
(ert-deftest responds-to-starting-with-whitespace ()
|
95
|
+
(should
|
96
|
+
(string= "Whatever." (response-for " hmmmmmmm..."))))
|
97
|
+
|
98
|
+
(ert-deftest responds-to-ending-with-whitespace ()
|
99
|
+
(should
|
100
|
+
(string= "Sure." (response-for "Okay if like my spacebar quite a bit? "))))
|
101
|
+
|
102
|
+
(ert-deftest responds-to-other-whitespace ()
|
103
|
+
(should
|
104
|
+
(string= "Fine. Be that way!" (response-for "\n\r \t"))))
|
105
|
+
|
106
|
+
(ert-deftest responds-to-non-question-ending-with-whitespace ()
|
107
|
+
(should
|
108
|
+
(string= "Whatever." (response-for "This is a statement ending with whitespace "))))
|
64
109
|
|
65
110
|
(provide 'bob-test)
|
66
111
|
;;;bob-test.el ends here
|