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}