trackler 2.2.1.171 → 2.2.1.172

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/tracks/go/exercises/dominoes/.meta/gen.go +1 -1
  4. data/tracks/go/exercises/dominoes/cases_test.go +11 -11
  5. data/tracks/ocaml/config.json +1 -1
  6. data/tracks/ocaml/docs/ABOUT.md +6 -4
  7. data/tracks/powershell/config.json +3 -2
  8. data/tracks/rust/bin/format_exercises +31 -0
  9. data/tracks/rust/config.json +10 -2
  10. data/tracks/rust/config/exercise_readme.go.tmpl +26 -5
  11. data/tracks/rust/exercises/accumulate/README.md +26 -5
  12. data/tracks/rust/exercises/accumulate/src/lib.rs +1 -0
  13. data/tracks/rust/exercises/accumulate/tests/accumulate.rs +7 -7
  14. data/tracks/rust/exercises/acronym/README.md +26 -5
  15. data/tracks/rust/exercises/acronym/src/lib.rs +1 -0
  16. data/tracks/rust/exercises/acronym/tests/acronym.rs +10 -5
  17. data/tracks/rust/exercises/all-your-base/README.md +26 -5
  18. data/tracks/rust/exercises/all-your-base/src/lib.rs +6 -1
  19. data/tracks/rust/exercises/all-your-base/tests/all-your-base.rs +68 -34
  20. data/tracks/rust/exercises/allergies/README.md +26 -5
  21. data/tracks/rust/exercises/allergies/src/lib.rs +1 -0
  22. data/tracks/rust/exercises/allergies/tests/allergies.rs +34 -26
  23. data/tracks/rust/exercises/alphametics/README.md +26 -5
  24. data/tracks/rust/exercises/alphametics/tests/alphametics.rs +44 -9
  25. data/tracks/rust/exercises/anagram/README.md +26 -5
  26. data/tracks/rust/exercises/anagram/src/lib.rs +1 -0
  27. data/tracks/rust/exercises/anagram/tests/anagram.rs +15 -4
  28. data/tracks/rust/exercises/armstrong-numbers/README.md +26 -5
  29. data/tracks/rust/exercises/atbash-cipher/README.md +26 -5
  30. data/tracks/rust/exercises/atbash-cipher/src/lib.rs +1 -1
  31. data/tracks/rust/exercises/atbash-cipher/tests/atbash-cipher.rs +16 -8
  32. data/tracks/rust/exercises/beer-song/README.md +26 -5
  33. data/tracks/rust/exercises/binary-search/README.md +26 -5
  34. data/tracks/rust/exercises/binary-search/src/lib.rs +1 -0
  35. data/tracks/rust/exercises/binary-search/tests/binary-search.rs +8 -4
  36. data/tracks/rust/exercises/bob/README.md +26 -5
  37. data/tracks/rust/exercises/bob/tests/bob.rs +32 -15
  38. data/tracks/rust/exercises/book-store/README.md +26 -5
  39. data/tracks/rust/exercises/book-store/src/lib.rs +4 -1
  40. data/tracks/rust/exercises/book-store/tests/book-store.rs +52 -24
  41. data/tracks/rust/exercises/bowling/README.md +26 -5
  42. data/tracks/rust/exercises/bowling/src/lib.rs +1 -2
  43. data/tracks/rust/exercises/bowling/tests/bowling.rs +2 -1
  44. data/tracks/rust/exercises/bracket-push/README.md +29 -7
  45. data/tracks/rust/exercises/bracket-push/src/lib.rs +1 -0
  46. data/tracks/rust/exercises/circular-buffer/README.md +26 -5
  47. data/tracks/rust/exercises/circular-buffer/src/lib.rs +1 -0
  48. data/tracks/rust/exercises/clock/README.md +26 -5
  49. data/tracks/rust/exercises/clock/src/lib.rs +1 -0
  50. data/tracks/rust/exercises/clock/tests/clock.rs +0 -1
  51. data/tracks/rust/exercises/collatz-conjecture/README.md +26 -5
  52. data/tracks/rust/exercises/crypto-square/README.md +53 -29
  53. data/tracks/rust/exercises/custom-set/README.md +26 -5
  54. data/tracks/rust/exercises/custom-set/src/lib.rs +1 -0
  55. data/tracks/rust/exercises/decimal/README.md +26 -5
  56. data/tracks/rust/exercises/decimal/tests/decimal.rs +4 -7
  57. data/tracks/rust/exercises/diamond/README.md +26 -5
  58. data/tracks/rust/exercises/difference-of-squares/README.md +26 -5
  59. data/tracks/rust/exercises/difference-of-squares/src/lib.rs +1 -1
  60. data/tracks/rust/exercises/diffie-hellman/README.md +26 -5
  61. data/tracks/rust/exercises/diffie-hellman/src/lib.rs +12 -2
  62. data/tracks/rust/exercises/diffie-hellman/tests/diffie-hellman.rs +3 -3
  63. data/tracks/rust/exercises/dominoes/README.md +26 -5
  64. data/tracks/rust/exercises/dominoes/src/lib.rs +1 -0
  65. data/tracks/rust/exercises/dominoes/tests/dominoes.rs +29 -13
  66. data/tracks/rust/exercises/etl/README.md +26 -5
  67. data/tracks/rust/exercises/etl/src/lib.rs +1 -0
  68. data/tracks/rust/exercises/etl/tests/etl.rs +39 -34
  69. data/tracks/rust/exercises/forth/README.md +26 -5
  70. data/tracks/rust/exercises/forth/tests/forth.rs +17 -65
  71. data/tracks/rust/exercises/gigasecond/README.md +26 -5
  72. data/tracks/rust/exercises/gigasecond/tests/gigasecond.rs +31 -10
  73. data/tracks/rust/exercises/grade-school/README.md +26 -5
  74. data/tracks/rust/exercises/grade-school/src/lib.rs +1 -2
  75. data/tracks/rust/exercises/grade-school/tests/grade-school.rs +5 -9
  76. data/tracks/rust/exercises/grains/README.md +26 -5
  77. data/tracks/rust/exercises/hamming/README.md +30 -8
  78. data/tracks/rust/exercises/hamming/src/lib.rs +1 -2
  79. data/tracks/rust/exercises/hello-world/README.md +26 -5
  80. data/tracks/rust/exercises/hexadecimal/README.md +26 -5
  81. data/tracks/rust/exercises/hexadecimal/src/lib.rs +1 -0
  82. data/tracks/rust/exercises/isbn-verifier/README.md +26 -5
  83. data/tracks/rust/exercises/isogram/README.md +26 -5
  84. data/tracks/rust/exercises/isogram/src/lib.rs +1 -1
  85. data/tracks/rust/exercises/isogram/tests/isogram.rs +36 -24
  86. data/tracks/rust/exercises/largest-series-product/README.md +26 -5
  87. data/tracks/rust/exercises/largest-series-product/src/lib.rs +5 -1
  88. data/tracks/rust/exercises/largest-series-product/tests/largest-series-product.rs +4 -2
  89. data/tracks/rust/exercises/leap/README.md +26 -5
  90. data/tracks/rust/exercises/luhn-from/README.md +26 -5
  91. data/tracks/rust/exercises/luhn-from/src/lib.rs +1 -0
  92. data/tracks/rust/exercises/luhn-trait/README.md +26 -5
  93. data/tracks/rust/exercises/luhn-trait/src/lib.rs +1 -0
  94. data/tracks/rust/exercises/luhn/README.md +26 -5
  95. data/tracks/rust/exercises/luhn/src/lib.rs +1 -1
  96. data/tracks/rust/exercises/macros/README.md +26 -5
  97. data/tracks/rust/exercises/minesweeper/README.md +26 -5
  98. data/tracks/rust/exercises/minesweeper/src/lib.rs +1 -0
  99. data/tracks/rust/exercises/nth-prime/README.md +26 -5
  100. data/tracks/rust/exercises/nucleotide-codons/README.md +26 -5
  101. data/tracks/rust/exercises/nucleotide-codons/src/lib.rs +1 -0
  102. data/tracks/rust/exercises/nucleotide-codons/tests/codons.rs +6 -5
  103. data/tracks/rust/exercises/nucleotide-count/README.md +26 -5
  104. data/tracks/rust/exercises/nucleotide-count/src/lib.rs +1 -0
  105. data/tracks/rust/exercises/nucleotide-count/tests/nucleotide-count.rs +5 -8
  106. data/tracks/rust/exercises/ocr-numbers/README.md +26 -5
  107. data/tracks/rust/exercises/ocr-numbers/tests/ocr-numbers.rs +0 -1
  108. data/tracks/rust/exercises/palindrome-products/README.md +26 -5
  109. data/tracks/rust/exercises/pangram/README.md +26 -5
  110. data/tracks/rust/exercises/pangram/src/lib.rs +1 -1
  111. data/tracks/rust/exercises/parallel-letter-frequency/README.md +26 -5
  112. data/tracks/rust/exercises/parallel-letter-frequency/benches/benchmark.rs +6 -3
  113. data/tracks/rust/exercises/parallel-letter-frequency/src/lib.rs +1 -0
  114. data/tracks/rust/exercises/parallel-letter-frequency/tests/parallel-letter-frequency.rs +6 -3
  115. data/tracks/rust/exercises/pascals-triangle/README.md +26 -5
  116. data/tracks/rust/exercises/pascals-triangle/tests/pascals-triangle.rs +36 -28
  117. data/tracks/rust/exercises/perfect-numbers/README.md +26 -5
  118. data/tracks/rust/exercises/perfect-numbers/src/lib.rs +1 -1
  119. data/tracks/rust/exercises/perfect-numbers/tests/perfect-numbers.rs +1 -2
  120. data/tracks/rust/exercises/phone-number/README.md +26 -5
  121. data/tracks/rust/exercises/phone-number/src/lib.rs +1 -0
  122. data/tracks/rust/exercises/pig-latin/README.md +26 -5
  123. data/tracks/rust/exercises/pig-latin/src/lib.rs +1 -0
  124. data/tracks/rust/exercises/poker/README.md +26 -5
  125. data/tracks/rust/exercises/poker/tests/poker.rs +27 -104
  126. data/tracks/rust/exercises/prime-factors/README.md +26 -5
  127. data/tracks/rust/exercises/protein-translation/README.md +26 -5
  128. data/tracks/rust/exercises/protein-translation/src/lib.rs +1 -0
  129. data/tracks/rust/exercises/protein-translation/tests/proteins.rs +16 -9
  130. data/tracks/rust/exercises/proverb/README.md +26 -5
  131. data/tracks/rust/exercises/proverb/tests/proverb.rs +1 -7
  132. data/tracks/rust/exercises/pythagorean-triplet/README.md +26 -5
  133. data/tracks/rust/exercises/queen-attack/README.md +26 -5
  134. data/tracks/rust/exercises/queen-attack/src/lib.rs +1 -0
  135. data/tracks/rust/exercises/raindrops/README.md +26 -5
  136. data/tracks/rust/exercises/raindrops/tests/raindrops.rs +57 -19
  137. data/tracks/rust/exercises/react/README.md +26 -5
  138. data/tracks/rust/exercises/react/src/lib.rs +16 -4
  139. data/tracks/rust/exercises/react/tests/react.rs +174 -43
  140. data/tracks/rust/exercises/rectangles/README.md +26 -5
  141. data/tracks/rust/exercises/rectangles/src/lib.rs +1 -0
  142. data/tracks/rust/exercises/reverse-string/README.md +26 -5
  143. data/tracks/rust/exercises/reverse-string/tests/reverse-string.rs +2 -11
  144. data/tracks/rust/exercises/rna-transcription/README.md +26 -5
  145. data/tracks/rust/exercises/rna-transcription/src/lib.rs +1 -0
  146. data/tracks/rust/exercises/robot-name/README.md +26 -5
  147. data/tracks/rust/exercises/robot-name/src/lib.rs +1 -0
  148. data/tracks/rust/exercises/robot-name/tests/robot-name.rs +8 -2
  149. data/tracks/rust/exercises/robot-simulator/README.md +26 -5
  150. data/tracks/rust/exercises/robot-simulator/src/lib.rs +5 -6
  151. data/tracks/rust/exercises/roman-numerals/README.md +26 -5
  152. data/tracks/rust/exercises/roman-numerals/src/lib.rs +1 -0
  153. data/tracks/rust/exercises/rotational-cipher/README.md +26 -5
  154. data/tracks/rust/exercises/rotational-cipher/src/lib.rs +1 -0
  155. data/tracks/rust/exercises/rotational-cipher/tests/rotational-cipher.rs +12 -4
  156. data/tracks/rust/exercises/run-length-encoding/README.md +26 -5
  157. data/tracks/rust/exercises/run-length-encoding/src/lib.rs +1 -1
  158. data/tracks/rust/exercises/run-length-encoding/tests/run-length-encoding.rs +12 -5
  159. data/tracks/rust/exercises/saddle-points/README.md +26 -5
  160. data/tracks/rust/exercises/saddle-points/src/lib.rs +4 -1
  161. data/tracks/rust/exercises/say/README.md +27 -6
  162. data/tracks/rust/exercises/say/src/lib.rs +1 -1
  163. data/tracks/rust/exercises/say/tests/say.rs +30 -14
  164. data/tracks/rust/exercises/scrabble-score/README.md +26 -5
  165. data/tracks/rust/exercises/scrabble-score/src/lib.rs +1 -1
  166. data/tracks/rust/exercises/series/README.md +32 -11
  167. data/tracks/rust/exercises/series/src/lib.rs +5 -1
  168. data/tracks/rust/exercises/sieve/README.md +31 -8
  169. data/tracks/rust/exercises/sieve/src/lib.rs +1 -0
  170. data/tracks/rust/exercises/sieve/tests/sieve.rs +11 -12
  171. data/tracks/rust/exercises/simple-cipher/README.md +26 -5
  172. data/tracks/rust/exercises/simple-cipher/src/lib.rs +6 -3
  173. data/tracks/rust/exercises/simple-cipher/tests/simple-cipher.rs +0 -1
  174. data/tracks/rust/exercises/simple-linked-list/README.md +26 -5
  175. data/tracks/rust/exercises/simple-linked-list/src/lib.rs +0 -1
  176. data/tracks/rust/exercises/simple-linked-list/tests/simple-linked-list.rs +0 -1
  177. data/tracks/rust/exercises/space-age/README.md +26 -5
  178. data/tracks/rust/exercises/space-age/tests/space-age.rs +4 -4
  179. data/tracks/rust/exercises/spiral-matrix/README.md +26 -5
  180. data/tracks/rust/exercises/sublist/README.md +26 -5
  181. data/tracks/rust/exercises/sublist/src/lib.rs +1 -0
  182. data/tracks/rust/exercises/sublist/tests/sublist.rs +17 -68
  183. data/tracks/rust/exercises/sum-of-multiples/README.md +26 -5
  184. data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +5 -1
  185. data/tracks/rust/exercises/tournament/README.md +26 -5
  186. data/tracks/rust/exercises/tournament/src/lib.rs +1 -0
  187. data/tracks/rust/exercises/tournament/tests/tournament.rs +60 -60
  188. data/tracks/rust/exercises/triangle/README.md +26 -5
  189. data/tracks/rust/exercises/triangle/src/lib.rs +1 -0
  190. data/tracks/rust/exercises/two-bucket/README.md +26 -5
  191. data/tracks/rust/exercises/two-bucket/src/lib.rs +2 -6
  192. data/tracks/rust/exercises/two-bucket/tests/two-bucket.rs +49 -37
  193. data/tracks/rust/exercises/twofer/README.md +33 -7
  194. data/tracks/rust/exercises/twofer/src/lib.rs +2 -2
  195. data/tracks/rust/exercises/twofer/tests/two-fer.rs +2 -2
  196. data/tracks/rust/exercises/variable-length-quantity/README.md +26 -5
  197. data/tracks/rust/exercises/variable-length-quantity/tests/variable-length-quantity.rs +60 -32
  198. data/tracks/rust/exercises/word-count/README.md +26 -5
  199. data/tracks/rust/exercises/word-count/src/lib.rs +1 -1
  200. data/tracks/rust/exercises/word-count/tests/word-count.rs +15 -23
  201. data/tracks/rust/exercises/wordy/README.md +26 -5
  202. data/tracks/rust/exercises/wordy/src/lib.rs +1 -0
  203. metadata +3 -2
