summaryrefslogtreecommitdiffstats
path: root/CLI/rust/src
diff options
context:
space:
mode:
Diffstat (limited to 'CLI/rust/src')
-rw-r--r--CLI/rust/src/game_of_life/simulation/universe.rs156
1 files changed, 156 insertions, 0 deletions
diff --git a/CLI/rust/src/game_of_life/simulation/universe.rs b/CLI/rust/src/game_of_life/simulation/universe.rs
index 782e611..a70fa11 100644
--- a/CLI/rust/src/game_of_life/simulation/universe.rs
+++ b/CLI/rust/src/game_of_life/simulation/universe.rs
@@ -72,3 +72,159 @@ mod index {
assert_eq!(u[4][7], true);
}
}
+
+impl Universe {
+ /// Return the neighboring cells to the cell in index (Y,X) on a plane
+ ///
+ /// given a cell "C" in a universe of cells "." the immediate neighbors would be "x" as in
+ /// the following different examples
+ ///
+ /// ..... | .xxx. | .xCx. | xCx.. | Cx..x | xx..x |
+ /// .xxx. | .xCx. | .xxx. | xxx.. | xx..x | Cx..x |
+ /// .xCx. | .xxx. | ..... | ..... | ..... | xx..x |
+ /// .xxx. | ..... | ..... | ..... | ..... | ..... |
+ /// ..... | ..... | .xxx. | xxx.. | xx..x | ..... |
+ ///
+ pub(crate) fn neighbors(self, y: isize, x: isize) -> Vec<bool> {
+ vec![
+ self[y - 1][x - 1],
+ self[y - 1][x],
+ self[y - 1][x + 1],
+ self[y][x - 1],
+ self[y][x + 1],
+ self[y + 1][x - 1],
+ self[y + 1][x],
+ self[y + 1][x + 1],
+ ]
+ }
+
+}
+
+#[cfg(test)]
+mod neighbors {
+ use super::*;
+
+ fn opts() -> Opts {
+ Opts {
+ seed: 1337,
+ input: None,
+ width: 13,
+ height: 13,
+ live_cell: 'L',
+ dead_cell: 'D',
+ delay: 13,
+ }
+ }
+
+ #[test]
+ fn center() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, false, false, false, false]),
+ ],
+ };
+ assert_eq!(u.neighbors(2,2), vec![true; 8]);
+ }
+
+ #[test]
+ fn top_edge() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, true, true, true, false]),
+ ],
+ };
+ assert_eq!(u.neighbors(0,2), vec![true; 8]);
+ }
+
+ #[test]
+ fn bottom_edge() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, true, true, true, false]),
+ Plane(vec![false, true, true, true, false]),
+ ],
+ };
+ assert_eq!(u.neighbors(4,2), vec![true; 8]);
+ }
+
+ #[test]
+ fn left_edge() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![true, true, false, false, true]),
+ Plane(vec![true, true, false, false, true]),
+ Plane(vec![true, true, false, false, true]),
+ Plane(vec![false, false, false, false, false]),
+ ],
+ };
+ assert_eq!(u.neighbors(2,0), vec![true; 8]);
+ }
+
+ #[test]
+ fn right_edge() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![true, false, false, true, true]),
+ Plane(vec![true, false, false, true, true]),
+ Plane(vec![true, false, false, true, true]),
+ Plane(vec![false, false, false, false, false]),
+ ],
+ };
+ assert_eq!(u.neighbors(2,4), vec![true; 8]);
+ }
+
+ #[test]
+ fn bottom_corner_edge() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![true, false, false, true, true]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![true, false, false, true, true]),
+ Plane(vec![true, false, false, true, true]),
+ ],
+ };
+ assert_eq!(u.neighbors(4,4), vec![true; 8]);
+ }
+
+ #[test]
+ fn top_corner_edge() {
+ let u = Universe {
+ opts: opts(),
+ future: vec![Plane(vec![])],
+ current: vec![
+ Plane(vec![true, true, false, false, true]),
+ Plane(vec![true, true, false, false, true]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![false, false, false, false, false]),
+ Plane(vec![true, true, false, false, true]),
+ ],
+ };
+ assert_eq!(u.neighbors(0,0), vec![true; 8]);
+ }
+}