use bevy_ecs::prelude::*;
use windows::UI::Composition::{ContainerVisual, Visual};
use windows::core::{Interface, Result};
use wintf::ecs::VisualGraphics;
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(())
}
#[test]
fn test_visual_graphics_has_parent_visual_field() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let visual = factory.create_visual()?;
let vg = VisualGraphics::new(visual);
assert!(
vg.parent_visual().is_none(),
"Initial parent_visual should be None"
);
Ok(())
}
#[test]
fn test_visual_graphics_new_with_parent() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent_visual = factory.create_visual()?;
let child_visual = factory.create_visual()?;
let vg = VisualGraphics::new_with_parent(child_visual.clone(), Some(parent_visual.clone()));
assert!(vg.parent_visual().is_some(), "parent_visual should be set");
Ok(())
}
#[test]
fn test_visual_graphics_set_parent_visual() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent1 = factory.create_visual()?;
let parent2 = factory.create_visual()?;
let child = factory.create_visual()?;
let mut vg = VisualGraphics::new(child);
assert!(vg.parent_visual().is_none());
vg.set_parent_visual(Some(parent1.clone()));
assert!(vg.parent_visual().is_some());
vg.set_parent_visual(Some(parent2.clone()));
assert!(vg.parent_visual().is_some());
vg.set_parent_visual(None);
assert!(vg.parent_visual().is_none());
Ok(())
}
#[test]
fn test_visual_graphics_on_remove_simulation() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let parent = factory.create_visual()?;
let child = factory.create_visual()?;
add_child(&parent, &child)?;
let vg = VisualGraphics::new_with_parent(child.clone(), Some(parent.clone()));
if let Some(p) = vg.parent_visual() {
if let Some(v) = vg.visual() {
let _ = remove_child(p, v);
}
}
let result = remove_child(&parent, &child);
eprintln!("Remove after on_remove: {:?}", result);
Ok(())
}
#[test]
fn test_visual_graphics_ecs_lifecycle() -> Result<()> {
let graphics = setup_graphics()?;
let factory = WucVisualFactory::new(&graphics)?;
let mut world = World::new();
let parent_visual = factory.create_visual()?;
let parent_vg = VisualGraphics::new(parent_visual.clone());
let parent_entity = world.spawn(parent_vg).id();
let child_visual = factory.create_visual()?;
add_child(&parent_visual, &child_visual)?;
let child_vg =
VisualGraphics::new_with_parent(child_visual.clone(), Some(parent_visual.clone()));
let child_entity = world.spawn(child_vg).id();
let child_vg_ref = world.get::<VisualGraphics>(child_entity).unwrap();
assert!(child_vg_ref.parent_visual().is_some());
world.despawn(child_entity);
assert!(world.get::<VisualGraphics>(parent_entity).is_some());
Ok(())
}