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.
Files changed (220) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/alphametics/canonical-data.json +29 -11
  4. data/problem-specifications/exercises/binary-search-tree/canonical-data.json +177 -0
  5. data/problem-specifications/package.json +2 -2
  6. data/problem-specifications/yarn.lock +61 -51
  7. data/tracks/bash/CONTRIBUTING.md +10 -6
  8. data/tracks/bash/README.md +1 -0
  9. data/tracks/bash/exercises/acronym/README.md +1 -1
  10. data/tracks/bash/exercises/anagram/README.md +1 -1
  11. data/tracks/bash/exercises/anagram/{anagram_tests.sh → anagram_test.sh} +0 -0
  12. data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +25 -17
  13. data/tracks/bash/exercises/armstrong-numbers/example.sh +18 -12
  14. data/tracks/bash/exercises/atbash-cipher/README.md +1 -1
  15. data/tracks/bash/exercises/atbash-cipher/{atbash_cipher_tests.sh → atbash_cipher_test.sh} +0 -0
  16. data/tracks/bash/exercises/difference-of-squares/README.md +1 -1
  17. data/tracks/bash/exercises/gigasecond/README.md +1 -1
  18. data/tracks/bash/exercises/hamming/README.md +1 -1
  19. data/tracks/bash/exercises/hello-world/README.md +1 -1
  20. data/tracks/bash/exercises/leap/README.md +1 -1
  21. data/tracks/bash/exercises/luhn/README.md +1 -1
  22. data/tracks/bash/exercises/nucleotide-count/README.md +1 -1
  23. data/tracks/bash/exercises/pangram/README.md +1 -1
  24. data/tracks/bash/exercises/pangram/{pangram_tests.sh → pangram_test.sh} +0 -0
  25. data/tracks/bash/exercises/phone-number/README.md +1 -1
  26. data/tracks/bash/exercises/phone-number/{phone_number_tests.sh → phone_number_test.sh} +0 -0
  27. data/tracks/bash/exercises/raindrops/README.md +1 -1
  28. data/tracks/bash/exercises/rna-transcription/README.md +1 -1
  29. data/tracks/bash/exercises/triangle/example.sh +23 -4
  30. data/tracks/bash/exercises/triangle/triangle_test.sh +17 -0
  31. data/tracks/bash/exercises/two-fer/README.md +1 -1
  32. data/tracks/bash/exercises/word-count/README.md +1 -1
  33. data/tracks/c/config.json +11 -0
  34. data/tracks/c/exercises/complex-numbers/README.md +67 -0
  35. data/tracks/c/exercises/complex-numbers/makefile +27 -0
  36. data/tracks/c/exercises/complex-numbers/src/complex_numbers.c +46 -0
  37. data/tracks/c/exercises/complex-numbers/src/complex_numbers.h +19 -0
  38. data/tracks/c/exercises/complex-numbers/src/example.c +80 -0
  39. data/tracks/c/exercises/complex-numbers/test/test_complex_numbers.c +397 -0
  40. data/tracks/c/exercises/complex-numbers/test/vendor/unity.c +1300 -0
  41. data/tracks/c/exercises/complex-numbers/test/vendor/unity.h +274 -0
  42. data/tracks/c/exercises/complex-numbers/test/vendor/unity_internals.h +701 -0
  43. data/tracks/crystal/.github/stale.yml +18 -0
  44. data/tracks/csharp/exercises/bob/README.md +3 -2
  45. data/tracks/ecmascript/config.json +4 -4
  46. data/tracks/fsharp/exercises/bob/README.md +4 -2
  47. data/tracks/fsharp/exercises/react/ReactTest.fs +137 -74
  48. data/tracks/fsharp/generators/Generators.fs +76 -0
  49. data/tracks/go/exercises/tree-building/tree_test.go +15 -0
  50. data/tracks/haskell/.travis.yml +1 -1
  51. data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
  52. data/tracks/haskell/exercises/acronym/package.yaml +1 -1
  53. data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
  54. data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
  55. data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
  56. data/tracks/haskell/exercises/all-your-base/test/Tests.hs +6 -6
  57. data/tracks/haskell/exercises/allergies/package.yaml +1 -1
  58. data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
  59. data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
  60. data/tracks/haskell/exercises/anagram/package.yaml +1 -1
  61. data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
  62. data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
  63. data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
  64. data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
  65. data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
  66. data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
  67. data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
  68. data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +3 -0
  69. data/tracks/haskell/exercises/binary/stack.yaml +1 -1
  70. data/tracks/haskell/exercises/bob/package.yaml +1 -1
  71. data/tracks/haskell/exercises/bob/stack.yaml +1 -1
  72. data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
  73. data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
  74. data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
  75. data/tracks/haskell/exercises/change/package.yaml +1 -1
  76. data/tracks/haskell/exercises/change/stack.yaml +1 -1
  77. data/tracks/haskell/exercises/clock/stack.yaml +1 -1
  78. data/tracks/haskell/exercises/collatz-conjecture/package.yaml +1 -1
  79. data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
  80. data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
  81. data/tracks/haskell/exercises/connect/package.yaml +1 -1
  82. data/tracks/haskell/exercises/connect/stack.yaml +1 -1
  83. data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
  84. data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
  85. data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
  86. data/tracks/haskell/exercises/diamond/package.yaml +1 -1
  87. data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
  88. data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
  89. data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
  90. data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
  91. data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
  92. data/tracks/haskell/exercises/etl/stack.yaml +1 -1
  93. data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
  94. data/tracks/haskell/exercises/forth/stack.yaml +1 -1
  95. data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
  96. data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
  97. data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
  98. data/tracks/haskell/exercises/grains/stack.yaml +1 -1
  99. data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
  100. data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
  101. data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
  102. data/tracks/haskell/exercises/house/stack.yaml +1 -1
  103. data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +1 -0
  104. data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
  105. data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -1
  106. data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +4 -0
  107. data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
  108. data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
  109. data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
  110. data/tracks/haskell/exercises/leap/stack.yaml +1 -1
  111. data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
  112. data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
  113. data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
  114. data/tracks/haskell/exercises/luhn/package.yaml +1 -1
  115. data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
  116. data/tracks/haskell/exercises/luhn/test/Tests.hs +1 -1
  117. data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
  118. data/tracks/haskell/exercises/meetup/package.yaml +1 -1
  119. data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
  120. data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
  121. data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
  122. data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
  123. data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
  124. data/tracks/haskell/exercises/octal/stack.yaml +1 -1
  125. data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
  126. data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
  127. data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
  128. data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
  129. data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
  130. data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
  131. data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
  132. data/tracks/haskell/exercises/pov/stack.yaml +1 -1
  133. data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
  134. data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
  135. data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
  136. data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
  137. data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -1
  138. data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
  139. data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
  140. data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
  141. data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +0 -12
  142. data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
  143. data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
  144. data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
  145. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
  146. data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
  147. data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
  148. data/tracks/haskell/exercises/say/stack.yaml +1 -1
  149. data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
  150. data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
  151. data/tracks/haskell/exercises/series/stack.yaml +1 -1
  152. data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
  153. data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
  154. data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
  155. data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
  156. data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
  157. data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
  158. data/tracks/haskell/exercises/strain/stack.yaml +1 -1
  159. data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
  160. data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
  161. data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
  162. data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
  163. data/tracks/haskell/exercises/twelve-days/stack.yaml +1 -1
  164. data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
  165. data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
  166. data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
  167. data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
  168. data/tracks/java/config.json +12 -0
  169. data/tracks/java/exercises/alphametics/.meta/src/reference/java/Alphametics.java +125 -0
  170. data/tracks/java/exercises/alphametics/.meta/src/reference/java/UnsolvablePuzzleException.java +2 -0
  171. data/tracks/java/exercises/alphametics/.meta/src/version +1 -0
  172. data/tracks/java/exercises/alphametics/README.md +47 -0
  173. data/tracks/java/exercises/alphametics/build.gradle +18 -0
  174. data/tracks/java/exercises/alphametics/src/main/java/.keep +0 -0
  175. data/tracks/java/exercises/alphametics/src/main/java/UnsolvablePuzzleException.java +2 -0
  176. data/tracks/java/exercises/alphametics/src/test/java/AlphameticsTest.java +150 -0
  177. data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +5 -4
  178. data/tracks/java/exercises/beer-song/.meta/version +1 -0
  179. data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +24 -16
  180. data/tracks/java/exercises/binary-search/.meta/version +1 -0
  181. data/tracks/java/exercises/book-store/.meta/version +1 -0
  182. data/tracks/java/exercises/book-store/src/test/java/BookStoreTest.java +15 -8
  183. data/tracks/java/exercises/circular-buffer/.meta/version +1 -0
  184. data/tracks/java/exercises/list-ops/.meta/version +1 -1
  185. data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +1 -1
  186. data/tracks/java/exercises/nth-prime/.meta/version +1 -0
  187. data/tracks/java/exercises/settings.gradle +1 -0
  188. data/tracks/java/exercises/tournament/.meta/version +1 -0
  189. data/tracks/java/exercises/transpose/.meta/version +1 -0
  190. data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +29 -74
  191. data/tracks/java/exercises/wordy/.meta/version +1 -0
  192. data/tracks/javascript/.eslintignore +0 -1
  193. data/tracks/javascript/config.json +13 -3
  194. data/tracks/javascript/exercises/bowling/example.js +24 -10
  195. data/tracks/javascript/exercises/forth/README.md +56 -0
  196. data/tracks/javascript/exercises/forth/example.js +66 -0
  197. data/tracks/javascript/exercises/forth/forth.spec.js +259 -0
  198. data/tracks/lua/config.json +92 -81
  199. data/tracks/lua/exercises/accumulate/README.md +42 -0
  200. data/tracks/lua/exercises/beer-song/README.md +1 -1
  201. data/tracks/lua/exercises/bob/README.md +2 -0
  202. data/tracks/lua/exercises/crypto-square/README.md +6 -4
  203. data/tracks/lua/exercises/house/README.md +1 -1
  204. data/tracks/lua/exercises/isbn-verifier/README.md +25 -20
  205. data/tracks/lua/exercises/kindergarten-garden/README.md +3 -3
  206. data/tracks/lua/exercises/meetup/README.md +16 -12
  207. data/tracks/lua/exercises/nucleotide-count/README.md +2 -2
  208. data/tracks/lua/exercises/phone-number/README.md +1 -1
  209. data/tracks/lua/exercises/pov/README.md +0 -2
  210. data/tracks/lua/exercises/queen-attack/README.md +22 -22
  211. data/tracks/lua/exercises/rectangles/README.md +9 -9
  212. data/tracks/lua/exercises/reverse-string/README.md +23 -0
  213. data/tracks/lua/exercises/reverse-string/example.lua +7 -0
  214. data/tracks/lua/exercises/reverse-string/reverse-string_spec.lua +24 -0
  215. data/tracks/lua/exercises/secret-handshake/README.md +1 -1
  216. data/tracks/lua/exercises/space-age/README.md +1 -2
  217. data/tracks/lua/exercises/sum-of-multiples/README.md +3 -3
  218. data/tracks/perl6/exercises/two-fer/README.md +1 -1
  219. data/tracks/python/exercises/luhn/luhn_test.py +1 -1
  220. 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 says 'Fine. Be that way!' if you address him without actually saying
