From 0173abde8c09d0045e66b656397a0b4910b3aa58 Mon Sep 17 00:00:00 2001 From: aiongg <67543387+aiongg@users.noreply.github.com> Date: Fri, 23 Oct 2026 12:59:51 -0400 Subject: [PATCH] CI: dev-profile gate, one test binary per crate, nextest, line tables only (#2235) * Dev profile: line tables only for workspace crates, no debug info for dependencies * xtask ci: dev-profile gate, nextest, tests without examples, wasm --keep-going * One integration-test binary per crate * xtask ci: run effectcraft-gpu's shared-device tests in one cargo test process * xtask ci: run every stage and report all failures * xtask ci: name the stage type (clippy type_complexity) * xtask ci: run every test pass and report all failures * cargo fmt --- Cargo.toml | 3 + apps/effectcraft-cli/tests/{ => it}/cli.rs | 0 apps/effectcraft-cli/tests/it/main.rs | 4 + .../tests/{ => it}/qa_template.rs | 0 crates/av1enc/README.md | 4 +- crates/av1enc/tests/{ => it}/bench.rs | 4 +- crates/av1enc/tests/{ => it}/common/mod.rs | 0 crates/av1enc/tests/{ => it}/ffmpeg_oracle.rs | 2 +- crates/av1enc/tests/it/main.rs | 6 ++ crates/av1enc/tests/{ => it}/roundtrip.rs | 2 +- crates/effects/tests/{ => it}/gen_golden.rs | 0 crates/effects/tests/it/main.rs | 6 ++ .../effects/tests/{ => it}/particle_golden.rs | 0 crates/effects/tests/{ => it}/sim_golden.rs | 0 .../effects/tests/{ => it}/timewarp_golden.rs | 0 .../engine/src/tests_timeline_interchange.rs | 2 +- .../{ => it}/key_time_post_snap_bounds.rs | 0 .../tests/{ => it}/key_time_reply_contract.rs | 0 crates/engine/tests/it/main.rs | 5 ++ .../tests/{ => it}/parenting_3d_position.rs | 0 .../tests/{ => it}/audio_sample_positions.rs | 0 .../tests/{ => it}/hevc_av1_roundtrip.rs | 0 crates/export/tests/it/main.rs | 14 ++++ .../{ => it}/mov_audio_sample_positions.rs | 2 - .../tests/{ => it}/ms_rounded_footage.rs | 0 .../{ => it}/native_audio_sample_positions.rs | 2 - .../export/tests/{ => it}/opus_roundtrip.rs | 0 .../export/tests/{ => it}/render_settings.rs | 0 crates/export/tests/{ => it}/roundtrip.rs | 0 .../export/tests/{ => it}/uncompressed_mov.rs | 0 crates/export/tests/{ => it}/vp9_roundtrip.rs | 0 .../host/tests/{ => it}/background_presets.rs | 0 crates/host/tests/{ => it}/determinism.rs | 0 crates/host/tests/{ => it}/exr_layers.rs | 0 crates/host/tests/{ => it}/footage_reload.rs | 0 crates/host/tests/{ => it}/gif_animates.rs | 0 crates/host/tests/it/main.rs | 13 +++ crates/host/tests/{ => it}/plugins.rs | 0 crates/host/tests/{ => it}/relink.rs | 0 crates/host/tests/{ => it}/tga_import.rs | 0 .../host/tests/{ => it}/timeline_interop.rs | 0 crates/host/tests/{ => it}/vector_import.rs | 4 +- crates/host/tests/{ => it}/webm_metadata.rs | 0 crates/media/tests/{ => it}/downmix.rs | 0 .../media/tests/{ => it}/exif_orientation.rs | 0 crates/media/tests/{ => it}/footage.rs | 2 +- crates/media/tests/it/main.rs | 7 ++ crates/media/tests/{ => it}/open_in_place.rs | 0 crates/media/tests/{ => it}/tga.rs | 0 crates/opusenc/README.md | 2 +- crates/opusenc/tests/{ => it}/common/mod.rs | 0 crates/opusenc/tests/{ => it}/ffmpeg.rs | 2 +- crates/opusenc/tests/it/main.rs | 5 ++ crates/opusenc/tests/{ => it}/modes.rs | 2 +- crates/text/src/layout.rs | 10 ++- crates/text/tests/it/main.rs | 5 ++ crates/text/tests/{ => it}/script_fallback.rs | 0 .../text/tests/{ => it}/system_font_menu.rs | 0 .../tests/{ => it}/vertical_punctuation.rs | 0 crates/ui-egui/tests/it/main.rs | 83 +++++++++++++++++++ .../tests/{ => it}/render_queue_snapshot.rs | 2 +- .../tests/{ => it}/shared_docking_ui.rs | 0 crates/ui-egui/tests/{ => it}/ui_3d.rs | 2 +- .../ui-egui/tests/{ => it}/ui_agent_audit.rs | 0 crates/ui-egui/tests/{ => it}/ui_angles.rs | 0 .../ui-egui/tests/{ => it}/ui_audio_scrub.rs | 0 .../tests/{ => it}/ui_azerty_shortcuts.rs | 0 .../tests/{ => it}/ui_blank_context_menus.rs | 0 .../tests/{ => it}/ui_camera_tracker.rs | 0 .../tests/{ => it}/ui_character_eyedropper.rs | 0 crates/ui-egui/tests/{ => it}/ui_color_hex.rs | 0 .../ui-egui/tests/{ => it}/ui_comp_presets.rs | 0 .../tests/{ => it}/ui_control_modifiers.rs | 0 .../ui-egui/tests/{ => it}/ui_dock_resize.rs | 0 crates/ui-egui/tests/{ => it}/ui_drag_drop.rs | 0 .../tests/{ => it}/ui_effect_controls.rs | 0 .../{ => it}/ui_effect_drop_highlight.rs | 0 .../ui-egui/tests/{ => it}/ui_effect_names.rs | 0 .../ui-egui/tests/{ => it}/ui_font_search.rs | 0 crates/ui-egui/tests/{ => it}/ui_form_fit.rs | 0 .../ui-egui/tests/{ => it}/ui_frame_step.rs | 0 .../ui-egui/tests/{ => it}/ui_fx_editors.rs | 0 crates/ui-egui/tests/{ => it}/ui_gpu.rs | 0 .../tests/{ => it}/ui_gradient_editor.rs | 0 .../tests/{ => it}/ui_gradient_handles.rs | 0 .../tests/{ => it}/ui_gradient_value.rs | 0 crates/ui-egui/tests/{ => it}/ui_graph_fit.rs | 0 .../ui-egui/tests/{ => it}/ui_group_rename.rs | 0 .../ui-egui/tests/{ => it}/ui_guide_layers.rs | 0 .../ui-egui/tests/{ => it}/ui_inline_edit.rs | 0 crates/ui-egui/tests/{ => it}/ui_keyframes.rs | 0 .../tests/{ => it}/ui_large_project.rs | 0 .../tests/{ => it}/ui_layer_panel_zoom.rs | 0 .../ui-egui/tests/{ => it}/ui_live_preview.rs | 0 .../ui-egui/tests/{ => it}/ui_locked_color.rs | 0 .../tests/{ => it}/ui_media_browser_cache.rs | 0 .../{ => it}/ui_media_browser_copy_path.rs | 0 crates/ui-egui/tests/{ => it}/ui_menus.rs | 0 .../ui-egui/tests/{ => it}/ui_object_matte.rs | 0 .../ui-egui/tests/{ => it}/ui_panel_focus.rs | 0 .../tests/{ => it}/ui_panel_windows.rs | 0 crates/ui-egui/tests/{ => it}/ui_panels.rs | 2 +- .../tests/{ => it}/ui_parameter_spacing.rs | 0 .../tests/{ => it}/ui_presets_folder.rs | 0 .../tests/{ => it}/ui_preview_align.rs | 0 .../tests/{ => it}/ui_project_delete.rs | 0 .../tests/{ => it}/ui_project_keyboard.rs | 0 .../tests/{ => it}/ui_project_new_folder.rs | 0 .../ui-egui/tests/{ => it}/ui_project_rows.rs | 0 .../ui-egui/tests/{ => it}/ui_quick_offset.rs | 0 .../ui-egui/tests/{ => it}/ui_ram_preview.rs | 0 .../ui-egui/tests/{ => it}/ui_render_queue.rs | 0 .../tests/{ => it}/ui_script_console.rs | 2 +- crates/ui-egui/tests/{ => it}/ui_scriptui.rs | 0 crates/ui-egui/tests/{ => it}/ui_scrolling.rs | 0 .../tests/{ => it}/ui_settings_info.rs | 0 crates/ui-egui/tests/{ => it}/ui_tabs.rs | 2 +- crates/ui-egui/tests/{ => it}/ui_tail.rs | 0 crates/ui-egui/tests/{ => it}/ui_text_edit.rs | 0 .../tests/{ => it}/ui_text_range_handles.rs | 0 .../tests/{ => it}/ui_theme_favorites.rs | 0 .../tests/{ => it}/ui_time_zoom_controls.rs | 0 .../{ => it}/ui_timeline_effect_label.rs | 0 .../tests/{ => it}/ui_timeline_shapes.rs | 0 .../tests/{ => it}/ui_timeline_switches.rs | 0 .../tests/{ => it}/ui_timeline_trim.rs | 0 .../tests/{ => it}/ui_timeline_zoom.rs | 0 .../tests/{ => it}/ui_toolbar_gradient.rs | 0 crates/ui-egui/tests/{ => it}/ui_tracker.rs | 0 .../tests/{ => it}/ui_unreadable_footage.rs | 0 .../tests/{ => it}/ui_video_preview_off.rs | 0 crates/ui-egui/tests/{ => it}/ui_viewer.rs | 0 crates/ui-egui/tests/{ => it}/ui_viewers.rs | 2 +- .../tests/{ => it}/ui_visual_review.rs | 0 .../tests/{ => it}/ui_web_gpu_storage.rs | 0 .../ui-egui/tests/{ => it}/ui_web_job_gpu.rs | 0 .../ui-egui/tests/{ => it}/ui_web_offload.rs | 0 .../tests/{ => it}/ui_workflow_selection.rs | 0 .../tests/{ => it}/ui_workspace_focus.rs | 0 .../ui-egui/tests/{ => it}/viewer_geometry.rs | 0 .../tests/{ => it}/viewer_passive_display.rs | 0 docs/agents.md | 2 +- docs/control-protocol.md | 2 +- docs/fidelity/workflow-checks.md | 2 +- docs/target-app-parity.md | 4 +- docs/testing.md | 9 +- docs/web.md | 6 +- xtask/src/main.rs | 52 +++++++++--- 148 files changed, 237 insertions(+), 43 deletions(-) rename apps/effectcraft-cli/tests/{ => it}/cli.rs (100%) create mode 100644 apps/effectcraft-cli/tests/it/main.rs rename apps/effectcraft-cli/tests/{ => it}/qa_template.rs (100%) rename crates/av1enc/tests/{ => it}/bench.rs (97%) rename crates/av1enc/tests/{ => it}/common/mod.rs (100%) rename crates/av1enc/tests/{ => it}/ffmpeg_oracle.rs (99%) create mode 100644 crates/av1enc/tests/it/main.rs rename crates/av1enc/tests/{ => it}/roundtrip.rs (99%) rename crates/effects/tests/{ => it}/gen_golden.rs (100%) create mode 100644 crates/effects/tests/it/main.rs rename crates/effects/tests/{ => it}/particle_golden.rs (100%) rename crates/effects/tests/{ => it}/sim_golden.rs (100%) rename crates/effects/tests/{ => it}/timewarp_golden.rs (100%) rename crates/engine/tests/{ => it}/key_time_post_snap_bounds.rs (100%) rename crates/engine/tests/{ => it}/key_time_reply_contract.rs (100%) create mode 100644 crates/engine/tests/it/main.rs rename crates/engine/tests/{ => it}/parenting_3d_position.rs (100%) rename crates/export/tests/{ => it}/audio_sample_positions.rs (100%) rename crates/export/tests/{ => it}/hevc_av1_roundtrip.rs (100%) create mode 100644 crates/export/tests/it/main.rs rename crates/export/tests/{ => it}/mov_audio_sample_positions.rs (99%) rename crates/export/tests/{ => it}/ms_rounded_footage.rs (100%) rename crates/export/tests/{ => it}/native_audio_sample_positions.rs (99%) rename crates/export/tests/{ => it}/opus_roundtrip.rs (100%) rename crates/export/tests/{ => it}/render_settings.rs (100%) rename crates/export/tests/{ => it}/roundtrip.rs (100%) rename crates/export/tests/{ => it}/uncompressed_mov.rs (100%) rename crates/export/tests/{ => it}/vp9_roundtrip.rs (100%) rename crates/host/tests/{ => it}/background_presets.rs (100%) rename crates/host/tests/{ => it}/determinism.rs (100%) rename crates/host/tests/{ => it}/exr_layers.rs (100%) rename crates/host/tests/{ => it}/footage_reload.rs (100%) rename crates/host/tests/{ => it}/gif_animates.rs (100%) create mode 100644 crates/host/tests/it/main.rs rename crates/host/tests/{ => it}/plugins.rs (100%) rename crates/host/tests/{ => it}/relink.rs (100%) rename crates/host/tests/{ => it}/tga_import.rs (100%) rename crates/host/tests/{ => it}/timeline_interop.rs (100%) rename crates/host/tests/{ => it}/vector_import.rs (99%) rename crates/host/tests/{ => it}/webm_metadata.rs (100%) rename crates/media/tests/{ => it}/downmix.rs (100%) rename crates/media/tests/{ => it}/exif_orientation.rs (100%) rename crates/media/tests/{ => it}/footage.rs (99%) create mode 100644 crates/media/tests/it/main.rs rename crates/media/tests/{ => it}/open_in_place.rs (100%) rename crates/media/tests/{ => it}/tga.rs (100%) rename crates/opusenc/tests/{ => it}/common/mod.rs (100%) rename crates/opusenc/tests/{ => it}/ffmpeg.rs (99%) create mode 100644 crates/opusenc/tests/it/main.rs rename crates/opusenc/tests/{ => it}/modes.rs (99%) create mode 100644 crates/text/tests/it/main.rs rename crates/text/tests/{ => it}/script_fallback.rs (100%) rename crates/text/tests/{ => it}/system_font_menu.rs (100%) rename crates/text/tests/{ => it}/vertical_punctuation.rs (100%) create mode 100644 crates/ui-egui/tests/it/main.rs rename crates/ui-egui/tests/{ => it}/render_queue_snapshot.rs (98%) rename crates/ui-egui/tests/{ => it}/shared_docking_ui.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_3d.rs (99%) rename crates/ui-egui/tests/{ => it}/ui_agent_audit.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_angles.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_audio_scrub.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_azerty_shortcuts.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_blank_context_menus.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_camera_tracker.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_character_eyedropper.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_color_hex.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_comp_presets.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_control_modifiers.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_dock_resize.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_drag_drop.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_effect_controls.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_effect_drop_highlight.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_effect_names.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_font_search.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_form_fit.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_frame_step.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_fx_editors.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_gpu.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_gradient_editor.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_gradient_handles.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_gradient_value.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_graph_fit.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_group_rename.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_guide_layers.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_inline_edit.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_keyframes.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_large_project.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_layer_panel_zoom.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_live_preview.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_locked_color.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_media_browser_cache.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_media_browser_copy_path.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_menus.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_object_matte.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_panel_focus.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_panel_windows.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_panels.rs (99%) rename crates/ui-egui/tests/{ => it}/ui_parameter_spacing.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_presets_folder.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_preview_align.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_project_delete.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_project_keyboard.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_project_new_folder.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_project_rows.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_quick_offset.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_ram_preview.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_render_queue.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_script_console.rs (98%) rename crates/ui-egui/tests/{ => it}/ui_scriptui.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_scrolling.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_settings_info.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_tabs.rs (99%) rename crates/ui-egui/tests/{ => it}/ui_tail.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_text_edit.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_text_range_handles.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_theme_favorites.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_time_zoom_controls.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_timeline_effect_label.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_timeline_shapes.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_timeline_switches.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_timeline_trim.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_timeline_zoom.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_toolbar_gradient.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_tracker.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_unreadable_footage.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_video_preview_off.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_viewer.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_viewers.rs (98%) rename crates/ui-egui/tests/{ => it}/ui_visual_review.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_web_gpu_storage.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_web_job_gpu.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_web_offload.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_workflow_selection.rs (100%) rename crates/ui-egui/tests/{ => it}/ui_workspace_focus.rs (100%) rename crates/ui-egui/tests/{ => it}/viewer_geometry.rs (100%) rename crates/ui-egui/tests/{ => it}/viewer_passive_display.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index b1573fd7..d71d2933 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -139,9 +139,12 @@ type_complexity = "allow" [profile.dev.package."*"] opt-level = 2 +debug = false [profile.dev] opt-level = 1 +# Panics and backtraces keep file and line; full debug info only made the many test binaries large. +debug = "line-tables-only" # Pixel hot loops: keep debug builds interactive. [profile.dev.package.effectcraft-raster] diff --git a/apps/effectcraft-cli/tests/cli.rs b/apps/effectcraft-cli/tests/it/cli.rs similarity index 100% rename from apps/effectcraft-cli/tests/cli.rs rename to apps/effectcraft-cli/tests/it/cli.rs diff --git a/apps/effectcraft-cli/tests/it/main.rs b/apps/effectcraft-cli/tests/it/main.rs new file mode 100644 index 00000000..17149f54 --- /dev/null +++ b/apps/effectcraft-cli/tests/it/main.rs @@ -0,0 +1,4 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod cli; +mod qa_template; diff --git a/apps/effectcraft-cli/tests/qa_template.rs b/apps/effectcraft-cli/tests/it/qa_template.rs similarity index 100% rename from apps/effectcraft-cli/tests/qa_template.rs rename to apps/effectcraft-cli/tests/it/qa_template.rs diff --git a/crates/av1enc/README.md b/crates/av1enc/README.md index 6ced20ba..c922c95e 100644 --- a/crates/av1enc/README.md +++ b/crates/av1enc/README.md @@ -4,8 +4,8 @@ Clean-room, pure-Rust AV1 encoder for EffectCraft's MP4 / WebM export (layer L0, no `unsafe`, builds for `wasm32-unknown-unknown`). Output is decoded **bit-exactly** by libdav1d (`ffmpeg -c:v libdav1d`, checked in -`tests/ffmpeg_oracle.rs` when ffmpeg is installed) and by FilmCraft's spec-derived -`filmcraft-av1` decoder (`tests/roundtrip.rs`): every decoded frame equals the encoder's own +`tests/it/ffmpeg_oracle.rs` when ffmpeg is installed) and by FilmCraft's spec-derived +`filmcraft-av1` decoder (`tests/it/roundtrip.rs`): every decoded frame equals the encoder's own reconstruction, so prediction never drifts. ## What is implemented diff --git a/crates/av1enc/tests/bench.rs b/crates/av1enc/tests/it/bench.rs similarity index 97% rename from crates/av1enc/tests/bench.rs rename to crates/av1enc/tests/it/bench.rs index 6577f8f9..b29817e1 100644 --- a/crates/av1enc/tests/bench.rs +++ b/crates/av1enc/tests/it/bench.rs @@ -1,7 +1,7 @@ //! Speed / efficiency measurements on ffmpeg-generated test sources (ignored by default): -//! `cargo test -p effectcraft-av1enc --test bench -- --ignored --nocapture`. +//! `cargo test -p effectcraft-av1enc --test it bench:: -- --ignored --nocapture`. -mod common; +use crate::common; use std::process::Command; use std::time::Instant; diff --git a/crates/av1enc/tests/common/mod.rs b/crates/av1enc/tests/it/common/mod.rs similarity index 100% rename from crates/av1enc/tests/common/mod.rs rename to crates/av1enc/tests/it/common/mod.rs diff --git a/crates/av1enc/tests/ffmpeg_oracle.rs b/crates/av1enc/tests/it/ffmpeg_oracle.rs similarity index 99% rename from crates/av1enc/tests/ffmpeg_oracle.rs rename to crates/av1enc/tests/it/ffmpeg_oracle.rs index 66f380ac..b35cbf49 100644 --- a/crates/av1enc/tests/ffmpeg_oracle.rs +++ b/crates/av1enc/tests/it/ffmpeg_oracle.rs @@ -2,7 +2,7 @@ //! bit for bit. Skipped when `ffmpeg` (with libdav1d) is not installed. ffmpeg's native `av1` //! decoder only drives hardware decoders, so it is not used. -mod common; +use crate::common; use std::process::Command; diff --git a/crates/av1enc/tests/it/main.rs b/crates/av1enc/tests/it/main.rs new file mode 100644 index 00000000..c66bacde --- /dev/null +++ b/crates/av1enc/tests/it/main.rs @@ -0,0 +1,6 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod bench; +mod common; +mod ffmpeg_oracle; +mod roundtrip; diff --git a/crates/av1enc/tests/roundtrip.rs b/crates/av1enc/tests/it/roundtrip.rs similarity index 99% rename from crates/av1enc/tests/roundtrip.rs rename to crates/av1enc/tests/it/roundtrip.rs index 1e777e50..282880e0 100644 --- a/crates/av1enc/tests/roundtrip.rs +++ b/crates/av1enc/tests/it/roundtrip.rs @@ -1,7 +1,7 @@ //! Round trips through FilmCraft's spec-derived AV1 decoder: decoded frames must equal the //! encoder's own reconstruction bit for bit. -mod common; +use crate::common; use common::*; use effectcraft_av1enc::{EncoderConfig, RateControl}; diff --git a/crates/effects/tests/gen_golden.rs b/crates/effects/tests/it/gen_golden.rs similarity index 100% rename from crates/effects/tests/gen_golden.rs rename to crates/effects/tests/it/gen_golden.rs diff --git a/crates/effects/tests/it/main.rs b/crates/effects/tests/it/main.rs new file mode 100644 index 00000000..7b12e25c --- /dev/null +++ b/crates/effects/tests/it/main.rs @@ -0,0 +1,6 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod gen_golden; +mod particle_golden; +mod sim_golden; +mod timewarp_golden; diff --git a/crates/effects/tests/particle_golden.rs b/crates/effects/tests/it/particle_golden.rs similarity index 100% rename from crates/effects/tests/particle_golden.rs rename to crates/effects/tests/it/particle_golden.rs diff --git a/crates/effects/tests/sim_golden.rs b/crates/effects/tests/it/sim_golden.rs similarity index 100% rename from crates/effects/tests/sim_golden.rs rename to crates/effects/tests/it/sim_golden.rs diff --git a/crates/effects/tests/timewarp_golden.rs b/crates/effects/tests/it/timewarp_golden.rs similarity index 100% rename from crates/effects/tests/timewarp_golden.rs rename to crates/effects/tests/it/timewarp_golden.rs diff --git a/crates/engine/src/tests_timeline_interchange.rs b/crates/engine/src/tests_timeline_interchange.rs index b32e19c4..45be0f7a 100644 --- a/crates/engine/src/tests_timeline_interchange.rs +++ b/crates/engine/src/tests_timeline_interchange.rs @@ -1,5 +1,5 @@ //! File ▸ Import / Export ▸ Adobe Premiere Pro Project… (timeline interchange) through the command -//! registry, without media decoding (pixels: `crates/host/tests/timeline_interop.rs`). +//! registry, without media decoding (pixels: `crates/host/tests/it/timeline_interop.rs`). use serde_json::json; diff --git a/crates/engine/tests/key_time_post_snap_bounds.rs b/crates/engine/tests/it/key_time_post_snap_bounds.rs similarity index 100% rename from crates/engine/tests/key_time_post_snap_bounds.rs rename to crates/engine/tests/it/key_time_post_snap_bounds.rs diff --git a/crates/engine/tests/key_time_reply_contract.rs b/crates/engine/tests/it/key_time_reply_contract.rs similarity index 100% rename from crates/engine/tests/key_time_reply_contract.rs rename to crates/engine/tests/it/key_time_reply_contract.rs diff --git a/crates/engine/tests/it/main.rs b/crates/engine/tests/it/main.rs new file mode 100644 index 00000000..ac1484cf --- /dev/null +++ b/crates/engine/tests/it/main.rs @@ -0,0 +1,5 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod key_time_post_snap_bounds; +mod key_time_reply_contract; +mod parenting_3d_position; diff --git a/crates/engine/tests/parenting_3d_position.rs b/crates/engine/tests/it/parenting_3d_position.rs similarity index 100% rename from crates/engine/tests/parenting_3d_position.rs rename to crates/engine/tests/it/parenting_3d_position.rs diff --git a/crates/export/tests/audio_sample_positions.rs b/crates/export/tests/it/audio_sample_positions.rs similarity index 100% rename from crates/export/tests/audio_sample_positions.rs rename to crates/export/tests/it/audio_sample_positions.rs diff --git a/crates/export/tests/hevc_av1_roundtrip.rs b/crates/export/tests/it/hevc_av1_roundtrip.rs similarity index 100% rename from crates/export/tests/hevc_av1_roundtrip.rs rename to crates/export/tests/it/hevc_av1_roundtrip.rs diff --git a/crates/export/tests/it/main.rs b/crates/export/tests/it/main.rs new file mode 100644 index 00000000..0f89a641 --- /dev/null +++ b/crates/export/tests/it/main.rs @@ -0,0 +1,14 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod audio_sample_positions; +mod hevc_av1_roundtrip; +#[cfg(not(target_arch = "wasm32"))] +mod mov_audio_sample_positions; +mod ms_rounded_footage; +#[cfg(not(target_arch = "wasm32"))] +mod native_audio_sample_positions; +mod opus_roundtrip; +mod render_settings; +mod roundtrip; +mod uncompressed_mov; +mod vp9_roundtrip; diff --git a/crates/export/tests/mov_audio_sample_positions.rs b/crates/export/tests/it/mov_audio_sample_positions.rs similarity index 99% rename from crates/export/tests/mov_audio_sample_positions.rs rename to crates/export/tests/it/mov_audio_sample_positions.rs index c58d2b14..a46a4927 100644 --- a/crates/export/tests/mov_audio_sample_positions.rs +++ b/crates/export/tests/it/mov_audio_sample_positions.rs @@ -1,5 +1,3 @@ -#![cfg(not(target_arch = "wasm32"))] - //! Tiny native WAV to ProRes PCM MOV sample-position proof. use effectcraft_export::render_queue::{AudioFormat, OutputFormat, OutputModule, RenderSettings}; use effectcraft_export::{Job, JobOptions, Sink, export}; diff --git a/crates/export/tests/ms_rounded_footage.rs b/crates/export/tests/it/ms_rounded_footage.rs similarity index 100% rename from crates/export/tests/ms_rounded_footage.rs rename to crates/export/tests/it/ms_rounded_footage.rs diff --git a/crates/export/tests/native_audio_sample_positions.rs b/crates/export/tests/it/native_audio_sample_positions.rs similarity index 99% rename from crates/export/tests/native_audio_sample_positions.rs rename to crates/export/tests/it/native_audio_sample_positions.rs index 1b59e8c1..9222d0f2 100644 --- a/crates/export/tests/native_audio_sample_positions.rs +++ b/crates/export/tests/it/native_audio_sample_positions.rs @@ -1,5 +1,3 @@ -#![cfg(not(target_arch = "wasm32"))] - //! Native MediaPool decoding and native WAV export preserve selected sample positions. use effectcraft_export::render_queue::{AudioFormat, OutputFormat, OutputModule, RenderSettings}; use effectcraft_export::{Job, JobOptions, Sink, export}; diff --git a/crates/export/tests/opus_roundtrip.rs b/crates/export/tests/it/opus_roundtrip.rs similarity index 100% rename from crates/export/tests/opus_roundtrip.rs rename to crates/export/tests/it/opus_roundtrip.rs diff --git a/crates/export/tests/render_settings.rs b/crates/export/tests/it/render_settings.rs similarity index 100% rename from crates/export/tests/render_settings.rs rename to crates/export/tests/it/render_settings.rs diff --git a/crates/export/tests/roundtrip.rs b/crates/export/tests/it/roundtrip.rs similarity index 100% rename from crates/export/tests/roundtrip.rs rename to crates/export/tests/it/roundtrip.rs diff --git a/crates/export/tests/uncompressed_mov.rs b/crates/export/tests/it/uncompressed_mov.rs similarity index 100% rename from crates/export/tests/uncompressed_mov.rs rename to crates/export/tests/it/uncompressed_mov.rs diff --git a/crates/export/tests/vp9_roundtrip.rs b/crates/export/tests/it/vp9_roundtrip.rs similarity index 100% rename from crates/export/tests/vp9_roundtrip.rs rename to crates/export/tests/it/vp9_roundtrip.rs diff --git a/crates/host/tests/background_presets.rs b/crates/host/tests/it/background_presets.rs similarity index 100% rename from crates/host/tests/background_presets.rs rename to crates/host/tests/it/background_presets.rs diff --git a/crates/host/tests/determinism.rs b/crates/host/tests/it/determinism.rs similarity index 100% rename from crates/host/tests/determinism.rs rename to crates/host/tests/it/determinism.rs diff --git a/crates/host/tests/exr_layers.rs b/crates/host/tests/it/exr_layers.rs similarity index 100% rename from crates/host/tests/exr_layers.rs rename to crates/host/tests/it/exr_layers.rs diff --git a/crates/host/tests/footage_reload.rs b/crates/host/tests/it/footage_reload.rs similarity index 100% rename from crates/host/tests/footage_reload.rs rename to crates/host/tests/it/footage_reload.rs diff --git a/crates/host/tests/gif_animates.rs b/crates/host/tests/it/gif_animates.rs similarity index 100% rename from crates/host/tests/gif_animates.rs rename to crates/host/tests/it/gif_animates.rs diff --git a/crates/host/tests/it/main.rs b/crates/host/tests/it/main.rs new file mode 100644 index 00000000..575ae946 --- /dev/null +++ b/crates/host/tests/it/main.rs @@ -0,0 +1,13 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod background_presets; +mod determinism; +mod exr_layers; +mod footage_reload; +mod gif_animates; +mod plugins; +mod relink; +mod tga_import; +mod timeline_interop; +mod vector_import; +mod webm_metadata; diff --git a/crates/host/tests/plugins.rs b/crates/host/tests/it/plugins.rs similarity index 100% rename from crates/host/tests/plugins.rs rename to crates/host/tests/it/plugins.rs diff --git a/crates/host/tests/relink.rs b/crates/host/tests/it/relink.rs similarity index 100% rename from crates/host/tests/relink.rs rename to crates/host/tests/it/relink.rs diff --git a/crates/host/tests/tga_import.rs b/crates/host/tests/it/tga_import.rs similarity index 100% rename from crates/host/tests/tga_import.rs rename to crates/host/tests/it/tga_import.rs diff --git a/crates/host/tests/timeline_interop.rs b/crates/host/tests/it/timeline_interop.rs similarity index 100% rename from crates/host/tests/timeline_interop.rs rename to crates/host/tests/it/timeline_interop.rs diff --git a/crates/host/tests/vector_import.rs b/crates/host/tests/it/vector_import.rs similarity index 99% rename from crates/host/tests/vector_import.rs rename to crates/host/tests/it/vector_import.rs index 49f8d950..36d83dd1 100644 --- a/crates/host/tests/vector_import.rs +++ b/crates/host/tests/it/vector_import.rs @@ -121,8 +121,8 @@ fn psd_16bit_cmyk_composition_imports() { assert!(d < 2.0 / 255.0, "mean diff {d}"); } -const SVG: &[u8] = include_bytes!("../../svg/tests/fixtures/basic-shapes.svg"); -const SVG2: &[u8] = include_bytes!("../../svg/tests/fixtures/paths-gradients.svg"); +const SVG: &[u8] = include_bytes!("../../../svg/tests/fixtures/basic-shapes.svg"); +const SVG2: &[u8] = include_bytes!("../../../svg/tests/fixtures/paths-gradients.svg"); #[test] fn svg_footage_and_shapes_from_vector_layer() { diff --git a/crates/host/tests/webm_metadata.rs b/crates/host/tests/it/webm_metadata.rs similarity index 100% rename from crates/host/tests/webm_metadata.rs rename to crates/host/tests/it/webm_metadata.rs diff --git a/crates/media/tests/downmix.rs b/crates/media/tests/it/downmix.rs similarity index 100% rename from crates/media/tests/downmix.rs rename to crates/media/tests/it/downmix.rs diff --git a/crates/media/tests/exif_orientation.rs b/crates/media/tests/it/exif_orientation.rs similarity index 100% rename from crates/media/tests/exif_orientation.rs rename to crates/media/tests/it/exif_orientation.rs diff --git a/crates/media/tests/footage.rs b/crates/media/tests/it/footage.rs similarity index 99% rename from crates/media/tests/footage.rs rename to crates/media/tests/it/footage.rs index 8fbd6e97..9b1baa8b 100644 --- a/crates/media/tests/footage.rs +++ b/crates/media/tests/it/footage.rs @@ -837,7 +837,7 @@ fn flac_audio_of_any_shape_reads_in_device_blocks() { } // ffmpeg's sine source has an amplitude of 1/8 (mono is duplicated). The fixture carries // channels 0 and 1 at full level and the others at half, so a multichannel file sounds as - // its stereo downmix (tests/downmix.rs checks that matrix channel by channel). + // its stereo downmix (tests/it/downmix.rs checks that matrix channel by channel). let gains = effectcraft_media::downmix::stereo_gains(channels as usize, false); let side = |s: usize| gains.iter().enumerate().map(|(c, g)| f64::from(g[s]) * if c < 2 { 1.0 } else { 0.5 }).sum::(); let want = 0.125 * ((side(0).powi(2) + side(1).powi(2)) / 2.0).sqrt() / 2f64.sqrt(); diff --git a/crates/media/tests/it/main.rs b/crates/media/tests/it/main.rs new file mode 100644 index 00000000..5f7fb803 --- /dev/null +++ b/crates/media/tests/it/main.rs @@ -0,0 +1,7 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod downmix; +mod exif_orientation; +mod footage; +mod open_in_place; +mod tga; diff --git a/crates/media/tests/open_in_place.rs b/crates/media/tests/it/open_in_place.rs similarity index 100% rename from crates/media/tests/open_in_place.rs rename to crates/media/tests/it/open_in_place.rs diff --git a/crates/media/tests/tga.rs b/crates/media/tests/it/tga.rs similarity index 100% rename from crates/media/tests/tga.rs rename to crates/media/tests/it/tga.rs diff --git a/crates/opusenc/README.md b/crates/opusenc/README.md index 999d8a7e..1ebf6fed 100644 --- a/crates/opusenc/README.md +++ b/crates/opusenc/README.md @@ -130,7 +130,7 @@ weights) and the decoder-side normative arithmetic the encoder must reproduce bi allocation; SILK NLSF dequantisation and stabilisation, NLSF → LPC conversion, `log2lin`, the fixed-point division/inverse helpers and the LPC analysis filter) are mirrored from FilmCraft's first-party, spec-derived `filmcraft-opus` decoder (MIT OR Apache-2.0), which is also the -round-trip oracle in `tests/` and `crates/export/tests/opus_roundtrip.rs` (ffmpeg is a second, +round-trip oracle in `tests/` and `crates/export/tests/it/opus_roundtrip.rs` (ffmpeg is a second, external oracle when installed). All encoder-side analysis and search (pitch, LPC, NLSF and LTP search, noise feedback, rate control, stereo prediction, the decimator) is our own design. No third-party encoder or decoder source (libopus or otherwise) was consulted. diff --git a/crates/opusenc/tests/common/mod.rs b/crates/opusenc/tests/it/common/mod.rs similarity index 100% rename from crates/opusenc/tests/common/mod.rs rename to crates/opusenc/tests/it/common/mod.rs diff --git a/crates/opusenc/tests/ffmpeg.rs b/crates/opusenc/tests/it/ffmpeg.rs similarity index 99% rename from crates/opusenc/tests/ffmpeg.rs rename to crates/opusenc/tests/it/ffmpeg.rs index fcbb8c8a..1294ed34 100644 --- a/crates/opusenc/tests/ffmpeg.rs +++ b/crates/opusenc/tests/it/ffmpeg.rs @@ -2,7 +2,7 @@ //! without errors with both ffmpeg's native `opus` decoder and `libopus`, honour the pre-skip //! and end granule, and reproduce the input. Skipped when ffmpeg is not installed. -mod common; +use crate::common; use std::process::Command; diff --git a/crates/opusenc/tests/it/main.rs b/crates/opusenc/tests/it/main.rs new file mode 100644 index 00000000..ba6a7895 --- /dev/null +++ b/crates/opusenc/tests/it/main.rs @@ -0,0 +1,5 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod common; +mod ffmpeg; +mod modes; diff --git a/crates/opusenc/tests/modes.rs b/crates/opusenc/tests/it/modes.rs similarity index 99% rename from crates/opusenc/tests/modes.rs rename to crates/opusenc/tests/it/modes.rs index 843cf3d9..c01f64e6 100644 --- a/crates/opusenc/tests/modes.rs +++ b/crates/opusenc/tests/it/modes.rs @@ -2,7 +2,7 @@ //! mode/bandwidth decodes, waveform quality on speech-like and music-like signals, bitrate //! tracking, stereo, the application tables and delay alignment. -mod common; +use crate::common; use common::*; use effectcraft_opusenc::{Application, Bandwidth, Mode, OpusEncoder}; diff --git a/crates/text/src/layout.rs b/crates/text/src/layout.rs index 8f692888..7ca5bd13 100644 --- a/crates/text/src/layout.rs +++ b/crates/text/src/layout.rs @@ -597,7 +597,15 @@ fn run_at(runs: &[(Range, TextStyle)], b: usize) -> usize { } /// Lay out one paragraph (no newlines) whose text starts at byte `base` of the whole string. -fn paragraph(text: &str, base: usize, runs: &[(Range, TextStyle)], primaries: &[Resolved], variation_ids: &[u32], para: &ParagraphStyle, width: Option) -> Vec { +fn paragraph( + text: &str, + base: usize, + runs: &[(Range, TextStyle)], + primaries: &[Resolved], + variation_ids: &[u32], + para: &ParagraphStyle, + width: Option, +) -> Vec { let rtl_para = para.rtl == Some(true); let margins_for = |first: bool| -> (f32, f32) { let fi = if first { para.indent_first } else { 0.0 }; diff --git a/crates/text/tests/it/main.rs b/crates/text/tests/it/main.rs new file mode 100644 index 00000000..1319b7d5 --- /dev/null +++ b/crates/text/tests/it/main.rs @@ -0,0 +1,5 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod script_fallback; +mod system_font_menu; +mod vertical_punctuation; diff --git a/crates/text/tests/script_fallback.rs b/crates/text/tests/it/script_fallback.rs similarity index 100% rename from crates/text/tests/script_fallback.rs rename to crates/text/tests/it/script_fallback.rs diff --git a/crates/text/tests/system_font_menu.rs b/crates/text/tests/it/system_font_menu.rs similarity index 100% rename from crates/text/tests/system_font_menu.rs rename to crates/text/tests/it/system_font_menu.rs diff --git a/crates/text/tests/vertical_punctuation.rs b/crates/text/tests/it/vertical_punctuation.rs similarity index 100% rename from crates/text/tests/vertical_punctuation.rs rename to crates/text/tests/it/vertical_punctuation.rs diff --git a/crates/ui-egui/tests/it/main.rs b/crates/ui-egui/tests/it/main.rs new file mode 100644 index 00000000..630d865b --- /dev/null +++ b/crates/ui-egui/tests/it/main.rs @@ -0,0 +1,83 @@ +//! The crate's integration tests, one binary (each module is a former `tests/.rs`). + +mod render_queue_snapshot; +mod shared_docking_ui; +mod ui_3d; +mod ui_agent_audit; +mod ui_angles; +mod ui_audio_scrub; +mod ui_azerty_shortcuts; +mod ui_blank_context_menus; +mod ui_camera_tracker; +mod ui_character_eyedropper; +mod ui_color_hex; +mod ui_comp_presets; +mod ui_control_modifiers; +mod ui_dock_resize; +mod ui_drag_drop; +mod ui_effect_controls; +mod ui_effect_drop_highlight; +mod ui_effect_names; +mod ui_font_search; +mod ui_form_fit; +mod ui_frame_step; +mod ui_fx_editors; +mod ui_gpu; +mod ui_gradient_editor; +mod ui_gradient_handles; +mod ui_gradient_value; +mod ui_graph_fit; +mod ui_group_rename; +mod ui_guide_layers; +mod ui_inline_edit; +mod ui_keyframes; +mod ui_large_project; +mod ui_layer_panel_zoom; +mod ui_live_preview; +mod ui_locked_color; +mod ui_media_browser_cache; +mod ui_media_browser_copy_path; +mod ui_menus; +mod ui_object_matte; +mod ui_panel_focus; +mod ui_panel_windows; +mod ui_panels; +mod ui_parameter_spacing; +mod ui_presets_folder; +mod ui_preview_align; +mod ui_project_delete; +mod ui_project_keyboard; +mod ui_project_new_folder; +mod ui_project_rows; +mod ui_quick_offset; +mod ui_ram_preview; +mod ui_render_queue; +mod ui_script_console; +mod ui_scriptui; +mod ui_scrolling; +mod ui_settings_info; +mod ui_tabs; +mod ui_tail; +mod ui_text_edit; +mod ui_text_range_handles; +mod ui_theme_favorites; +mod ui_time_zoom_controls; +mod ui_timeline_effect_label; +mod ui_timeline_shapes; +mod ui_timeline_switches; +mod ui_timeline_trim; +mod ui_timeline_zoom; +mod ui_toolbar_gradient; +mod ui_tracker; +mod ui_unreadable_footage; +mod ui_video_preview_off; +mod ui_viewer; +mod ui_viewers; +mod ui_visual_review; +mod ui_web_gpu_storage; +mod ui_web_job_gpu; +mod ui_web_offload; +mod ui_workflow_selection; +mod ui_workspace_focus; +mod viewer_geometry; +mod viewer_passive_display; diff --git a/crates/ui-egui/tests/render_queue_snapshot.rs b/crates/ui-egui/tests/it/render_queue_snapshot.rs similarity index 98% rename from crates/ui-egui/tests/render_queue_snapshot.rs rename to crates/ui-egui/tests/it/render_queue_snapshot.rs index 41ce13d2..702421ca 100644 --- a/crates/ui-egui/tests/render_queue_snapshot.rs +++ b/crates/ui-egui/tests/it/render_queue_snapshot.rs @@ -1,6 +1,6 @@ //! Headless look at the Render Queue panel (wgpu offscreen). Ignored by default (needs a GPU //! adapter); run with -//! `RQ_SNAPSHOT=/abs/out.png cargo test -p effectcraft-ui-egui --test render_queue_snapshot -- --ignored`. +//! `RQ_SNAPSHOT=/abs/out.png cargo test -p effectcraft-ui-egui --test it render_queue_snapshot:: -- --ignored`. use effectcraft_engine::Session; use effectcraft_engine::project::render_queue::RenderStatus; diff --git a/crates/ui-egui/tests/shared_docking_ui.rs b/crates/ui-egui/tests/it/shared_docking_ui.rs similarity index 100% rename from crates/ui-egui/tests/shared_docking_ui.rs rename to crates/ui-egui/tests/it/shared_docking_ui.rs diff --git a/crates/ui-egui/tests/ui_3d.rs b/crates/ui-egui/tests/it/ui_3d.rs similarity index 99% rename from crates/ui-egui/tests/ui_3d.rs rename to crates/ui-egui/tests/it/ui_3d.rs index 223d9960..a654f745 100644 --- a/crates/ui-egui/tests/ui_3d.rs +++ b/crates/ui-egui/tests/it/ui_3d.rs @@ -1,6 +1,6 @@ //! Headless UI checks for the 3D viewer (egui_kittest). The `snapshot` test renders the window //! with wgpu and writes PNGs when `EC_SNAPSHOT_DIR` is set (`cargo test -p effectcraft-ui-egui -//! --test ui_3d -- --ignored`); the other test only runs the UI logic. +//! --test it ui_3d:: -- --ignored`); the other test only runs the UI logic. use effectcraft_engine::Session; use effectcraft_engine::render::three_d::View3D; diff --git a/crates/ui-egui/tests/ui_agent_audit.rs b/crates/ui-egui/tests/it/ui_agent_audit.rs similarity index 100% rename from crates/ui-egui/tests/ui_agent_audit.rs rename to crates/ui-egui/tests/it/ui_agent_audit.rs diff --git a/crates/ui-egui/tests/ui_angles.rs b/crates/ui-egui/tests/it/ui_angles.rs similarity index 100% rename from crates/ui-egui/tests/ui_angles.rs rename to crates/ui-egui/tests/it/ui_angles.rs diff --git a/crates/ui-egui/tests/ui_audio_scrub.rs b/crates/ui-egui/tests/it/ui_audio_scrub.rs similarity index 100% rename from crates/ui-egui/tests/ui_audio_scrub.rs rename to crates/ui-egui/tests/it/ui_audio_scrub.rs diff --git a/crates/ui-egui/tests/ui_azerty_shortcuts.rs b/crates/ui-egui/tests/it/ui_azerty_shortcuts.rs similarity index 100% rename from crates/ui-egui/tests/ui_azerty_shortcuts.rs rename to crates/ui-egui/tests/it/ui_azerty_shortcuts.rs diff --git a/crates/ui-egui/tests/ui_blank_context_menus.rs b/crates/ui-egui/tests/it/ui_blank_context_menus.rs similarity index 100% rename from crates/ui-egui/tests/ui_blank_context_menus.rs rename to crates/ui-egui/tests/it/ui_blank_context_menus.rs diff --git a/crates/ui-egui/tests/ui_camera_tracker.rs b/crates/ui-egui/tests/it/ui_camera_tracker.rs similarity index 100% rename from crates/ui-egui/tests/ui_camera_tracker.rs rename to crates/ui-egui/tests/it/ui_camera_tracker.rs diff --git a/crates/ui-egui/tests/ui_character_eyedropper.rs b/crates/ui-egui/tests/it/ui_character_eyedropper.rs similarity index 100% rename from crates/ui-egui/tests/ui_character_eyedropper.rs rename to crates/ui-egui/tests/it/ui_character_eyedropper.rs diff --git a/crates/ui-egui/tests/ui_color_hex.rs b/crates/ui-egui/tests/it/ui_color_hex.rs similarity index 100% rename from crates/ui-egui/tests/ui_color_hex.rs rename to crates/ui-egui/tests/it/ui_color_hex.rs diff --git a/crates/ui-egui/tests/ui_comp_presets.rs b/crates/ui-egui/tests/it/ui_comp_presets.rs similarity index 100% rename from crates/ui-egui/tests/ui_comp_presets.rs rename to crates/ui-egui/tests/it/ui_comp_presets.rs diff --git a/crates/ui-egui/tests/ui_control_modifiers.rs b/crates/ui-egui/tests/it/ui_control_modifiers.rs similarity index 100% rename from crates/ui-egui/tests/ui_control_modifiers.rs rename to crates/ui-egui/tests/it/ui_control_modifiers.rs diff --git a/crates/ui-egui/tests/ui_dock_resize.rs b/crates/ui-egui/tests/it/ui_dock_resize.rs similarity index 100% rename from crates/ui-egui/tests/ui_dock_resize.rs rename to crates/ui-egui/tests/it/ui_dock_resize.rs diff --git a/crates/ui-egui/tests/ui_drag_drop.rs b/crates/ui-egui/tests/it/ui_drag_drop.rs similarity index 100% rename from crates/ui-egui/tests/ui_drag_drop.rs rename to crates/ui-egui/tests/it/ui_drag_drop.rs diff --git a/crates/ui-egui/tests/ui_effect_controls.rs b/crates/ui-egui/tests/it/ui_effect_controls.rs similarity index 100% rename from crates/ui-egui/tests/ui_effect_controls.rs rename to crates/ui-egui/tests/it/ui_effect_controls.rs diff --git a/crates/ui-egui/tests/ui_effect_drop_highlight.rs b/crates/ui-egui/tests/it/ui_effect_drop_highlight.rs similarity index 100% rename from crates/ui-egui/tests/ui_effect_drop_highlight.rs rename to crates/ui-egui/tests/it/ui_effect_drop_highlight.rs diff --git a/crates/ui-egui/tests/ui_effect_names.rs b/crates/ui-egui/tests/it/ui_effect_names.rs similarity index 100% rename from crates/ui-egui/tests/ui_effect_names.rs rename to crates/ui-egui/tests/it/ui_effect_names.rs diff --git a/crates/ui-egui/tests/ui_font_search.rs b/crates/ui-egui/tests/it/ui_font_search.rs similarity index 100% rename from crates/ui-egui/tests/ui_font_search.rs rename to crates/ui-egui/tests/it/ui_font_search.rs diff --git a/crates/ui-egui/tests/ui_form_fit.rs b/crates/ui-egui/tests/it/ui_form_fit.rs similarity index 100% rename from crates/ui-egui/tests/ui_form_fit.rs rename to crates/ui-egui/tests/it/ui_form_fit.rs diff --git a/crates/ui-egui/tests/ui_frame_step.rs b/crates/ui-egui/tests/it/ui_frame_step.rs similarity index 100% rename from crates/ui-egui/tests/ui_frame_step.rs rename to crates/ui-egui/tests/it/ui_frame_step.rs diff --git a/crates/ui-egui/tests/ui_fx_editors.rs b/crates/ui-egui/tests/it/ui_fx_editors.rs similarity index 100% rename from crates/ui-egui/tests/ui_fx_editors.rs rename to crates/ui-egui/tests/it/ui_fx_editors.rs diff --git a/crates/ui-egui/tests/ui_gpu.rs b/crates/ui-egui/tests/it/ui_gpu.rs similarity index 100% rename from crates/ui-egui/tests/ui_gpu.rs rename to crates/ui-egui/tests/it/ui_gpu.rs diff --git a/crates/ui-egui/tests/ui_gradient_editor.rs b/crates/ui-egui/tests/it/ui_gradient_editor.rs similarity index 100% rename from crates/ui-egui/tests/ui_gradient_editor.rs rename to crates/ui-egui/tests/it/ui_gradient_editor.rs diff --git a/crates/ui-egui/tests/ui_gradient_handles.rs b/crates/ui-egui/tests/it/ui_gradient_handles.rs similarity index 100% rename from crates/ui-egui/tests/ui_gradient_handles.rs rename to crates/ui-egui/tests/it/ui_gradient_handles.rs diff --git a/crates/ui-egui/tests/ui_gradient_value.rs b/crates/ui-egui/tests/it/ui_gradient_value.rs similarity index 100% rename from crates/ui-egui/tests/ui_gradient_value.rs rename to crates/ui-egui/tests/it/ui_gradient_value.rs diff --git a/crates/ui-egui/tests/ui_graph_fit.rs b/crates/ui-egui/tests/it/ui_graph_fit.rs similarity index 100% rename from crates/ui-egui/tests/ui_graph_fit.rs rename to crates/ui-egui/tests/it/ui_graph_fit.rs diff --git a/crates/ui-egui/tests/ui_group_rename.rs b/crates/ui-egui/tests/it/ui_group_rename.rs similarity index 100% rename from crates/ui-egui/tests/ui_group_rename.rs rename to crates/ui-egui/tests/it/ui_group_rename.rs diff --git a/crates/ui-egui/tests/ui_guide_layers.rs b/crates/ui-egui/tests/it/ui_guide_layers.rs similarity index 100% rename from crates/ui-egui/tests/ui_guide_layers.rs rename to crates/ui-egui/tests/it/ui_guide_layers.rs diff --git a/crates/ui-egui/tests/ui_inline_edit.rs b/crates/ui-egui/tests/it/ui_inline_edit.rs similarity index 100% rename from crates/ui-egui/tests/ui_inline_edit.rs rename to crates/ui-egui/tests/it/ui_inline_edit.rs diff --git a/crates/ui-egui/tests/ui_keyframes.rs b/crates/ui-egui/tests/it/ui_keyframes.rs similarity index 100% rename from crates/ui-egui/tests/ui_keyframes.rs rename to crates/ui-egui/tests/it/ui_keyframes.rs diff --git a/crates/ui-egui/tests/ui_large_project.rs b/crates/ui-egui/tests/it/ui_large_project.rs similarity index 100% rename from crates/ui-egui/tests/ui_large_project.rs rename to crates/ui-egui/tests/it/ui_large_project.rs diff --git a/crates/ui-egui/tests/ui_layer_panel_zoom.rs b/crates/ui-egui/tests/it/ui_layer_panel_zoom.rs similarity index 100% rename from crates/ui-egui/tests/ui_layer_panel_zoom.rs rename to crates/ui-egui/tests/it/ui_layer_panel_zoom.rs diff --git a/crates/ui-egui/tests/ui_live_preview.rs b/crates/ui-egui/tests/it/ui_live_preview.rs similarity index 100% rename from crates/ui-egui/tests/ui_live_preview.rs rename to crates/ui-egui/tests/it/ui_live_preview.rs diff --git a/crates/ui-egui/tests/ui_locked_color.rs b/crates/ui-egui/tests/it/ui_locked_color.rs similarity index 100% rename from crates/ui-egui/tests/ui_locked_color.rs rename to crates/ui-egui/tests/it/ui_locked_color.rs diff --git a/crates/ui-egui/tests/ui_media_browser_cache.rs b/crates/ui-egui/tests/it/ui_media_browser_cache.rs similarity index 100% rename from crates/ui-egui/tests/ui_media_browser_cache.rs rename to crates/ui-egui/tests/it/ui_media_browser_cache.rs diff --git a/crates/ui-egui/tests/ui_media_browser_copy_path.rs b/crates/ui-egui/tests/it/ui_media_browser_copy_path.rs similarity index 100% rename from crates/ui-egui/tests/ui_media_browser_copy_path.rs rename to crates/ui-egui/tests/it/ui_media_browser_copy_path.rs diff --git a/crates/ui-egui/tests/ui_menus.rs b/crates/ui-egui/tests/it/ui_menus.rs similarity index 100% rename from crates/ui-egui/tests/ui_menus.rs rename to crates/ui-egui/tests/it/ui_menus.rs diff --git a/crates/ui-egui/tests/ui_object_matte.rs b/crates/ui-egui/tests/it/ui_object_matte.rs similarity index 100% rename from crates/ui-egui/tests/ui_object_matte.rs rename to crates/ui-egui/tests/it/ui_object_matte.rs diff --git a/crates/ui-egui/tests/ui_panel_focus.rs b/crates/ui-egui/tests/it/ui_panel_focus.rs similarity index 100% rename from crates/ui-egui/tests/ui_panel_focus.rs rename to crates/ui-egui/tests/it/ui_panel_focus.rs diff --git a/crates/ui-egui/tests/ui_panel_windows.rs b/crates/ui-egui/tests/it/ui_panel_windows.rs similarity index 100% rename from crates/ui-egui/tests/ui_panel_windows.rs rename to crates/ui-egui/tests/it/ui_panel_windows.rs diff --git a/crates/ui-egui/tests/ui_panels.rs b/crates/ui-egui/tests/it/ui_panels.rs similarity index 99% rename from crates/ui-egui/tests/ui_panels.rs rename to crates/ui-egui/tests/it/ui_panels.rs index 240f2de8..21298910 100644 --- a/crates/ui-egui/tests/ui_panels.rs +++ b/crates/ui-egui/tests/it/ui_panels.rs @@ -414,7 +414,7 @@ fn settings_buttons_stay_in_view_at_200_percent() { } /// Headless look at the panels (wgpu offscreen; needs a GPU adapter). Run with -/// `PANELS_SNAPSHOT=/abs/dir cargo test -p effectcraft-ui-egui --test ui_panels -- --ignored`. +/// `PANELS_SNAPSHOT=/abs/dir cargo test -p effectcraft-ui-egui --test it ui_panels:: -- --ignored`. #[test] #[ignore] fn panels_snapshot() { diff --git a/crates/ui-egui/tests/ui_parameter_spacing.rs b/crates/ui-egui/tests/it/ui_parameter_spacing.rs similarity index 100% rename from crates/ui-egui/tests/ui_parameter_spacing.rs rename to crates/ui-egui/tests/it/ui_parameter_spacing.rs diff --git a/crates/ui-egui/tests/ui_presets_folder.rs b/crates/ui-egui/tests/it/ui_presets_folder.rs similarity index 100% rename from crates/ui-egui/tests/ui_presets_folder.rs rename to crates/ui-egui/tests/it/ui_presets_folder.rs diff --git a/crates/ui-egui/tests/ui_preview_align.rs b/crates/ui-egui/tests/it/ui_preview_align.rs similarity index 100% rename from crates/ui-egui/tests/ui_preview_align.rs rename to crates/ui-egui/tests/it/ui_preview_align.rs diff --git a/crates/ui-egui/tests/ui_project_delete.rs b/crates/ui-egui/tests/it/ui_project_delete.rs similarity index 100% rename from crates/ui-egui/tests/ui_project_delete.rs rename to crates/ui-egui/tests/it/ui_project_delete.rs diff --git a/crates/ui-egui/tests/ui_project_keyboard.rs b/crates/ui-egui/tests/it/ui_project_keyboard.rs similarity index 100% rename from crates/ui-egui/tests/ui_project_keyboard.rs rename to crates/ui-egui/tests/it/ui_project_keyboard.rs diff --git a/crates/ui-egui/tests/ui_project_new_folder.rs b/crates/ui-egui/tests/it/ui_project_new_folder.rs similarity index 100% rename from crates/ui-egui/tests/ui_project_new_folder.rs rename to crates/ui-egui/tests/it/ui_project_new_folder.rs diff --git a/crates/ui-egui/tests/ui_project_rows.rs b/crates/ui-egui/tests/it/ui_project_rows.rs similarity index 100% rename from crates/ui-egui/tests/ui_project_rows.rs rename to crates/ui-egui/tests/it/ui_project_rows.rs diff --git a/crates/ui-egui/tests/ui_quick_offset.rs b/crates/ui-egui/tests/it/ui_quick_offset.rs similarity index 100% rename from crates/ui-egui/tests/ui_quick_offset.rs rename to crates/ui-egui/tests/it/ui_quick_offset.rs diff --git a/crates/ui-egui/tests/ui_ram_preview.rs b/crates/ui-egui/tests/it/ui_ram_preview.rs similarity index 100% rename from crates/ui-egui/tests/ui_ram_preview.rs rename to crates/ui-egui/tests/it/ui_ram_preview.rs diff --git a/crates/ui-egui/tests/ui_render_queue.rs b/crates/ui-egui/tests/it/ui_render_queue.rs similarity index 100% rename from crates/ui-egui/tests/ui_render_queue.rs rename to crates/ui-egui/tests/it/ui_render_queue.rs diff --git a/crates/ui-egui/tests/ui_script_console.rs b/crates/ui-egui/tests/it/ui_script_console.rs similarity index 98% rename from crates/ui-egui/tests/ui_script_console.rs rename to crates/ui-egui/tests/it/ui_script_console.rs index 526a5293..e705a20b 100644 --- a/crates/ui-egui/tests/ui_script_console.rs +++ b/crates/ui-egui/tests/it/ui_script_console.rs @@ -44,7 +44,7 @@ fn script_console_runs_scripts() { } /// Headless look at the panel (wgpu offscreen); run with -/// `SC_SNAPSHOT=/abs/out.png cargo test -p effectcraft-ui-egui --test ui_script_console -- --ignored`. +/// `SC_SNAPSHOT=/abs/out.png cargo test -p effectcraft-ui-egui --test it ui_script_console:: -- --ignored`. #[test] #[ignore] fn script_console_snapshot() { diff --git a/crates/ui-egui/tests/ui_scriptui.rs b/crates/ui-egui/tests/it/ui_scriptui.rs similarity index 100% rename from crates/ui-egui/tests/ui_scriptui.rs rename to crates/ui-egui/tests/it/ui_scriptui.rs diff --git a/crates/ui-egui/tests/ui_scrolling.rs b/crates/ui-egui/tests/it/ui_scrolling.rs similarity index 100% rename from crates/ui-egui/tests/ui_scrolling.rs rename to crates/ui-egui/tests/it/ui_scrolling.rs diff --git a/crates/ui-egui/tests/ui_settings_info.rs b/crates/ui-egui/tests/it/ui_settings_info.rs similarity index 100% rename from crates/ui-egui/tests/ui_settings_info.rs rename to crates/ui-egui/tests/it/ui_settings_info.rs diff --git a/crates/ui-egui/tests/ui_tabs.rs b/crates/ui-egui/tests/it/ui_tabs.rs similarity index 99% rename from crates/ui-egui/tests/ui_tabs.rs rename to crates/ui-egui/tests/it/ui_tabs.rs index 7f4689bf..fe69d56f 100644 --- a/crates/ui-egui/tests/ui_tabs.rs +++ b/crates/ui-egui/tests/it/ui_tabs.rs @@ -123,7 +123,7 @@ fn dragged_tabs_land_where_the_insertion_mark_is() { assert_eq!(group_of(&dock(&h), PanelKind::Timeline), Some(vec![PanelKind::RenderQueue, PanelKind::Timeline, PanelKind::EffectControls])); } -/// `cargo test -p effectcraft-ui-egui --test ui_tabs -- --ignored`: the insertion mark mid-drag +/// `cargo test -p effectcraft-ui-egui --test it ui_tabs:: -- --ignored`: the insertion mark mid-drag /// (`target/test-out/tab-drag.png`). #[test] #[ignore] diff --git a/crates/ui-egui/tests/ui_tail.rs b/crates/ui-egui/tests/it/ui_tail.rs similarity index 100% rename from crates/ui-egui/tests/ui_tail.rs rename to crates/ui-egui/tests/it/ui_tail.rs diff --git a/crates/ui-egui/tests/ui_text_edit.rs b/crates/ui-egui/tests/it/ui_text_edit.rs similarity index 100% rename from crates/ui-egui/tests/ui_text_edit.rs rename to crates/ui-egui/tests/it/ui_text_edit.rs diff --git a/crates/ui-egui/tests/ui_text_range_handles.rs b/crates/ui-egui/tests/it/ui_text_range_handles.rs similarity index 100% rename from crates/ui-egui/tests/ui_text_range_handles.rs rename to crates/ui-egui/tests/it/ui_text_range_handles.rs diff --git a/crates/ui-egui/tests/ui_theme_favorites.rs b/crates/ui-egui/tests/it/ui_theme_favorites.rs similarity index 100% rename from crates/ui-egui/tests/ui_theme_favorites.rs rename to crates/ui-egui/tests/it/ui_theme_favorites.rs diff --git a/crates/ui-egui/tests/ui_time_zoom_controls.rs b/crates/ui-egui/tests/it/ui_time_zoom_controls.rs similarity index 100% rename from crates/ui-egui/tests/ui_time_zoom_controls.rs rename to crates/ui-egui/tests/it/ui_time_zoom_controls.rs diff --git a/crates/ui-egui/tests/ui_timeline_effect_label.rs b/crates/ui-egui/tests/it/ui_timeline_effect_label.rs similarity index 100% rename from crates/ui-egui/tests/ui_timeline_effect_label.rs rename to crates/ui-egui/tests/it/ui_timeline_effect_label.rs diff --git a/crates/ui-egui/tests/ui_timeline_shapes.rs b/crates/ui-egui/tests/it/ui_timeline_shapes.rs similarity index 100% rename from crates/ui-egui/tests/ui_timeline_shapes.rs rename to crates/ui-egui/tests/it/ui_timeline_shapes.rs diff --git a/crates/ui-egui/tests/ui_timeline_switches.rs b/crates/ui-egui/tests/it/ui_timeline_switches.rs similarity index 100% rename from crates/ui-egui/tests/ui_timeline_switches.rs rename to crates/ui-egui/tests/it/ui_timeline_switches.rs diff --git a/crates/ui-egui/tests/ui_timeline_trim.rs b/crates/ui-egui/tests/it/ui_timeline_trim.rs similarity index 100% rename from crates/ui-egui/tests/ui_timeline_trim.rs rename to crates/ui-egui/tests/it/ui_timeline_trim.rs diff --git a/crates/ui-egui/tests/ui_timeline_zoom.rs b/crates/ui-egui/tests/it/ui_timeline_zoom.rs similarity index 100% rename from crates/ui-egui/tests/ui_timeline_zoom.rs rename to crates/ui-egui/tests/it/ui_timeline_zoom.rs diff --git a/crates/ui-egui/tests/ui_toolbar_gradient.rs b/crates/ui-egui/tests/it/ui_toolbar_gradient.rs similarity index 100% rename from crates/ui-egui/tests/ui_toolbar_gradient.rs rename to crates/ui-egui/tests/it/ui_toolbar_gradient.rs diff --git a/crates/ui-egui/tests/ui_tracker.rs b/crates/ui-egui/tests/it/ui_tracker.rs similarity index 100% rename from crates/ui-egui/tests/ui_tracker.rs rename to crates/ui-egui/tests/it/ui_tracker.rs diff --git a/crates/ui-egui/tests/ui_unreadable_footage.rs b/crates/ui-egui/tests/it/ui_unreadable_footage.rs similarity index 100% rename from crates/ui-egui/tests/ui_unreadable_footage.rs rename to crates/ui-egui/tests/it/ui_unreadable_footage.rs diff --git a/crates/ui-egui/tests/ui_video_preview_off.rs b/crates/ui-egui/tests/it/ui_video_preview_off.rs similarity index 100% rename from crates/ui-egui/tests/ui_video_preview_off.rs rename to crates/ui-egui/tests/it/ui_video_preview_off.rs diff --git a/crates/ui-egui/tests/ui_viewer.rs b/crates/ui-egui/tests/it/ui_viewer.rs similarity index 100% rename from crates/ui-egui/tests/ui_viewer.rs rename to crates/ui-egui/tests/it/ui_viewer.rs diff --git a/crates/ui-egui/tests/ui_viewers.rs b/crates/ui-egui/tests/it/ui_viewers.rs similarity index 98% rename from crates/ui-egui/tests/ui_viewers.rs rename to crates/ui-egui/tests/it/ui_viewers.rs index e556d92a..0019cc9c 100644 --- a/crates/ui-egui/tests/ui_viewers.rs +++ b/crates/ui-egui/tests/it/ui_viewers.rs @@ -134,7 +134,7 @@ fn a_locked_viewer_keeps_its_comp_when_the_project_panel_opens_another() { assert_eq!((h.state().ui.active_viewer, shows(&h, 0), shows(&h, 1)), (1, Some(a), Some(b))); } -/// `cargo test -p effectcraft-ui-egui --test ui_viewers -- --ignored`: two viewers side by side +/// `cargo test -p effectcraft-ui-egui --test it ui_viewers:: -- --ignored`: two viewers side by side /// (`target/test-out/viewers.png`). #[test] #[ignore] diff --git a/crates/ui-egui/tests/ui_visual_review.rs b/crates/ui-egui/tests/it/ui_visual_review.rs similarity index 100% rename from crates/ui-egui/tests/ui_visual_review.rs rename to crates/ui-egui/tests/it/ui_visual_review.rs diff --git a/crates/ui-egui/tests/ui_web_gpu_storage.rs b/crates/ui-egui/tests/it/ui_web_gpu_storage.rs similarity index 100% rename from crates/ui-egui/tests/ui_web_gpu_storage.rs rename to crates/ui-egui/tests/it/ui_web_gpu_storage.rs diff --git a/crates/ui-egui/tests/ui_web_job_gpu.rs b/crates/ui-egui/tests/it/ui_web_job_gpu.rs similarity index 100% rename from crates/ui-egui/tests/ui_web_job_gpu.rs rename to crates/ui-egui/tests/it/ui_web_job_gpu.rs diff --git a/crates/ui-egui/tests/ui_web_offload.rs b/crates/ui-egui/tests/it/ui_web_offload.rs similarity index 100% rename from crates/ui-egui/tests/ui_web_offload.rs rename to crates/ui-egui/tests/it/ui_web_offload.rs diff --git a/crates/ui-egui/tests/ui_workflow_selection.rs b/crates/ui-egui/tests/it/ui_workflow_selection.rs similarity index 100% rename from crates/ui-egui/tests/ui_workflow_selection.rs rename to crates/ui-egui/tests/it/ui_workflow_selection.rs diff --git a/crates/ui-egui/tests/ui_workspace_focus.rs b/crates/ui-egui/tests/it/ui_workspace_focus.rs similarity index 100% rename from crates/ui-egui/tests/ui_workspace_focus.rs rename to crates/ui-egui/tests/it/ui_workspace_focus.rs diff --git a/crates/ui-egui/tests/viewer_geometry.rs b/crates/ui-egui/tests/it/viewer_geometry.rs similarity index 100% rename from crates/ui-egui/tests/viewer_geometry.rs rename to crates/ui-egui/tests/it/viewer_geometry.rs diff --git a/crates/ui-egui/tests/viewer_passive_display.rs b/crates/ui-egui/tests/it/viewer_passive_display.rs similarity index 100% rename from crates/ui-egui/tests/viewer_passive_display.rs rename to crates/ui-egui/tests/it/viewer_passive_display.rs diff --git a/docs/agents.md b/docs/agents.md index c47bfb60..b2589a7a 100644 --- a/docs/agents.md +++ b/docs/agents.md @@ -216,7 +216,7 @@ Things that tripped up a long agent-driven session (a multi-scene 3D piece built ### Cookbook (from end-to-end QA) -The scenarios in `crates/automation/tests/qa/` and `apps/effectcraft-cli/tests/qa_template.rs` +The scenarios in `crates/automation/tests/qa/` and `apps/effectcraft-cli/tests/it/qa_template.rs` build real projects through these interfaces; they are worked examples of everything below. * **Name things when you create them**: `layer.newText`, `layer.newShape`, `layer.newSolid`, diff --git a/docs/control-protocol.md b/docs/control-protocol.md index 4d01ef2e..8cd7b769 100644 --- a/docs/control-protocol.md +++ b/docs/control-protocol.md @@ -51,7 +51,7 @@ export formats, parity summary), `jobs.list` (Progress panel jobs, e.g. the back `footage.check` after File ▸ Open). Every engine command is reachable through `engine.execute`, and every interactive widget of every -panel registers an element id; both are enforced by `crates/ui-egui/tests/ui_agent_audit.rs`. +panel registers an element id; both are enforced by `crates/ui-egui/tests/it/ui_agent_audit.rs`. ## UI state diff --git a/docs/fidelity/workflow-checks.md b/docs/fidelity/workflow-checks.md index 4bea37ee..613d6878 100644 --- a/docs/fidelity/workflow-checks.md +++ b/docs/fidelity/workflow-checks.md @@ -4,7 +4,7 @@ These checks use original compositions and public interaction behavior. No Adobe implementation code are included. Adobe's [selection documentation](https://helpx.adobe.com/after-effects/desktop/work-with-layers/select-and-arrange-layers/selecting-arranging-layers.html) describes Timeline range selection and Composition Shift-click/Shift-marquee selection. -`crates/ui-egui/tests/ui_workflow_selection.rs` exercises actual pointer and keyboard events: +`crates/ui-egui/tests/it/ui_workflow_selection.rs` exercises actual pointer and keyboard events: - Timeline Shift-click selects the visible range, skipping locked layers; Ctrl/Command-click toggles a layer. - A drag beginning in the empty Timeline outline selects the intersected layer rows without reordering them. diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 3ebaa452..43af6354 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -1068,7 +1068,7 @@ resolution, adjustment) and composited at 8 and 32 bpc: Bucket's flood-filled region, Eyedropper Fill's sample); segments and convex polygons are binned into 16 × 16 tiles and rasterised on the GPU with the CPU's coverage functions, glows and compositing included. The CPU effects were refactored to draw from the same plans with - bit-identical output (`crates/effects/tests/gen_golden.rs`: 288 frame hashes pinned before + bit-identical output (`crates/effects/tests/it/gen_golden.rs`: 288 frame hashes pinned before the refactor). Exception: CC Threads decides band membership and fibre shade per pixel, and at round parameter values (the defaults) pixel centres sit exactly on band edges, where f32 and the CPU's f64 can fall on either side: up to 5 % of pixels allowed (measured ≤ 3.6 % at half @@ -1082,7 +1082,7 @@ resolution, adjustment) and composited at 8 and 32 bpc: 7 more effects run on the GPU (280 in all, with M13.28's 37), and five CPU fallbacks are gone. Each case is checked against the CPU oracle (≤ 1/255 at 8 bpc, ≤ 1e-3 at 32 bpc) directly on a buffer (full and half resolution) and composited at 8 and 32 bpc; the CPU refactors behind the shared plans -are pinned bit for bit by golden hashes (`crates/effects/tests/particle_golden.rs`, +are pinned bit for bit by golden hashes (`crates/effects/tests/it/particle_golden.rs`, `timewarp_golden.rs`, `sim_golden.rs`). - **Particle render passes** (`gpu::fx_particles`): CC Particle World and CC Particle Systems II diff --git a/docs/testing.md b/docs/testing.md index 3a975747..69a70f4d 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -5,6 +5,13 @@ cargo test --workspace # everything cargo xtask ci # fmt, clippy -D warnings, tests, layers, assets, wasm ``` +`cargo xtask ci` builds in the dev profile and runs the tests with `cargo nextest run` (plus +`cargo test --doc`) when `cargo-nextest` is installed, and with `cargo test` otherwise. + +Each crate with several integration-test files has one test binary, `tests/it/main.rs`, whose +modules are the files in `tests/it/`. Run one file with `cargo test -p --test it ::` +or `cargo nextest run -p -E 'binary(it) and test(/^::/)'`. + ## What the tests cover - **Engine commands** (`crates/engine/src/tests*.rs`): every command family, including undo and @@ -16,7 +23,7 @@ cargo xtask ci # fmt, clippy -D warnings, tests, layers, assets, was - **Effects** (`crates/effects`): each effect has a determinism test and at least one behaviour test (identity at neutral settings, known pixel results, or simulations giving the same frame whether you seek straight to it or play up to it). A registry-wide test checks that effects - which read the clock are declared time-dependent. `crates/effects/tests/sim_golden.rs` pins + which read the clock are declared time-dependent. `crates/effects/tests/it/sim_golden.rs` pins exact pixel hashes of the simulation effects the GPU shares plans with (CC Rainfall … Card Wipe) at several settings, times, bit depths and resolutions, so any change to their CPU output fails (re-pin with `SIM_GOLDEN_PRINT=1` after an intended change; pinned for aarch64 macOS, diff --git a/docs/web.md b/docs/web.md index e00ec166..c18f7e86 100644 --- a/docs/web.md +++ b/docs/web.md @@ -462,19 +462,19 @@ every request and reply, a render through an in-process offload; `tests_roto.rs` propagation through an offload streaming segmentations; `tests_mask_warp.rs`: Warp Stabilizer plans solved in the job, never by `warp.status` on the page), the frame-worker protocol (`crates/engine/src/remote.rs`: diff / patch, a replica following edits renders the same pixels; -`crates/ui-egui/tests/ui_web_offload.rs`: the frame cache through a remote renderer, `wait: true` +`crates/ui-egui/tests/it/ui_web_offload.rs`: the frame cache through a remote renderer, `wait: true` deferred until the offloaded job ends) and the Media Browser's virtual tree (`media_browser.rs`, `tests_panels.rs`). M13.24: deferred readbacks on a real device (`crates/gpu/src/tests_deferred.rs`: whole-frame GPU and CPU-composited frames in passes match the CPU, placeholders never reach the layer cache; `deferred.rs`: keys, late readbacks of an older frame dropped), the frame server's passes and Auto timing (`remote.rs`, a deferred stand-in accelerator), the browser's routing and -disk cache (`crates/ui-egui/tests/ui_web_gpu_storage.rs`: a GPU frame worker renders effect frames, +disk cache (`crates/ui-egui/tests/it/ui_web_gpu_storage.rs`: a GPU frame worker renders effect frames, the page's GPU keeps frames without effects, frames stored under their disk keys come back after a "reload" without rendering, the blue cache bar sees them; the storage manager's widgets and commands), the disk index (`disk_cache.rs`), the store's usage by kind and clearing (`store.rs`), `storage.*` (`storage.rs`), and every WGSL float literal fitting f32 (browsers reject the whole module otherwise; `tests.rs`). M13.30: job workers on a deferred device -(`crates/ui-egui/tests/ui_web_job_gpu.rs`: a Render Queue job and a Warp Stabilizer analysis +(`crates/ui-egui/tests/it/ui_web_job_gpu.rs`: a Render Queue job and a Warp Stabilizer analysis render their frames in passes on the device, with the CPU worker's pixels / result), particles, Advanced 3D and the job pass driver in passes (`crates/gpu/src/tests_deferred_jobs.rs`), layer buffers through the disk store and the prefetch plan (`remote.rs` diff --git a/xtask/src/main.rs b/xtask/src/main.rs index e79ac63a..468f832c 100644 --- a/xtask/src/main.rs +++ b/xtask/src/main.rs @@ -9,7 +9,8 @@ //! - `assets`: every asset file (image, icon, font, LUT, audio, video…) has a complete //! `.attribution` sidecar and an entry in `ATTRIBUTION.md` (AGENTS.md §1). //! - `ico …`: pack PNGs into a Windows `.ico` (used by `packaging/icons.sh`). -//! - `ci`: fmt check, clippy -D warnings, tests, PDF dependency policy, layers, assets, wasm. +//! - `ci`: fmt check, clippy -D warnings, tests (`cargo nextest run` when installed) and doctests, +//! PDF dependency policy, layers, assets, wasm. Everything builds in the dev profile. //! - `bench [--bin CLI] [--quick] [--compare OLD.jsonl] …`: render benchmark of generated scenarios //! (memory, CPU, wall time) into `target/bench/results.jsonl` (`bench.rs`, docs/testing.md). @@ -235,7 +236,7 @@ const WEB_CRATES: &[&str] = &["effectcraft-ui-egui", "effectcraft-web"]; fn wasm() -> Result<(), String> { let md = metadata()?; let mut cmd = Command::new(env!("CARGO")); - cmd.args(["check", "--target", "wasm32-unknown-unknown"]); + cmd.args(["check", "--target", "wasm32-unknown-unknown", "--keep-going"]); let mut n = 0; for (name, _) in workspace_crates(&md) { if layer_of(&name).is_some_and(|l| l <= 4) || WEB_CRATES.contains(&name.as_str()) { @@ -406,15 +407,46 @@ fn serve_dir(dir: &std::path::Path, port: u16) -> Result<(), String> { Ok(()) } -fn ci() -> Result<(), String> { +/// Lib, bin and integration tests (examples aren't linked; clippy checked them), then doctests, +/// which nextest doesn't run. +/// +/// `effectcraft-gpu`'s tests share one device and serialise on a lock inside their process (several +/// devices at once crash software Vulkan and GL), so they run in one `cargo test` process instead of +/// nextest's process per test. +/// +/// Each run goes ahead when an earlier one fails; the error names every run that failed. +fn tests() -> Result<(), String> { let cargo = env!("CARGO"); - run(Command::new(cargo).args(["fmt", "--check"]))?; - run(Command::new(cargo).args(["clippy", "--workspace", "--all-targets", "--release", "--", "-D", "warnings"]))?; - run(Command::new(cargo).args(["test", "--workspace", "--release"]))?; - pdf_deps::run(&root())?; - layers()?; - assets()?; - wasm() + let targets = ["--workspace", "--lib", "--bins", "--tests", "--no-fail-fast"]; + let nextest = Command::new(cargo).args(["nextest", "--version"]).output().is_ok_and(|o| o.status.success()); + let mut runs = Vec::new(); + if nextest { + runs.push(run(Command::new(cargo).args(["nextest", "run"]).args(targets).args(["-E", "not package(effectcraft-gpu)"]))); + runs.push(run(Command::new(cargo).args(["test", "-p", "effectcraft-gpu", "--lib", "--no-fail-fast"]))); + } else { + println!("cargo-nextest not found, running cargo test (install: cargo install cargo-nextest --locked)"); + runs.push(run(Command::new(cargo).arg("test").args(targets))); + } + runs.push(run(Command::new(cargo).args(["test", "--workspace", "--doc", "--no-fail-fast"]))); + let failed: Vec = runs.into_iter().filter_map(Result::err).collect(); + if failed.is_empty() { Ok(()) } else { Err(failed.join("; ")) } +} + +type Stage = fn() -> Result<(), String>; + +/// Every stage runs even when an earlier one fails, so one run reports all the problems. +fn ci() -> Result<(), String> { + let stages: [(&str, Stage); 7] = [ + ("fmt", || run(Command::new(env!("CARGO")).args(["fmt", "--check"]))), + ("clippy", || run(Command::new(env!("CARGO")).args(["clippy", "--workspace", "--all-targets", "--", "-D", "warnings"]))), + ("tests", tests), + ("pdf-deps", || pdf_deps::run(&root())), + ("layers", layers), + ("assets", assets), + ("wasm", wasm), + ]; + let failed: Vec<&str> = stages.iter().filter_map(|(name, stage)| stage().map_err(|e| eprintln!("ci: {name} failed: {e}")).err().map(|()| *name)).collect(); + if failed.is_empty() { Ok(()) } else { Err(format!("ci failed: {}", failed.join(", "))) } } fn main() -> ExitCode {