From 0f0416054f263b80ccec1a463ce4ab20913bdf71 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 15 Jan 2021 15:43:59 +0100 Subject: [PATCH] =?UTF-8?q?Move=20value=20tests=20+=20smarter=20number=20f?= =?UTF-8?q?ormatting=20=F0=9F=94=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 1 + src/eval/value.rs | 10 ++++----- src/geom/angle.rs | 11 +++++++++- src/geom/length.rs | 24 +++++++++++--------- src/geom/relative.rs | 2 +- src/parse/tests.rs | 45 ++------------------------------------ src/syntax/expr.rs | 6 ++--- tests/ref/lang/values.png | Bin 0 -> 24313 bytes tests/typ/lang/values.typ | 33 ++++++++++++++++++++++++++++ 9 files changed, 69 insertions(+), 63 deletions(-) create mode 100644 tests/ref/lang/values.png create mode 100644 tests/typ/lang/values.typ diff --git a/Cargo.toml b/Cargo.toml index dba398a5a..1b6989cc3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ image = { version = "0.23", default-features = false, features = ["jpeg", "png"] itoa = "0.4" miniz_oxide = "0.3" pdf-writer = { path = "../pdf-writer" } +ryu = "1.0" ttf-parser = "0.8.2" unicode-xid = "0.2" anyhow = { version = "1", optional = true } diff --git a/src/eval/value.rs b/src/eval/value.rs index 13548c87e..20cc457c8 100644 --- a/src/eval/value.rs +++ b/src/eval/value.rs @@ -116,8 +116,8 @@ impl Pretty for Value { match self { Value::None => p.push_str("none"), Value::Bool(v) => write!(p, "{}", v).unwrap(), - Value::Int(v) => write!(p, "{}", v).unwrap(), - Value::Float(v) => write!(p, "{}", v).unwrap(), + Value::Int(v) => p.push_str(itoa::Buffer::new().format(*v)), + Value::Float(v) => p.push_str(ryu::Buffer::new().format(*v)), Value::Length(v) => write!(p, "{}", v).unwrap(), Value::Angle(v) => write!(p, "{}", v).unwrap(), Value::Relative(v) => write!(p, "{}", v).unwrap(), @@ -521,9 +521,9 @@ mod tests { test_pretty(false, "false"); test_pretty(12.4, "12.4"); test_pretty(Length::pt(5.5), "5.5pt"); - test_pretty(Angle::deg(90.0), "90deg"); - test_pretty(Relative::ONE / 2.0, "50%"); - test_pretty(Relative::new(0.3) + Length::cm(2.0), "30% + 2cm"); + test_pretty(Angle::deg(90.0), "90.0deg"); + test_pretty(Relative::ONE / 2.0, "50.0%"); + test_pretty(Relative::new(0.3) + Length::cm(2.0), "30.0% + 2.0cm"); test_pretty(Color::Rgba(RgbaColor::new(1, 1, 1, 0xff)), "#010101"); test_pretty("hello", r#""hello""#); test_pretty(vec![Spanned::zero(Node::Strong)], "[*]"); diff --git a/src/geom/angle.rs b/src/geom/angle.rs index 47541cb8b..07471a026 100644 --- a/src/geom/angle.rs +++ b/src/geom/angle.rs @@ -56,7 +56,16 @@ impl Angle { impl Display for Angle { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - write!(f, "{}{}", self.to_deg(), AngularUnit::Deg) + // Format with the unit that yields the shortest output, preferring + // degrees when tied. + let mut buf = ryu::Buffer::new(); + let unit = [AngularUnit::Deg, AngularUnit::Rad] + .iter() + .copied() + .min_by_key(|&unit| buf.format(self.to_unit(unit)).len()) + .unwrap(); + + write!(f, "{}{}", buf.format(self.to_unit(unit)), unit) } } diff --git a/src/geom/length.rs b/src/geom/length.rs index bfb1d6681..00803e13c 100644 --- a/src/geom/length.rs +++ b/src/geom/length.rs @@ -99,13 +99,16 @@ impl Length { impl Display for Length { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - // Format small lengths as points and large ones as centimeters. - let (val, unit) = if self.to_pt().abs() < 25.0 { - (self.to_pt(), LengthUnit::Pt) - } else { - (self.to_cm(), LengthUnit::Cm) - }; - write!(f, "{}{}", (val * 100.0).round() / 100.0, unit) + // Format with the unit that yields the shortest output, preferring + // larger units when tied. + let mut buf = ryu::Buffer::new(); + let unit = [LengthUnit::Cm, LengthUnit::Mm, LengthUnit::Pt] + .iter() + .copied() + .min_by_key(|&unit| buf.format(self.to_unit(unit)).len()) + .unwrap(); + + write!(f, "{}{}", buf.format(self.to_unit(unit)), unit) } } @@ -229,8 +232,9 @@ mod tests { #[test] fn test_length_formatting() { - assert_eq!(Length::pt(-28.34).to_string(), "-1cm".to_string()); - assert_eq!(Length::pt(23.0).to_string(), "23pt".to_string()); - assert_eq!(Length::cm(12.728).to_string(), "12.73cm".to_string()); + assert_eq!(Length::pt(23.0).to_string(), "23.0pt"); + assert_eq!(Length::pt(-28.3465).to_string(), "-1.0cm"); + assert_eq!(Length::cm(12.728).to_string(), "12.728cm"); + assert_eq!(Length::cm(4.5).to_string(), "4.5cm"); } } diff --git a/src/geom/relative.rs b/src/geom/relative.rs index d39ead3ae..e91ea6724 100644 --- a/src/geom/relative.rs +++ b/src/geom/relative.rs @@ -37,7 +37,7 @@ impl Relative { impl Display for Relative { fn fmt(&self, f: &mut Formatter) -> fmt::Result { - write!(f, "{}%", (self.0 * 10000.0).round() / 100.0) + write!(f, "{}%", ryu::Buffer::new().format(100.0 * self.0)) } } diff --git a/src/parse/tests.rs b/src/parse/tests.rs index 8d52c24b5..9a35f5522 100644 --- a/src/parse/tests.rs +++ b/src/parse/tests.rs @@ -3,13 +3,12 @@ use std::fmt::Debug; use super::parse; -use crate::color::RgbaColor; use crate::diag::{Diag, Level, Pass}; -use crate::geom::{AngularUnit, LengthUnit}; +use crate::geom::LengthUnit; use crate::syntax::*; use BinOp::*; -use Expr::{Angle, Bool, Color, Float, Int, Length, Percent}; +use Expr::{Float, Int, Length}; use Node::{Space, Strong}; use UnOp::{Neg, Pos}; @@ -290,43 +289,3 @@ fn test_parse_expressions() { S(6..6, "expected expression"), S(10..10, "expected expression")]); } - -#[test] -fn test_parse_values() { - // Basics. - t!("{_}" Block!(Id("_"))); - t!("{name}" Block!(Id("name"))); - t!("{ke-bab}" Block!(Id("ke-bab"))); - t!("{α}" Block!(Id("α"))); - t!("{none}" Block!(Expr::None)); - t!("{true}" Block!(Bool(true))); - t!("{false}" Block!(Bool(false))); - t!("{1.0e-4}" Block!(Float(1e-4))); - t!("{3.15}" Block!(Float(3.15))); - t!("{50%}" Block!(Percent(50.0))); - t!("{4.5cm}" Block!(Length(4.5, LengthUnit::Cm))); - t!("{12e1pt}" Block!(Length(12e1, LengthUnit::Pt))); - t!("{13rad}" Block!(Angle(13.0, AngularUnit::Rad))); - t!("{45deg}" Block!(Angle(45.0, AngularUnit::Deg))); - - // Strings. - t!(r#"{"hi"}"# Block!(Str("hi"))); - t!(r#"{"a\n[]\"\u{1F680}string"}"# Block!(Str("a\n[]\"🚀string"))); - - // Colors. - t!("{#f7a20500}" Block!(Color(RgbaColor::new(0xf7, 0xa2, 0x05, 0)))); - t!("{#a5}" - nodes: [Block!(Color(RgbaColor::new(0, 0, 0, 0xff)))], - errors: [S(1..4, "invalid color")]); - - // Content. - t!("{[*Hi*]}" Block!(Template![Strong, Text("Hi"), Strong])); - - // Nested blocks. - t!("{{1}}" Block!(Block!(@Int(1)))); - - // Invalid tokens. - t!("{1u}" - nodes: [], - errors: [S(1..3, "expected expression, found invalid token")]); -} diff --git a/src/syntax/expr.rs b/src/syntax/expr.rs index b758a8494..795339183 100644 --- a/src/syntax/expr.rs +++ b/src/syntax/expr.rs @@ -54,8 +54,8 @@ impl Pretty for Expr { Self::None => p.push_str("none"), Self::Ident(v) => p.push_str(&v), Self::Bool(v) => write!(p, "{}", v).unwrap(), - Self::Int(v) => write!(p, "{}", v).unwrap(), - Self::Float(v) => write!(p, "{}", v).unwrap(), + Self::Int(v) => p.push_str(itoa::Buffer::new().format(*v)), + Self::Float(v) => p.push_str(ryu::Buffer::new().format(*v)), Self::Length(v, u) => write!(p, "{}{}", v, u).unwrap(), Self::Angle(v, u) => write!(p, "{}{}", v, u).unwrap(), Self::Percent(v) => write!(p, "{}%", v).unwrap(), @@ -370,7 +370,7 @@ mod tests { test_pretty("{true}", "{true}"); test_pretty("{25}", "{25}"); test_pretty("{2.50}", "{2.5}"); - test_pretty("{1e2}", "{100}"); + test_pretty("{1e2}", "{100.0}"); test_pretty("{12pt}", "{12pt}"); test_pretty("{90.0deg}", "{90deg}"); test_pretty("{50%}", "{50%}"); diff --git a/tests/ref/lang/values.png b/tests/ref/lang/values.png new file mode 100644 index 0000000000000000000000000000000000000000..4205221b75e033fb284620dc5808ca269e6bc798 GIT binary patch literal 24313 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 CW-2fM literal 0 HcmV?d00001 diff --git a/tests/typ/lang/values.typ b/tests/typ/lang/values.typ new file mode 100644 index 000000000..ce41fc433 --- /dev/null +++ b/tests/typ/lang/values.typ @@ -0,0 +1,33 @@ +#let name = "Typst"; +#let ke-bab = "Kebab!"; +#let α = "Alpha"; + +{name} \ +{ke-bab} \ +{α} \ +{none} (empty) \ +{true} \ +{false} \ +{1.0e-4} \ +{3.15} \ +{1e-10} \ +{50.368%} \ +{0.0000012345pt} \ +{4.5cm} \ +{12e1pt} \ +{2.5rad} \ +{45deg} \ +{"hi"} \ +{"a\n[]\"\u{1F680}string"} \ +{#f7a20500} \ +{[*{"Hi"} [f 1]*]} \ +{{1}} + +// Error: 1:1-1:4 unknown variable +{_} \ + +// Error: 1:2-1:5 invalid color +{#a5} + +// Error: 1:2-1:4 expected expression, found invalid token +{1u}