use pong::collision::collision::CollisionHandler; use pong::game_object::components::{DefaultGeomComp, DefaultPhysicsComp}; use pong::game_object::game_object::{DefaultGameObject, GameObject}; use pong::geom::geom::Vector; use pong::geom::shape::Shape; use pong::utils::utils::DefaultLoggerFactory; use rstest::rstest; use std::borrow::{Borrow, BorrowMut}; use std::cell::RefCell; use std::rc::Rc; #[rstest] #[case( // given create_game_obj(1, Vector::new(1., 0.), Vector::new(1., 0.), true), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(1., 0.), Vector::new(1., 0.), true), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), )] #[case( // given create_game_obj(1, Vector::new(1., 0.), Vector::new(1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(-1., 0.), Vector::new(1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), )] #[case( // given create_game_obj(1, Vector::new(-1., 0.), Vector::new(-1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(1., 0.), Vector::new(-1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), )] #[case( // given create_game_obj(1, Vector::new(1., 1.), Vector::new(1., 1.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(-1., 1.), Vector::new(1., 1.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), )] #[case( // given create_game_obj(1, Vector::new(-2., 1.), Vector::new(-1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(2., 1.), Vector::new(-1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), )] #[case( // given create_game_obj(1, Vector::new(1., 0.), Vector::new(1., 0.), false), create_game_obj(2, Vector::new(0., 1.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(-1., 1.), Vector::new(1., 0.), false), create_game_obj(2, Vector::new(0., 1.), Vector::new(0., 1.), true), )] #[case( // given create_game_obj(1, Vector::new(-2., 1.), Vector::new(-1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), // expected create_game_obj(1, Vector::new(2., 1.), Vector::new(-1., 0.), false), create_game_obj(2, Vector::new(0., 0.), Vector::new(0., 1.), true), )] pub fn should_handle_collision( #[case] mut obj_a: Rc>>, #[case] mut obj_b: Rc>>, #[case] expected_a: Rc>>, #[case] expected_b: Rc>>, ) { let logger = DefaultLoggerFactory::noop(); let mut handler = CollisionHandler::new(&logger); handler.register((String::from("obj"), String::from("obj")), |a, b| {}); let res = handler.handle(obj_a, obj_b); assert_eq!(true, res) // assert_eq!(obj_a.pos(), expected_a.pos()); // assert_eq!(obj_a.vel(), expected_a.vel()); // assert_eq!(obj_b.pos(), expected_b.pos()); // assert_eq!(obj_b.vel(), expected_b.vel()); } fn create_game_obj( id: u16, vel: Vector, orientation: Vector, is_static: bool, ) -> Rc>> { Rc::new(RefCell::new(Box::new(DefaultGameObject::new( id, "obj".to_string(), Box::new(DefaultGeomComp::new(Shape::rect( Vector::zero(), orientation, 20., 20., ))), Box::new(DefaultPhysicsComp::new(vel, is_static)), )))) }