use windows::UI::Composition::{ContainerVisual, Visual};
use windows::core::{Interface, Result};
use super::common::{WucVisualFactory, setup_graphics};
fn add_child(parent: &Visual, child: &Visual) -> Result<()> {
parent
.cast::<ContainerVisual>()?
.Children()?
.InsertAtBottom(child)?;
Ok(())
}
fn remove_child(parent: &Visual, child: &Visual) -> Result<()> {
parent
.cast::<ContainerVisual>()?
.Children()?
.Remove(child)?;
Ok(())
}
fn remove_all_children(parent: &Visual) -> Result<()> {
parent.cast::<ContainerVisual>()?.Children()?.RemoveAll()?;
Ok(())
}
fn child_count(parent: &Visual) -> Result<i32> {
Ok(parent.cast::<ContainerVisual>()?.Children()?.Count()?)
}
#[test]
fn test_remove_visual_removes_child_from_parent() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent_visual = factory.create_visual()?;
let child_visual = factory.create_visual()?;
add_child(&parent_visual, &child_visual)?;
assert_eq!(child_count(&parent_visual)?, 1, "追加後は子が 1");
let result = remove_child(&parent_visual, &child_visual);
assert!(result.is_ok(), "remove should succeed: {:?}", result);
assert_eq!(child_count(&parent_visual)?, 0, "削除後は子が 0");
Ok(())
}
#[test]
fn test_remove_visual_nonexistent_returns_error() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent_visual = factory.create_visual()?;
let child_visual = factory.create_visual()?;
let result = remove_child(&parent_visual, &child_visual);
eprintln!("remove result for nonexistent: {:?}", result);
Ok(())
}
#[test]
fn test_remove_all_visuals_clears_all_children() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent_visual = factory.create_visual()?;
let child1 = factory.create_visual()?;
let child2 = factory.create_visual()?;
let child3 = factory.create_visual()?;
add_child(&parent_visual, &child1)?;
add_child(&parent_visual, &child2)?;
add_child(&parent_visual, &child3)?;
assert_eq!(child_count(&parent_visual)?, 3, "3 子追加後");
let result = remove_all_children(&parent_visual);
assert!(result.is_ok(), "remove_all should succeed: {:?}", result);
assert_eq!(child_count(&parent_visual)?, 0, "一括削除後は 0");
let result2 = remove_all_children(&parent_visual);
assert!(
result2.is_ok(),
"remove_all on empty parent should succeed: {:?}",
result2
);
Ok(())
}
#[test]
fn test_remove_visual_multiple_operations() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent_visual = factory.create_visual()?;
let child_visual = factory.create_visual()?;
add_child(&parent_visual, &child_visual)?;
remove_child(&parent_visual, &child_visual)?;
add_child(&parent_visual, &child_visual)?;
remove_child(&parent_visual, &child_visual)?;
assert_eq!(child_count(&parent_visual)?, 0, "サイクル後は 0");
Ok(())
}