use screencapturekit::shareable_content::SCShareableContent;
fn content_or_skip() -> Option<SCShareableContent> {
match SCShareableContent::get() {
Ok(content) => Some(content),
Err(e) => {
eprintln!("skip: screen-recording permission required (error: {e:?})");
None
}
}
}
#[test]
fn test_snapshot_does_not_panic_and_reports_real_content() {
let Some(content) = content_or_skip() else {
return;
};
let snapshot = content.snapshot().expect("snapshot returned None");
assert_eq!(
snapshot.displays.len(),
content.displays().len(),
"batched display count diverged from the per-element accessors"
);
for display in &snapshot.displays {
assert!(display.width > 0, "display {display:?} has no width");
assert!(display.height > 0, "display {display:?} has no height");
}
}
#[test]
fn test_snapshot_owning_app_indices_are_always_in_range() {
let Some(content) = content_or_skip() else {
return;
};
let snapshot = content.snapshot().expect("snapshot returned None");
for window in &snapshot.windows {
if let Some(index) = window.owning_app_index {
assert!(
index < snapshot.applications.len(),
"window {} reported owning app index {index} with only {} applications",
window.window_id,
snapshot.applications.len()
);
let owner = &snapshot.applications[index];
assert!(
owner.process_id > 0,
"window {} is owned by application {index} with a non-positive pid {}",
window.window_id,
owner.process_id
);
}
}
}
#[test]
fn test_repeated_snapshots_are_consistent() {
let Some(content) = content_or_skip() else {
return;
};
let first = content.snapshot().expect("first snapshot returned None");
let second = content.snapshot().expect("second snapshot returned None");
assert_eq!(first.displays, second.displays);
assert_eq!(first.applications, second.applications);
assert_eq!(first.windows, second.windows);
assert!(
first.string_pool_used
<= screencapturekit::shareable_content::ContentSnapshot::string_pool_capacity(),
"reported string pool usage exceeds its capacity"
);
for app in &first.applications {
assert!(app.bundle_identifier.is_char_boundary(0));
assert!(app.application_name.is_char_boundary(0));
}
}