@@ -28,11 +28,31 @@ Execute the tests with:
28
28
  $ cargo test
29
29
  ```
30
30
 
31
- All but the first test have been ignored. After you get the first test to
32
- pass, remove the ignore flag (`#[ignore]`) from the next test and get the tests
33
- to pass again. The test file is located in the `tests` directory. You can
34
- also remove the ignore flag from all the tests to get them to run all at once
35
- if you wish.
31
+ All but the first test have been ignored. After you get the first test to
32
+ pass, open the tests source file wich is located in the `tests` directory
33
+ and remove the `#[ignore]` flag from the next test and get the tests to pass
34
+ again. Each separate test is a function with `#[test]` flag above it.
35
+ Continue, until you pass every test.
36
+
37
+ If you wish to run all tests without editing the tests source file, use:
38
+
39
+ ```bash
40
+ $ cargo test -- --ignored
41
+ ```
42
+
43
+ To run a specific test, for example `some_test`, you can use:
44
+
45
+ ```bash
46
+ $ cargo test some_test
47
+ ```
48
+
49
+ If the specfic test is ignored use:
50
+
51
+ ```bash
52
+ $ cargo test some_test -- --ignored
53
+ ```
54
+
55
+ To learn more about Rust tests refer to the [online test documentation][rust-tests]
36
56
 
