libitofin 0.52.1

A ground-up Rust port of QuantLib: quantitative-finance primitives for pricing, risk, and numerical methods.
Documentation
use super::*;
use crate::time::calendars::nullcalendar::NullCalendar;
use crate::time::calendars::weekendsonly::WeekendsOnly;

#[test]
fn extreme_periods_fail_without_entering_panicking_date_arithmetic() {
    let calendar = NullCalendar::new();
    for unit in [TimeUnit::Weeks, TimeUnit::Months, TimeUnit::Years] {
        for length in [i32::MIN, i32::MAX] {
            assert!(
                advance(
                    &calendar,
                    Date::min_date(),
                    Period::new(length, unit),
                    Bdc::Unadjusted,
                    false
                )
                .is_err()
            );
        }
    }
    assert!(
        advance(
            &calendar,
            Date::max_date(),
            Period::new(1, TimeUnit::Days),
            Bdc::Unadjusted,
            false
        )
        .is_err()
    );
    assert!(
        advance(
            &calendar,
            Date::min_date(),
            Period::new(-1, TimeUnit::Days),
            Bdc::Unadjusted,
            false
        )
        .is_err()
    );
}
#[test]
fn checked_month_end_matches_native_calendar() {
    let calendar = WeekendsOnly::new();
    for date in [
        Date::new(31, crate::time::date::Month::January, 2025),
        Date::new(30, crate::time::date::Month::May, 2025),
    ] {
        for roll in [Bdc::Following, Bdc::Unadjusted] {
            for length in [-2, -1, 0, 1, 2] {
                assert_eq!(
                    advance(
                        &calendar,
                        date,
                        Period::new(length, TimeUnit::Months),
                        roll,
                        true
                    )
                    .unwrap(),
                    calendar.advance(date, length, TimeUnit::Months, roll, true)
                );
            }
        }
    }
}

#[test]
fn ordinary_checked_date_operations_match_calendar() {
    let calendar = WeekendsOnly::new();
    let date = Date::from_serial(45823);
    for units in [
        TimeUnit::Days,
        TimeUnit::Weeks,
        TimeUnit::Months,
        TimeUnit::Years,
    ] {
        for amount in [-2, -1, 0, 1, 2] {
            for roll in [
                Bdc::Following,
                Bdc::Preceding,
                Bdc::Unadjusted,
                Bdc::ModifiedFollowing,
            ] {
                assert_eq!(
                    advance(&calendar, date, Period::new(amount, units), roll, false).unwrap(),
                    calendar.advance(date, amount, units, roll, false)
                );
            }
        }
    }
}