dntk 3.1.0

Command line's multi-platform interactive calculator, GNU bc wrapper.
Documentation
use super::{util, Dntker, FilterResult};

fn statement_bytes(d: &Dntker) -> Vec<u8> {
    d.statement_from_utf8().into_bytes()
}

#[test]
fn filter_char_classifies_known_inputs() {
    let d: Dntker = Default::default();
    assert_eq!(
        d.filter_char(util::ASCII_CODE_ONE),
        FilterResult::Calculatable(util::ASCII_CODE_ONE)
    );
    assert_eq!(
        d.filter_char(util::ASCII_CODE_PLUS),
        FilterResult::Calculatable(util::ASCII_CODE_PLUS)
    );
    assert_eq!(
        d.filter_char(util::ASCII_CODE_SQUARELEFT),
        FilterResult::CurLeft
    );
    assert_eq!(
        d.filter_char(util::ASCII_CODE_SQUARERIGHT),
        FilterResult::CurRight
    );
    assert_eq!(d.filter_char(util::ASCII_CODE_AT), FilterResult::Refresh);
    assert_eq!(d.filter_char(util::ASCII_CODE_ESCAPE), FilterResult::Esc);
    assert_eq!(d.filter_char(util::ASCII_CODE_DELETE), FilterResult::Delete);
    assert_eq!(d.filter_char(0x00), FilterResult::Unknown(0x00));
}

#[test]
fn delete_column_removes_previous_byte() {
    let d1: &mut Dntker = &mut Default::default();
    d1.delete_column();
    assert!(statement_bytes(d1).is_empty());
    assert_eq!(d1.cursor(), 0);

    d1.insert_column(util::ASCII_CODE_ONE);
    d1.insert_column(util::ASCII_CODE_PLUS);
    d1.insert_column(util::ASCII_CODE_TWO);
    d1.cursor_move_left();
    d1.delete_column();

    assert_eq!(
        statement_bytes(d1),
        vec![util::ASCII_CODE_ONE, util::ASCII_CODE_TWO]
    );
    assert_eq!(d1.cursor(), 1);
}

#[test]
fn cursor_movement_bounds_checks() {
    let d: &mut Dntker = &mut Default::default();
    d.cursor_move_left();
    assert_eq!(d.cursor(), 0);

    d.insert_column(util::ASCII_CODE_ONE);
    d.insert_column(util::ASCII_CODE_PLUS);
    d.insert_column(util::ASCII_CODE_TWO);
    assert_eq!(d.cursor(), 3);

    d.cursor_move_left();
    assert_eq!(d.cursor(), 2);

    d.cursor_move_right();
    assert_eq!(d.cursor(), 3);

    d.cursor_move_right();
    assert_eq!(d.cursor(), 3);
}

#[test]
fn insert_column_inserts_at_cursor() {
    let d: &mut Dntker = &mut Default::default();
    d.insert_column(util::ASCII_CODE_ONE);
    d.insert_column(util::ASCII_CODE_TWO);
    assert_eq!(
        statement_bytes(d),
        vec![util::ASCII_CODE_ONE, util::ASCII_CODE_TWO]
    );

    d.cursor_move_left();
    d.insert_column(util::ASCII_CODE_PLUS);
    assert_eq!(
        statement_bytes(d),
        vec![
            util::ASCII_CODE_ONE,
            util::ASCII_CODE_PLUS,
            util::ASCII_CODE_TWO,
        ]
    );
    assert_eq!(d.cursor(), 2);
}

#[test]
fn refresh_resets_prompt_state() {
    let d: &mut Dntker = &mut Default::default();
    d.insert_column(util::ASCII_CODE_ONE);
    d.insert_column(util::ASCII_CODE_PLUS);
    std::env::set_var("DNTK_ENV", "TEST");
    d.refresh();

    assert!(statement_bytes(d).is_empty());
    assert_eq!(d.cursor(), 0);
    std::env::remove_var("DNTK_ENV");
}