#![allow(clippy::panic)]

use std::collections::HashMap;

use crate::expressions::parser::stringify::to_string;
use crate::expressions::parser::Parser;
use crate::expressions::types::CellReferenceRC;

#[test]
fn exp_order() {
    let worksheets = vec!["Sheet1".to_string()];
    let mut parser = Parser::new(worksheets, vec![], HashMap::new());

    // Reference cell is Sheet1!A1
    let cell_reference = CellReferenceRC {
        sheet: "Sheet1".to_string(),
        row: 1,
        column: 1,
    };
    let t = parser.parse("(1 + 2)^3  + 4", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "(1+2)^3+4");

    let t = parser.parse("(C5 + 3)^R4", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "(C5+3)^R4");

    let t = parser.parse("(C5 + 3)^(R4*6)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "(C5+3)^(R4*6)");

    let t = parser.parse("(C5)^(R4)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "C5^R4");

    let t = parser.parse("(5)^(4)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "5^4");
}

#[test]
fn correct_parenthesis() {
    let worksheets = vec!["Sheet1".to_string()];
    let mut parser = Parser::new(worksheets, vec![], HashMap::new());

    let cell_reference = CellReferenceRC {
        sheet: "Sheet1".to_string(),
        row: 1,
        column: 1,
    };

    let t = parser.parse("-(1 + 1)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "-(1+1)");

    let t = parser.parse("1 - (3 + 4)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "1-(3+4)");

    let t = parser.parse("-(1.05*(0.0284 + 0.0046) - 0.0284)", &cell_reference);
    assert_eq!(
        to_string(&t, &cell_reference),
        "-(1.05*(0.0284+0.0046)-0.0284)"
    );

    let t = parser.parse("1 + (3+5)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "1+3+5");

    let t = parser.parse("1 - (3+5)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "1-(3+5)");

    let t = parser.parse("(1 - 3) - (3+5)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "1-3-(3+5)");

    let t = parser.parse("1 + (3<5)", &cell_reference);
    assert_eq!(to_string(&t, &cell_reference), "1+(3<5)");
}
