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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/go/exercises/dominoes/.meta/gen.go +1 -1
- data/tracks/go/exercises/dominoes/cases_test.go +11 -11
- data/tracks/ocaml/config.json +1 -1
- data/tracks/ocaml/docs/ABOUT.md +6 -4
- data/tracks/powershell/config.json +3 -2
- data/tracks/rust/bin/format_exercises +31 -0
- data/tracks/rust/config.json +10 -2
- data/tracks/rust/config/exercise_readme.go.tmpl +26 -5
- data/tracks/rust/exercises/accumulate/README.md +26 -5
- data/tracks/rust/exercises/accumulate/src/lib.rs +1 -0
- data/tracks/rust/exercises/accumulate/tests/accumulate.rs +7 -7
- data/tracks/rust/exercises/acronym/README.md +26 -5
- data/tracks/rust/exercises/acronym/src/lib.rs +1 -0
- data/tracks/rust/exercises/acronym/tests/acronym.rs +10 -5
- data/tracks/rust/exercises/all-your-base/README.md +26 -5
- data/tracks/rust/exercises/all-your-base/src/lib.rs +6 -1
- data/tracks/rust/exercises/all-your-base/tests/all-your-base.rs +68 -34
- data/tracks/rust/exercises/allergies/README.md +26 -5
- data/tracks/rust/exercises/allergies/src/lib.rs +1 -0
- data/tracks/rust/exercises/allergies/tests/allergies.rs +34 -26
- data/tracks/rust/exercises/alphametics/README.md +26 -5
- data/tracks/rust/exercises/alphametics/tests/alphametics.rs +44 -9
- data/tracks/rust/exercises/anagram/README.md +26 -5
- data/tracks/rust/exercises/anagram/src/lib.rs +1 -0
- data/tracks/rust/exercises/anagram/tests/anagram.rs +15 -4
- data/tracks/rust/exercises/armstrong-numbers/README.md +26 -5
- data/tracks/rust/exercises/atbash-cipher/README.md +26 -5
- data/tracks/rust/exercises/atbash-cipher/src/lib.rs +1 -1
- data/tracks/rust/exercises/atbash-cipher/tests/atbash-cipher.rs +16 -8
- data/tracks/rust/exercises/beer-song/README.md +26 -5
- data/tracks/rust/exercises/binary-search/README.md +26 -5
- data/tracks/rust/exercises/binary-search/src/lib.rs +1 -0
- data/tracks/rust/exercises/binary-search/tests/binary-search.rs +8 -4
- data/tracks/rust/exercises/bob/README.md +26 -5
- data/tracks/rust/exercises/bob/tests/bob.rs +32 -15
- data/tracks/rust/exercises/book-store/README.md +26 -5
- data/tracks/rust/exercises/book-store/src/lib.rs +4 -1
- data/tracks/rust/exercises/book-store/tests/book-store.rs +52 -24
- data/tracks/rust/exercises/bowling/README.md +26 -5
- data/tracks/rust/exercises/bowling/src/lib.rs +1 -2
- data/tracks/rust/exercises/bowling/tests/bowling.rs +2 -1
- data/tracks/rust/exercises/bracket-push/README.md +29 -7
- data/tracks/rust/exercises/bracket-push/src/lib.rs +1 -0
- data/tracks/rust/exercises/circular-buffer/README.md +26 -5
- data/tracks/rust/exercises/circular-buffer/src/lib.rs +1 -0
- data/tracks/rust/exercises/clock/README.md +26 -5
- data/tracks/rust/exercises/clock/src/lib.rs +1 -0
- data/tracks/rust/exercises/clock/tests/clock.rs +0 -1
- data/tracks/rust/exercises/collatz-conjecture/README.md +26 -5
- data/tracks/rust/exercises/crypto-square/README.md +53 -29
- data/tracks/rust/exercises/custom-set/README.md +26 -5
- data/tracks/rust/exercises/custom-set/src/lib.rs +1 -0
- data/tracks/rust/exercises/decimal/README.md +26 -5
- data/tracks/rust/exercises/decimal/tests/decimal.rs +4 -7
- data/tracks/rust/exercises/diamond/README.md +26 -5
- data/tracks/rust/exercises/difference-of-squares/README.md +26 -5
- data/tracks/rust/exercises/difference-of-squares/src/lib.rs +1 -1
- data/tracks/rust/exercises/diffie-hellman/README.md +26 -5
- data/tracks/rust/exercises/diffie-hellman/src/lib.rs +12 -2
- data/tracks/rust/exercises/diffie-hellman/tests/diffie-hellman.rs +3 -3
- data/tracks/rust/exercises/dominoes/README.md +26 -5
- data/tracks/rust/exercises/dominoes/src/lib.rs +1 -0
- data/tracks/rust/exercises/dominoes/tests/dominoes.rs +29 -13
- data/tracks/rust/exercises/etl/README.md +26 -5
- data/tracks/rust/exercises/etl/src/lib.rs +1 -0
- data/tracks/rust/exercises/etl/tests/etl.rs +39 -34
- data/tracks/rust/exercises/forth/README.md +26 -5
- data/tracks/rust/exercises/forth/tests/forth.rs +17 -65
- data/tracks/rust/exercises/gigasecond/README.md +26 -5
- data/tracks/rust/exercises/gigasecond/tests/gigasecond.rs +31 -10
- data/tracks/rust/exercises/grade-school/README.md +26 -5
- data/tracks/rust/exercises/grade-school/src/lib.rs +1 -2
- data/tracks/rust/exercises/grade-school/tests/grade-school.rs +5 -9
- data/tracks/rust/exercises/grains/README.md +26 -5
- data/tracks/rust/exercises/hamming/README.md +30 -8
- data/tracks/rust/exercises/hamming/src/lib.rs +1 -2
- data/tracks/rust/exercises/hello-world/README.md +26 -5
- data/tracks/rust/exercises/hexadecimal/README.md +26 -5
- data/tracks/rust/exercises/hexadecimal/src/lib.rs +1 -0
- data/tracks/rust/exercises/isbn-verifier/README.md +26 -5
- data/tracks/rust/exercises/isogram/README.md +26 -5
- data/tracks/rust/exercises/isogram/src/lib.rs +1 -1
- data/tracks/rust/exercises/isogram/tests/isogram.rs +36 -24
- data/tracks/rust/exercises/largest-series-product/README.md +26 -5
- data/tracks/rust/exercises/largest-series-product/src/lib.rs +5 -1
- data/tracks/rust/exercises/largest-series-product/tests/largest-series-product.rs +4 -2
- data/tracks/rust/exercises/leap/README.md +26 -5
- data/tracks/rust/exercises/luhn-from/README.md +26 -5
- data/tracks/rust/exercises/luhn-from/src/lib.rs +1 -0
- data/tracks/rust/exercises/luhn-trait/README.md +26 -5
- data/tracks/rust/exercises/luhn-trait/src/lib.rs +1 -0
- data/tracks/rust/exercises/luhn/README.md +26 -5
- data/tracks/rust/exercises/luhn/src/lib.rs +1 -1
- data/tracks/rust/exercises/macros/README.md +26 -5
- data/tracks/rust/exercises/minesweeper/README.md +26 -5
- data/tracks/rust/exercises/minesweeper/src/lib.rs +1 -0
- data/tracks/rust/exercises/nth-prime/README.md +26 -5
- data/tracks/rust/exercises/nucleotide-codons/README.md +26 -5
- data/tracks/rust/exercises/nucleotide-codons/src/lib.rs +1 -0
- data/tracks/rust/exercises/nucleotide-codons/tests/codons.rs +6 -5
- data/tracks/rust/exercises/nucleotide-count/README.md +26 -5
- data/tracks/rust/exercises/nucleotide-count/src/lib.rs +1 -0
- data/tracks/rust/exercises/nucleotide-count/tests/nucleotide-count.rs +5 -8
- data/tracks/rust/exercises/ocr-numbers/README.md +26 -5
- data/tracks/rust/exercises/ocr-numbers/tests/ocr-numbers.rs +0 -1
- data/tracks/rust/exercises/palindrome-products/README.md +26 -5
- data/tracks/rust/exercises/pangram/README.md +26 -5
- data/tracks/rust/exercises/pangram/src/lib.rs +1 -1
- data/tracks/rust/exercises/parallel-letter-frequency/README.md +26 -5
- data/tracks/rust/exercises/parallel-letter-frequency/benches/benchmark.rs +6 -3
- data/tracks/rust/exercises/parallel-letter-frequency/src/lib.rs +1 -0
- data/tracks/rust/exercises/parallel-letter-frequency/tests/parallel-letter-frequency.rs +6 -3
- data/tracks/rust/exercises/pascals-triangle/README.md +26 -5
- data/tracks/rust/exercises/pascals-triangle/tests/pascals-triangle.rs +36 -28
- data/tracks/rust/exercises/perfect-numbers/README.md +26 -5
- data/tracks/rust/exercises/perfect-numbers/src/lib.rs +1 -1
- data/tracks/rust/exercises/perfect-numbers/tests/perfect-numbers.rs +1 -2
- data/tracks/rust/exercises/phone-number/README.md +26 -5
- data/tracks/rust/exercises/phone-number/src/lib.rs +1 -0
- data/tracks/rust/exercises/pig-latin/README.md +26 -5
- data/tracks/rust/exercises/pig-latin/src/lib.rs +1 -0
- data/tracks/rust/exercises/poker/README.md +26 -5
- data/tracks/rust/exercises/poker/tests/poker.rs +27 -104
- data/tracks/rust/exercises/prime-factors/README.md +26 -5
- data/tracks/rust/exercises/protein-translation/README.md +26 -5
- data/tracks/rust/exercises/protein-translation/src/lib.rs +1 -0
- data/tracks/rust/exercises/protein-translation/tests/proteins.rs +16 -9
- data/tracks/rust/exercises/proverb/README.md +26 -5
- data/tracks/rust/exercises/proverb/tests/proverb.rs +1 -7
- data/tracks/rust/exercises/pythagorean-triplet/README.md +26 -5
- data/tracks/rust/exercises/queen-attack/README.md +26 -5
- data/tracks/rust/exercises/queen-attack/src/lib.rs +1 -0
- data/tracks/rust/exercises/raindrops/README.md +26 -5
- data/tracks/rust/exercises/raindrops/tests/raindrops.rs +57 -19
- data/tracks/rust/exercises/react/README.md +26 -5
- data/tracks/rust/exercises/react/src/lib.rs +16 -4
- data/tracks/rust/exercises/react/tests/react.rs +174 -43
- data/tracks/rust/exercises/rectangles/README.md +26 -5
- data/tracks/rust/exercises/rectangles/src/lib.rs +1 -0
- data/tracks/rust/exercises/reverse-string/README.md +26 -5
- data/tracks/rust/exercises/reverse-string/tests/reverse-string.rs +2 -11
- data/tracks/rust/exercises/rna-transcription/README.md +26 -5
- data/tracks/rust/exercises/rna-transcription/src/lib.rs +1 -0
- data/tracks/rust/exercises/robot-name/README.md +26 -5
- data/tracks/rust/exercises/robot-name/src/lib.rs +1 -0
- data/tracks/rust/exercises/robot-name/tests/robot-name.rs +8 -2
- data/tracks/rust/exercises/robot-simulator/README.md +26 -5
- data/tracks/rust/exercises/robot-simulator/src/lib.rs +5 -6
- data/tracks/rust/exercises/roman-numerals/README.md +26 -5
- data/tracks/rust/exercises/roman-numerals/src/lib.rs +1 -0
- data/tracks/rust/exercises/rotational-cipher/README.md +26 -5
- data/tracks/rust/exercises/rotational-cipher/src/lib.rs +1 -0
- data/tracks/rust/exercises/rotational-cipher/tests/rotational-cipher.rs +12 -4
- data/tracks/rust/exercises/run-length-encoding/README.md +26 -5
- data/tracks/rust/exercises/run-length-encoding/src/lib.rs +1 -1
- data/tracks/rust/exercises/run-length-encoding/tests/run-length-encoding.rs +12 -5
- data/tracks/rust/exercises/saddle-points/README.md +26 -5
- data/tracks/rust/exercises/saddle-points/src/lib.rs +4 -1
- data/tracks/rust/exercises/say/README.md +27 -6
- data/tracks/rust/exercises/say/src/lib.rs +1 -1
- data/tracks/rust/exercises/say/tests/say.rs +30 -14
- data/tracks/rust/exercises/scrabble-score/README.md +26 -5
- data/tracks/rust/exercises/scrabble-score/src/lib.rs +1 -1
- data/tracks/rust/exercises/series/README.md +32 -11
- data/tracks/rust/exercises/series/src/lib.rs +5 -1
- data/tracks/rust/exercises/sieve/README.md +31 -8
- data/tracks/rust/exercises/sieve/src/lib.rs +1 -0
- data/tracks/rust/exercises/sieve/tests/sieve.rs +11 -12
- data/tracks/rust/exercises/simple-cipher/README.md +26 -5
- data/tracks/rust/exercises/simple-cipher/src/lib.rs +6 -3
- data/tracks/rust/exercises/simple-cipher/tests/simple-cipher.rs +0 -1
- data/tracks/rust/exercises/simple-linked-list/README.md +26 -5
- data/tracks/rust/exercises/simple-linked-list/src/lib.rs +0 -1
- data/tracks/rust/exercises/simple-linked-list/tests/simple-linked-list.rs +0 -1
- data/tracks/rust/exercises/space-age/README.md +26 -5
- data/tracks/rust/exercises/space-age/tests/space-age.rs +4 -4
- data/tracks/rust/exercises/spiral-matrix/README.md +26 -5
- data/tracks/rust/exercises/sublist/README.md +26 -5
- data/tracks/rust/exercises/sublist/src/lib.rs +1 -0
- data/tracks/rust/exercises/sublist/tests/sublist.rs +17 -68
- data/tracks/rust/exercises/sum-of-multiples/README.md +26 -5
- data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +5 -1
- data/tracks/rust/exercises/tournament/README.md +26 -5
- data/tracks/rust/exercises/tournament/src/lib.rs +1 -0
- data/tracks/rust/exercises/tournament/tests/tournament.rs +60 -60
- data/tracks/rust/exercises/triangle/README.md +26 -5
- data/tracks/rust/exercises/triangle/src/lib.rs +1 -0
- data/tracks/rust/exercises/two-bucket/README.md +26 -5
- data/tracks/rust/exercises/two-bucket/src/lib.rs +2 -6
- data/tracks/rust/exercises/two-bucket/tests/two-bucket.rs +49 -37
- data/tracks/rust/exercises/twofer/README.md +33 -7
- data/tracks/rust/exercises/twofer/src/lib.rs +2 -2
- data/tracks/rust/exercises/twofer/tests/two-fer.rs +2 -2
- data/tracks/rust/exercises/variable-length-quantity/README.md +26 -5
- data/tracks/rust/exercises/variable-length-quantity/tests/variable-length-quantity.rs +60 -32
- data/tracks/rust/exercises/word-count/README.md +26 -5
- data/tracks/rust/exercises/word-count/src/lib.rs +1 -1
- data/tracks/rust/exercises/word-count/tests/word-count.rs +15 -23
- data/tracks/rust/exercises/wordy/README.md +26 -5
- data/tracks/rust/exercises/wordy/src/lib.rs +1 -0
- 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.
|
32
|
-
pass,
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
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>(
|
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) -> ()>(
|
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(
|
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
|
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
|
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!(
|
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!(
|
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
|
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
|
86
|
-
|
87
|
-
|
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!(
|
114
|
-
|
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!(
|
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!(
|
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
|
133
|
-
|
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
|
144
|
-
|
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
|
154
|
-
|
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
|
172
|
-
|
173
|
-
|
174
|
-
|
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!(
|
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
|
198
|
-
|
199
|
-
|
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!(
|
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
|
218
|
-
|
219
|
-
|
220
|
-
let
|
221
|
-
|
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
|
233
|
-
|
234
|
-
|
235
|
-
|
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
|
253
|
-
|
254
|
-
|
255
|
-
let
|
256
|
-
|
257
|
-
|
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!(
|
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.
|
80
|
-
pass,
|
81
|
-
|
82
|
-
|
83
|
-
|
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.
|