ironwork-exec 0.1.2

ironwork for COBOL: storage layout and an interpreter over EBCDIC storage
Documentation
pub use rt::edit::{alphanumeric, de_edit, numeric};

#[cfg(test)]
mod tests {
    use crate::picture::analyse;
    use rt::edit::*;

    fn edit(pic: &str, value: i128) -> String {
        let p = analyse(pic).unwrap();
        numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, '.')
    }

    #[test]
    fn zero_suppression_and_insertion() {
        assert_eq!(edit("ZZ,ZZ9", 1234), " 1,234");
        assert_eq!(edit("ZZ,ZZ9", 5), "     5");
        assert_eq!(edit("ZZZ", 0), "   ");
        assert_eq!(edit("ZZ9.99", 505), "  5.05");
        assert_eq!(edit("ZZ.ZZ", 0), "     ");
        assert_eq!(edit("99/99/99", 270926), "27/09/26");
        assert_eq!(edit("999B999", 123456), "123 456");
    }

    #[test]
    fn check_protection() {
        assert_eq!(edit("**,**9.99", 1234), "****12.34");
        assert_eq!(edit("***", 0), "***");
        assert_eq!(edit("**.**", 0), "**.**");
    }

    #[test]
    fn floating_currency_and_signs() {
        assert_eq!(edit("$$,$$9.99", 123450), "$1,234.50");
        assert_eq!(edit("$$,$$9.99", 550), "    $5.50");
        assert_eq!(edit("----9", -42), "  -42");
        assert_eq!(edit("----9", 42), "   42");
        assert_eq!(edit("++++9", 42), "  +42");
    }

    #[test]
    fn fixed_signs_cr_and_db() {
        assert_eq!(edit("-ZZ9", -7), "-  7");
        assert_eq!(edit("+ZZ9", 7), "+  7");
        assert_eq!(edit("ZZ9-", -7), "  7-");
        assert_eq!(edit("ZZ9CR", -7), "  7CR");
        assert_eq!(edit("ZZ9DB", 7), "  7  ");
        assert_eq!(edit("$ZZ9.99", 1999), "$ 19.99");
    }

    #[test]
    fn blank_when_zero() {
        let p = analyse("999.99").unwrap();
        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, true, '.'), "      ");
    }

    #[test]
    fn de_editing_recovers_the_value() {
        for (pic, v) in [("$$,$$9.99CR", -123450i128), ("ZZ9-", -7), ("ZZ,ZZ9", 1234)] {
            let p = analyse(pic).unwrap();
            let text = numeric(p.edit.as_ref().unwrap(), p.digits, v < 0, v.unsigned_abs(), false, '.');
            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text), (v < 0, v.unsigned_abs()), "{pic} {text:?}");
        }
    }

    #[test]
    fn under_decimal_point_is_comma_a_comma_shows_the_point_and_de_editing_still_recovers_the_value() {
        let edit = |pic: &str, value: i128| {
            let p = crate::picture::analyse_with(pic, true).unwrap();
            let text = numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, ',');
            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text), (value < 0, value.unsigned_abs()), "{pic} {text:?}");
            text
        };
        assert_eq!(edit("Z.ZZ9,99-", -123450), "1.234,50-");
        assert_eq!(edit("$$.$$9,99", 550), "    $5,50");
        assert_eq!(edit("***.**9,99", 1234), "*****12,34");
        assert_eq!(edit("99.999", 12345), "12.345");
    }

    #[test]
    fn insertion_outside_a_suppression_string_is_always_inserted_and_check_protection_covers_cr() {
        assert_eq!(edit("$0(10)999", 492), "$0000000000492");
        assert_eq!(edit("0ZZ9", 5), "0  5");
        assert_eq!(edit("ZZ0Z9", 5), "    5");
        let p = analyse("$**.**CR").unwrap();
        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, false, '.'), "$**.****".replace('$', "*"));
    }

    #[test]
    fn alphanumeric_editing() {
        let p = analyse("XXBXX/X").unwrap();
        let out = alphanumeric(p.edit.as_ref().unwrap(), b"ABCDE", b' ', |c| c as u8);
        assert_eq!(out, b"AB CD/E");
    }
}