icydb-schema 0.300.0

Bounded public schema proposal contract for IcyDB
Documentation
use super::SourceRuleOperation;
use crate::{ScalarLiteral, SchemaContractError};

#[test]
fn source_rule_operation_rejects_reversed_and_mixed_ranges() {
    assert_eq!(
        SourceRuleOperation::LengthRangeInclusive { min: 2, max: 1 }.validate(),
        Err(SchemaContractError::InvalidRuleOperation),
    );
    assert_eq!(
        SourceRuleOperation::NumericRangeInclusive {
            min: ScalarLiteral::Nat(2),
            max: ScalarLiteral::Nat(1),
        }
        .validate(),
        Err(SchemaContractError::InvalidRuleOperation),
    );
    assert_eq!(
        SourceRuleOperation::NumericRangeInclusive {
            min: ScalarLiteral::Int(0),
            max: ScalarLiteral::Nat(1),
        }
        .validate(),
        Err(SchemaContractError::InvalidRuleOperation),
    );
}

#[test]
fn source_rule_operation_accepts_ordered_exact_ranges() {
    assert!(
        SourceRuleOperation::LengthRangeInclusive { min: 1, max: 2 }
            .validate()
            .is_ok()
    );
    assert!(
        SourceRuleOperation::NumericRangeInclusive {
            min: ScalarLiteral::Int(-1),
            max: ScalarLiteral::Int(1),
        }
        .validate()
        .is_ok()
    );
}

#[test]
fn source_rule_operation_accepts_exact_nonzero_multiple_and_maximum() {
    assert!(
        SourceRuleOperation::NumericMaximumInclusive {
            value: ScalarLiteral::Nat(10),
        }
        .validate()
        .is_ok()
    );
    assert!(
        SourceRuleOperation::MultipleOf {
            divisor: ScalarLiteral::Int(-5),
        }
        .validate()
        .is_ok()
    );
}

#[test]
fn source_rule_operation_rejects_zero_and_float_multiple() {
    for divisor in [
        ScalarLiteral::Nat(0),
        ScalarLiteral::Float64(crate::Float64::try_new(1.0).expect("finite float")),
    ] {
        assert_eq!(
            SourceRuleOperation::MultipleOf { divisor }.validate(),
            Err(SchemaContractError::InvalidRuleOperation),
        );
    }
}