diff options
Diffstat (limited to 'rust/crates/graphics/tests/gradient_stops.rs')
| -rw-r--r-- | rust/crates/graphics/tests/gradient_stops.rs | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/rust/crates/graphics/tests/gradient_stops.rs b/rust/crates/graphics/tests/gradient_stops.rs new file mode 100644 index 00000000..04adc893 --- /dev/null +++ b/rust/crates/graphics/tests/gradient_stops.rs @@ -0,0 +1,176 @@ +use graphics::gradient::ast::{Color, ColorStop, Distance}; +use graphics::gradient::stops::{color_to_string, normalize_color_stops}; + +fn stop(color: Color, length: Option<Distance>) -> ColorStop { + ColorStop { color, length } +} + +fn literal(name: &str) -> Color { + Color::Literal(name.to_string()) +} + +#[test] +fn color_string_round_trip() { + assert_eq!(color_to_string(&Color::Hex("abc".into())), "#abc"); + assert_eq!(color_to_string(&literal("red")), "red"); + assert_eq!( + color_to_string(&Color::Rgb(vec!["1".into(), "2".into(), "3".into()])), + "rgb(1,2,3)" + ); + assert_eq!( + color_to_string(&Color::Rgba(vec!["1".into(), "2".into(), "3".into(), "0.5".into()])), + "rgba(1,2,3,0.5)" + ); + assert_eq!( + color_to_string(&Color::Hsl(["120".into(), "50".into(), "50".into()])), + "hsl(120,50,50)" + ); + assert_eq!( + color_to_string(&Color::Hsla(["120".into(), "50".into(), "50".into(), "0.5".into()])), + "hsla(120,50,50,0.5)" + ); + assert_eq!(color_to_string(&Color::Var("--x".into())), "var(--x)"); +} + +#[test] +fn evenly_distributed_stops() { + let stops = normalize_color_stops( + &[stop(literal("red"), None), stop(literal("blue"), None)], + 100.0, + ); + assert_eq!(stops[0].offset, 0.0); + assert_eq!(stops[1].offset, 1.0); + + let stops = normalize_color_stops( + &[ + stop(literal("a"), None), + stop(literal("b"), None), + stop(literal("c"), None), + ], + 100.0, + ); + assert_eq!(stops[1].offset, 0.5); +} + +#[test] +fn explicit_and_mixed_offsets() { + let stops = normalize_color_stops( + &[ + stop(literal("red"), Some(Distance::Percent("20".into()))), + stop(literal("green"), None), + stop(literal("blue"), Some(Distance::Percent("80".into()))), + ], + 100.0, + ); + assert_eq!(stops[0].offset, 0.2); + assert_eq!(stops[1].offset, 0.5); + assert_eq!(stops[2].offset, 0.8); +} + +#[test] +fn px_and_em_offsets_use_gradient_length() { + let stops = normalize_color_stops( + &[ + stop(literal("red"), Some(Distance::Px("50".into()))), + stop(literal("blue"), Some(Distance::Em("6.25".into()))), + ], + 200.0, + ); + assert_eq!(stops[0].offset, 0.25); + assert!((stops[1].offset - 0.5).abs() < 1e-9); +} + +#[test] +fn offsets_clamped() { + let stops = normalize_color_stops( + &[ + stop(literal("red"), Some(Distance::Percent("-20".into()))), + stop(literal("blue"), Some(Distance::Percent("150".into()))), + ], + 100.0, + ); + assert_eq!(stops[0].offset, 0.0); + assert_eq!(stops[1].offset, 1.0); +} + +#[test] +fn leading_unpositioned_stops() { + let stops = normalize_color_stops( + &[ + stop(literal("a"), None), + stop(literal("b"), None), + stop(literal("c"), Some(Distance::Percent("90".into()))), + ], + 100.0, + ); + assert_eq!(stops[0].offset, 0.0); + assert_eq!(stops[1].offset, 0.45); + assert_eq!(stops[2].offset, 0.9); +} + +#[test] +fn trailing_unpositioned_stops() { + let stops = normalize_color_stops( + &[ + stop(literal("a"), Some(Distance::Percent("10".into()))), + stop(literal("b"), None), + stop(literal("c"), None), + ], + 100.0, + ); + assert_eq!(stops[0].offset, 0.1); + assert!((stops[1].offset - 0.55).abs() < 1e-9); + assert_eq!(stops[2].offset, 1.0); +} + +#[test] +fn transparent_stop_adopts_previous_color() { + let stops = normalize_color_stops( + &[ + stop(Color::Hex("ff0000".into()), None), + stop(literal("transparent"), None), + stop(Color::Hex("0000ff".into()), None), + ], + 100.0, + ); + assert_eq!(stops[1].color, "rgba(255,0,0,0)"); +} + +#[test] +fn transparent_stop_with_unparseable_donors_unchanged() { + let stops = normalize_color_stops( + &[ + stop(literal("red"), None), + stop(literal("transparent"), None), + stop(literal("blue"), None), + ], + 100.0, + ); + assert_eq!(stops[1].color, "transparent"); +} + +#[test] +fn transparent_stop_adopts_next_color_when_first() { + let stops = normalize_color_stops( + &[ + stop(literal("transparent"), None), + stop(Color::Hex("00ff00".into()), None), + ], + 100.0, + ); + assert_eq!(stops[1].color, "#00ff00"); + assert_eq!(stops[0].color, "rgba(0,255,0,0)"); +} + +#[test] +fn all_transparent_stops_unchanged() { + let stops = normalize_color_stops( + &[ + stop(literal("transparent"), None), + stop(Color::Rgba(vec!["0".into(), "0".into(), "0".into(), "0".into()]), None), + ], + 100.0, + ); + assert_eq!(stops[0].color, "transparent"); + assert_eq!(stops[1].color, "rgba(0,0,0,0)"); +} |
