use super::*;
use snora_design::{Tokens, contrast};
use iced::widget::button::Status;
#[test]
fn chip_style_selected_all_statuses_all_presets() {
for t in all_presets() {
for s in all_statuses() {
let style = chip_style_selected(&t, s);
assert!(style.background.is_some(), "selected {s:?}: background must be set");
}
}
}
#[test]
fn chip_style_unselected_all_statuses_all_presets() {
for t in all_presets() {
for s in all_statuses() {
let style = chip_style_unselected(&t, s);
assert!(style.background.is_some(), "unselected {s:?}: background must be set");
}
}
}
#[test]
fn selected_active_uses_accent_text_foreground() {
for t in all_presets() {
let style = chip_style_selected(&t, Status::Active);
let expected = style::color::to_iced_color(t.palette.accent_text);
assert_eq!(
style.text_color, expected,
"selected active must use accent_text for contrast"
);
}
}
#[test]
fn chip_selected_text_over_accent_background_meets_aa_all_presets() {
const AA: f32 = 4.5;
for (name, t) in named_presets() {
let ratio = contrast::contrast_ratio(t.palette.accent_text, t.palette.accent);
assert!(
ratio >= AA,
"{name}: accent_text/accent contrast {ratio:.2} < {AA} (WCAG AA)"
);
}
}
#[test]
fn chip_selected_text_hover_pressed_meets_aa_all_presets() {
const AA: f32 = 4.5;
for (name, t) in named_presets() {
let accent = t.palette.accent;
let accent_text = t.palette.accent_text;
let hover_bg = snora_design::Color {
r: (accent.r - 0.06).max(0.0),
g: (accent.g - 0.06).max(0.0),
b: (accent.b - 0.06).max(0.0),
a: accent.a,
};
let pressed_bg = snora_design::Color {
r: (accent.r - 0.12).max(0.0),
g: (accent.g - 0.12).max(0.0),
b: (accent.b - 0.12).max(0.0),
a: accent.a,
};
let hover_ratio = contrast::contrast_ratio(accent_text, hover_bg);
let pressed_ratio = contrast::contrast_ratio(accent_text, pressed_bg);
assert!(
hover_ratio >= AA,
"{name}: accent_text/hover_bg {hover_ratio:.2} < {AA} (WCAG AA)"
);
assert!(
pressed_ratio >= AA,
"{name}: accent_text/pressed_bg {pressed_ratio:.2} < {AA} (WCAG AA)"
);
}
}
#[test]
fn darken_clamps_to_zero() {
let black = darken(iced::Color::BLACK, 1.0);
assert!(black.r >= 0.0 && black.g >= 0.0 && black.b >= 0.0);
}
fn all_presets() -> [Tokens; 4] {
[
Tokens::light(), Tokens::dark(),
Tokens::high_contrast_light(), Tokens::high_contrast_dark(),
]
}
fn named_presets() -> [(&'static str, Tokens); 4] {
[
("light", Tokens::light()),
("dark", Tokens::dark()),
("high_contrast_light", Tokens::high_contrast_light()),
("high_contrast_dark", Tokens::high_contrast_dark()),
]
}
fn all_statuses() -> [Status; 4] {
[Status::Active, Status::Hovered, Status::Pressed, Status::Disabled]
}