37
57
  Make sure to read the [Modules](https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html) chapter if you
38
58
  haven't already, it will help you with organizing your files.
@@ -46,6 +66,7 @@ If you want to know more about Exercism, take a look at the [contribution guide]
46
66
  [help-page]: http://exercism.io/languages/rust
47
67
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
48
68
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
69
+ [rust-tests]: https://doc.rust-lang.org/book/second-edition/ch11-02-running-tests.html
49
70
 
50
71
  ## Submitting Incomplete Solutions
51
72
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -39,7 +39,7 @@ pub struct Reactor<T> {
39
39
  }
40
40
 
41
41
  // You are guaranteed that Reactor will only be tested against types that are Copy + PartialEq.
42
- impl <T: Copy + PartialEq> Reactor<T> {
42
+ impl<T: Copy + PartialEq> Reactor<T> {
43
43
  pub fn new() -> Self {
44
44
  unimplemented!()
45
45
  }
@@ -62,7 +62,11 @@ impl <T: Copy + PartialEq> Reactor<T> {
62
62
  // Notice that there is no way to *remove* a cell.
63
63
  // This means that you may assume, without checking, that if the dependencies exist at creation
64
64
  // time they will continue to exist as long as the Reactor exists.
65
- pub fn create_compute<F: Fn(&[T]) -> T>(&mut self, _dependencies: &[CellID], _compute_func: F) -> Result<ComputeCellID, CellID> {
65
+ pub fn create_compute<F: Fn(&[T]) -> T>(
66
+ &mut self,
67
+ _dependencies: &[CellID],
68
+ _compute_func: F,
69
+ ) -> Result<ComputeCellID, CellID> {
66
70
  unimplemented!()
67
71
  }
68
72
 
@@ -101,7 +105,11 @@ impl <T: Copy + PartialEq> Reactor<T> {
101
105
  // * Exactly once if the compute cell's value changed as a result of the set_value call.
102
106
  // The value passed to the callback should be the final value of the compute cell after the
103
107
  // set_value call.
104
- pub fn add_callback<F: FnMut(T) -> ()>(&mut self, _id: ComputeCellID, _callback: F) -> Option<CallbackID> {
108
+ pub fn add_callback<F: FnMut(T) -> ()>(
109
+ &mut self,
110
+ _id: ComputeCellID,
111
+ _callback: F,
112
+ ) -> Option<CallbackID> {
105
113
  unimplemented!()
106
114
  }
107
115
 
@@ -110,7 +118,11 @@ impl <T: Copy + PartialEq> Reactor<T> {
110
118
  // Returns an Err if either the cell or callback does not exist.
111
119
  //
112
120
  // A removed callback should no longer be called.
113
- pub fn remove_callback(&mut self, cell: ComputeCellID, callback: CallbackID) -> Result<(), RemoveCallbackError> {
121
+ pub fn remove_callback(
122
+ &mut self,
123
+ cell: ComputeCellID,
124
+ callback: CallbackID,
125
+ ) -> Result<(), RemoveCallbackError> {
114
126
  unimplemented!(
115
127
  "Remove the callback identified by the CallbackID {:?} from the cell {:?}",
116
128
  callback,
@@ -31,7 +31,9 @@ fn error_setting_a_nonexistent_input_cell() {
31
31
  fn compute_cells_calculate_initial_value() {
32
32
  let mut reactor = Reactor::new();
33
33
  let input = reactor.create_input(1);
34
- let output = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
34
+ let output = reactor
35
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
36
+ .unwrap();
35
37
  assert_eq!(reactor.value(CellID::Compute(output)), Some(2));
36
38
  }
37
39
 
@@ -41,7 +43,11 @@ fn compute_cells_take_inputs_in_the_right_order() {
41
43
  let mut reactor = Reactor::new();
42
44
  let one = reactor.create_input(1);
43
45
  let two = reactor.create_input(2);
44
- let output = reactor.create_compute(&[CellID::Input(one), CellID::Input(two)], |v| v[0] + v[1] * 10).unwrap();
46
+ let output = reactor
47
+ .create_compute(&[CellID::Input(one), CellID::Input(two)], |v| {
48
+ v[0] + v[1] * 10
49
+ })
50
+ .unwrap();
45
51
  assert_eq!(reactor.value(CellID::Compute(output)), Some(21));
46
52
  }
47
53
 
@@ -50,7 +56,10 @@ fn compute_cells_take_inputs_in_the_right_order() {
50
56
  fn error_creating_compute_cell_if_input_doesnt_exist() {
51
57
  let mut dummy_reactor = Reactor::new();
52
58
  let input = dummy_reactor.create_input(1);
53
- assert_eq!(Reactor::new().create_compute(&[CellID::Input(input)], |_| 0), Err(CellID::Input(input)));
59
+ assert_eq!(
60
+ Reactor::new().create_compute(&[CellID::Input(input)], |_| 0),
61
+ Err(CellID::Input(input))
62
+ );
54
63
  }
55
64
 
56
65
  #[test]
@@ -61,7 +70,10 @@ fn do_not_break_cell_if_creating_compute_cell_with_valid_and_invalid_input() {
61
70
  let dummy_cell = dummy_reactor.create_input(2);
62
71
  let mut reactor = Reactor::new();
63
72
  let input = reactor.create_input(1);
64
- assert_eq!(reactor.create_compute(&[CellID::Input(input), CellID::Input(dummy_cell)], |_| 0), Err(CellID::Input(dummy_cell)));
73
+ assert_eq!(
74
+ reactor.create_compute(&[CellID::Input(input), CellID::Input(dummy_cell)], |_| 0),
75
+ Err(CellID::Input(dummy_cell))
76
+ );
65
77
  assert!(reactor.set_value(input, 5));
66
78
  assert_eq!(reactor.value(CellID::Input(input)), Some(5));
67
79
  }
@@ -71,7 +83,9 @@ fn do_not_break_cell_if_creating_compute_cell_with_valid_and_invalid_input() {
71
83
  fn compute_cells_update_value_when_dependencies_are_changed() {
72
84
  let mut reactor = Reactor::new();
73
85
  let input = reactor.create_input(1);
74
- let output = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
86
+ let output = reactor
87
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
88
+ .unwrap();
75
89
  assert_eq!(reactor.value(CellID::Compute(output)), Some(2));
76
90
  assert!(reactor.set_value(input, 3));
77
91
  assert_eq!(reactor.value(CellID::Compute(output)), Some(4));
@@ -82,9 +96,18 @@ fn compute_cells_update_value_when_dependencies_are_changed() {
82
96
  fn compute_cells_can_depend_on_other_compute_cells() {
83
97
  let mut reactor = Reactor::new();
84
98
  let input = reactor.create_input(1);
85
- let times_two = reactor.create_compute(&[CellID::Input(input)], |v| v[0] * 2).unwrap();
86
- let times_thirty = reactor.create_compute(&[CellID::Input(input)], |v| v[0] * 30).unwrap();
87
- let output = reactor.create_compute(&[CellID::Compute(times_two), CellID::Compute(times_thirty)], |v| v[0] + v[1]).unwrap();
99
+ let times_two = reactor
100
+ .create_compute(&[CellID::Input(input)], |v| v[0] * 2)
101
+ .unwrap();
102
+ let times_thirty = reactor
103
+ .create_compute(&[CellID::Input(input)], |v| v[0] * 30)
104
+ .unwrap();
105
+ let output = reactor
106
+ .create_compute(
107
+ &[CellID::Compute(times_two), CellID::Compute(times_thirty)],
108
+ |v| v[0] + v[1],
109
+ )
110
+ .unwrap();
88
111
  assert_eq!(reactor.value(CellID::Compute(output)), Some(32));
89
112
  assert!(reactor.set_value(input, 3));
90
113
  assert_eq!(reactor.value(CellID::Compute(output)), Some(96));
@@ -110,16 +133,33 @@ impl CallbackRecorder {
110
133
  }
111
134
 
112
135
  fn expect_to_have_been_called_with(&self, v: isize) {
113
- assert_ne!(self.value.get(), None, "Callback was not called, but should have been");
114
- assert_eq!(self.value.replace(None), Some(v), "Callback was called with incorrect value");
136
+ assert_ne!(
137
+ self.value.get(),
138
+ None,
139
+ "Callback was not called, but should have been"
140
+ );
141
+ assert_eq!(
142
+ self.value.replace(None),
143
+ Some(v),
144
+ "Callback was called with incorrect value"
145
+ );
115
146
  }
116
147
 
117
148
  fn expect_not_to_have_been_called(&self) {
118
- assert_eq!(self.value.get(), None, "Callback was called, but should not have been");
149
+ assert_eq!(
150
+ self.value.get(),
151
+ None,
152
+ "Callback was called, but should not have been"
153
+ );
119
154
  }
120
155
 
121
156
  fn callback_called(&self, v: isize) {
122
- assert_eq!(self.value.replace(Some(v)), None, "Callback was called too many times; can't be called with {}", v);
157
+ assert_eq!(
158
+ self.value.replace(Some(v)),
159
+ None,
160
+ "Callback was called too many times; can't be called with {}",
161
+ v
162
+ );
123
163
  }
124
164
  }
125
165
 
@@ -129,8 +169,14 @@ fn compute_cells_fire_callbacks() {
129
169
  let cb = CallbackRecorder::new();
130
170
  let mut reactor = Reactor::new();
131
171
  let input = reactor.create_input(1);
132
- let output = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
133
- assert!(reactor.add_callback(output, |v| cb.callback_called(v)).is_some());
172
+ let output = reactor
173
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
174
+ .unwrap();
175
+ assert!(
176
+ reactor
177
+ .add_callback(output, |v| cb.callback_called(v))
178
+ .is_some()
179
+ );
134
180
  assert!(reactor.set_value(input, 3));
135
181
  cb.expect_to_have_been_called_with(4);
136
182
  }
@@ -140,8 +186,13 @@ fn compute_cells_fire_callbacks() {
140
186
  fn error_adding_callback_to_nonexistent_cell() {
141
187
  let mut dummy_reactor = Reactor::new();
142
188
  let input = dummy_reactor.create_input(1);
143
- let output = dummy_reactor.create_compute(&[CellID::Input(input)], |_| 0).unwrap();
144
- assert_eq!(Reactor::new().add_callback(output, |_: usize| println!("hi")), None);
189
+ let output = dummy_reactor
190
+ .create_compute(&[CellID::Input(input)], |_| 0)
191
+ .unwrap();
192
+ assert_eq!(
193
+ Reactor::new().add_callback(output, |_: usize| println!("hi")),
194
+ None
195
+ );
145
196
  }
146
197
 
147
198
  #[test]
@@ -150,8 +201,17 @@ fn callbacks_only_fire_on_change() {
150
201
  let cb = CallbackRecorder::new();
151
202
  let mut reactor = Reactor::new();
152
203
  let input = reactor.create_input(1);
153
- let output = reactor.create_compute(&[CellID::Input(input)], |v| if v[0] < 3 { 111 } else { 222 }).unwrap();
154
- assert!(reactor.add_callback(output, |v| cb.callback_called(v)).is_some());
204
+ let output = reactor
205
+ .create_compute(
206
+ &[CellID::Input(input)],
207
+ |v| if v[0] < 3 { 111 } else { 222 },
208
+ )
209
+ .unwrap();
210
+ assert!(
211
+ reactor
212
+ .add_callback(output, |v| cb.callback_called(v))
213
+ .is_some()
214
+ );
155
215
 
156
216
  assert!(reactor.set_value(input, 2));
157
217
  cb.expect_not_to_have_been_called();
@@ -168,17 +228,29 @@ fn callbacks_can_be_added_and_removed() {
168
228
 
169
229
  let mut reactor = Reactor::new();
170
230
  let input = reactor.create_input(11);
171
- let output = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
172
-
173
- let callback = reactor.add_callback(output, |v| cb1.callback_called(v)).unwrap();
174
- assert!(reactor.add_callback(output, |v| cb2.callback_called(v)).is_some());
231
+ let output = reactor
232
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
233
+ .unwrap();
234
+
235
+ let callback = reactor
236
+ .add_callback(output, |v| cb1.callback_called(v))
237
+ .unwrap();
238
+ assert!(
239
+ reactor
240
+ .add_callback(output, |v| cb2.callback_called(v))
241
+ .is_some()
242
+ );
175
243
 
176
244
  assert!(reactor.set_value(input, 31));
177
245
  cb1.expect_to_have_been_called_with(32);
178
246
  cb2.expect_to_have_been_called_with(32);
179
247
 
180
248
  assert!(reactor.remove_callback(output, callback).is_ok());
181
- assert!(reactor.add_callback(output, |v| cb3.callback_called(v)).is_some());
249
+ assert!(
250
+ reactor
251
+ .add_callback(output, |v| cb3.callback_called(v))
252
+ .is_some()
253
+ );
182
254
 
183
255
  assert!(reactor.set_value(input, 41));
184
256
  cb1.expect_not_to_have_been_called();
@@ -194,13 +266,24 @@ fn removing_a_callback_multiple_times_doesnt_interfere_with_other_callbacks() {
194
266
 
195
267
  let mut reactor = Reactor::new();
196
268
  let input = reactor.create_input(1);
197
- let output = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
198
- let callback = reactor.add_callback(output, |v| cb1.callback_called(v)).unwrap();
199
- assert!(reactor.add_callback(output, |v| cb2.callback_called(v)).is_some());
269
+ let output = reactor
270
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
271
+ .unwrap();
272
+ let callback = reactor
273
+ .add_callback(output, |v| cb1.callback_called(v))
274
+ .unwrap();
275
+ assert!(
276
+ reactor
277
+ .add_callback(output, |v| cb2.callback_called(v))
278
+ .is_some()
279
+ );
200
280
  // We want the first remove to be Ok, but the others should be errors.
201
281
  assert!(reactor.remove_callback(output, callback).is_ok());
202
282
  for _ in 1..5 {
203
- assert_eq!(reactor.remove_callback(output, callback), Err(RemoveCallbackError::NonexistentCallback));
283
+ assert_eq!(
284
+ reactor.remove_callback(output, callback),
285
+ Err(RemoveCallbackError::NonexistentCallback)
286
+ );
204
287
  }
205
288
 
206
289
  assert!(reactor.set_value(input, 2));
@@ -214,11 +297,26 @@ fn callbacks_should_only_be_called_once_even_if_multiple_dependencies_change() {
214
297
  let cb = CallbackRecorder::new();
215
298
  let mut reactor = Reactor::new();
216
299
  let input = reactor.create_input(1);
217
- let plus_one = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
218
- let minus_one1 = reactor.create_compute(&[CellID::Input(input)], |v| v[0] - 1).unwrap();
219
- let minus_one2 = reactor.create_compute(&[CellID::Compute(minus_one1)], |v| v[0] - 1).unwrap();
220
- let output = reactor.create_compute(&[CellID::Compute(plus_one), CellID::Compute(minus_one2)], |v| v[0] * v[1]).unwrap();
221
- assert!(reactor.add_callback(output, |v| cb.callback_called(v)).is_some());
300
+ let plus_one = reactor
301
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
302
+ .unwrap();
303
+ let minus_one1 = reactor
304
+ .create_compute(&[CellID::Input(input)], |v| v[0] - 1)
305
+ .unwrap();
306
+ let minus_one2 = reactor
307
+ .create_compute(&[CellID::Compute(minus_one1)], |v| v[0] - 1)
308
+ .unwrap();
309
+ let output = reactor
310
+ .create_compute(
311
+ &[CellID::Compute(plus_one), CellID::Compute(minus_one2)],
312
+ |v| v[0] * v[1],
313
+ )
314
+ .unwrap();
315
+ assert!(
316
+ reactor
317
+ .add_callback(output, |v| cb.callback_called(v))
318
+ .is_some()
319
+ );
222
320
  assert!(reactor.set_value(input, 4));
223
321
  cb.expect_to_have_been_called_with(10);
224
322
  }
@@ -229,10 +327,23 @@ fn callbacks_should_not_be_called_if_dependencies_change_but_output_value_doesnt
229
327
  let cb = CallbackRecorder::new();
230
328
  let mut reactor = Reactor::new();
231
329
  let input = reactor.create_input(1);
232
- let plus_one = reactor.create_compute(&[CellID::Input(input)], |v| v[0] + 1).unwrap();
233
- let minus_one = reactor.create_compute(&[CellID::Input(input)], |v| v[0] - 1).unwrap();
234
- let always_two = reactor.create_compute(&[CellID::Compute(plus_one), CellID::Compute(minus_one)], |v| v[0] - v[1]).unwrap();
235
- assert!(reactor.add_callback(always_two, |v| cb.callback_called(v)).is_some());
330
+ let plus_one = reactor
331
+ .create_compute(&[CellID::Input(input)], |v| v[0] + 1)
332
+ .unwrap();
333
+ let minus_one = reactor
334
+ .create_compute(&[CellID::Input(input)], |v| v[0] - 1)
335
+ .unwrap();
336
+ let always_two = reactor
337
+ .create_compute(
338
+ &[CellID::Compute(plus_one), CellID::Compute(minus_one)],
339
+ |v| v[0] - v[1],
340
+ )
341
+ .unwrap();
342
+ assert!(
343
+ reactor
344
+ .add_callback(always_two, |v| cb.callback_called(v))
345
+ .is_some()
346
+ );
236
347
  for i in 2..5 {
237
348
  assert!(reactor.set_value(input, i));
238
349
  cb.expect_not_to_have_been_called();
@@ -249,12 +360,29 @@ fn test_adder_with_boolean_values() {
249
360
  let b = reactor.create_input(false);
250
361
  let carry_in = reactor.create_input(false);
251
362
 
252
- let a_xor_b = reactor.create_compute(&[CellID::Input(a), CellID::Input(b)], |v| v[0] ^ v[1]).unwrap();
253
- let sum = reactor.create_compute(&[CellID::Compute(a_xor_b), CellID::Input(carry_in)], |v| v[0] ^ v[1]).unwrap();
254
-
255
- let a_xor_b_and_cin = reactor.create_compute(&[CellID::Compute(a_xor_b), CellID::Input(carry_in)], |v| v[0] && v[1]).unwrap();
256
- let a_and_b = reactor.create_compute(&[CellID::Input(a), CellID::Input(b)], |v| v[0] && v[1]).unwrap();
257
- let carry_out = reactor.create_compute(&[CellID::Compute(a_xor_b_and_cin), CellID::Compute(a_and_b)], |v| v[0] || v[1]).unwrap();
363
+ let a_xor_b = reactor
364
+ .create_compute(&[CellID::Input(a), CellID::Input(b)], |v| v[0] ^ v[1])
365
+ .unwrap();
366
+ let sum = reactor
367
+ .create_compute(&[CellID::Compute(a_xor_b), CellID::Input(carry_in)], |v| {
368
+ v[0] ^ v[1]
369
+ })
370
+ .unwrap();
371
+
372
+ let a_xor_b_and_cin = reactor
373
+ .create_compute(&[CellID::Compute(a_xor_b), CellID::Input(carry_in)], |v| {
374
+ v[0] && v[1]
375
+ })
376
+ .unwrap();
377
+ let a_and_b = reactor
378
+ .create_compute(&[CellID::Input(a), CellID::Input(b)], |v| v[0] && v[1])
379
+ .unwrap();
380
+ let carry_out = reactor
381
+ .create_compute(
382
+ &[CellID::Compute(a_xor_b_and_cin), CellID::Compute(a_and_b)],
383
+ |v| v[0] || v[1],
384
+ )
385
+ .unwrap();
258
386
 
259
387
  let tests = &[
260
388
  (false, false, false, false, false),
@@ -273,6 +401,9 @@ fn test_adder_with_boolean_values() {
273
401
  assert!(reactor.set_value(carry_in, cinval));
274
402
 
275
403
  assert_eq!(reactor.value(CellID::Compute(sum)), Some(expected_sum));
276
- assert_eq!(reactor.value(CellID::Compute(carry_out)), Some(expected_cout));
404
+ assert_eq!(
405
+ reactor.value(CellID::Compute(carry_out)),
406
+ Some(expected_cout)
407
+ );
277
408
  }
278
409
  }
@@ -76,11 +76,31 @@ Execute the tests with:
76
76
  $ cargo test
77
77
  ```
78
78
 
79
- All but the first test have been ignored. After you get the first test to
80
- pass, remove the ignore flag (`#[ignore]`) from the next test and get the tests
81
- to pass again. The test file is located in the `tests` directory. You can
82
- also remove the ignore flag from all the tests to get them to run all at once
83
- if you wish.
79
+ All but the first test have been ignored. After you get the first test to
80
+ pass, open the tests source file wich is located in the `tests` directory
81
+ and remove the `#[ignore]` flag from the next test and get the tests to pass
82
+ again. Each separate test is a function with `#[test]` flag above it.
83
+ Continue, until you pass every test.
84
+
85
+ If you wish to run all tests without editing the tests source file, use:
86
+
87
+ ```bash
88
+ $ cargo test -- --ignored
89
+ ```
90
+
91
+ To run a specific test, for example `some_test`, you can use:
92
+
93
+ ```bash
94
+ $ cargo test some_test
95
+ ```
96
+
97
+ If the specfic test is ignored use:
98
+
99
+ ```bash
100
+ $ cargo test some_test -- --ignored
101
+ ```
102
+
103
+ To learn more about Rust tests refer to the [online test documentation][rust-tests]
84
104
 
85
105
  Make sure to read the [Modules](https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html) chapter if you
86
106
  haven't already, it will help you with organizing your files.
@@ -94,6 +114,7 @@ If you want to know more about Exercism, take a look at the [contribution guide]
94
114
  [help-page]: http://exercism.io/languages/rust
95
115
  [modules]: https://doc.rust-lang.org/book/second-edition/ch07-00-modules.html
96
116
  [cargo]: https://doc.rust-lang.org/book/second-edition/ch14-00-more-about-cargo.html
117
+ [rust-tests]: https://doc.rust-lang.org/book/second-edition/ch11-02-running-tests.html
97
118
 
98
119
  ## Submitting Incomplete Solutions
99
120
  It's possible to submit an incomplete solution so you can see how others have completed the exercise.