#![allow(clippy::unwrap_used)]

use crate::constants::{COLUMN_WIDTH_FACTOR, DEFAULT_COLUMN_WIDTH};
use crate::test::util::new_empty_model;
use crate::types::Col;

#[test]
fn test_column_width() {
    let mut model = new_empty_model();
    let cols = vec![Col {
        custom_width: false,
        max: 16384,
        min: 1,
        style: Some(6),
        width: 8.7,
    }];
    model.workbook.worksheets[0].cols = cols;
    model
        .workbook
        .worksheet_mut(0)
        .unwrap()
        .set_column_width(2, 30.0)
        .unwrap();
    assert_eq!(model.workbook.worksheets[0].cols.len(), 3);
    let worksheet = model.workbook.worksheet(0).unwrap();
    assert!((worksheet.get_column_width(1).unwrap() - DEFAULT_COLUMN_WIDTH).abs() < f64::EPSILON);
    assert!((worksheet.get_column_width(2).unwrap() - 30.0).abs() < f64::EPSILON);
    assert!((worksheet.get_column_width(3).unwrap() - DEFAULT_COLUMN_WIDTH).abs() < f64::EPSILON);
    assert_eq!(model.get_cell_style_index(0, 23, 2), Ok(6));
}

#[test]
fn test_column_width_lower_edge() {
    let mut model = new_empty_model();
    let cols = vec![Col {
        custom_width: true,
        max: 16,
        min: 5,
        style: Some(1),
        width: 10.0,
    }];
    model.workbook.worksheets[0].cols = cols;
    model
        .workbook
        .worksheet_mut(0)
        .unwrap()
        .set_column_width(5, 30.0)
        .unwrap();
    assert_eq!(model.workbook.worksheets[0].cols.len(), 2);
    let worksheet = model.workbook.worksheet(0).unwrap();
    assert!((worksheet.get_column_width(4).unwrap() - DEFAULT_COLUMN_WIDTH).abs() < f64::EPSILON);
    assert!((worksheet.get_column_width(5).unwrap() - 30.0).abs() < f64::EPSILON);
    assert!(
        (worksheet.get_column_width(6).unwrap() - 10.0 * COLUMN_WIDTH_FACTOR).abs() < f64::EPSILON
    );
    assert_eq!(model.get_cell_style_index(0, 23, 5), Ok(1));
}

#[test]
fn test_column_width_higher_edge() {
    let mut model = new_empty_model();
    let cols = vec![Col {
        custom_width: true,
        max: 16,
        min: 5,
        style: Some(1),
        width: 10.0,
    }];
    model.workbook.worksheets[0].cols = cols;
    model
        .workbook
        .worksheet_mut(0)
        .unwrap()
        .set_column_width(16, 30.0)
        .unwrap();
    assert_eq!(model.workbook.worksheets[0].cols.len(), 2);
    let worksheet = model.workbook.worksheet(0).unwrap();
    assert!(
        (worksheet.get_column_width(15).unwrap() - 10.0 * COLUMN_WIDTH_FACTOR).abs() < f64::EPSILON
    );
    assert!((worksheet.get_column_width(16).unwrap() - 30.0).abs() < f64::EPSILON);
    assert!((worksheet.get_column_width(17).unwrap() - DEFAULT_COLUMN_WIDTH).abs() < f64::EPSILON);
    assert_eq!(model.get_cell_style_index(0, 23, 16), Ok(1));
}

#[test]
fn test_column_width_negative() {
    let mut model = new_empty_model();
    let result = model
        .workbook
        .worksheet_mut(0)
        .unwrap()
        .set_column_width(16, -1.0);
    assert_eq!(result, Err("Can not set a negative width: -1".to_string()));
    assert_eq!(model.workbook.worksheets[0].cols.len(), 0);
    let worksheet = model.workbook.worksheet(0).unwrap();
    assert_eq!(
        (worksheet.get_column_width(16).unwrap()),
        DEFAULT_COLUMN_WIDTH
    );
    assert_eq!(model.get_cell_style_index(0, 23, 16), Ok(0));
}
