From 276f7a5fbc1c70d97f50fd39625f926ce069c907 Mon Sep 17 00:00:00 2001 From: a14m Date: Wed, 7 Apr 2021 15:56:28 +0200 Subject: Add the universe neighbors method w/testing --- CLI/rust/src/game_of_life/simulation/universe.rs | 156 +++++++++++++++++++++++ 1 file changed, 156 insertions(+) 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 { + 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]); + } +} -- cgit v1.2.3