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}