use bevy::prelude::*;
use super::states::TurnPhase;
#[derive(Resource, Debug, Clone, Reflect)]
#[reflect(Resource)]
pub struct GameDate {
pub day: u32,
pub tick: u64,
}
impl GameDate {
pub fn new() -> Self {
Self { day: 1, tick: 0 }
}
pub fn increment_day(&mut self) -> u32 {
self.day += 1;
self.day
}
pub fn tick(&mut self) {
self.tick += 1;
}
pub fn current_day(&self) -> u32 {
self.day
}
}
impl Default for GameDate {
fn default() -> Self {
Self::new()
}
}
#[derive(Resource, Default, Reflect)]
#[reflect(Resource)]
pub struct NextTurnPhase {
reserved: Option<TurnPhase>,
}
impl NextTurnPhase {
pub fn reserve(&mut self, phase: TurnPhase) {
self.reserved = Some(phase);
}
pub fn get(&self) -> Option<TurnPhase> {
self.reserved.clone()
}
pub fn clear(&mut self) {
self.reserved = None;
}
pub fn is_reserved(&self) -> bool {
self.reserved.is_some()
}
}
#[derive(Resource, Clone, Reflect)]
#[reflect(Resource)]
pub struct TimeConfig {
pub initial_day: u32,
}
impl Default for TimeConfig {
fn default() -> Self {
Self { initial_day: 1 }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_game_date_new() {
let date = GameDate::new();
assert_eq!(date.day, 1);
assert_eq!(date.tick, 0);
}
#[test]
fn test_game_date_increment_day() {
let mut date = GameDate::new();
let new_day = date.increment_day();
assert_eq!(new_day, 2);
assert_eq!(date.day, 2);
date.increment_day();
assert_eq!(date.day, 3);
}
#[test]
fn test_game_date_tick() {
let mut date = GameDate::new();
date.tick();
assert_eq!(date.tick, 1);
date.tick();
date.tick();
assert_eq!(date.tick, 3);
}
#[test]
fn test_game_date_current_day() {
let date = GameDate::new();
assert_eq!(date.current_day(), 1);
let mut date = GameDate::new();
date.increment_day();
assert_eq!(date.current_day(), 2);
}
#[test]
fn test_game_date_default() {
let date = GameDate::default();
assert_eq!(date.day, 1);
assert_eq!(date.tick, 0);
}
#[test]
fn test_game_date_independent_day_and_tick() {
let mut date = GameDate::new();
date.tick();
date.tick();
assert_eq!(date.day, 1);
assert_eq!(date.tick, 2);
date.increment_day();
assert_eq!(date.day, 2);
assert_eq!(date.tick, 2);
}
#[test]
fn test_next_turn_phase_default() {
let next_phase = NextTurnPhase::default();
assert!(!next_phase.is_reserved());
assert_eq!(next_phase.get(), None);
}
#[test]
fn test_next_turn_phase_reserve() {
let mut next_phase = NextTurnPhase::default();
next_phase.reserve(TurnPhase::EnemyTurn);
assert!(next_phase.is_reserved());
assert_eq!(next_phase.get(), Some(TurnPhase::EnemyTurn));
}
#[test]
fn test_next_turn_phase_clear() {
let mut next_phase = NextTurnPhase::default();
next_phase.reserve(TurnPhase::Processing);
assert!(next_phase.is_reserved());
next_phase.clear();
assert!(!next_phase.is_reserved());
assert_eq!(next_phase.get(), None);
}
#[test]
fn test_next_turn_phase_overwrite() {
let mut next_phase = NextTurnPhase::default();
next_phase.reserve(TurnPhase::Processing);
assert_eq!(next_phase.get(), Some(TurnPhase::Processing));
next_phase.reserve(TurnPhase::EnemyTurn);
assert_eq!(next_phase.get(), Some(TurnPhase::EnemyTurn));
}
#[test]
fn test_time_config_default() {
let config = TimeConfig::default();
assert_eq!(config.initial_day, 1);
}
#[test]
fn test_time_config_custom() {
let config = TimeConfig { initial_day: 10 };
assert_eq!(config.initial_day, 10);
}
#[test]
fn test_time_config_clone() {
let config1 = TimeConfig { initial_day: 5 };
let config2 = config1.clone();
assert_eq!(config1.initial_day, config2.initial_day);
}
}