mod support;
use muri::{
render_menu_to_png, render_menu_to_rgba, Align, Color, Flex, Icon, Menu, MenuOptions, Row,
Segment, ThemeMode, ThemeSource,
};
fn sample_menu() -> Menu {
Menu::new()
.section_header(Row::info().label("Account"))
.row(Row::new("acct:me").segments(vec![
Segment::new("me@example.com").flex(Flex::Grow),
Segment::new("47%")
.align(Align::Right)
.color(Color::SystemGreen),
]))
.row(
Row::new("acct:on")
.label("Sync enabled")
.leading(Icon::Checkmark)
.checked(true),
)
.separator()
.row(Row::new("quit").segments(vec![
Segment::new("Quit").flex(Flex::Grow),
Segment::new("v0.10")
.align(Align::Right)
.color(Color::SecondaryLabel),
]))
}
fn forced(family: ThemeSource) -> MenuOptions {
MenuOptions::default().theme(family)
}
#[test]
fn render_menu_to_png_is_nonempty_and_decodable() {
let menu = sample_menu();
let opts = MenuOptions::default();
let png = render_menu_to_png(&menu, &opts, 2.0);
assert!(!png.is_empty(), "PNG output must be non-empty");
let (rgba, w, h) = muri::render::decode_png(&png).expect("PNG decodes");
assert!(w > 0 && h > 0, "decoded PNG must have positive dimensions");
assert_eq!(rgba.len(), (w * h * 4) as usize, "RGBA is w*h*4 bytes");
}
#[test]
fn render_menu_to_rgba_matches_png_dimensions() {
let menu = sample_menu();
let opts = MenuOptions::default();
let (rgba, w, h) = render_menu_to_rgba(&menu, &opts, 2.0);
assert!(w > 0 && h > 0, "RGBA render must have positive dimensions");
assert_eq!(rgba.len(), (w * h * 4) as usize, "RGBA is w*h*4 bytes");
let png = render_menu_to_png(&menu, &opts, 2.0);
let (_p, pw, ph) = muri::render::decode_png(&png).expect("PNG decodes");
assert_eq!((pw, ph), (w, h), "PNG and RGBA sizes agree");
}
#[test]
fn scale_changes_device_size() {
let menu = sample_menu();
let opts = MenuOptions::default();
let (_a, w1, h1) = render_menu_to_rgba(&menu, &opts, 1.0);
let (_b, w2, h2) = render_menu_to_rgba(&menu, &opts, 2.0);
assert!(w2 > w1 && h2 > h1, "2x render must be larger than 1x");
}
#[test]
fn forced_os_looks_differ() {
let menu = sample_menu();
let mac = render_menu_to_rgba(&menu, &forced(ThemeSource::MacOs(ThemeMode::Light)), 2.0);
let win = render_menu_to_rgba(&menu, &forced(ThemeSource::Windows(ThemeMode::Light)), 2.0);
let gnome = render_menu_to_rgba(&menu, &forced(ThemeSource::Gnome(ThemeMode::Light)), 2.0);
assert_ne!(mac, win, "macOS and Windows forced looks must differ");
assert_ne!(win, gnome, "Windows and GNOME forced looks must differ");
assert_ne!(mac, gnome, "macOS and GNOME forced looks must differ");
}
#[cfg(feature = "bundled-fonts")]
mod goldens {
use super::*;
use support::assert_golden_png;
fn assert_forced_golden(source: ThemeSource, name: &str) {
let png = render_menu_to_png(&sample_menu(), &forced(source), 2.0);
assert_golden_png(name, &png);
}
#[test]
fn headless_macos_golden() {
assert_forced_golden(
ThemeSource::MacOs(ThemeMode::Light),
"headless-macos-light-2x",
);
}
#[test]
fn headless_windows_golden() {
assert_forced_golden(
ThemeSource::Windows(ThemeMode::Light),
"headless-windows-light-2x",
);
}
#[test]
fn headless_gnome_golden() {
assert_forced_golden(
ThemeSource::Gnome(ThemeMode::Light),
"headless-gnome-light-2x",
);
}
}