use concinnity_core::components::Sprite;
use concinnity_core::components::TriggerVolume;
use concinnity_core::ecs::WorldLines;
use concinnity_host::thread::asset_id;
use crate::frame_hook::FrameHook;
use crate::editor::hook::tests::fixtures::{click_at, hook, pick_world, release_at};
use crate::editor::outlines;
use crate::editor::hook::tests::fixtures::{active, select};
use crate::editor::view_menu;
use crate::editor::viewport::billboards;
#[test]
fn selected_trigger_volume_publishes_its_line_outline() {
asset_id::reset_interner();
let mut world = pick_world([0.0; 3], Vec::new());
for (id, s) in billboards::sprites() {
world.push_identified(id, s);
}
let entity = world.push(TriggerVolume {
position: [0.0, 0.0, -6.0],
..Default::default()
});
let id = asset_id::intern("zone");
world.identify(entity, id);
let mut h = hook(vec![serde_json::json!({
"type": "TriggerVolume",
"args": {"$id": "zone", "position": [0.0, 0.0, -6.0]}
})]);
click_at(&mut world, &mut h, [640.0, 360.0]);
assert_eq!(active(&h).as_deref(), Some("zone"));
let published = world.resource::<WorldLines>().unwrap().0.len();
assert_eq!(
published,
6 + outlines::shapes::BOX_EDGES,
"axes plus the volume's box edges"
);
let ids: std::collections::HashSet<_> = billboards::ids().sprites.iter().copied().collect();
let icons = billboards::MAX_BILLBOARDS;
assert!(
world
.join2::<Sprite, concinnity_core::components::Identity>()
.filter(|(_, s, identity)| s.visible && ids.contains(&identity.id()))
.count()
<= icons,
"no dotted outline segments show; only the icon chips do"
);
release_at(&mut world, &mut h, [640.0, 360.0]);
h.selection.clear();
h.tick(&mut world);
let published = world.resource::<WorldLines>().unwrap().0.len();
assert_eq!(published, 6, "no outline without a selected volume");
select(&mut h, &["zone"]);
h.show_flags = h.show_flags.toggled(view_menu::ShowFlags::LINES);
h.tick(&mut world);
let published = world.resource::<WorldLines>().unwrap().0.len();
assert_eq!(published, 0, "the Lines flag gates axes and outlines alike");
}