summaryrefslogtreecommitdiffstats
path: root/CLI/rust/src/game_of_life/generators/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'CLI/rust/src/game_of_life/generators/input.rs')
-rw-r--r--CLI/rust/src/game_of_life/generators/input.rs80
1 files changed, 80 insertions, 0 deletions
diff --git a/CLI/rust/src/game_of_life/generators/input.rs b/CLI/rust/src/game_of_life/generators/input.rs
index e22a9fc..235b3b2 100644
--- a/CLI/rust/src/game_of_life/generators/input.rs
+++ b/CLI/rust/src/game_of_life/generators/input.rs
@@ -133,3 +133,83 @@ mod generate_file_data {
fn generate_url_data(_opts: Opts) -> Result<Universe, Error> {
unimplemented!()
}
+
+/// Return a universe struct with populated data from the data param
+///
+/// The data param is reshaped to fit with the opts width/height (extended or shrinked)
+fn populate(opts: Opts, data: Vec<Vec<bool>>) -> Universe {
+ let (width, height) = (opts.width as usize, opts.height as usize);
+ let mut current = vec![vec![false; width]; height];
+
+ for i in 0..height {
+ for j in 0..width {
+ current[i][j] = data
+ .get(i)
+ .unwrap_or(&vec![])
+ .get(j)
+ .unwrap_or(&false)
+ .clone();
+ }
+ }
+
+ Universe {
+ opts,
+ current,
+ future: vec![vec![false; width]; height],
+ }
+}
+
+#[cfg(test)]
+mod populate {
+ use super::*;
+
+ fn opts(width: isize, height: isize) -> Opts {
+ Opts {
+ width,
+ height,
+ seed: 1337,
+ input: None,
+ live_cell: 'L',
+ dead_cell: 'D',
+ delay: 13,
+ }
+ }
+
+ #[test]
+ fn expand_data() {
+ let data = vec![vec![true, false, true]; 3];
+ let opts = opts(5, 5);
+
+ let universe = populate(opts.clone(), data);
+ assert_eq!(
+ universe,
+ Universe {
+ opts,
+ future: vec![vec![false; 5]; 5],
+ current: vec![
+ vec![true, false, true, false, false],
+ vec![true, false, true, false, false],
+ vec![true, false, true, false, false],
+ vec![false, false, false, false, false],
+ vec![false, false, false, false, false],
+ ]
+ }
+ )
+ }
+
+ #[test]
+ fn shrink_data() {
+ let data = vec![vec![true, false, true]; 3];
+ let opts = opts(2, 2);
+
+ let universe = populate(opts.clone(), data);
+ assert_eq!(
+ universe,
+ Universe {
+ opts,
+ future: vec![vec![false; 2]; 2],
+ current: vec![vec![true, false], vec![true, false]]
+ }
+ )
+ }
+}