Merge branch 'check-collision' into 'master'
Check collision See merge request mhart/DancingDroids!35
This commit is contained in:
commit
790caa111d
68
src/main.rs
68
src/main.rs
@ -14,12 +14,37 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use clap::{App, Arg};
|
use clap::{App, Arg};
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
|
|
||||||
mod robot;
|
mod robot;
|
||||||
mod world;
|
mod world;
|
||||||
|
|
||||||
|
/// Check if the robot is in the map.
|
||||||
|
fn check_map(r: &robot::Robot, w: &world::World) -> Result<(), String> {
|
||||||
|
if (r.p.x, r.p.y) < (0, 0) || (r.p.x, r.p.y) > (w.x, w.y) {
|
||||||
|
Err(format!("The robot {} is off map", r.id))
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Check if the robot collide with another one at the given position.
|
||||||
|
fn check_collisions(
|
||||||
|
r: &robot::Robot,
|
||||||
|
w: &world::World,
|
||||||
|
h: &HashMap<&robot::Position, &u32>,
|
||||||
|
) -> Result<(), String> {
|
||||||
|
match h.get(&r.p) {
|
||||||
|
Some(&x) => Err(format!(
|
||||||
|
"The robot id: {} collided with robot id: {} in position: ({};{}) !",
|
||||||
|
&r.id, x, &r.p.x, &r.p.y
|
||||||
|
)),
|
||||||
|
None => Ok(()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Parse the config file, generate the world and robot pool.
|
/// Parse the config file, generate the world and robot pool.
|
||||||
fn parse_config(conf: String, pool: &mut Vec<robot::Robot>) -> Result<world::World, &'static str> {
|
fn parse_config(conf: String, pool: &mut Vec<robot::Robot>) -> Result<world::World, &'static str> {
|
||||||
let mut lines = conf.lines();
|
let mut lines = conf.lines();
|
||||||
@ -84,4 +109,47 @@ mod tests {
|
|||||||
assert!(open_file("two_robots.txt").is_ok());
|
assert!(open_file("two_robots.txt").is_ok());
|
||||||
assert!(open_file("test_unexisting_file.extension").is_err());
|
assert!(open_file("test_unexisting_file.extension").is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_check_map() {
|
||||||
|
let mut r = robot::Robot::new(
|
||||||
|
0,
|
||||||
|
robot::Orientation::N,
|
||||||
|
robot::Position { x: 2, y: 3 },
|
||||||
|
vec!['F'],
|
||||||
|
);
|
||||||
|
let w = world::World { x: 10, y: 10 };
|
||||||
|
|
||||||
|
assert!(check_map(&r, &w).is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_check_map_fail() {
|
||||||
|
let mut r = robot::Robot::new(
|
||||||
|
0,
|
||||||
|
robot::Orientation::N,
|
||||||
|
robot::Position { x: 2, y: 3 },
|
||||||
|
vec!['F'],
|
||||||
|
);
|
||||||
|
let w = world::World { x: 1, y: 1 };
|
||||||
|
|
||||||
|
assert!(check_map(&r, &w).is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn test_check_collisions() {
|
||||||
|
let mut r = robot::Robot::new(
|
||||||
|
0,
|
||||||
|
robot::Orientation::N,
|
||||||
|
robot::Position { x: 2, y: 3 },
|
||||||
|
vec!['F'],
|
||||||
|
);
|
||||||
|
let w = world::World { x: 10, y: 10 };
|
||||||
|
|
||||||
|
let mut h: HashMap<&robot::Position, &u32> = HashMap::new();
|
||||||
|
h.insert(&robot::Position { x: 2, y: 3 }, &1);
|
||||||
|
assert!(check_collisions(&r, &w, &h).is_ok());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user