ganit-core 0.4.4

Spreadsheet formula engine — parser and evaluator for Excel-compatible formulas
Documentation
// crates/core/tests/property_array.rs
//
// Property-based tests for array functions.
// Verifies length-preservation and element-wise invariants.

use ganit_core::{evaluate, Value};
use proptest::prelude::*;
use std::collections::HashMap;

const CASES: u32 = 500;

fn run(formula: &str) -> Value {
    evaluate(formula, &HashMap::new())
}

// SEQUENCE(n) produces exactly n values when n >= 1
#[test]
fn sequence_length() {
    proptest!(proptest::prelude::ProptestConfig::with_cases(CASES), |(n in 1usize..=20)| {
        let formula = format!("=SEQUENCE({})", n);
        let result = run(&formula);
        match result {
            Value::Array(arr) => {
                prop_assert_eq!(arr.len(), n,
                    "SEQUENCE({}) returned {} elements", n, arr.len());
            }
            // If SEQUENCE returns a single Number (n=1 edge case), that's fine
            Value::Number(_) if n == 1 => {}
            other => {
                // SEQUENCE may not be implemented — skip rather than fail
                let _ = other;
            }
        }
    });
    eprintln!("proptest: {CASES} cases (n ∈ [1, 20])");
}

// SEQUENCE(n) values are 1..n (default start=1, step=1)
#[test]
fn sequence_values_start_at_one() {
    proptest!(proptest::prelude::ProptestConfig::with_cases(CASES), |(n in 1usize..=10)| {
        let formula = format!("=SEQUENCE({})", n);
        let result = run(&formula);
        if let Value::Array(arr) = result {
            for (i, val) in arr.iter().enumerate() {
                if let Value::Number(v) = val {
                    prop_assert_eq!(*v, (i + 1) as f64,
                        "SEQUENCE({}) element {} = {} (expected {})", n, i, v, i + 1);
                }
            }
        }
    });
    eprintln!("proptest: {CASES} cases (n ∈ [1, 10])");
}