#![cfg_attr(not(feature = "std"), no_std)]
#![warn(missing_docs)]
#![warn(clippy::std_instead_of_core)]
#![warn(clippy::print_stderr)]
#![warn(clippy::print_stdout)]
mod date;
mod error;
mod numeral;
pub use date::Kalendarium;
pub use error::OutOfRangeError;
pub use numeral::RomanNumeral;
pub const MIN: u32 = 0;
pub const MAX: u32 = 4_999_999;
pub type Result<T, E = OutOfRangeError> = core::result::Result<T, E>;
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_roman_numeral_new() {
assert_eq!(RomanNumeral::new(0), Ok(RomanNumeral(0_u32)));
assert_eq!(RomanNumeral::new(1), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::new(1_u8.into()), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::new(1_u32), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::new(42), Ok(RomanNumeral(42_u32)));
assert_eq!(RomanNumeral::new(616), Ok(RomanNumeral(616_u32)));
assert_eq!(RomanNumeral::new(49_999), Ok(RomanNumeral(49_999_u32)));
assert_eq!(RomanNumeral::new(99_999), Ok(RomanNumeral(99_999_u32)));
assert_eq!(RomanNumeral::new(999_999), Ok(RomanNumeral(999_999_u32)));
assert_eq!(RomanNumeral::new(MAX), Ok(RomanNumeral(4_999_999_u32)));
assert!(matches!(RomanNumeral::new(5_000_000), Err(OutOfRangeError)));
assert!(matches!(RomanNumeral::new(u32::MAX), Err(OutOfRangeError)));
}
#[test]
fn test_try_from_one() {
assert_eq!(RomanNumeral::try_from(1_u8), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_u16), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_u32), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_u64), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_u128), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_usize), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_i8), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_i16), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_i32), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_i64), Ok(RomanNumeral(1_u32)));
assert_eq!(RomanNumeral::try_from(1_i128), Ok(RomanNumeral(1_u32)));
}
#[test]
fn test_roman_numeral_to_string() {
assert_eq!(RomanNumeral::new(0).unwrap().to_string(), "N");
assert_eq!(RomanNumeral::new(1).unwrap().to_string(), "I");
assert_eq!(RomanNumeral::new(616).unwrap().to_string(), "DCXVI");
assert_eq!(RomanNumeral::new(1984).unwrap().to_string(), "MCMLXXXIV");
}
#[test]
fn test_kalendarium_dates() {
let kal: Kalendarium = Kalendarium::new("2025", "5", "24").unwrap();
assert_eq!(kal.roman_year(), "MMDCCLXXVIII a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Sāturnī");
assert_eq!(kal.roman_day(), "ante diem IX Kal. Iun.");
assert_eq!(
kal.to_str(),
"ante diem IX Kal. Iun. MMDCCLXXVIII a.u.c. diēs Sāturnī"
);
let kal: Kalendarium = Kalendarium::new("1977", "5", "25").unwrap();
assert_eq!(kal.roman_year(), "MMDCCXXX a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Mercuriī");
assert_eq!(kal.roman_day(), "ante diem VIII Kal. Iun.");
assert_eq!(
kal.to_str(),
"ante diem VIII Kal. Iun. MMDCCXXX a.u.c. diēs Mercuriī"
);
let kal: Kalendarium = Kalendarium::new("1776", "7", "4").unwrap();
assert_eq!(kal.roman_year(), "MMDXXIX a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Iovis");
assert_eq!(kal.roman_day(), "ante diem IV Nōn. Iul.");
assert_eq!(
kal.to_str(),
"ante diem IV Nōn. Iul. MMDXXIX a.u.c. diēs Iovis"
);
let kal: Kalendarium = Kalendarium::new("1453", "5", "29").unwrap();
assert_eq!(kal.roman_year(), "MMCCVI a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Mārtis");
assert_eq!(kal.roman_day(), "ante diem IV Kal. Iun.");
assert_eq!(
kal.to_str(),
"ante diem IV Kal. Iun. MMCCVI a.u.c. diēs Mārtis"
);
let kal: Kalendarium = Kalendarium::new("1066", "10", "14").unwrap();
assert_eq!(kal.roman_year(), "MDCCCXIX a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Sāturnī");
assert_eq!(kal.roman_day(), "prīdiē Īdūs Octobrās");
assert_eq!(
kal.to_str(),
"prīdiē Īdūs Octobrās MDCCCXIX a.u.c. diēs Sāturnī"
);
let kal: Kalendarium = Kalendarium::new("1000", "2", "25").unwrap();
assert_eq!(kal.roman_year(), "MDCCLIII a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Sōlis");
assert_eq!(kal.roman_day(), "ante diem bis VI Kal. Mart.");
assert_eq!(
kal.to_str(),
"ante diem bis VI Kal. Mart. MDCCLIII a.u.c. diēs Sōlis"
);
let kal: Kalendarium = Kalendarium::new("800", "12", "25").unwrap();
assert_eq!(kal.roman_year(), "MDLIII a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Veneris");
assert_eq!(kal.roman_day(), "ante diem bis VI Kal. Mart.");
assert_eq!(kal.roman_festival_day(), "Dīēs Nātālis Sōlis Invictī ");
assert_eq!(
kal.to_str(),
"ante diem bis VI Kal. Mart. MDLIII a.u.c. Dīēs Nātālis Sōlis Invictī diēs Veneris"
);
let kal: Kalendarium = Kalendarium::new("1", "1", "1").unwrap();
assert_eq!(kal.roman_year(), "DCCLIV a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Sāturnī");
assert_eq!(kal.roman_day(), "Kalendae Iānuāriae");
assert_eq!(
kal.to_str(),
"Kalendae Iānuāriae DCCLIV a.u.c. diēs Sāturnī"
);
let kal: Kalendarium = Kalendarium::new("-1", "12", "31").unwrap();
assert_eq!(kal.roman_year(), "DCCLIII a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Veneris");
assert_eq!(kal.roman_day(), "prīdiē Kalendae Iānuāriās");
assert_eq!(
kal.to_str(),
"prīdiē Kalendae Iānuāriās DCCLIII a.u.c. diēs Veneris"
);
let kal: Kalendarium = Kalendarium::new("-43", "03", "15").unwrap();
assert_eq!(kal.roman_year(), "DCCXI a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Iovis");
assert_eq!(kal.roman_day(), "Īdūs Mārtiae");
assert_eq!(kal.to_str(), "Īdūs Mārtiae DCCXI a.u.c. diēs Iovis");
let kal: Kalendarium = Kalendarium::new("-753", "4", "21").unwrap();
assert_eq!(kal.roman_year(), "I a.u.c.");
assert_eq!(kal.roman_day_of_week(), "diēs Lūnae");
assert_eq!(kal.roman_day(), "ante diem XI Kal. Māi.");
assert_eq!(kal.roman_festival_day(), "Parilia ");
assert_eq!(
kal.to_str(),
"ante diem XI Kal. Māi. I a.u.c. Parilia diēs Lūnae"
);
assert!(matches!(
Kalendarium::new("-755", "1", "3"),
Err(OutOfRangeError)
));
}
}