Skip to content

Commit bcab75f

Browse files
authored
Add layer tree tests for layer selection (#2577)
* layer selection testing * changes
1 parent 9acc23d commit bcab75f

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2707,3 +2707,82 @@ impl Iterator for ClickXRayIter<'_> {
27072707
None
27082708
}
27092709
}
2710+
2711+
#[cfg(test)]
2712+
mod document_message_handler_tests {
2713+
use super::*;
2714+
use crate::test_utils::test_prelude::*;
2715+
2716+
#[tokio::test]
2717+
async fn test_layer_selection_with_shift_and_ctrl() {
2718+
let mut editor = EditorTestUtils::create();
2719+
editor.new_document().await;
2720+
// Three rectangle layers
2721+
editor.drag_tool(ToolType::Rectangle, 0., 0., 100., 100., ModifierKeys::empty()).await;
2722+
editor.drag_tool(ToolType::Rectangle, 50., 50., 150., 150., ModifierKeys::empty()).await;
2723+
editor.drag_tool(ToolType::Rectangle, 100., 100., 200., 200., ModifierKeys::empty()).await;
2724+
2725+
let layers: Vec<_> = editor.active_document().metadata().all_layers().collect();
2726+
2727+
// Case 1: Basic selection (no modifier)
2728+
editor
2729+
.handle_message(DocumentMessage::SelectLayer {
2730+
id: layers[0].to_node(),
2731+
ctrl: false,
2732+
shift: false,
2733+
})
2734+
.await;
2735+
// Fresh document reference for verification
2736+
let document = editor.active_document();
2737+
let selected_nodes = document.network_interface.selected_nodes();
2738+
assert_eq!(selected_nodes.selected_nodes_ref().len(), 1);
2739+
assert!(selected_nodes.selected_layers_contains(layers[0], document.metadata()));
2740+
2741+
// Case 2: Ctrl + click to add another layer
2742+
editor
2743+
.handle_message(DocumentMessage::SelectLayer {
2744+
id: layers[2].to_node(),
2745+
ctrl: true,
2746+
shift: false,
2747+
})
2748+
.await;
2749+
let document = editor.active_document();
2750+
let selected_nodes = document.network_interface.selected_nodes();
2751+
assert_eq!(selected_nodes.selected_nodes_ref().len(), 2);
2752+
assert!(selected_nodes.selected_layers_contains(layers[0], document.metadata()));
2753+
assert!(selected_nodes.selected_layers_contains(layers[2], document.metadata()));
2754+
2755+
// Case 3: Shift + click to select a range
2756+
editor
2757+
.handle_message(DocumentMessage::SelectLayer {
2758+
id: layers[1].to_node(),
2759+
ctrl: false,
2760+
shift: true,
2761+
})
2762+
.await;
2763+
let document = editor.active_document();
2764+
let selected_nodes = document.network_interface.selected_nodes();
2765+
// We expect 2 layers to be selected (layers 1 and 2) - not 3
2766+
assert_eq!(selected_nodes.selected_nodes_ref().len(), 2);
2767+
assert!(!selected_nodes.selected_layers_contains(layers[0], document.metadata()));
2768+
assert!(selected_nodes.selected_layers_contains(layers[1], document.metadata()));
2769+
assert!(selected_nodes.selected_layers_contains(layers[2], document.metadata()));
2770+
2771+
// Case 4: Ctrl + click to toggle selection (deselect)
2772+
editor
2773+
.handle_message(DocumentMessage::SelectLayer {
2774+
id: layers[1].to_node(),
2775+
ctrl: true,
2776+
shift: false,
2777+
})
2778+
.await;
2779+
2780+
// Final fresh document reference
2781+
let document = editor.active_document();
2782+
let selected_nodes = document.network_interface.selected_nodes();
2783+
assert_eq!(selected_nodes.selected_nodes_ref().len(), 1);
2784+
assert!(!selected_nodes.selected_layers_contains(layers[0], document.metadata()));
2785+
assert!(!selected_nodes.selected_layers_contains(layers[1], document.metadata()));
2786+
assert!(selected_nodes.selected_layers_contains(layers[2], document.metadata()));
2787+
}
2788+
}

0 commit comments

Comments
 (0)