trackler 2.2.1.85 → 2.2.1.86
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/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/alphametics/canonical-data.json +29 -11
- data/problem-specifications/exercises/binary-search-tree/canonical-data.json +177 -0
- data/problem-specifications/package.json +2 -2
- data/problem-specifications/yarn.lock +61 -51
- data/tracks/bash/CONTRIBUTING.md +10 -6
- data/tracks/bash/README.md +1 -0
- data/tracks/bash/exercises/acronym/README.md +1 -1
- data/tracks/bash/exercises/anagram/README.md +1 -1
- data/tracks/bash/exercises/anagram/{anagram_tests.sh → anagram_test.sh} +0 -0
- data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +25 -17
- data/tracks/bash/exercises/armstrong-numbers/example.sh +18 -12
- data/tracks/bash/exercises/atbash-cipher/README.md +1 -1
- data/tracks/bash/exercises/atbash-cipher/{atbash_cipher_tests.sh → atbash_cipher_test.sh} +0 -0
- data/tracks/bash/exercises/difference-of-squares/README.md +1 -1
- data/tracks/bash/exercises/gigasecond/README.md +1 -1
- data/tracks/bash/exercises/hamming/README.md +1 -1
- data/tracks/bash/exercises/hello-world/README.md +1 -1
- data/tracks/bash/exercises/leap/README.md +1 -1
- data/tracks/bash/exercises/luhn/README.md +1 -1
- data/tracks/bash/exercises/nucleotide-count/README.md +1 -1
- data/tracks/bash/exercises/pangram/README.md +1 -1
- data/tracks/bash/exercises/pangram/{pangram_tests.sh → pangram_test.sh} +0 -0
- data/tracks/bash/exercises/phone-number/README.md +1 -1
- data/tracks/bash/exercises/phone-number/{phone_number_tests.sh → phone_number_test.sh} +0 -0
- data/tracks/bash/exercises/raindrops/README.md +1 -1
- data/tracks/bash/exercises/rna-transcription/README.md +1 -1
- data/tracks/bash/exercises/triangle/example.sh +23 -4
- data/tracks/bash/exercises/triangle/triangle_test.sh +17 -0
- data/tracks/bash/exercises/two-fer/README.md +1 -1
- data/tracks/bash/exercises/word-count/README.md +1 -1
- data/tracks/c/config.json +11 -0
- data/tracks/c/exercises/complex-numbers/README.md +67 -0
- data/tracks/c/exercises/complex-numbers/makefile +27 -0
- data/tracks/c/exercises/complex-numbers/src/complex_numbers.c +46 -0
- data/tracks/c/exercises/complex-numbers/src/complex_numbers.h +19 -0
- data/tracks/c/exercises/complex-numbers/src/example.c +80 -0
- data/tracks/c/exercises/complex-numbers/test/test_complex_numbers.c +397 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity_internals.h +701 -0
- data/tracks/crystal/.github/stale.yml +18 -0
- data/tracks/csharp/exercises/bob/README.md +3 -2
- data/tracks/ecmascript/config.json +4 -4
- data/tracks/fsharp/exercises/bob/README.md +4 -2
- data/tracks/fsharp/exercises/react/ReactTest.fs +137 -74
- data/tracks/fsharp/generators/Generators.fs +76 -0
- data/tracks/go/exercises/tree-building/tree_test.go +15 -0
- data/tracks/haskell/.travis.yml +1 -1
- data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/package.yaml +1 -1
- data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +6 -6
- data/tracks/haskell/exercises/allergies/package.yaml +1 -1
- data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
- data/tracks/haskell/exercises/anagram/package.yaml +1 -1
- data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/binary/stack.yaml +1 -1
- data/tracks/haskell/exercises/bob/package.yaml +1 -1
- data/tracks/haskell/exercises/bob/stack.yaml +1 -1
- data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
- data/tracks/haskell/exercises/change/package.yaml +1 -1
- data/tracks/haskell/exercises/change/stack.yaml +1 -1
- data/tracks/haskell/exercises/clock/stack.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/package.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
- data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/connect/package.yaml +1 -1
- data/tracks/haskell/exercises/connect/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
- data/tracks/haskell/exercises/diamond/package.yaml +1 -1
- data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
- data/tracks/haskell/exercises/etl/stack.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
- data/tracks/haskell/exercises/forth/stack.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
- data/tracks/haskell/exercises/grains/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
- data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
- data/tracks/haskell/exercises/house/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +1 -0
- data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +4 -0
- data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/stack.yaml +1 -1
- data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/package.yaml +1 -1
- data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/meetup/package.yaml +1 -1
- data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/octal/stack.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
- data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
- data/tracks/haskell/exercises/pov/stack.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
- data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +0 -12
- data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
- data/tracks/haskell/exercises/say/stack.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
- data/tracks/haskell/exercises/series/stack.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
- data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
- data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/strain/stack.yaml +1 -1
- data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
- data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
- data/tracks/haskell/exercises/twelve-days/stack.yaml +1 -1
- data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
- data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
- data/tracks/java/config.json +12 -0
- data/tracks/java/exercises/alphametics/.meta/src/reference/java/Alphametics.java +125 -0
- data/tracks/java/exercises/alphametics/.meta/src/reference/java/UnsolvablePuzzleException.java +2 -0
- data/tracks/java/exercises/alphametics/.meta/src/version +1 -0
- data/tracks/java/exercises/alphametics/README.md +47 -0
- data/tracks/java/exercises/alphametics/build.gradle +18 -0
- data/tracks/java/exercises/alphametics/src/main/java/.keep +0 -0
- data/tracks/java/exercises/alphametics/src/main/java/UnsolvablePuzzleException.java +2 -0
- data/tracks/java/exercises/alphametics/src/test/java/AlphameticsTest.java +150 -0
- data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +5 -4
- data/tracks/java/exercises/beer-song/.meta/version +1 -0
- data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +24 -16
- data/tracks/java/exercises/binary-search/.meta/version +1 -0
- data/tracks/java/exercises/book-store/.meta/version +1 -0
- data/tracks/java/exercises/book-store/src/test/java/BookStoreTest.java +15 -8
- data/tracks/java/exercises/circular-buffer/.meta/version +1 -0
- data/tracks/java/exercises/list-ops/.meta/version +1 -1
- data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +1 -1
- data/tracks/java/exercises/nth-prime/.meta/version +1 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/java/exercises/tournament/.meta/version +1 -0
- data/tracks/java/exercises/transpose/.meta/version +1 -0
- data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +29 -74
- data/tracks/java/exercises/wordy/.meta/version +1 -0
- data/tracks/javascript/.eslintignore +0 -1
- data/tracks/javascript/config.json +13 -3
- data/tracks/javascript/exercises/bowling/example.js +24 -10
- data/tracks/javascript/exercises/forth/README.md +56 -0
- data/tracks/javascript/exercises/forth/example.js +66 -0
- data/tracks/javascript/exercises/forth/forth.spec.js +259 -0
- data/tracks/lua/config.json +92 -81
- data/tracks/lua/exercises/accumulate/README.md +42 -0
- data/tracks/lua/exercises/beer-song/README.md +1 -1
- data/tracks/lua/exercises/bob/README.md +2 -0
- data/tracks/lua/exercises/crypto-square/README.md +6 -4
- data/tracks/lua/exercises/house/README.md +1 -1
- data/tracks/lua/exercises/isbn-verifier/README.md +25 -20
- data/tracks/lua/exercises/kindergarten-garden/README.md +3 -3
- data/tracks/lua/exercises/meetup/README.md +16 -12
- data/tracks/lua/exercises/nucleotide-count/README.md +2 -2
- data/tracks/lua/exercises/phone-number/README.md +1 -1
- data/tracks/lua/exercises/pov/README.md +0 -2
- data/tracks/lua/exercises/queen-attack/README.md +22 -22
- data/tracks/lua/exercises/rectangles/README.md +9 -9
- data/tracks/lua/exercises/reverse-string/README.md +23 -0
- data/tracks/lua/exercises/reverse-string/example.lua +7 -0
- data/tracks/lua/exercises/reverse-string/reverse-string_spec.lua +24 -0
- data/tracks/lua/exercises/secret-handshake/README.md +1 -1
- data/tracks/lua/exercises/space-age/README.md +1 -2
- data/tracks/lua/exercises/sum-of-multiples/README.md +3 -3
- data/tracks/perl6/exercises/two-fer/README.md +1 -1
- data/tracks/python/exercises/luhn/luhn_test.py +1 -1
- metadata +39 -6
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
|
2
|
+
daysUntilStale: 180
|
|
3
|
+
# Number of days of inactivity before a stale Issue or Pull Request is closed
|
|
4
|
+
daysUntilClose: 7
|
|
5
|
+
# Issues or Pull Requests with these labels will never be considered stale
|
|
6
|
+
exemptLabels:
|
|
7
|
+
- pinned
|
|
8
|
+
# Label to use when marking as stale
|
|
9
|
+
staleLabel: stale
|
|
10
|
+
# Comment to post when marking as stale. Set to `false` to disable
|
|
11
|
+
markComment: >
|
|
12
|
+
This issue has been automatically marked as stale because it has not had
|
|
13
|
+
recent activity. It will be closed if no further activity occurs. Thank you
|
|
14
|
+
for your contributions.
|
|
15
|
+
# Comment to post when closing a stale Issue or Pull Request. Set to `false` to disable
|
|
16
|
+
closeComment: false
|
|
17
|
+
# Limit to only `issues` or `pulls`
|
|
18
|
+
# only: issues
|
|
@@ -6,8 +6,9 @@ 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
|
|
10
|
-
|
|
9
|
+
He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
|
|
10
|
+
|
|
11
|
+
He says 'Fine. Be that way!' if you address him without actually saying anything.
|
|
11
12
|
|
|
12
13
|
He answers 'Whatever.' to anything else.
|
|
13
14
|
|
|
@@ -794,7 +794,7 @@
|
|
|
794
794
|
]
|
|
795
795
|
},
|
|
796
796
|
{
|
|
797
|
-
"uuid": "
|
|
797
|
+
"uuid": "a8b7187d-12eb-4efc-b966-87823654ccda",
|
|
798
798
|
"slug": "house",
|
|
799
799
|
"core": false,
|
|
800
800
|
"unlocked_by": "bob",
|
|
@@ -1211,7 +1211,7 @@
|
|
|
1211
1211
|
]
|
|
1212
1212
|
},
|
|
1213
1213
|
{
|
|
1214
|
-
"uuid": "
|
|
1214
|
+
"uuid": "c1abafcc-0d44-4fb5-afae-bff3ce2e1b39",
|
|
1215
1215
|
"slug": "spiral-matrix",
|
|
1216
1216
|
"core": false,
|
|
1217
1217
|
"unlocked_by": "matrix",
|
|
@@ -1225,7 +1225,7 @@
|
|
|
1225
1225
|
]
|
|
1226
1226
|
},
|
|
1227
1227
|
{
|
|
1228
|
-
"uuid": "
|
|
1228
|
+
"uuid": "f8c6786e-bf93-4f35-b649-03f4e39bb094",
|
|
1229
1229
|
"slug": "rectangles",
|
|
1230
1230
|
"core": false,
|
|
1231
1231
|
"unlocked_by": "matrix",
|
|
@@ -1239,7 +1239,7 @@
|
|
|
1239
1239
|
]
|
|
1240
1240
|
},
|
|
1241
1241
|
{
|
|
1242
|
-
"uuid": "
|
|
1242
|
+
"uuid": "34625b04-844e-41e3-b02b-3443b6b0b7cb",
|
|
1243
1243
|
"slug": "rotational-cipher",
|
|
1244
1244
|
"core": false,
|
|
1245
1245
|
"unlocked_by": "simple-cipher",
|
|
@@ -6,10 +6,12 @@ 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
|
|
10
|
-
|
|
9
|
+
He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
|
|
10
|
+
|
|
11
|
+
He says 'Fine. Be that way!' if you address him without actually saying anything.
|
|
11
12
|
|
|
12
13
|
He answers 'Whatever.' to anything else.
|
|
14
|
+
|
|
13
15
|
## Source
|
|
14
16
|
|
|
15
17
|
Inspired by the 'Deaf Grandma' exercise in Chris Pine's Learn to Program tutorial. [http://pine.fm/LearnToProgram/?Chapter=06](http://pine.fm/LearnToProgram/?Chapter=06)
|
|
@@ -1,98 +1,161 @@
|
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
|
2
|
+
|
|
1
3
|
module ReactTest
|
|
2
4
|
|
|
3
|
-
open Xunit
|
|
4
5
|
open FsUnit.Xunit
|
|
6
|
+
open Xunit
|
|
5
7
|
|
|
6
8
|
open React
|
|
7
9
|
|
|
8
10
|
[<Fact>]
|
|
9
|
-
let ``
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
let ``Input cells have a value`` () =
|
|
12
|
+
let reactor = new Reactor()
|
|
13
|
+
let input = reactor.createInputCell 10
|
|
14
|
+
input.Value |> should equal 10
|
|
15
|
+
|
|
12
16
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
17
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
18
|
+
let ``An input cell's value can be set`` () =
|
|
19
|
+
let reactor = new Reactor()
|
|
20
|
+
let input = reactor.createInputCell 4
|
|
21
|
+
input.Value <- 20
|
|
22
|
+
input.Value |> should equal 20
|
|
23
|
+
|
|
16
24
|
|
|
17
25
|
[<Fact(Skip = "Remove to run test")>]
|
|
18
|
-
let ``
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
26
|
+
let ``Compute cells calculate initial value`` () =
|
|
27
|
+
let reactor = new Reactor()
|
|
28
|
+
let input = reactor.createInputCell 1
|
|
29
|
+
let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
30
|
+
output.Value |> should equal 2
|
|
31
|
+
|
|
22
32
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
33
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
34
|
+
let ``Compute cells take inputs in the right order`` () =
|
|
35
|
+
let reactor = new Reactor()
|
|
36
|
+
let one = reactor.createInputCell 1
|
|
37
|
+
let two = reactor.createInputCell 2
|
|
38
|
+
let output = reactor.createComputeCell [one; two] (fun values -> values.[0] + values.[1] * 10)
|
|
39
|
+
output.Value |> should equal 21
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
43
|
+
let ``Compute cells update value when dependencies are changed`` () =
|
|
44
|
+
let reactor = new Reactor()
|
|
45
|
+
let input = reactor.createInputCell 1
|
|
46
|
+
let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
47
|
+
input.Value <- 3
|
|
48
|
+
output.Value |> should equal 4
|
|
49
|
+
|
|
26
50
|
|
|
27
51
|
[<Fact(Skip = "Remove to run test")>]
|
|
28
52
|
let ``Compute cells can depend on other compute cells`` () =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
53
|
+
let reactor = new Reactor()
|
|
54
|
+
let input = reactor.createInputCell 1
|
|
55
|
+
let times_two = reactor.createComputeCell [input] (fun values -> values.[0] * 2)
|
|
56
|
+
let times_thirty = reactor.createComputeCell [input] (fun values -> values.[0] * 30)
|
|
57
|
+
let output = reactor.createComputeCell [times_two; times_thirty] (fun values -> values.[0] + values.[1])
|
|
58
|
+
output.Value |> should equal 32
|
|
59
|
+
input.Value <- 3
|
|
60
|
+
output.Value |> should equal 96
|
|
61
|
+
|
|
38
62
|
|
|
39
63
|
[<Fact(Skip = "Remove to run test")>]
|
|
40
|
-
let ``Compute cells
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
64
|
+
let ``Compute cells fire callbacks`` () =
|
|
65
|
+
let reactor = new Reactor()
|
|
66
|
+
let input = reactor.createInputCell 1
|
|
67
|
+
let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
68
|
+
let mutable callback1 = []
|
|
69
|
+
let callback1Handler = Handler<int>(fun _ value -> callback1 <- callback1 @ [value])
|
|
70
|
+
output.Changed.AddHandler callback1Handler
|
|
71
|
+
input.Value <- 3
|
|
72
|
+
callback1 |> should equal [4]
|
|
73
|
+
|
|
50
74
|
|
|
51
75
|
[<Fact(Skip = "Remove to run test")>]
|
|
52
|
-
let ``
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
observerCalled |> should equal 1
|
|
76
|
+
let ``Callback cells only fire on change`` () =
|
|
77
|
+
let reactor = new Reactor()
|
|
78
|
+
let input = reactor.createInputCell 1
|
|
79
|
+
let output = reactor.createComputeCell [input] (fun values -> if values.[0] < 3 then 111 else 222)
|
|
80
|
+
let mutable callback1 = []
|
|
81
|
+
let callback1Handler = Handler<int>(fun _ value -> callback1 <- callback1 @ [value])
|
|
82
|
+
output.Changed.AddHandler callback1Handler
|
|
83
|
+
input.Value <- 2
|
|
84
|
+
callback1 |> should equal List.empty<int>
|
|
85
|
+
input.Value <- 4
|
|
86
|
+
callback1 |> should equal [222]
|
|
87
|
+
|
|
65
88
|
|
|
66
89
|
[<Fact(Skip = "Remove to run test")>]
|
|
67
|
-
let ``Callbacks can be removed`` () =
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
90
|
+
let ``Callbacks can be added and removed`` () =
|
|
91
|
+
let reactor = new Reactor()
|
|
92
|
+
let input = reactor.createInputCell 11
|
|
93
|
+
let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
94
|
+
let mutable callback1 = []
|
|
95
|
+
let callback1Handler = Handler<int>(fun _ value -> callback1 <- callback1 @ [value])
|
|
96
|
+
output.Changed.AddHandler callback1Handler
|
|
97
|
+
let mutable callback2 = []
|
|
98
|
+
let callback2Handler = Handler<int>(fun _ value -> callback2 <- callback2 @ [value])
|
|
99
|
+
output.Changed.AddHandler callback2Handler
|
|
100
|
+
input.Value <- 31
|
|
101
|
+
output.Changed.RemoveHandler callback1Handler
|
|
102
|
+
let mutable callback3 = []
|
|
103
|
+
let callback3Handler = Handler<int>(fun _ value -> callback3 <- callback3 @ [value])
|
|
104
|
+
output.Changed.AddHandler callback3Handler
|
|
105
|
+
input.Value <- 41
|
|
106
|
+
callback1 |> should equal [32]
|
|
107
|
+
callback2 |> should equal [32; 42]
|
|
108
|
+
callback3 |> should equal [42]
|
|
77
109
|
|
|
78
|
-
inputCell1.Value <- 2
|
|
79
|
-
observed1 |> should equal [3]
|
|
80
|
-
observed2 |> should equal [3]
|
|
81
110
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
111
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
112
|
+
let ``Removing a callback multiple times doesn't interfere with other callbacks`` () =
|
|
113
|
+
let reactor = new Reactor()
|
|
114
|
+
let input = reactor.createInputCell 1
|
|
115
|
+
let output = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
116
|
+
let mutable callback1 = []
|
|
117
|
+
let callback1Handler = Handler<int>(fun _ value -> callback1 <- callback1 @ [value])
|
|
118
|
+
output.Changed.AddHandler callback1Handler
|
|
119
|
+
let mutable callback2 = []
|
|
120
|
+
let callback2Handler = Handler<int>(fun _ value -> callback2 <- callback2 @ [value])
|
|
121
|
+
output.Changed.AddHandler callback2Handler
|
|
122
|
+
output.Changed.RemoveHandler callback1Handler
|
|
123
|
+
output.Changed.RemoveHandler callback1Handler
|
|
124
|
+
output.Changed.RemoveHandler callback1Handler
|
|
125
|
+
input.Value <- 2
|
|
126
|
+
callback1 |> should equal List.empty<int>
|
|
127
|
+
callback2 |> should equal [3]
|
|
128
|
+
|
|
86
129
|
|
|
87
130
|
[<Fact(Skip = "Remove to run test")>]
|
|
88
|
-
let ``Callbacks should only be called once even if multiple dependencies
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
131
|
+
let ``Callbacks should only be called once even if multiple dependencies change`` () =
|
|
132
|
+
let reactor = new Reactor()
|
|
133
|
+
let input = reactor.createInputCell 1
|
|
134
|
+
let plus_one = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
135
|
+
let minus_one1 = reactor.createComputeCell [input] (fun values -> values.[0] - 1)
|
|
136
|
+
let minus_one2 = reactor.createComputeCell [minus_one1] (fun values -> values.[0] - 1)
|
|
137
|
+
let output = reactor.createComputeCell [plus_one; minus_one2] (fun values -> values.[0] * values.[1])
|
|
138
|
+
let mutable callback1 = []
|
|
139
|
+
let callback1Handler = Handler<int>(fun _ value -> callback1 <- callback1 @ [value])
|
|
140
|
+
output.Changed.AddHandler callback1Handler
|
|
141
|
+
input.Value <- 4
|
|
142
|
+
callback1 |> should equal [10]
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
146
|
+
let ``Callbacks should not be called if dependencies change but output value doesn't change`` () =
|
|
147
|
+
let reactor = new Reactor()
|
|
148
|
+
let input = reactor.createInputCell 1
|
|
149
|
+
let plus_one = reactor.createComputeCell [input] (fun values -> values.[0] + 1)
|
|
150
|
+
let minus_one = reactor.createComputeCell [input] (fun values -> values.[0] - 1)
|
|
151
|
+
let always_two = reactor.createComputeCell [plus_one; minus_one] (fun values -> values.[0] - values.[1])
|
|
152
|
+
let mutable callback1 = []
|
|
153
|
+
let callback1Handler = Handler<int>(fun _ value -> callback1 <- callback1 @ [value])
|
|
154
|
+
always_two.Changed.AddHandler callback1Handler
|
|
155
|
+
input.Value <- 2
|
|
156
|
+
input.Value <- 3
|
|
157
|
+
input.Value <- 4
|
|
158
|
+
input.Value <- 5
|
|
159
|
+
callback1 |> should equal List.empty<int>
|
|
160
|
+
|
|
161
|
+
|
|
@@ -656,6 +656,82 @@ type RailFenceCipher() =
|
|
|
656
656
|
type Raindrops() =
|
|
657
657
|
inherit GeneratorExercise()
|
|
658
658
|
|
|
659
|
+
type React() =
|
|
660
|
+
inherit GeneratorExercise()
|
|
661
|
+
|
|
662
|
+
override __.PropertiesWithIdentifier _ = []
|
|
663
|
+
|
|
664
|
+
member private __.RenderCells canonicalDataCase =
|
|
665
|
+
let reactorVar = sprintf "let %s = new %s()" "reactor" "Reactor"
|
|
666
|
+
let cellVars =
|
|
667
|
+
canonicalDataCase.Properties.["cells"] :?> JArray
|
|
668
|
+
|> Seq.map (fun (cellValue: JToken) ->
|
|
669
|
+
let cell = cellValue :?> JObject
|
|
670
|
+
let cellName = cell.["name"].ToObject<string>()
|
|
671
|
+
match cell.["type"].ToObject<string>() with
|
|
672
|
+
| "compute" ->
|
|
673
|
+
let funBody =
|
|
674
|
+
cell.["compute_function"].ToObject<string>().Replace ("inputs", "values.")
|
|
675
|
+
let inputParams =
|
|
676
|
+
(cell.["inputs"].ToObject<seq<string>>() |> formatList)
|
|
677
|
+
|
|
678
|
+
sprintf "let %s = reactor.createComputeCell %s (fun values -> %s)" cellName inputParams funBody
|
|
679
|
+
| "input" ->
|
|
680
|
+
let initialValue = cell.["initial_value"].ToObject<int64>()
|
|
681
|
+
sprintf "let %s = reactor.createInputCell %s" cellName (formatValue initialValue)
|
|
682
|
+
| _ -> ""
|
|
683
|
+
)
|
|
684
|
+
|> Seq.toList
|
|
685
|
+
[ reactorVar ] @ cellVars
|
|
686
|
+
|
|
687
|
+
member private __.RenderOperations canonicalDataCase =
|
|
688
|
+
canonicalDataCase.Properties.["operations"] :?> JArray
|
|
689
|
+
// we can generate more than 1 line per operation
|
|
690
|
+
// so we need to flatten results here
|
|
691
|
+
// collect does it automatically for us
|
|
692
|
+
// and every operation should emit seq<string>
|
|
693
|
+
|> Seq.collect (fun (opToken: JToken) ->
|
|
694
|
+
let op = opToken :?> JObject
|
|
695
|
+
match op.["type"].ToObject<string>() with
|
|
696
|
+
| "expect_cell_value" -> seq {
|
|
697
|
+
let cellName = op.["cell"].ToObject<string>()
|
|
698
|
+
let expectedValue = op.["value"].ToObject<int>()
|
|
699
|
+
yield sprintf "%s.Value |> should equal %i" cellName expectedValue }
|
|
700
|
+
| "set_value" -> seq {
|
|
701
|
+
let cellName = op.["cell"].ToObject<string>()
|
|
702
|
+
let cellValue = op.["value"].ToObject<int>()
|
|
703
|
+
yield sprintf "%s.Value <- %i" cellName cellValue }
|
|
704
|
+
| "add_callback" -> seq {
|
|
705
|
+
let callbackName = op.["name"].ToObject<string>()
|
|
706
|
+
let cellName = op.["cell"].ToObject<string>()
|
|
707
|
+
yield sprintf "let mutable %s = []" callbackName
|
|
708
|
+
yield sprintf "let %sHandler = Handler<int>(fun _ value -> %s <- %s @ [value])" callbackName callbackName callbackName
|
|
709
|
+
yield sprintf "%s.Changed.AddHandler %sHandler" cellName callbackName }
|
|
710
|
+
| "expect_callback_values" -> seq {
|
|
711
|
+
let callbackName = op.["callback"].ToObject<string>()
|
|
712
|
+
let callbackValues = op.["values"].ToObject<string[]>()
|
|
713
|
+
if callbackValues.Length = 0 then
|
|
714
|
+
yield sprintf "%s |> should equal List.empty<int>" callbackName
|
|
715
|
+
else
|
|
716
|
+
yield sprintf "%s |> should equal %s" callbackName (formatList callbackValues) }
|
|
717
|
+
| "remove_callback" -> seq {
|
|
718
|
+
let cellName = op.["cell"].ToObject<string>()
|
|
719
|
+
let callbackName = op.["name"].ToObject<string>()
|
|
720
|
+
yield sprintf "%s.Changed.RemoveHandler %sHandler" cellName callbackName }
|
|
721
|
+
| _ -> seq { yield "" }
|
|
722
|
+
)
|
|
723
|
+
|> Seq.toList
|
|
724
|
+
|
|
725
|
+
override __.RenderAssert _ =
|
|
726
|
+
// skip this method
|
|
727
|
+
// because for this task we have multiple assert statements
|
|
728
|
+
""
|
|
729
|
+
|
|
730
|
+
override this.RenderArrange canonicalDataCase =
|
|
731
|
+
let initialVars = this.RenderCells canonicalDataCase
|
|
732
|
+
let operations = this.RenderOperations canonicalDataCase
|
|
733
|
+
initialVars @ operations
|
|
734
|
+
|
|
659
735
|
type Rectangles() =
|
|
660
736
|
inherit GeneratorExercise()
|
|
661
737
|
|
|
@@ -158,6 +158,21 @@ var failureTestCases = []struct {
|
|
|
158
158
|
{ID: 1, Parent: 0},
|
|
159
159
|
},
|
|
160
160
|
},
|
|
161
|
+
{
|
|
162
|
+
name: "duplicate node",
|
|
163
|
+
input: []Record{
|
|
164
|
+
{ID: 0, Parent: 0},
|
|
165
|
+
{ID: 1, Parent: 0},
|
|
166
|
+
{ID: 1, Parent: 0},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
name: "duplicate root",
|
|
171
|
+
input: []Record{
|
|
172
|
+
{ID: 0, Parent: 0},
|
|
173
|
+
{ID: 0, Parent: 0},
|
|
174
|
+
},
|
|
175
|
+
},
|
|
161
176
|
{
|
|
162
177
|
name: "non-continuous",
|
|
163
178
|
input: []Record{
|
data/tracks/haskell/.travis.yml
CHANGED
|
@@ -12,7 +12,7 @@ cache:
|
|
|
12
12
|
- $HOME/.foldercache # Per exercise `.stack-work` cache.
|
|
13
13
|
|
|
14
14
|
env:
|
|
15
|
-
- RESOLVER="lts-
|
|
15
|
+
- RESOLVER="lts-10.2" CURRENT="YES" # Equal to each stack.yaml.
|
|
16
16
|
- RESOLVER="nightly" # Latest nightly snapshot.
|
|
17
17
|
|
|
18
18
|
matrix:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
resolver: lts-
|
|
1
|
+
resolver: lts-10.2
|