use revue::style::Color;
use revue::widget::data::calendar::{Date, first_day_of_month, days_in_month};
use revue::widget::data::calendar::render::CalendarRender;
use revue::widget::data::calendar::types::{DateMarker, FirstDayOfWeek};
fn create_test_render(year: i32, month: u32, first_day: FirstDayOfWeek) -> CalendarRender<'static> {
CalendarRender {
year,
month,
selected: None,
range_end: None,
first_day,
show_week_numbers: false,
markers: &[],
today: None,
header_fg: Color::BLACK,
header_bg: None,
day_fg: Color::BLACK,
weekend_fg: Color::BLACK,
selected_fg: Color::BLACK,
selected_bg: Color::BLACK,
today_fg: Color::BLACK,
outside_fg: Color::BLACK,
border_color: None,
focused: false,
}
}
#[test]
fn test_is_in_range_no_selection() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
let date = Date::new(2024, 1, 15);
assert!(!render.is_in_range(&date));
}
#[test]
fn test_is_in_range_with_range() {
let render = CalendarRender {
selected: Some(Date::new(2024, 1, 10)),
range_end: Some(Date::new(2024, 1, 20)),
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let date = Date::new(2024, 1, 15);
assert!(render.is_in_range(&date));
}
#[test]
fn test_is_in_range_before_start() {
let render = CalendarRender {
selected: Some(Date::new(2024, 1, 10)),
range_end: Some(Date::new(2024, 1, 20)),
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let date = Date::new(2024, 1, 5);
assert!(!render.is_in_range(&date));
}
#[test]
fn test_is_in_range_after_end() {
let render = CalendarRender {
selected: Some(Date::new(2024, 1, 10)),
range_end: Some(Date::new(2024, 1, 20)),
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let date = Date::new(2024, 1, 25);
assert!(!render.is_in_range(&date));
}
#[test]
fn test_is_in_range_reversed() {
let render = CalendarRender {
selected: Some(Date::new(2024, 1, 20)),
range_end: Some(Date::new(2024, 1, 10)),
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let date = Date::new(2024, 1, 15);
assert!(render.is_in_range(&date));
}
#[test]
fn test_is_in_range_equal_dates() {
let render = CalendarRender {
selected: Some(Date::new(2024, 1, 15)),
range_end: Some(Date::new(2024, 1, 15)),
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let date = Date::new(2024, 1, 15);
assert!(render.is_in_range(&date));
}
#[test]
fn test_get_marker_found() {
let date = Date::new(2024, 1, 15);
let marker = DateMarker::new(date, Color::RED);
let render = CalendarRender {
markers: std::vec![marker],
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let result = render.get_marker(&date);
assert!(result.is_some());
}
#[test]
fn test_get_marker_not_found() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
let date = Date::new(2024, 1, 15);
assert!(render.get_marker(&date).is_none());
}
#[test]
fn test_get_marker_multiple_markers() {
let date1 = Date::new(2024, 1, 15);
let date2 = Date::new(2024, 1, 20);
let marker1 = DateMarker::new(date1, Color::RED);
let marker2 = DateMarker::new(date2, Color::BLUE);
let render = CalendarRender {
markers: vec![marker1, marker2].leak(),
..create_test_render(2024, 1, FirstDayOfWeek::Sunday)
};
let result1 = render.get_marker(&date1);
assert!(result1.is_some());
assert_eq!(result1.unwrap().color, Color::RED);
let result2 = render.get_marker(&date2);
assert!(result2.is_some());
assert_eq!(result2.unwrap().color, Color::BLUE);
}
#[test]
fn test_day_names_sunday_first() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
let names = render.day_names();
assert_eq!(names[0], "Su");
assert_eq!(names[6], "Sa");
}
#[test]
fn test_day_names_monday_first() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Monday);
let names = render.day_names();
assert_eq!(names[0], "Mo");
assert_eq!(names[6], "Su");
}
#[test]
fn test_is_weekend_sunday_first_sunday() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
assert!(render.is_weekend(0)); assert!(render.is_weekend(6)); }
#[test]
fn test_is_weekend_sunday_first_weekday() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
assert!(!render.is_weekend(1)); assert!(!render.is_weekend(2)); }
#[test]
fn test_is_weekend_monday_first_saturday() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Monday);
assert!(render.is_weekend(5)); assert!(render.is_weekend(6)); }
#[test]
fn test_is_weekend_monday_first_weekday() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Monday);
assert!(!render.is_weekend(0)); assert!(!render.is_weekend(4)); }
#[test]
fn test_get_week_number_january_1_2024() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
assert_eq!(render.get_week_number(2024, 1, 1), 1);
}
#[test]
fn test_get_week_number_february_2024() {
let render = create_test_render(2024, 2, FirstDayOfWeek::Sunday);
let week = render.get_week_number(2024, 2, 1);
assert!(week >= 1 && week <= 53);
}
#[test]
fn test_get_week_number_range() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
for day in 1..31 {
let week = render.get_week_number(2024, 1, day);
assert!(week >= 1 && week <= 53);
}
}
#[test]
fn test_get_week_number_december_2024() {
let render = create_test_render(2024, 12, FirstDayOfWeek::Sunday);
let week = render.get_week_number(2024, 12, 31);
assert!(week >= 1 && week <= 53);
}
#[test]
fn test_get_week_number_leap_year() {
let render = create_test_render(2024, 2, FirstDayOfWeek::Sunday);
let week = render.get_week_number(2024, 2, 29);
assert!(week >= 1 && week <= 53);
}
#[test]
fn test_get_week_number_year_boundary() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
let week = render.get_week_number(2023, 12, 31);
assert!(week >= 1 && week <= 53);
}
#[test]
fn test_get_week_number_mid_year() {
let render = create_test_render(2024, 6, FirstDayOfWeek::Sunday);
let week = render.get_week_number(2024, 6, 1);
assert!(week >= 20 && week <= 25);
}
#[test]
fn test_get_week_number_consistency() {
let render = create_test_render(2024, 1, FirstDayOfWeek::Sunday);
let week1 = render.get_week_number(2024, 1, 1);
let week2 = render.get_week_number(2024, 1, 7);
assert_eq!(week1, week2);
}
trait Leak {
fn leak(self) -> &'static [Self::Item] where Self: Sized;
}
impl<T> Leak for Vec<T> {
fn leak(self) -> &'static [T] {
Box::leak(self.into_boxed_slice())
}
}