()
| 2966 | |
| 2967 | #[test] |
| 2968 | fn test_rocket_load() { |
| 2969 | // Create the game world and the rocket for this test. |
| 2970 | let mut world = GameWorld::test_world(); |
| 2971 | let takeoff_loc = MapLocation::new(Planet::Earth, 10, 10); |
| 2972 | let rocket = world.create_unit(Team::Red, takeoff_loc, UnitType::Rocket).unwrap(); |
| 2973 | world.get_unit_mut(rocket).unwrap().be_built(1000); |
| 2974 | |
| 2975 | // Correct loading. |
| 2976 | let valid_boarder = world.create_unit(Team::Red, takeoff_loc.add(Direction::North), UnitType::Knight).unwrap(); |
| 2977 | assert![world.can_load(rocket, valid_boarder)]; |
| 2978 | assert![world.load(rocket, valid_boarder).is_ok()]; |
| 2979 | assert_eq![world.my_unit(valid_boarder).unwrap().location(), InGarrison(rocket)]; |
| 2980 | |
| 2981 | // Boarding fails when too far from the rocket. |
| 2982 | let invalid_boarder_too_far = world.create_unit(Team::Red, takeoff_loc.add(Direction::North).add(Direction::North), UnitType::Knight).unwrap(); |
| 2983 | assert![!world.can_load(rocket, valid_boarder)]; |
| 2984 | assert_err![world.load(rocket, invalid_boarder_too_far), GameError::OutOfRange]; |
| 2985 | |
| 2986 | // Boarding fails when the robot has already moved. |
| 2987 | assert![world.move_robot(invalid_boarder_too_far, Direction::South).is_ok()]; |
| 2988 | let invalid_boarder_already_moved = invalid_boarder_too_far; |
| 2989 | assert![!world.is_move_ready(invalid_boarder_already_moved)]; |
| 2990 | assert![!world.can_load(rocket, invalid_boarder_already_moved)]; |
| 2991 | assert_err![world.load(rocket, invalid_boarder_already_moved), GameError::Overheated]; |
| 2992 | |
| 2993 | // Factories and rockets cannot board rockets. |
| 2994 | let invalid_boarder_factory = world.create_unit(Team::Red, takeoff_loc.add(Direction::Southeast), UnitType::Factory).unwrap(); |
| 2995 | assert![!world.can_load(rocket, invalid_boarder_factory)]; |
| 2996 | assert_err![world.load(rocket, invalid_boarder_factory), GameError::InappropriateUnitType]; |
| 2997 | let invalid_boarder_rocket = world.create_unit(Team::Red, takeoff_loc.add(Direction::South), UnitType::Rocket).unwrap(); |
| 2998 | assert![!world.can_load(rocket, invalid_boarder_rocket)]; |
| 2999 | assert_err![world.load(rocket, invalid_boarder_rocket), GameError::InappropriateUnitType]; |
| 3000 | |
| 3001 | // Rockets can be loaded up to their capacity... |
| 3002 | for _ in 1..8 { |
| 3003 | let valid_extra_boarder = world.create_unit(Team::Red, takeoff_loc.add(Direction::East), UnitType::Knight).unwrap(); |
| 3004 | assert![world.can_load(rocket, valid_extra_boarder)]; |
| 3005 | assert![world.load(rocket, valid_extra_boarder).is_ok()]; |
| 3006 | } |
| 3007 | |
| 3008 | // ... but not beyond their capacity. |
| 3009 | let invalid_boarder_rocket_full = world.create_unit(Team::Red, takeoff_loc.add(Direction::East), UnitType::Knight).unwrap(); |
| 3010 | assert![!world.can_load(rocket, invalid_boarder_rocket_full)]; |
| 3011 | assert_err![world.load(rocket, invalid_boarder_rocket_full), GameError::GarrisonFull]; |
| 3012 | |
| 3013 | // A unit should not be able to board another team's rocket. |
| 3014 | let blue_takeoff_loc = MapLocation::new(Planet::Earth, 5, 5); |
| 3015 | let blue_rocket = world.create_unit(Team::Blue, blue_takeoff_loc, UnitType::Rocket).unwrap(); |
| 3016 | let invalid_boarder_wrong_team = world.create_unit(Team::Red, blue_takeoff_loc.add(Direction::North), UnitType::Knight).unwrap(); |
| 3017 | assert![!world.can_load(blue_rocket, invalid_boarder_wrong_team)]; |
| 3018 | assert_err![world.load(blue_rocket, invalid_boarder_wrong_team), GameError::TeamNotAllowed]; |
| 3019 | } |
| 3020 | |
| 3021 | #[test] |
| 3022 | fn test_rocket_unload() { |
nothing calls this directly
no test coverage detected