use super::*;
fn rigid_body(position: glam::Vec3, velocity: glam::Vec3) -> boxcars::RigidBody {
boxcars::RigidBody {
sleeping: false,
location: glam_to_vec(&position),
rotation: boxcars::Quaternion {
x: 0.0,
y: 0.0,
z: 0.0,
w: 1.0,
},
linear_velocity: Some(glam_to_vec(&velocity)),
angular_velocity: Some(glam_to_vec(&glam::Vec3::ZERO)),
}
}
fn frame(frame_number: usize) -> FrameInfo {
FrameInfo {
frame_number,
time: frame_number as f32 * 0.1,
dt: 0.1,
seconds_remaining: None,
}
}
fn ball(velocity: glam::Vec3) -> BallFrameState {
BallFrameState::Present(BallSample {
rigid_body: rigid_body(glam::Vec3::new(0.0, 0.0, BALL_RADIUS_Z), velocity),
})
}
fn players(player_id: PlayerId) -> PlayerFrameState {
PlayerFrameState {
players: vec![PlayerSample {
player_id,
is_team_0: true,
rigid_body: Some(rigid_body(
glam::Vec3::new(0.0, 0.0, BALL_RADIUS_Z),
glam::Vec3::ZERO,
)),
boost_amount: None,
last_boost_amount: None,
boost_active: false,
dodge_active: false,
powerslide_active: false,
match_goals: None,
match_assists: None,
match_saves: None,
match_shots: None,
match_score: None,
}],
}
}
#[test]
fn emits_consecutive_same_player_touch_candidates_without_cooldown() {
let player_id = boxcars::RemoteId::Steam(1);
let players = players(player_id.clone());
let mut calculator = TouchStateCalculator::new();
let live_play = LivePlayState {
gameplay_phase: GameplayPhase::ActivePlay,
is_live_play: true,
};
calculator.update(
&frame(0),
&ball(glam::Vec3::ZERO),
&players,
&FrameEventsState::default(),
&live_play,
);
let first_touch = calculator.update(
&frame(1),
&ball(glam::Vec3::new(300.0, 0.0, 0.0)),
&players,
&FrameEventsState::default(),
&live_play,
);
let second_touch = calculator.update(
&frame(2),
&ball(glam::Vec3::new(650.0, 0.0, 0.0)),
&players,
&FrameEventsState::default(),
&live_play,
);
assert_eq!(first_touch.touch_events.len(), 1);
assert_eq!(first_touch.touch_events[0].player, Some(player_id.clone()));
assert_eq!(first_touch.touch_events[0].frame, 1);
assert_eq!(second_touch.touch_events.len(), 1);
assert_eq!(second_touch.touch_events[0].player, Some(player_id.clone()));
assert_eq!(second_touch.touch_events[0].frame, 2);
assert_eq!(second_touch.last_touch_player, Some(player_id));
}