Skip to main content

ironwork_exec/
edit.rs

1pub use rt::edit::{alphanumeric, de_edit, numeric};
2
3#[cfg(test)]
4mod tests {
5    use crate::picture::analyse;
6    use rt::edit::*;
7
8    fn edit(pic: &str, value: i128) -> String {
9        let p = analyse(pic).unwrap();
10        numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, '.')
11    }
12
13    #[test]
14    fn zero_suppression_and_insertion() {
15        assert_eq!(edit("ZZ,ZZ9", 1234), " 1,234");
16        assert_eq!(edit("ZZ,ZZ9", 5), "     5");
17        assert_eq!(edit("ZZZ", 0), "   ");
18        assert_eq!(edit("ZZ9.99", 505), "  5.05");
19        assert_eq!(edit("ZZ.ZZ", 0), "     ");
20        assert_eq!(edit("99/99/99", 270926), "27/09/26");
21        assert_eq!(edit("999B999", 123456), "123 456");
22    }
23
24    #[test]
25    fn check_protection() {
26        assert_eq!(edit("**,**9.99", 1234), "****12.34");
27        assert_eq!(edit("***", 0), "***");
28        assert_eq!(edit("**.**", 0), "**.**");
29    }
30
31    #[test]
32    fn floating_currency_and_signs() {
33        assert_eq!(edit("$$,$$9.99", 123450), "$1,234.50");
34        assert_eq!(edit("$$,$$9.99", 550), "    $5.50");
35        assert_eq!(edit("----9", -42), "  -42");
36        assert_eq!(edit("----9", 42), "   42");
37        assert_eq!(edit("++++9", 42), "  +42");
38    }
39
40    #[test]
41    fn fixed_signs_cr_and_db() {
42        assert_eq!(edit("-ZZ9", -7), "-  7");
43        assert_eq!(edit("+ZZ9", 7), "+  7");
44        assert_eq!(edit("ZZ9-", -7), "  7-");
45        assert_eq!(edit("ZZ9CR", -7), "  7CR");
46        assert_eq!(edit("ZZ9DB", 7), "  7  ");
47        assert_eq!(edit("$ZZ9.99", 1999), "$ 19.99");
48    }
49
50    #[test]
51    fn blank_when_zero() {
52        let p = analyse("999.99").unwrap();
53        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, true, '.'), "      ");
54    }
55
56    #[test]
57    fn de_editing_recovers_the_value() {
58        for (pic, v) in [("$$,$$9.99CR", -123450i128), ("ZZ9-", -7), ("ZZ,ZZ9", 1234)] {
59            let p = analyse(pic).unwrap();
60            let text = numeric(p.edit.as_ref().unwrap(), p.digits, v < 0, v.unsigned_abs(), false, '.');
61            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text), (v < 0, v.unsigned_abs()), "{pic} {text:?}");
62        }
63    }
64
65    #[test]
66    fn under_decimal_point_is_comma_a_comma_shows_the_point_and_de_editing_still_recovers_the_value() {
67        let edit = |pic: &str, value: i128| {
68            let p = crate::picture::analyse_with(pic, true).unwrap();
69            let text = numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, ',');
70            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text), (value < 0, value.unsigned_abs()), "{pic} {text:?}");
71            text
72        };
73        assert_eq!(edit("Z.ZZ9,99-", -123450), "1.234,50-");
74        assert_eq!(edit("$$.$$9,99", 550), "    $5,50");
75        assert_eq!(edit("***.**9,99", 1234), "*****12,34");
76        assert_eq!(edit("99.999", 12345), "12.345");
77    }
78
79    #[test]
80    fn insertion_outside_a_suppression_string_is_always_inserted_and_check_protection_covers_cr() {
81        assert_eq!(edit("$0(10)999", 492), "$0000000000492");
82        assert_eq!(edit("0ZZ9", 5), "0  5");
83        assert_eq!(edit("ZZ0Z9", 5), "    5");
84        let p = analyse("$**.**CR").unwrap();
85        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, false, '.'), "$**.****".replace('$', "*"));
86    }
87
88    #[test]
89    fn alphanumeric_editing() {
90        let p = analyse("XXBXX/X").unwrap();
91        let out = alphanumeric(p.edit.as_ref().unwrap(), b"ABCDE", b' ', |c| c as u8);
92        assert_eq!(out, b"AB CD/E");
93    }
94}