10
- anything.
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": "03889544-064a-a980-2c2a-c7eb7d8407f8f737fb8",
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": "eec93b8b-0b50-3380-bd75-c53210c48ac5bffc8af",
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": "a7277814-0582-ce80-6451-7352158be58a36d5c3d",
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": "28d75cd0-0ab4-ed80-6010-6a0a9b61a3388455777",
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 says 'Fine. Be that way!' if you address him without actually saying
10
- anything.
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 ``Setting the value of an input cell changes the observable value`` () =
10
- let reactor = new Reactor()
11
- let inputCell1 = reactor.createInputCell 1
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
- inputCell1.Value |> should equal 1
14
- inputCell1.Value <- 2
15
- inputCell1.Value |> should equal 2
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 ``The value of a compute is determined by the value of the dependencies`` () =
19
- let reactor = new Reactor()
20
- let inputCell1 = reactor.createInputCell 1
21
- let computeCell1 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] + 1)
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
- computeCell1.Value |> should equal 2
24
- inputCell1.Value <- 2
25
- computeCell1.Value |> should equal 3
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
- let reactor = new Reactor()
30
- let inputCell1 = reactor.createInputCell 1
31
- let computeCell1 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] + 1)
32
- let computeCell2 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] - 1)
33
- let computeCell3 = reactor.createComputeCell [computeCell1; computeCell2] (fun values -> values.[0] * values.[1])
34
-
35
- computeCell3.Value |> should equal 0
36
- inputCell1.Value <- 3
37
- computeCell3.Value |> should equal 8
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 can have callbacks`` () =
41
- let reactor = new Reactor()
42
- let inputCell1 = reactor.createInputCell 1
43
- let computeCell1 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] + 1)
44
- let mutable observed = []
45
- computeCell1.Changed.Add(fun value -> observed <- observed @ [value]) |> ignore
46
-
47
- observed |> should be Empty
48
- inputCell1.Value <- 2
49
- observed |> should equal [3]
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 ``Callbacks only trigger on change`` () =
53
- let reactor = new Reactor()
54
- let inputCell1 = reactor.createInputCell 1
55
- let computecell1 = reactor.createComputeCell [inputCell1] (fun values -> if values.[0] > 2 then values.[0] + 1 else 2)
56
- let mutable observerCalled = 0
57
- computecell1.Changed.Add(fun value -> observerCalled <- observerCalled + 1) |> ignore
58
-
59
- inputCell1.Value <- 1
60
- observerCalled |> should equal 0
61
- inputCell1.Value <- 2
62
- observerCalled |> should equal 0
63
- inputCell1.Value <- 3
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
- let reactor = new Reactor()
69
- let inputCell1 = reactor.createInputCell 1
70
- let computeCell1 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] + 1)
71
- let mutable observed1 = []
72
- let mutable observed2 = []
73
-
74
- let changedHandler1 = Handler<int>(fun _ value -> observed1 <- observed1 @ [value])
75
- computeCell1.Changed.AddHandler changedHandler1
76
- computeCell1.Changed.Add(fun value -> observed2 <- observed2 @ [value]) |> ignore
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
- computeCell1.Changed.RemoveHandler changedHandler1
83
- inputCell1.Value <- 3
84
- observed1 |> should equal [3]
85
- observed2 |> should equal [3; 4]
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 have changed`` () =
89
- let reactor = new Reactor()
90
- let inputCell1 = reactor.createInputCell 1
91
- let computeCell1 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] + 1)
92
- let computeCell2 = reactor.createComputeCell [inputCell1] (fun values -> values.[0] - 1)
93
- let computeCell3 = reactor.createComputeCell [computeCell2] (fun values -> values.[0] - 1)
94
- let computeCell4 = reactor.createComputeCell [computeCell1; computeCell3] (fun values -> values.[0] * values.[1])
95
- let mutable changed4 = 0
96
- computeCell4.Changed.Add(fun value -> changed4 <- changed4 + 1) |> ignore
97
- inputCell1.Value <- 3
98
- changed4 |> should equal 1
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{
@@ -12,7 +12,7 @@ cache:
12
12
  - $HOME/.foldercache # Per exercise `.stack-work` cache.
13
13
 
14
14
  env:
15
- - RESOLVER="lts-9.11" CURRENT="YES" # Equal to each stack.yaml.
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-9.11
1
+ resolver: lts-10.2
@@ -1,5 +1,5 @@
1
1
  name: acronym
2
- version: 1.1.0.3
2
+ version: 1.2.0.4
3
3
 
4
4
  dependencies:
5
5
  - base