mirror of
https://github.com/storytold/cadcraft.git
synced 2026-10-24 10:56:51 -06:00
Drop minus sign from dimension text that rounds to zero (#1403)
Found while testing crates/render/src/units.rs:139-160 (format_linear, unit 3 and 4 arms) and feet_inches at :101 Co-authored-by: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Haiku 5.5
parent
cd3e8478d6
commit
286d3de0aa
@@ -102,7 +102,8 @@ fn feet_inches(neg: bool, ft: i64, inch_plain: &str, inch_m: &str, inch_zero: bo
|
||||
let mode = zin & 3;
|
||||
let show_ft = ft != 0 || mode == 1 || mode == 2;
|
||||
let show_in = !inch_zero || mode == 1 || mode == 3 || (ft == 0 && !show_ft);
|
||||
let sign = if neg { "-" } else { "" };
|
||||
// A negative value that rounds to zero prints without a sign.
|
||||
let sign = if neg && (ft != 0 || !inch_zero) { "-" } else { "" };
|
||||
let mut p = String::from(sign);
|
||||
let mut m = String::from(sign);
|
||||
if show_ft {
|
||||
@@ -282,6 +283,39 @@ mod tests {
|
||||
assert_eq!(format_linear(0.4, &f(5, 2, 0)).0, "1/2");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn negative_values_rounding_to_zero_have_no_sign() {
|
||||
for unit in 1..=5 {
|
||||
for decimals in [0, 2, 4] {
|
||||
for zin in [0, 1] {
|
||||
for v in [-1e-9, -0.0] {
|
||||
let (p, m) = format_linear(v, &f(unit, decimals, zin));
|
||||
assert!(!p.starts_with('-') || unit == 1 && v != 0.0, "unit {unit} decimals {decimals} zin {zin}: {p}");
|
||||
assert!(!m.starts_with('-') || unit == 1 && v != 0.0, "unit {unit} decimals {decimals} zin {zin}: {m}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// DIMRND rounding a small negative value to zero, in every unit.
|
||||
for unit in 1..=5 {
|
||||
let mut c = f(unit, 4, 0);
|
||||
c.round = 0.25;
|
||||
let (p, m) = format_linear(-0.1, &c);
|
||||
assert!(!p.starts_with('-') && !m.starts_with('-'), "unit {unit} with DIMRND: {p} / {m}");
|
||||
}
|
||||
assert_eq!(format_linear(-1e-9, &f(4, 4, 0)).0, "0\"");
|
||||
assert_eq!(format_linear(-1e-9, &f(3, 4, 0)).0, "0.0000\"");
|
||||
// Scientific keeps the sign: the mantissa of a tiny negative value is not zero.
|
||||
assert_eq!(format_linear(-1e-9, &f(1, 2, 0)).0, "-1.00E-09");
|
||||
// The shared feet/inch joiner never signs an all-zero result.
|
||||
assert_eq!(feet_inches(true, 0, "0", "0", true, 0).0, "0\"");
|
||||
assert_eq!(feet_inches(true, 0, "0", "0", true, 1).0, "0'-0\"");
|
||||
// Genuinely negative values keep the sign.
|
||||
assert_eq!(format_linear(-18.5, &f(4, 4, 0)).0, "-1'-6 1/2\"");
|
||||
assert_eq!(format_linear(-18.5, &f(3, 2, 0)).0, "-1'-6.50\"");
|
||||
assert_eq!(format_linear(-24.0, &f(4, 4, 0)).0, "-2'");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn angles() {
|
||||
assert_eq!(format_angle(std::f64::consts::FRAC_PI_4, 0, 0, 0), "45°");
|
||||
|
||||
Reference in New Issue
Block a user