use super::circular_index; use crate::game_of_life::opts::Opts; use crate::game_of_life::simulation::plane::Plane; use std::ops::Index; /// Game of Life universe struct for running simulations #[derive(Debug, Clone, PartialEq)] pub(crate) struct Universe { pub opts: Opts, pub current: Vec, pub future: Vec, } impl Index for Universe { type Output = Plane; fn index(&self, idx: isize) -> &Plane { let len = self.current.len() as isize; &self.current[circular_index(idx, len)] } } #[cfg(test)] mod universe { use super::*; mod index { use super::*; #[test] fn get_element() { let opts = Opts { seed: 1337, input: None, width: 13, height: 13, live_cell: 'L', dead_cell: 'D', delay: 13, }; let u = Universe { opts, current: vec![ Plane(vec![false; 5]), Plane(vec![false, false, true, false, false]), Plane(vec![false; 5]), ], future: vec![Plane(vec![])], }; assert_eq!(u[-3][0], false); assert_eq!(u[-3][1], false); assert_eq!(u[-3][3], false); assert_eq!(u[-3][4], false); assert_eq!(u[0][0], false); assert_eq!(u[0][1], false); assert_eq!(u[0][3], false); assert_eq!(u[0][4], false); assert_eq!(u[2][0], false); assert_eq!(u[2][1], false); assert_eq!(u[2][3], false); assert_eq!(u[2][4], false); assert_eq!(u[5][0], false); assert_eq!(u[5][1], false); assert_eq!(u[5][3], false); assert_eq!(u[5][4], false); assert_eq!(u[-2][-3], true); assert_eq!(u[-2][2], true); assert_eq!(u[-2][7], true); assert_eq!(u[1][-3], true); assert_eq!(u[1][2], true); assert_eq!(u[1][7], true); assert_eq!(u[4][-3], true); assert_eq!(u[4][2], true); assert_eq!(u[4][7], true); } } }