truecalc-core 3.2.0

Formula engine with exact Google Sheets semantics — stateless, embeddable evaluator
Documentation
use super::*;

#[test]
fn parse_relative() {
    let a = CellAddr::parse("A1").unwrap();
    assert_eq!(a, CellAddr::new(1, 1));
    assert!(!a.col_abs);
    assert!(!a.row_abs);
}

#[test]
fn parse_col_absolute() {
    let a = CellAddr::parse("$A1").unwrap();
    assert_eq!(a, CellAddr::new(1, 1).with_col_abs(true));
}

#[test]
fn parse_row_absolute() {
    let a = CellAddr::parse("A$1").unwrap();
    assert_eq!(a, CellAddr::new(1, 1).with_row_abs(true));
}

#[test]
fn parse_both_absolute() {
    let a = CellAddr::parse("$A$1").unwrap();
    assert_eq!(a, CellAddr::new(1, 1).with_col_abs(true).with_row_abs(true));
}

#[test]
fn display_round_trips_all_four_combinations() {
    for (text, col_abs, row_abs) in [
        ("A1", false, false),
        ("$A1", true, false),
        ("A$1", false, true),
        ("$A$1", true, true),
    ] {
        let a = CellAddr::parse(text).unwrap_or_else(|| panic!("{text} should parse"));
        assert_eq!(a.col_abs, col_abs, "{text} col_abs");
        assert_eq!(a.row_abs, row_abs, "{text} row_abs");
        assert_eq!(a.to_string(), text, "{text} display round-trip");
    }
}

#[test]
fn parse_rejects_malformed_dollar_shapes() {
    for text in ["$", "$$A1", "$1A", "A$$1", "$A$", "A$"] {
        assert!(CellAddr::parse(text).is_none(), "{text:?} should not parse");
    }
}

#[test]
fn parse_still_rejects_row_zero_and_non_addresses() {
    for text in ["", "A", "1", "A0", "$A0", "A$0", "1A", "A1B", "A 1", "A1.5"] {
        assert!(CellAddr::parse(text).is_none(), "{text:?} should not parse");
    }
}

#[test]
fn relative_display_strips_dollar_anchors() {
    let r = Ref::Cell {
        sheet: Some("Data".to_string()),
        addr: CellAddr::new(1, 1).with_col_abs(true).with_row_abs(true),
    };
    assert_eq!(r.relative_display(), "Data!A1");
    assert_eq!(r.to_string(), "Data!$A$1");
}

#[test]
fn relative_display_range_strips_dollar_anchors_per_corner() {
    let r = Ref::Range {
        sheet: None,
        start: CellAddr::new(1, 1).with_col_abs(true),
        end: CellAddr::new(4, 4).with_row_abs(true),
    };
    assert_eq!(r.relative_display(), "A1:D4");
    assert_eq!(r.to_string(), "$A1:D$4");
}

#[test]
fn relative_display_name_is_unchanged() {
    assert_eq!(Ref::Name("TAX_RATE".to_string()).relative_display(), "TAX_RATE");
}