diff --git a/crates/op-editor-ui/src/widgets/layer_panel_tests.rs b/crates/op-editor-ui/src/widgets/layer_panel_tests.rs index 081f2d4da..fed0df0ec 100644 --- a/crates/op-editor-ui/src/widgets/layer_panel_tests.rs +++ b/crates/op-editor-ui/src/widgets/layer_panel_tests.rs @@ -470,38 +470,53 @@ fn nested_frame_doc(depth: usize) -> String { src } +fn run_deep_layer_fixture(test: impl FnOnce() + Send + 'static) { + let handle = std::thread::Builder::new() + .name("op-layer-panel-deep-fixture".into()) + .stack_size(64 * 1024 * 1024) + .spawn(test) + .expect("spawn deep layer fixture test"); + if let Err(payload) = handle.join() { + std::panic::resume_unwind(payload); + } +} + #[test] fn deep_layer_tree_exposes_horizontal_scroll_range() { - let state = state_from(&nested_frame_doc(50)); - let panel = LayerPanel::from_editor(&state); - let rect = Rect { - origin: Point2D::new(0.0, 0.0), - size: Point2D::new(LAYER_PANEL_WIDTH, 700.0), - }; + run_deep_layer_fixture(|| { + let state = state_from(&nested_frame_doc(50)); + let panel = LayerPanel::from_editor(&state); + let rect = Rect { + origin: Point2D::new(0.0, 0.0), + size: Point2D::new(LAYER_PANEL_WIDTH, 700.0), + }; - let regions = panel.regions(rect); + let regions = panel.regions(rect); - assert!( - regions.layers_content_w > rect.size.x, - "deep layer content should be wider than the fixed panel viewport" - ); - assert!( - regions.layers_max_h_scroll > 0.0, - "deep layer rows need a horizontal scroll range" - ); + assert!( + regions.layers_content_w > rect.size.x, + "deep layer content should be wider than the fixed panel viewport" + ); + assert!( + regions.layers_max_h_scroll > 0.0, + "deep layer rows need a horizontal scroll range" + ); + }); } #[test] fn layer_horizontal_scroll_offset_is_clamped() { - let mut state = state_from(&nested_frame_doc(50)); - state.editor_ui.layer_layers_h_scroll = 10_000.0; - let panel = LayerPanel::from_editor(&state); - let rect = Rect { - origin: Point2D::new(0.0, 0.0), - size: Point2D::new(LAYER_PANEL_WIDTH, 700.0), - }; + run_deep_layer_fixture(|| { + let mut state = state_from(&nested_frame_doc(50)); + state.editor_ui.layer_layers_h_scroll = 10_000.0; + let panel = LayerPanel::from_editor(&state); + let rect = Rect { + origin: Point2D::new(0.0, 0.0), + size: Point2D::new(LAYER_PANEL_WIDTH, 700.0), + }; - let regions = panel.regions(rect); + let regions = panel.regions(rect); - assert_eq!(regions.layers_h_scroll, regions.layers_max_h_scroll); + assert_eq!(regions.layers_h_scroll, regions.layers_max_h_scroll); + }); } diff --git a/crates/op-host-native/src/widget_host/scroll_tests.rs b/crates/op-host-native/src/widget_host/scroll_tests.rs index 1272c0b4e..8a9efb9b2 100644 --- a/crates/op-host-native/src/widget_host/scroll_tests.rs +++ b/crates/op-host-native/src/widget_host/scroll_tests.rs @@ -22,31 +22,44 @@ fn seed(host: &mut WidgetHostNative, json: &str) { host.mark_paint_dirty_for_test(); } +fn run_deep_layer_fixture(test: impl FnOnce() + Send + 'static) { + let handle = std::thread::Builder::new() + .name("op-host-native-deep-layer-fixture".into()) + .stack_size(64 * 1024 * 1024) + .spawn(test) + .expect("spawn deep layer fixture test"); + if let Err(payload) = handle.join() { + std::panic::resume_unwind(payload); + } +} + #[test] fn layer_panel_trackpad_pan_scrolls_horizontally() { - let mut host = WidgetHostNative::new(); - seed(&mut host, &nested_frame_doc(50)); - let viewport_w = 1200.0; - let viewport_h = 800.0; - let panel = op_editor_ui::widgets::LayerPanel::from_editor(host.editor_state()); - let rect = op_editor_ui::Rect { - origin: op_editor_ui::Point2D::new(0.0, op_editor_ui::widgets::TOP_BAR_HEIGHT), - size: op_editor_ui::Point2D::new( - host.editor_state().editor_ui.layer_panel_width, - viewport_h - op_editor_ui::widgets::TOP_BAR_HEIGHT, - ), - }; - let regions = panel.regions(rect); - assert!(regions.layers_max_h_scroll > 0.0); + run_deep_layer_fixture(|| { + let mut host = WidgetHostNative::new(); + seed(&mut host, &nested_frame_doc(50)); + let viewport_w = 1200.0; + let viewport_h = 800.0; + let panel = op_editor_ui::widgets::LayerPanel::from_editor(host.editor_state()); + let rect = op_editor_ui::Rect { + origin: op_editor_ui::Point2D::new(0.0, op_editor_ui::widgets::TOP_BAR_HEIGHT), + size: op_editor_ui::Point2D::new( + host.editor_state().editor_ui.layer_panel_width, + viewport_h - op_editor_ui::widgets::TOP_BAR_HEIGHT, + ), + }; + let regions = panel.regions(rect); + assert!(regions.layers_max_h_scroll > 0.0); - assert!(host.apply_pan_gesture( - 80.0, - regions.layers_rows_top + 12.0, - -180.0, - 0.0, - viewport_w, - viewport_h - )); + assert!(host.apply_pan_gesture( + 80.0, + regions.layers_rows_top + 12.0, + -180.0, + 0.0, + viewport_w, + viewport_h + )); - assert!(host.editor_state().editor_ui.layer_layers_h_scroll > 0.0); + assert!(host.editor_state().editor_ui.layer_layers_h_scroll > 0.0); + }); }