pub fn negotiate_resolution(
client_caps: &[(u32, u32)],
server_caps: &[(u32, u32)],
) -> Option<(u32, u32)> {
let mut common: Vec<(u32, u32)> = client_caps
.iter()
.copied()
.filter(|cap| server_caps.contains(cap))
.collect();
common.sort_unstable();
common.dedup();
common.into_iter().max_by_key(|&(w, h)| w as u64 * h as u64)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic_negotiation() {
let client = [(1920, 1080), (1280, 720), (640, 480)];
let server = [(3840, 2160), (1920, 1080), (1280, 720)];
assert_eq!(negotiate_resolution(&client, &server), Some((1920, 1080)));
}
#[test]
fn test_no_common_resolution() {
let client = [(640, 480), (320, 240)];
let server = [(3840, 2160), (1920, 1080)];
assert_eq!(negotiate_resolution(&client, &server), None);
}
#[test]
fn test_single_common() {
let client = [(1280, 720)];
let server = [(1280, 720), (1920, 1080)];
assert_eq!(negotiate_resolution(&client, &server), Some((1280, 720)));
}
#[test]
fn test_empty_client() {
let server = [(1920, 1080)];
assert_eq!(negotiate_resolution(&[], &server), None);
}
#[test]
fn test_empty_server() {
let client = [(1920, 1080)];
assert_eq!(negotiate_resolution(&client, &[]), None);
}
#[test]
fn test_both_empty() {
assert_eq!(negotiate_resolution(&[], &[]), None);
}
#[test]
fn test_selects_highest_resolution() {
let client = [(3840, 2160), (1920, 1080), (1280, 720)];
let server = [(3840, 2160), (1920, 1080), (1280, 720)];
assert_eq!(negotiate_resolution(&client, &server), Some((3840, 2160)));
}
#[test]
fn test_duplicate_entries_handled() {
let client = [(1280, 720), (1280, 720), (1920, 1080)];
let server = [(1280, 720), (1920, 1080), (1920, 1080)];
assert_eq!(negotiate_resolution(&client, &server), Some((1920, 1080)));
}
#[test]
fn test_portrait_resolutions() {
let client = [(720, 1280), (480, 854)];
let server = [(720, 1280), (1080, 1920)];
assert_eq!(negotiate_resolution(&client, &server), Some((720, 1280)));
}
#[test]
fn test_equal_pixel_count_returns_one() {
let client = [(1024, 768)];
let server = [(1024, 768), (768, 1024)];
assert_eq!(negotiate_resolution(&client, &server), Some((1024, 768)));
}
}