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::{Notation, Picture, analyse, analyse_with};
6    use rt::edit::*;
7    use syntax::ast::CurrencySign;
8
9    fn currency(p: &Picture) -> &str {
10        p.currency.as_deref().unwrap_or_default()
11    }
12
13    fn edit(pic: &str, value: i128) -> String {
14        let p = analyse(pic).unwrap();
15        numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, '.', currency(&p))
16    }
17
18    #[test]
19    fn zero_suppression_and_insertion() {
20        assert_eq!(edit("ZZ,ZZ9", 1234), " 1,234");
21        assert_eq!(edit("ZZ,ZZ9", 5), "     5");
22        assert_eq!(edit("ZZZ", 0), "   ");
23        assert_eq!(edit("ZZ9.99", 505), "  5.05");
24        assert_eq!(edit("ZZ.ZZ", 0), "     ");
25        assert_eq!(edit("99/99/99", 270926), "27/09/26");
26        assert_eq!(edit("999B999", 123456), "123 456");
27    }
28
29    #[test]
30    fn check_protection() {
31        assert_eq!(edit("**,**9.99", 1234), "****12.34");
32        assert_eq!(edit("***", 0), "***");
33        assert_eq!(edit("**.**", 0), "**.**");
34    }
35
36    #[test]
37    fn floating_currency_and_signs() {
38        assert_eq!(edit("$$,$$9.99", 123450), "$1,234.50");
39        assert_eq!(edit("$$,$$9.99", 550), "    $5.50");
40        assert_eq!(edit("----9", -42), "  -42");
41        assert_eq!(edit("----9", 42), "   42");
42        assert_eq!(edit("++++9", 42), "  +42");
43    }
44
45    #[test]
46    fn fixed_signs_cr_and_db() {
47        assert_eq!(edit("-ZZ9", -7), "-  7");
48        assert_eq!(edit("+ZZ9", 7), "+  7");
49        assert_eq!(edit("ZZ9-", -7), "  7-");
50        assert_eq!(edit("ZZ9CR", -7), "  7CR");
51        assert_eq!(edit("ZZ9DB", 7), "  7  ");
52        assert_eq!(edit("$ZZ9.99", 1999), "$ 19.99");
53    }
54
55    #[test]
56    fn blank_when_zero() {
57        let p = analyse("999.99").unwrap();
58        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, true, '.', currency(&p)), "      ");
59    }
60
61    #[test]
62    fn de_editing_recovers_the_value() {
63        for (pic, v) in [("$$,$$9.99CR", -123450i128), ("ZZ9-", -7), ("ZZ,ZZ9", 1234)] {
64            let p = analyse(pic).unwrap();
65            let text = numeric(p.edit.as_ref().unwrap(), p.digits, v < 0, v.unsigned_abs(), false, '.', currency(&p));
66            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text, currency(&p)), (v < 0, v.unsigned_abs()), "{pic} {text:?}");
67        }
68    }
69
70    #[test]
71    fn under_decimal_point_is_comma_a_comma_shows_the_point_and_de_editing_still_recovers_the_value() {
72        let edit = |pic: &str, value: i128| {
73            let p = analyse_with(pic, Notation { decimal_comma: true, currency: &[] }).unwrap();
74            let text = numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, ',', currency(&p));
75            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text, currency(&p)), (value < 0, value.unsigned_abs()), "{pic} {text:?}");
76            text
77        };
78        assert_eq!(edit("Z.ZZ9,99-", -123450), "1.234,50-");
79        assert_eq!(edit("$$.$$9,99", 550), "    $5,50");
80        assert_eq!(edit("***.**9,99", 1234), "*****12,34");
81        assert_eq!(edit("99.999", 12345), "12.345");
82    }
83
84    #[test]
85    fn insertion_outside_a_suppression_string_is_always_inserted_and_check_protection_covers_cr() {
86        assert_eq!(edit("$0(10)999", 492), "$0000000000492");
87        assert_eq!(edit("0ZZ9", 5), "0  5");
88        assert_eq!(edit("ZZ0Z9", 5), "    5");
89        let p = analyse("$**.**CR").unwrap();
90        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, false, '.', currency(&p)), "$**.****".replace('$', "*"));
91    }
92
93    #[test]
94    fn a_currency_sign_value_fills_the_first_currency_position_fixed_or_floating() {
95        let signs = [CurrencySign { value: "W".into(), symbol: 'W', hex: None }, CurrencySign { value: "EUR ".into(), symbol: 'U', hex: None }];
96        let edit = |pic: &str, value: i128| {
97            let p = analyse_with(pic, Notation { decimal_comma: true, currency: &signs }).unwrap();
98            let text = numeric(p.edit.as_ref().unwrap(), p.digits, value < 0, value.unsigned_abs(), false, ',', currency(&p));
99            assert_eq!(text.chars().count(), p.size as usize, "{pic} {text:?}");
100            assert_eq!(de_edit(p.edit.as_ref().unwrap(), &text, currency(&p)), (value < 0, value.unsigned_abs()), "{pic} {text:?}");
101            text
102        };
103        assert_eq!(edit("W9999", 1234), "W1234");
104        assert_eq!(edit("WWWWW", 12), "  W12");
105        assert_eq!(edit("U9.999,99", 123456), "EUR 1.234,56");
106        assert_eq!(edit("UUUU9,99-", -550), "   EUR 5,50-");
107        assert_eq!(edit("UUUU9,99", 123456), "EUR 1234,56");
108        let p = analyse_with("U**9", Notation { decimal_comma: false, currency: &signs }).unwrap();
109        assert_eq!(numeric(p.edit.as_ref().unwrap(), p.digits, false, 0, false, '.', currency(&p)), "EUR **0");
110    }
111
112    #[test]
113    fn alphanumeric_editing() {
114        let p = analyse("XXBXX/X").unwrap();
115        let out = alphanumeric(p.edit.as_ref().unwrap(), b"ABCDE", b' ', |c| c as u8);
116        assert_eq!(out, b"AB CD/E");
117    }
118}