Files
hcie-rust-v3.05/test_inventory.md
Your Name 8447b2d796
mandatory-regression-gate / deterministic-tests (push) Has been cancelled
mandatory-regression-gate / protected-performance-path (push) Has been cancelled
Refactor code structure for improved readability and maintainability
2026-07-23 15:34:05 +03:00

821 lines
58 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HCIE-Rust v3.05 — Complete Test Inventory
> Generated: 2026-07-23
> Project root: `/mnt/extra/00_PROJECTS/hcie-rust-v3.05`
>
> **Total: ~415+ `#[test]` functions** across 23+ crates organized in 6 layers.
---
## Table of Contents
1. [Layer 1: DATA](#layer-1-data)
- [hcie-protocol — tests/helpers.rs](#hcie-protocol--testshelpersrs)
- [hcie-color — tests/color_roundtrip.rs](#hcie-color--testscolor_roundtriprs)
2. [Layer 2: ENGINE CORE](#layer-2-engine-core)
- [hcie-blend — tests/blend_modes.rs](#hcie-blend--testsblend_modesrs)
- [hcie-brush-engine — tests/stamp.rs](#hcie-brush-engine--testsstamp.rs)
- [hcie-brush-engine — src/lib.rs (internal)](#hcie-brush-engine--srclibrs-internal)
- [hcie-draw — tests/draw_pixels.rs](#hcie-draw--testsdraw_pixelsrs)
- [hcie-composite — tests/](#hcie-composite--tests)
- [hcie-composite — src/test_composite.rs](#hcie-composite--srctest_compositers)
- [hcie-filter — tests/filters.rs](#hcie-filter--testsfiltersrs)
- [hcie-selection — tests/mask_ops.rs](#hcie-selection--testsmask_opsrs)
- [hcie-vector — src/lib.rs (internal)](#hcie-vector--srclibrs-internal)
- [hcie-history — tests/history_state.rs](#hcie-history--testshistory_staters)
- [hcie-history — src/lib.rs (internal)](#hcie-history--srclibrs-internal)
- [hcie-fx — src/parser.rs (internal)](#hcie-fx--srcparserrs-internal)
- [hcie-io — src/test_psd_composite.rs](#hcie-io--srctest_psd_compositers)
- [hcie-psd — src/](#hcie-psd--src)
- [hcie-vision — src/smart_patch.rs](#hcie-vision--srcsmart_patchrs)
- [hcie-build-info — src/lib.rs](#hcie-build-info--srclibrs)
3. [Layer 4: ENGINE API](#layer-4-engine-api)
- [hcie-engine-api — tests/visual_regression.rs](#hcie-engine-api--testsvisual_regressionrs)
- [hcie-engine-api — tests/vector_creation_history.rs](#hcie-engine-api--testsvector_creation_historyrs)
- [hcie-engine-api — tests/meadow_check.rs](#hcie-engine-api--testsmeadow_checkrs)
- [hcie-engine-api — tests/leaves_check.rs](#hcie-engine-api--testsleaves_checkrs)
- [hcie-engine-api — tests/stamp_floor_check.rs](#hcie-engine-api--testsstamp_floor_checkrs)
- [hcie-engine-api — tests/bitmap_brush_stamp.rs](#hcie-engine-api--testsbitmap_brush_stamprs)
- [hcie-engine-api — tests/selection_clear.rs](#hcie-engine-api--testsselection_clearrs)
- [hcie-engine-api — tests/performance_stroke_4k.rs](#hcie-engine-api--testsperformance_stroke_4krs)
- [hcie-engine-api — src/stroke_brush.rs (internal)](#hcie-engine-api--srcstroke_brushrs-internal)
4. [Layer 6: GUI — egui](#layer-6-gui--egui)
- [hcie-gui-egui — tests/canvas_engine.rs](#hcie-gui-egui--testscanvas_enginers)
- [hcie-gui-egui — tests/gui_audit.rs](#hcie-gui-egui--testsgui_auditrs)
- [hcie-gui-egui — tests/widget_ui.rs](#hcie-gui-egui--testswidget_uirs)
- [hcie-gui-egui — src/brush_import.rs (internal)](#hcie-gui-egui--srcbrush_importrs-internal)
5. [Layer 6: GUI — iced](#layer-6-gui--iced)
- [hcie-iced-gui — tests/selection_test.rs](#hcie-iced-gui--testsselection_testrs)
- [hcie-iced-gui — tests/feature_scorecard.rs](#hcie-iced-gui--testsfeature_scorecardrs)
- [hcie-iced-gui — tests/raster_test.rs](#hcie-iced-gui--testsraster_testrs)
- [hcie-iced-gui — src/app.rs (internal)](#hcie-iced-gui--srcapprs-internal)
- [hcie-iced-gui — src/app/transform_dirty.rs](#hcie-iced-gui--srcapptransform_dirtyrs)
- [hcie-iced-gui — src/color_picker.rs](#hcie-iced-gui--srccolor_pickerrs)
- [hcie-iced-gui — src/ai_chat.rs](#hcie-iced-gui--srcai_chatrs)
- [hcie-iced-gui — src/ai_script.rs](#hcie-iced-gui--srcai_scriptrs)
- [hcie-iced-gui — src/screenshot.rs](#hcie-iced-gui--srcscreenshotrs)
- [hcie-iced-gui — src/sidebar/mod.rs](#hcie-iced-gui--srcsidebarmodrs)
- [hcie-iced-gui — src/theme.rs](#hcie-iced-gui--srcthemers)
- [hcie-iced-gui — src/viewer/mod.rs](#hcie-iced-gui--srcviewermodrs)
- [hcie-iced-gui — src/settings.rs](#hcie-iced-gui--srcsettingsrs)
- [hcie-iced-gui — src/cli.rs](#hcie-iced-gui--srcclirs)
- [hcie-iced-gui — src/canvas/shader_canvas.rs](#hcie-iced-gui--srccanvasshader_canvasrs)
- [hcie-iced-gui — src/canvas/texture_update.rs](#hcie-iced-gui--srccanvastexture_updaters)
- [hcie-iced-gui — src/selection/state.rs](#hcie-iced-gui--srcselectionstaters)
- [hcie-iced-gui — src/panels/menus.rs](#hcie-iced-gui--srcpanelsmenusrs)
- [hcie-iced-gui — src/panels/styles.rs](#hcie-iced-gui--srcpanelsstylesrs)
- [hcie-iced-gui — src/panels/custom_shapes.rs](#hcie-iced-gui--srcpanelscustom_shapesrs)
- [hcie-iced-gui — src/panels/brushes.rs](#hcie-iced-gui--srcpanelsbrushesrs)
- [hcie-iced-gui — src/panels/svg_editor.rs](#hcie-iced-gui--srcpanelssvg_editorrs)
- [hcie-iced-gui — src/panels/title_bar.rs](#hcie-iced-gui--srcpanelstitle_bar.rs)
- [hcie-iced-gui — src/vector_edit.rs](#hcie-iced-gui--srcvector_editrs)
- [hcie-iced-gui — src/widgets/plain_slider.rs](#hcie-iced-gui--srcwidgetsplain_sliderrs)
- [hcie-iced-gui — src/dock/state.rs](#hcie-iced-gui--srcdockstaters)
- [hcie-iced-gui — src/dock/manager.rs](#hcie-iced-gui--srcdockmanagersr)
- [hcie-iced-gui — src/dock/sizing.rs](#hcie-iced-gui--srcdocksizingrs)
- [hcie-iced-gui — src/dock/persistence.rs](#hcie-iced-gui--srcdockpersistencers)
- [hcie-iced-gui — src/dock/view.rs](#hcie-iced-gui--srcdockviewrs)
- [hcie-iced-gui — src/dock/preview.rs](#hcie-iced-gui--srcdockpreviewrs)
- [hcie-iced-gui — src/dock/floating.rs](#hcie-iced-gui--srcdockfloatingrs)
6. [Brush Catalog Crates](#brush-catalog-crates)
---
## Layer 1: DATA
### `hcie-protocol` — tests/helpers.rs
| Line | Function | Summary |
|------|----------|---------|
| 4 | `test_to_u32_from_u32_roundtrip` | Tests that packing and unpacking RGBA colors to/from u32 round-trips correctly for several test colors. |
| 20 | `test_color_constants` | Verifies that `TRANSPARENT`, `BLACK`, `WHITE`, and `RED` constants have the expected RGBA values. |
| 28 | `test_lerp_boundaries` | Confirms linear interpolation at t=0, t=0.5, and t=1 returns correct boundary/midpoint values. |
| 35 | `test_color_lerp` | Verifies color lerp between two RGBA colors at 0.5 blend produces expected midpoint values. |
| 46 | `test_lerp_clamp` | Confirms lerp clamps t values below 0 and above 1 to the range endpoints. |
| 52 | `test_clamp` | Tests the clamp function with in-range, below-min, and above-max values. |
| 59 | `test_distance` | Verifies Euclidean distance calculation (3-4-5 triangle) and zero-distance for same point. |
| 65 | `test_point_in_rect` | Tests `point_in_rect` with points inside and outside a rectangle. |
| 72 | `test_thumbnail_nearest` | Tests nearest-neighbor thumbnail generation from a 2×1 RGBA image to 1×1. |
| 83 | `test_selection_rect_from_mask` | Verifies extracting a bounding rectangle from a selection mask with a 2×2 selected region. |
| 95 | `test_blank_mask_no_selection` | Confirms a mask of all zeros returns `None` from `selection_rect_from_mask`. |
| 101 | `test_blend_mode_all_contains_all` | Asserts that `BlendMode::ALL` contains exactly 28 blend modes. |
| 106 | `test_all_tools_listed` | Asserts that `Tool::ALL` contains exactly 36 tools. |
| 111 | `test_expand_dirty_bounds` | Tests expanding dirty bounds with a given rectangle, verifying the union result. |
| 118 | `test_version_string_format` | Checks that the version string starts with "3." (expected format). |
| 125 | `from_u32_to_u32_roundtrip` | Property-based test using proptest to verify u32 round-trip for random RGBA values. |
### `hcie-color` — tests/color_roundtrip.rs
| Line | Function | Summary |
|------|----------|---------|
| 4 | `test_gamma_encode_boundary_zero` | Verifies gamma encoding of 0.0 equals 0.0. |
| 9 | `test_gamma_encode_boundary_one` | Verifies gamma encoding of 1.0 equals 1.0. |
| 14 | `test_gamma_decode_boundary_zero` | Verifies gamma decoding of 0.0 equals 0.0. |
| 19 | `test_gamma_decode_boundary_one` | Verifies gamma decoding of 1.0 equals 1.0. |
| 24 | `test_gamma_roundtrip` | Ensures gamma encode→decode round-trip preserves values within 0.01 epsilon for 7 test values. |
| 33 | `test_srgb_to_linear_black` | Confirms sRGB black [0,0,0] converts to linear [0.0, 0.0, 0.0]. |
| 38 | `test_srgb_to_linear_white` | Confirms sRGB white [255,255,255] converts to linear [1.0, 1.0, 1.0]. |
| 47 | `srgb_linear_roundtrip` | Property-based test verifying sRGB→linear→sRGB round-trip preserves values. |
| 58 | `test_rgb_to_hsl_basic` | Tests RGB→HSL conversion for pure red, expecting H=0, S=1, L=0.5. |
| 66 | `test_rgb_to_hsl_gray` | Tests RGB→HSL for gray (0.5,0.5,0.5), expecting S=0. |
| 74 | `test_linear_to_srgb_clamps` | Confirms linear→sRGB clamps values below 0 to 0 and above 1 to 255. |
---
## Layer 2: ENGINE CORE
### `hcie-blend` — tests/blend_modes.rs
| Line | Function | Summary |
|------|----------|---------|
| 5 | `test_normal_zero_opacity_identity` | Verifies that blending with opacity=0 returns the destination unchanged for Normal mode. |
| 13 | `test_normal_full_opacity` | Verifies that Normal mode with opacity=1 outputs the source pixel unchanged. |
| 21 | `test_opacity_zero_no_mutation_for_all_modes` | Confirms that opacity=0 returns dst unchanged for every blend mode (except PassThrough). |
| 38 | `test_specific_blend_modes` | Parametric test (rstest) checking specific blend modes (Multiply, Screen, etc.) produce valid alpha. |
| 51 | `test_transparent_src_normal` | Verifies that a fully transparent source leaves the destination unchanged. |
| 59 | `test_all_modes_produce_valid_alpha` | Ensures all blend modes with opacity=0.5 produce valid u8 alpha values. |
| 70 | `test_multiply_darkens` | Verifies Multiply blend mode darkens the destination channel. |
| 78 | `test_screen_lightens` | Verifies Screen blend mode lightens the destination channel. |
| 87 | `identity_at_zero_opacity` | Property-based test: random pixels blended with opacity 0 always equal the destination for all modes. |
### `hcie-brush-engine` — tests/stamp.rs
| Line | Function | Summary |
|------|----------|---------|
| 13 | `test_generate_brush_stamp_size` | Verifies a round brush stamp of size 10 produces a 20×20 square stamp buffer. |
| 25 | `test_generate_brush_stamp_center_nonzero` | Confirms the center pixel of a hardness=1.0 round stamp is opaque. |
| 34 | `test_generate_brush_stamp_hardness_gradient` | Checks that soft (0.0) and hard (1.0) stamps have the same buffer length. |
| 45 | `test_brush_spacing_pixels` | Verifies `brush_spacing_pixels` returns size×ratio for 0.5 ratio and minimum ~0.2 for 0.0 ratio. |
| 57 | `test_jitter_offset_within_bounds` | Confirms zero jitter amount produces zero offset. |
| 64 | `test_bitmap_stamp_fallback_to_round` | Verifies that an empty bitmap stamp falls back to a round stamp (non-empty buffer). |
### `hcie-brush-engine` — src/lib.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 4241 | `watercolor_detail_count_is_hard_bounded` | Verifies watercolor detail counts (satellites, splatters, blooms) stay within `WATERCOLOR_MAX_DABS_PER_SAMPLE` for sizes 0.51024. |
| 4257 | `every_specialized_style_is_noop_at_zero_pressure` | Tests that all 28 specialized brush styles produce zero-painted pixels when pressure is 0. |
| 4328 | `blender_preserves_uniform_color_and_transparency` | Verifies the Blender brush doesn't change uniform color fields and doesn't paint on empty areas. |
| 4352 | `rotated_dab_uses_single_channel_stroke_mask` | Confirms rotated dabs write into a single-channel stroke mask during specialized stroke drawing. |
| 4389 | `rotated_pen_respects_stroke_opacity_cap` | Verifies three overlapping pen dabs at 50% flow stay within the 50% stroke opacity cap (~128 alpha). |
| 4430 | `pigment_mix_is_subtractive_and_bounded` | Confirms pigment mixing is subtractive (red+blue → dark purple) and respects blend factor boundaries. |
| 4447 | `diagnostic_watercolor_sample_latency` | Diagnostic benchmark (ignored) measuring round dab and watercolor brush latency at various sizes. |
### `hcie-draw` — tests/draw_pixels.rs
| Line | Function | Summary |
|------|----------|---------|
| 4 | `test_draw_filled_rect` | Draws a filled red rectangle and checks the center pixel is red. |
| 14 | `test_draw_filled_rect_outside` | Confirms pixels outside a drawn rectangle remain unchanged (transparent). |
| 22 | `test_draw_filled_circle` | Draws a filled green circle and checks the center pixel is green. |
| 30 | `test_draw_filled_ellipse` | Draws a filled blue ellipse and checks the center pixel is blue. |
| 38 | `test_draw_line` | Draws a yellow horizontal line and checks a pixel on the line. |
| 56 | `test_flood_fill` | Performs flood fill from (0,0) and checks that the filled area is red. |
| 64 | `test_draw_with_mask_restricts_pixels` | Draws a rect with a mask where only pixel (0,0) is masked; verifies only that pixel is painted. |
| 84 | `test_line_at_edge` | Draws a diagonal line from corner to corner and checks the start pixel. |
### `hcie-composite` — tests/
| File | Line | Function | Summary |
|------|------|----------|---------|
| pass_through.rs | 24 | `test_pass_through_group_skipped_in_composite` | Verifies child layers in a PassThrough group blend directly onto the background (Multiply on white→gray). |
| pass_through.rs | 56 | `test_pass_through_group_invisible_children` | Confirms invisible children of a PassThrough group are excluded and only background appears. |
| pass_through.rs | 78 | `test_pass_through_group_with_opacity` | Documents current MVP behavior: PassThrough group opacity is skipped so child blends at full strength. |
| ff_visibility.rs | 20 | `test_composite_visibility_from_protocol_layer` | Tests composite with protocol layers toggling visibility of background and top layers, printing opaque pixel counts. |
| visibility.rs | 17 | `test_composite_visibility_toggle` | Tests compositing with both visible, background hidden, top hidden, and both hidden, asserting correct opaque pixel counts. |
### `hcie-composite` — src/test_composite.rs
| Line | Function | Summary |
|------|----------|---------|
| 5 | `test_composite_basic` | Basic composite test: single red layer output, then two layers (red background, blue overlay) checking top-wins compositing. |
### `hcie-filter` — tests/filters.rs
| Line | Function | Summary |
|------|----------|---------|
| 22 | `test_blur_does_not_panic` | Applies box_blur with radius 2 and checks dimensions remain valid. |
| 30 | `test_gaussian_blur_does_not_panic` | Applies gaussian_blur with radius 2 and checks dimensions remain valid. |
| 38 | `test_motion_blur_does_not_panic` | Applies motion_blur with distance 5, angle 45 and checks dimensions remain valid. |
| 46 | `test_invert_filter` | Applies invert filter and verifies at least one pixel changed value. |
| 55 | `test_grayscale_filter` | Applies grayscale filter and verifies R, G, B values differ by at most 3 (effectively gray). |
| 69 | `test_filter_ids` | Checks that filter_ids() returns at least one filter and includes "invert" and "box_blur". |
| 78 | `test_sharpen_does_not_panic` | Applies sharpen filter and checks dimensions remain valid. |
| 86 | `test_unknown_filter_is_noop` | Confirms applying a nonexistent filter name leaves pixels unchanged. |
| 94 | `test_unsharp_mask_does_not_panic` | Applies unsharp_mask with radius 2, amount 0.5 and checks dimensions remain valid. |
| 102 | `test_brightness_contrast` | Applies brightness_contrast filter and confirms output contains non-zero pixel values. |
| 110 | `test_hue_saturation_does_not_panic` | Applies hue_saturation filter and checks dimensions remain valid. |
| 118 | `test_emboss_does_not_panic` | Applies emboss filter and checks dimensions remain valid. |
| 126 | `test_find_edges_does_not_panic` | Applies find_edges filter and checks dimensions remain valid. |
### `hcie-selection` — tests/mask_ops.rs
| Line | Function | Summary |
|------|----------|---------|
| 2 | `test_create_rect_mask_full` | Creates a 4×4 rect mask covering the full area and verifies all values are 255. |
| 8 | `test_create_rect_mask_partial` | Creates a partial rect mask (1,1 to 2,2 in 4×4) and verifies inside/outside pixels. |
| 15 | `test_create_ellipse_mask` | Creates an ellipse mask and verifies center is selected, corner is not. |
| 22 | `test_invert_mask` | Inverts a mask and verifies 255→0 and 0→255. |
| 31 | `test_invert_twice_is_identity` | Inverts a mask twice and confirms the result equals the original. |
| 45 | `test_grow_mask` | Grows a single selected pixel by 1 and verifies more pixels become selected. |
| 54 | `test_grow_zero_is_noop` | Confirms growing by 0 leaves the mask unchanged. |
| 66 | `test_shrink_mask` | Shrinks a fully-selected mask by 1 and verifies fewer selected pixels. |
| 74 | `test_shrink_zero_is_noop` | Confirms shrinking by 0 leaves the mask unchanged. |
| 82 | `test_grow_shrink_roundtrip` | Grows then shrinks a mask by 1 and verifies it returns to the original state. |
| 97 | `test_feather_mask` | Feathers a 3×3 selected area with radius 1 and checks center remains 255 and corners are feathered. |
| 110 | `test_feather_zero_is_noop` | Confirms feathering with radius 0 leaves the mask unchanged. |
| 119 | `test_mask_at` | Tests `mask_at` with and without a mask, checking correct values returned at various positions. |
| 131 | `test_magic_wand` | Tests magic wand selection on a 2×2 pixel grid, checking seed and adjacent same-color pixels are selected. |
| 143 | `test_lasso_fill_mask` | Fills a 5×5 mask with a square lasso and verifies the center pixel is filled. |
### `hcie-vector` — src/lib.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 1101 | `test_crescent_sharp_tips` | Verifies the crescent shape's outer and inner ellipse arcs meet exactly at both tips. |
| 1129 | `test_bubble_tail_points` | Verifies the speech bubble contains the tail tip and inner connection points. |
| 1154 | `test_rotate_point` | Tests rotating a point 90° around a center and verifies correct output coordinates. |
| 1167 | `svg_points_follow_shape_angle` | Verifies SVG-backed shape rotation applies correctly around bounds center. |
### `hcie-history` — tests/history_state.rs
| Line | Function | Summary |
|------|----------|---------|
| 31 | `test_history_new_is_empty` | Verifies a new HistoryManager has len=0, can_undo=false, can_redo=false, index=-1. |
| 40 | `test_history_push_undo_redo` | Pushes two pixel changes, undoes one step (checking pixel value), then redoes. |
| 65 | `test_history_undo_twice_is_stable` | Verifies double-undo doesn't go past the bottom of the history stack. |
| 79 | `test_history_redo_twice_is_stable` | Verifies double-redo doesn't go past the top of the history stack. |
| 94 | `test_history_max_steps` | Pushes 10 actions with max_steps=3 and verifies only 3 are retained. |
| 108 | `test_history_new_action_truncates_redo` | Undoes, then pushes a new action; verifies redo stack is truncated. |
| 133 | `test_history_jump_to` | Pushes 3 actions, jumps to index -1, verifies at bottom with full redo stack. |
| 161 | `test_entry_description` | Tests that entry_description returns the action description for valid indices and None for invalid. |
### `hcie-history` — src/lib.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 126 | `first_entry_can_redo_from_pre_history_cursor` | Verifies the first history entry can be redone after undo when cursor starts at pre-history state. |
### `hcie-fx` — src/parser.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 1671 | `test_parse_asl_emboss` | Tests parsing an ASL file for emboss styles, verifying styles are non-empty with UUIDs and effects. Ignored by default (requires fixture). |
### `hcie-io` — src/test_psd_composite.rs
| Line | Function | Summary |
|------|----------|---------|
| 3 | `test_psd_import_sizes_and_offsets` | Imports Example3-mini.psd, checks background has >1M non-zero pixels and named layers have correct data. |
| 43 | `test_psd_composite_against_ref` | Full composite comparison of PSD layers against reference PNG, asserting MAE < 2.0 and match ≥ 88%. |
| 241 | `test_layer_pixels_direct` | Compares raw layer pixels (layer 0 and all layers) against reference PNG pixel-by-pixel per layer. |
| 301 | `test_base_generated_2_vs_merged` | Compares our composited output against ImageMagick-extracted PSD merged image. |
| 345 | `test_blend_normal` | Tests basic src-over compositing with known RGBA values and prints expected vs actual. |
| 364 | `test_teal_circle_emboss_debug` | Imports base_test_generated_2.psd, extracts the BevelEmboss effect from the teal circle layer. |
| 378 | `test_base_generated_2_no_effects` | Composites with all effects disabled and compares against reference to measure baseline error. |
| 420 | `test_base_generated_2_composite` | Composite and compare base_test_generated_2.psd against reference PNG. |
| 428 | `test_hc_emboss_composite` | Composite and compare hc_emboss.psd against its reference PNG. |
| 438 | `test_base_generated_2_effect_isolation` | Disables effects layer-by-layer, measuring MAE delta to isolate which effects contribute most to error. |
| 491 | `test_check_soft_orange_pixels` | Prints RGBA values of specific pixels in Soft Orange Shape and Pink Rectangle layers. |
| 516 | `test_find_orange_pixels` | Finds non-zero pixel bounds in Soft Orange Shape layer and samples pixels. |
| 555 | `test_layer_bounds` | Computes and prints non-zero pixel bounds for every layer in base_test_generated_2.psd. |
| 584 | `test_check_layer_offsets` | Finds leftmost/topmost non-zero pixels to determine layer position offsets. |
| 621 | `test_save_layer_pixels` | Saves each layer as a separate PNG to /tmp for visual inspection. |
| 635 | `test_pixel_layer_contributions` | Prints RGBA contributions from each layer at 5 specific pixel coordinates. |
| 658 | `test_load_test_2_psd` | Loads and composites all PSDs from test_2 directory, printing load/composite times. |
| 696 | `test_per_layer_effects_vs_photoshop_export` | Per-layer effect comparison: applies effects to each layer and compares against Photoshop-exported PNGs. |
| 795 | `test_test2_effects_mae` | Computes MAE for all PSDs in test_2 directory against JPG references and prints average. |
| 861 | `test_sultan_effects_mae` | Full sultan.psd composite analysis: per-layer skip analysis, grid-based MAE breakdown, debug saves. |
| 1057 | `test_emboss_optimize` | emboss.psd detailed analysis: channel MAE, opaque-only MAE, regional grid, horizontal/vertical line scans, saves debug heatmaps. |
| 1246 | `test_effects_survive_ffi_boundary` | Verifies that effects parsed from PSD survive the PSD→protocol layer boundary (effects > 0). |
| 1276 | `test_ffi_bincode_roundtrip` | Verifies bincode serialization/deserialization round-trip preserves all layer effects. |
### `hcie-psd` — src/
| File | Line | Function | Summary |
|------|------|----------|---------|
| lib.rs | 341 | `psd_signature_fail` | Verifies that loading a PNG file through Psd::from_bytes returns a PSD signature error. |
| psd_channel.rs | 357 | `does_not_read_beyond_rle_channels_bytes` | Verifies RLE channel insertion doesn't read beyond channel bytes by testing 1×1 layer with RLE-compressed Red channel. |
| sections/file_header_section.rs | 291 | `valid_channel_count` | Verifies ChannelCount::new accepts all channel counts from 1 to 56. |
| sections/file_header_section.rs | 300 | `invalid_channel_count` | Verifies ChannelCount::new rejects 0 and 57. |
| sections/file_header_section.rs | 307 | `incorrect_file_header_section_length` | Verifies a 25-byte input returns IncorrectLength error. |
| sections/file_header_section.rs | 317 | `first_four_bytes_incorrect` | Tests that invalid first 4 bytes (wrong PSD signature) returns InvalidSignature error. |
| sections/file_header_section.rs | 329 | `version_incorrect` | Tests that wrong version number returns InvalidVersion error. |
| sections/file_header_section.rs | 339 | `invalid_reserved_section` | Tests that wrong reserved section returns InvalidReserved error. |
### `hcie-vision` — src/smart_patch.rs
| Line | Function | Summary |
|------|----------|---------|
| 415 | `identity_patch_on_uniform_regions_is_stable` | Smart patch on two identical uniform 120-gray 16×16 layers; verifies output changes by at most 1 per channel. |
| 433 | `patch_interior_moves_toward_source_gradient` | Patches a gradient source into a uniform destination; verifies exterior unchanged and interior follows gradient direction. |
### `hcie-build-info` — src/lib.rs
| Line | Function | Summary |
|------|----------|---------|
| 31 | `generated_version_contains_the_same_build_id` | Verifies build_id() > 0 and VERSION string ends with "+build.{BUILD_ID}". |
---
## Layer 4: ENGINE API
### `hcie-engine-api` — tests/visual_regression.rs
| Line | Function | Summary |
|------|----------|---------|
| 39 | `white_canvas_empty_document` | Validates blank 8×8 transparent document produces deterministic SHA-256 hash. |
| 58 | `green_rect_draw_and_composite` | Draws a green rectangle and checks center pixel + deterministic hash. |
| 79 | `red_rect_over_green_rect` | Two-layer composite (green bottom, red top) verifying top layer wins + hash. |
| 109 | `vector_rect_golden` | Adds a vector rect shape and verifies rendering through Engine API with hash. |
| 145 | `brush_stroke_golden` | Draws a brush stroke and verifies deterministic output via golden hash. |
| 178 | `invert_filter_golden` | Applies invert filter and validates pixel values + deterministic hash. |
| 200 | `undo_after_rect_golden` | Draws then undoes a rectangle; verifies composite hash matches initial state. |
| 221 | `vector_fill_toggle_and_delete` | Creates vector rect, toggles fill on/off, deletes shape, verifying state at each step. |
### `hcie-engine-api` — tests/vector_creation_history.rs
| Line | Function | Summary |
|------|----------|---------|
| 35 | `first_vector_shape_is_one_atomic_layer_transaction` | Verifies first vector shape auto-creates vector layer as one history transaction with correct description. |
| 71 | `later_vector_shapes_each_add_one_snapshot` | Verifies later vector shapes on the same layer each add one snapshot and undo correctly reduces shape count. |
### `hcie-engine-api` — tests/meadow_check.rs
| Line | Function | Summary |
|------|----------|---------|
| 18 | `meadow_brush_visual_check` | Manual visual check: renders Meadow brush strokes to 512×512 canvas and saves PNG; asserts colored pixels exist. |
### `hcie-engine-api` — tests/leaves_check.rs
| Line | Function | Summary |
|------|----------|---------|
| 11 | `leaves_brush_visual_check` | Manual visual check: renders Leaf brush strokes and saves to PNG; asserts colored pixels exist. |
### `hcie-engine-api` — tests/stamp_floor_check.rs
| Line | Function | Summary |
|------|----------|---------|
| 11 | `stamp_floor_brush_visual_check` | Manual visual check: renders Dirt/StampFloor brush strokes and saves to PNG; asserts colored pixels exist. |
### `hcie-engine-api` — tests/bitmap_brush_stamp.rs
| Line | Function | Summary |
|------|----------|---------|
| 4 | `bitmap_brush_stamp_shape` | Tests bitmap brush stamp produces roughly square bounding box (~8×8) with enough painted pixels. |
### `hcie-engine-api` — tests/selection_clear.rs
| Line | Function | Summary |
|------|----------|---------|
| 30 | `clear_selection_pixels_clears_inside_and_preserves_outside` | Creates 3×3 opaque layer, selects center pixel, clears selection; verifies center cleared, outside preserved. |
### `hcie-engine-api` — tests/performance_stroke_4k.rs
| Line | Function | Summary |
|------|----------|---------|
| 41 | `benchmark_4k_stroke_on_multilayer_document` | Performance benchmark: 10 layers on 3840×2160 canvas, 100 stroke segments with per-segment timing. |
### `hcie-engine-api` — src/stroke_brush.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 547 | `watercolor_dirty_radius_covers_jitter_and_scatter` | Verifies brush_dirty_radius for watercolor with jitter/scatter matches expected value 74.8. |
---
## Layer 6: GUI — egui
### `hcie-gui-egui` — tests/canvas_engine.rs
| Line | Function | Summary |
|------|----------|---------|
| 23 | `canvas_widget_creation` | Tests CanvasWidget can be created and rendered in an egui test UI. |
| 41 | `canvas_widget_zoom_0_1` | Tests canvas widget renders with zoom=0.1. |
| 45 | `canvas_widget_zoom_0_5` | Tests canvas widget renders with zoom=0.5. |
| 49 | `canvas_widget_zoom_1_0` | Tests canvas widget renders with zoom=1.0. |
| 53 | `canvas_widget_zoom_2_0` | Tests canvas widget renders with zoom=2.0. |
| 57 | `canvas_widget_zoom_4_0` | Tests canvas widget renders with zoom=4.0. |
| 61 | `canvas_widget_zoom_8_0` | Tests canvas widget renders with zoom=8.0. |
| 65 | `canvas_widget_zoom_min` | Tests canvas widget renders at ZOOM_MIN. |
| 69 | `canvas_widget_zoom_max` | Tests canvas widget renders at ZOOM_MAX. |
| 83 | `canvas_widget_pen` | Tests canvas widget with Pen tool. |
| 87 | `canvas_widget_brush` | Tests canvas widget with Brush tool. |
| 91 | `canvas_widget_eraser` | Tests canvas widget with Eraser tool. |
| 95 | `canvas_widget_rect` | Tests canvas widget with VectorRect tool. |
| 99 | `canvas_widget_line` | Tests canvas widget with VectorLine tool. |
| 103 | `canvas_widget_select` | Tests canvas widget with Select tool. |
| 107 | `canvas_widget_lasso` | Tests canvas widget with Lasso tool. |
| 111 | `canvas_widget_magic_wand` | Tests canvas widget with MagicWand tool. |
| 115 | `canvas_widget_eyedropper` | Tests canvas widget with Eyedropper tool. |
| 119 | `canvas_widget_flood_fill` | Tests canvas widget with FloodFill tool. |
| 123 | `canvas_widget_gradient` | Tests canvas widget with Gradient tool. |
| 127 | `canvas_widget_move` | Tests canvas widget with Move tool. |
| 131 | `canvas_widget_crop` | Tests canvas widget with Crop tool. |
| 136 | `canvas_widget_with_pan` | Tests canvas widget with pan offset applied. |
| 146 | `canvas_widget_with_selection` | Tests canvas widget with a selection rectangle active. |
| 156 | `canvas_widget_lasso_with_points` | Tests canvas widget with Lasso tool and lasso points. |
| 167 | `canvas_widget_text_active` | Tests canvas widget with Text tool and draft text active. |
| 181 | `app_document_zoom_roundtrip` | Tests Zoom round-trip for many zoom values (0.164.0) through AppDocument. |
| 193 | `engine_composite_after_draw` | Tests Engine compositing after drawing a green rectangle through AppDocument. |
| 207 | `engine_multi_layer_composite` | Tests multi-layer compositing through AppDocument (adds layer, draws red rect, checks pixel). |
| 218 | `transform_handle_variants` | Basic match test ensuring all TransformHandle variants exist. |
| 232 | `selection_transform_from_engine_empty_mask` | Tests SelectionTransform::from_engine with empty mask produces empty transform. |
| 241 | `zoom_clamp_values` | Tests zoom clamping for values from -1.0 to 100.0 stays within [ZOOM_MIN, ZOOM_MAX]. |
| 257 | `event_bus_events_dispatched_to_engine` | Tests that engine undo changes composite pixel values through AppDocument. |
| 267 | `test_text_layer_rotation` | Adds rotated text layer and verifies at least one non-transparent pixel was rasterized. |
### `hcie-gui-egui` — tests/gui_audit.rs
| Line | Function | Summary |
|------|----------|---------|
| 6 | `test_all_tools_in_toolbox_groups` | Verifies every Tool variant is present in TOOL_SLOTS. |
| 23 | `test_all_tools_have_labels` | Verifies every tool has a non-empty label(). |
| 32 | `test_all_tools_have_icons` | Verifies every tool has a non-empty icon(). |
| 41 | `test_all_blend_modes_have_labels` | Verifies every BlendMode has a non-empty label(). |
| 50 | `test_tools_menu_coverage` | Verifies expected tools in menu are defined in Tool::ALL. |
| 81 | `test_view_menu_panels_match` | Verifies panel labels are unique. |
| 102 | `test_all_tools_layer_type_known` | Calls allowed_layer_type() on every tool to ensure it doesn't panic. |
| 110 | `test_feature_flags_are_non_empty` | Verifies all_features() returns non-empty flags including "layers", "undo_redo", "selection". |
| 123 | `test_app_event_variants_exist` | Creates an EventBus to verify the module exists. |
| 131 | `test_dock_panels_have_icons` | Verifies all HciePane variants have icons. |
| 154 | `test_shape_tools_consistency` | Verifies 15 specific shape tools return true for is_shape_tool(). |
| 181 | `test_raster_tools_consistency` | Verifies raster tools are also raster_compatible. |
| 194 | `test_brush_presets` | Verifies 5 brush presets have positive size and opacity. |
| 211 | `test_canvas_presets` | Verifies 1080p and Instagram canvas presets have correct dimensions. |
### `hcie-gui-egui` — tests/widget_ui.rs
| Line | Function | Summary |
|------|----------|---------|
| 24 | `plain_slider_default_range` | Tests slider with in-range value (50 in 0..100) stays at 50. |
| 29 | `plain_slider_out_of_range_clamps` | Tests slider clamps value above range to max. |
| 34 | `plain_slider_negative_clamps` | Tests slider clamps negative value to range min. |
| 39 | `plain_slider_suffix` | Tests slider renders with "px" suffix. |
| 49 | `plain_slider_integer_type` | Tests slider with i32 integer type. |
| 58 | `plain_slider_custom_width` | Tests slider with custom width. |
| 68 | `plain_slider_both_themes` | Tests slider renders with both ProDark and PhotoshopLight themes. |
| 79 | `tool_state_default_active_tool_is_brush` | Verifies default active tool is Brush. |
| 85 | `tool_state_default_colors` | Verifies default primary (black) and secondary (white) colors. |
| 92 | `tool_state_default_pressure` | Verifies default pressure is 1.0. |
| 98 | `tool_state_default_not_drawing` | Verifies default state has is_drawing=false, no drag start, no selection rect. |
| 106 | `tool_state_default_tool_configs` | Verifies active_size() returns a positive value. |
| 113 | `tool_state_default_brush_presets` | Verifies default brush presets exist and active preset is "basic_round". |
| 120 | `tool_state_pinned_panels_default` | Verifies default pinned panels include Tools, Brushes & Tips, Color Palette, Layers. |
| 129 | `app_document_new_defaults` | Tests AppDocument default state (name, zoom=1, no textures, empty buffer). |
| 139 | `app_document_engine_accessible` | Verifies AppDocument wraps Engine with correct canvas dimensions. |
| 147 | `app_document_default_name` | Tests AppDocument name is set correctly. |
| 153 | `event_bus_push_pop` | Tests EventBus push and pop single event. |
| 166 | `event_bus_fifo_order` | Tests EventBus maintains FIFO order. |
| 177 | `event_bus_drain` | Tests EventBus drain returns all events. |
| 189 | `event_bus_tool_changed` | Tests EventBus pushes/reads ToolChanged event. |
| 197 | `event_bus_zoom_set` | Tests EventBus pushes/reads ZoomSet event. |
| 205 | `event_bus_theme_changed` | Tests EventBus pushes/reads ThemeChanged event. |
| 216 | `event_bus_apply_filter` | Tests EventBus pushes/reads ApplyFilter event with params. |
| 226 | `event_bus_multiple_events` | Tests EventBus with three selection events in sequence. |
| 238 | `event_bus_new_empty` | Tests new EventBus is empty. |
| 245 | `event_bus_doc_created` | Tests EventBus pushes/reads DocCreated event with name, width, height. |
| 260 | `tool_button_selected` | Tests ToolButton renders in selected state. |
| 268 | `tool_button_unselected` | Tests ToolButton renders in unselected state. |
| 276 | `tool_button_both_themes` | Tests ToolButton renders with both themes. |
| 286 | `plain_slider_logarithmic` | Tests slider in logarithmic mode. |
| 296 | `plain_slider_snap_steps` | Tests slider with snap steps. |
| 306 | `plain_slider_percent_suffix` | Tests slider with "%" suffix. |
| 316 | `plain_slider_u8_range` | Tests slider with u8 range. |
| 325 | `plain_slider_usize_range` | Tests slider with usize range. |
| 334 | `selection_op_variants` | Tests SelectionOp enum variants can be constructed. |
| 343 | `event_bus_selection_shrink` | Tests EventBus SelectionShrink event. |
| 351 | `event_bus_selection_feather` | Tests EventBus SelectionFeather event. |
| 359 | `event_bus_selection_erode` | Tests EventBus SelectionErode event. |
| 367 | `event_bus_selection_fade` | Tests EventBus SelectionFade event. |
| 375 | `event_bus_clipboard_cut` | Tests EventBus ClipboardCut event. |
| 383 | `event_bus_clipboard_paste_special` | Tests EventBus ClipboardPasteSpecial event. |
| 391 | `event_bus_layer_added` | Tests EventBus LayerAdded event. |
| 399 | `event_bus_layer_deleted` | Tests EventBus LayerDeleted(42) event. |
| 407 | `event_bus_rotate_clockwise` | Tests EventBus RotateClockwise event. |
| 415 | `event_bus_rotate_counter_clockwise` | Tests EventBus RotateCounterClockwise event. |
| 423 | `event_bus_rotate_180` | Tests EventBus Rotate180 event. |
| 431 | `event_bus_rotate_layer` | Tests EventBus RotateLayer(45) event. |
| 439 | `event_bus_flip_horizontal` | Tests EventBus FlipHorizontal event. |
| 447 | `event_bus_flip_vertical` | Tests EventBus FlipVertical event. |
| 455 | `event_bus_layer_clear` | Tests EventBus LayerClear event. |
| 463 | `event_bus_transform_start` | Tests EventBus TransformStart event. |
| 471 | `event_bus_image_size` | Tests EventBus ImageSize event. |
| 479 | `event_bus_canvas_size` | Tests EventBus CanvasSize event. |
| 487 | `event_bus_ai_chat_submit` | Tests EventBus AiChatSubmit event. |
| 495 | `event_bus_adjustment_brightness_contrast` | Tests EventBus ApplyAdjustmentBrightnessContrast event. |
| 505 | `event_bus_adjustment_hue_saturation` | Tests EventBus ApplyAdjustmentHueSaturation event. |
| 515 | `event_bus_vector_shape_deleted` | Tests EventBus VectorShapeDeleted event. |
| 523 | `event_bus_file_export_import` | Tests EventBus Export/Import/ImportBrushes events. |
| 534 | `event_bus_align_all_axes` | Tests EventBus AlignLayer event for all 6 align axes (HCenter, VCenter, Top, Bottom, Left, Right). |
### `hcie-gui-egui` — src/brush_import.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 604 | `test_extract_desc_block_names` | Tests extracting descriptor block names from an ABR brush file; verifies names are descriptive. |
| 623 | `test_abr_import_with_names` | Tests importing ABR brush presets; verifies bitmap presets have descriptive names. |
---
## Layer 6: GUI — iced
### `hcie-iced-gui` — tests/selection_test.rs
| Line | Function | Summary |
|------|----------|---------|
| 11 | `test_selection_transform_is_empty` | Verifies empty SelectionTransform returns true for is_empty(). |
| 24 | `test_selection_transform_with_data` | Verifies non-empty SelectionTransform returns false for is_empty(). |
| 37 | `test_crop_state_lifecycle` | Tests CropState: start_drag, update_drag, end_drag, confirm lifecycle. |
| 63 | `test_crop_cancel` | Tests CropState cancel restores idle state. |
| 73 | `test_transform_handle_cursor_hints` | Verifies cursor_hint() returns correct strings for Move, TopLeft, Rotate handles. |
| 80 | `selection_modes_combine_alpha_without_losing_soft_edges` | Tests combine_masks with Replace, Add, Subtract, Intersect modes. |
| 99 | `irregular_mask_bounds_and_fill_spans_are_exact` | Tests mask_bounds and selected_spans on irregular mask. |
| 109 | `crop_clamps_drag_and_cancel_restores_idle_state` | Tests CropState start_drag_clamped, update_drag clamped to canvas, cancel restores state. |
| 120 | `clipboard_transform_is_centered_and_transform_geometry_is_safe` | Tests centered_transform produces correct position and sanitize_geometry handles NaN/negative sizes. |
| 136 | `inverse_affine_identity_sampling_is_exact` | Verifies the inverse-affine rasterizer preserves identity placement exactly. |
| 159 | `rotated_bounds_expand_to_cover_corners` | Tests that rotated bounds include every corner rather than clipping to unrotated box. |
| 177 | `rotated_handle_hit_test_and_resize_share_geometry` | Verifies rotated handle hit-testing and opposite-corner anchoring during resize. |
| 204 | `rotation_drag_adds_delta_to_original_angle` | Verifies rotation uses drag-start delta and retains pre-existing rotation. |
### `hcie-iced-gui` — tests/feature_scorecard.rs
| Line | Function | Summary |
|------|----------|---------|
| 55 | `semantic_menu_dispatch_has_no_positional_message` | Verifies menu uses semantic MenuCommand dispatch not positional (usize, usize). |
| 73 | `cut_does_not_dispatch_copy` | Verifies Cut uses distinct MenuCommand::Cut not menu-alias-based Copy. |
| 91 | `cycle_three_canvas_selection_clipboard_crop_text_paths_are_connected` | Verifies selection overlay, distinct cut, transform placement, crop lifecycle, text multiline, gradient, canvas input parity, and pen/spray distinct. |
| 152 | `screenshot_cli_uses_native_capture_and_panel_crop` | Verifies screenshot CLI uses native window capture and panel crop functions. |
| 170 | `cycle_one_state_paths_are_complete_and_persisted` | Verifies dock drop targets, theme sync isolation, and sidebar mode persistence. |
| 211 | `cycle_two_vector_completion_paths_are_connected` | Verifies vector screen-constant handles, constrained drag, layer-bound cancel, boolean result, and clamped controls. |
| 252 | `cycle_four_panel_and_document_paths_are_connected` | Verifies layer hierarchy controls, style cancel/restore, immutable previews, filter schema coverage, document path identity, and close-save continuation. |
| 316 | `cycle_five_practical_paths_are_connected` | Verifies AI real streaming, reasoning transcript, validated script output, viewer deterministic navigation, and safe edit. |
### `hcie-iced-gui` — tests/raster_test.rs
| Line | Function | Summary |
|------|----------|---------|
| 6 | `linear_gradient_interpolates_and_respects_mask` | Tests linear gradient interpolation with pixel mask applied. |
| 27 | `radial_gradient_uses_distance_from_origin` | Tests radial gradient using distance from origin. |
### `hcie-iced-gui` — src/app.rs (internal)
| Line | Function | Summary |
|------|----------|---------|
| 1536 | `move_commit_pushes_one_named_snapshot` | Tests apply_transform_to_layer pushes exactly one history entry named "Move Selection". |
| 10083 | `popup_and_menu_escape_priority_is_stable` | Tests overlay_escape_target returns correct priority ordering. |
| 10098 | `document_tab_close_uses_semantic_continuations` | Tests document_close_disposition for dirty, clean, last-tab, and invalid scenarios. |
| 10119 | `document_tab_close_keeps_active_index_safe` | Tests active_index_after_document_close produces safe indices. |
| 10128 | `selection_sync_request_is_consumed_once` | Tests consume_selection_sync_request flag is consumed once and stays false until reset. |
| 10140 | `dirty_region_union_retains_all_updates_before_view` | Tests union_regions correctly merges two overlapping regions. |
| 10152 | `proximate_identical_color_is_skipped` | Tests is_proximate_to_last returns true for identical colors (diff=0 ≤ threshold). |
| 10163 | `proximate_small_slider_step_skipped` | Tests is_proximate_to_last returns true for +1 channel change. |
| 10171 | `large_change_not_proximate` | Tests is_proximate_to_last returns false for +3 in all channels. |
| 10179 | `three_unit_change_exceeds_threshold` | Tests is_proximate_to_last returns false for single +3 channel change. |
| 10187 | `mixed_small_changes_are_proximate` | Tests is_proximate_to_last returns true for +1 in all channels. |
### `hcie-iced-gui` — src/app/transform_dirty.rs
| Line | Function | Summary |
|------|----------|---------|
| 70 | `consecutive_positions_retain_old_and_new_extents` | Tests that two consecutive transform positions produce correct old+new union bounds. |
### `hcie-iced-gui` — src/color_picker.rs
| Line | Function | Summary |
|------|----------|---------|
| 1048 | `rgb_hsl_roundtrip_preserves_channels_with_rounding_tolerance` | Tests RGB→HSL→RGB roundtrip for 4 colors with ≤1 tolerance per channel. |
| 1059 | `rgb_hsv_roundtrip_preserves_channels_with_rounding_tolerance` | Tests RGB→HSV→RGB roundtrip for 4 colors with ≤1 tolerance per channel. |
| 1070 | `hex_parser_preserves_or_explicitly_updates_alpha` | Tests parse_hex_color with 6-digit, 8-digit, and invalid hex strings. |
### `hcie-iced-gui` — src/ai_chat.rs
| Line | Function | Summary |
|------|----------|---------|
| 794 | `canvas_context_replaces_only_latest_user_payload` | Tests build_messages_json replaces only the latest user message with canvas context. |
| 818 | `transcript_includes_reasoning_and_tool_results` | Tests transcript_text includes reasoning and tool messages correctly. |
### `hcie-iced-gui` — src/ai_script.rs
| Line | Function | Summary |
|------|----------|---------|
| 244 | `generated_output_must_parse_before_run_is_enabled` | Tests validate_script_output accepts valid DSL and rejects invalid input. |
### `hcie-iced-gui` — src/screenshot.rs
| Line | Function | Summary |
|------|----------|---------|
| 126 | `physical_crop_scales_and_clamps` | Tests physical_crop_rect scaling rounds outward and clamps to viewport. |
### `hcie-iced-gui` — src/sidebar/mod.rs
| Line | Function | Summary |
|------|----------|---------|
| 858 | `every_subtool_has_an_svg_icon` | Tests that every tool in TOOL_SLOTS has a resolvable SVG icon path. |
### `hcie-iced-gui` — src/theme.rs
| Line | Function | Summary |
|------|----------|---------|
| 65 | `theme_state_retains_and_reports_selected_preset` | Tests ThemeState preset changes are retained and colors updated accordingly. |
### `hcie-iced-gui` — src/viewer/mod.rs
| Line | Function | Summary |
|------|----------|---------|
| 989 | `navigation_wraps_deterministically` | Tests ViewerState prev/next wraps correctly with 2 images. |
| 999 | `supported_extensions_are_case_insensitive` | Tests is_supported_image is case-insensitive and rejects non-image files. |
### `hcie-iced-gui` — src/settings.rs
| Line | Function | Summary |
|------|----------|---------|
| 367 | `legacy_settings_default_new_cycle_one_fields` | Tests deserializing legacy settings (without new fields) gets safe defaults. |
### `hcie-iced-gui` — src/cli.rs
| Line | Function | Summary |
|------|----------|---------|
| 206 | `parses_full_screenshot_and_startup_file` | Tests CLI parses --screenshot flag with output file and startup file. |
| 223 | `parses_named_panel_screenshot` | Tests CLI parses --screenshot-panel flag. |
| 229 | `parses_svg_editor_screenshot` | Tests CLI parses --screenshot-svg-editor flag. |
| 237 | `rejects_duplicate_positional_files` | Tests CLI rejects multiple positional file arguments. |
| 242 | `supports_dash_prefixed_file_after_terminator` | Tests CLI supports dash-prefixed filenames after -- terminator. |
### `hcie-iced-gui` — src/canvas/shader_canvas.rs
| Line | Function | Summary |
|------|----------|---------|
| 1282 | `selection_overlay_uses_one_texture_sample` | Verifies the WGSL shader uses exactly one `textureSample(selection_texture` call (anti-regression for nine-sample detector). |
### `hcie-iced-gui` — src/canvas/texture_update.rs
| Line | Function | Summary |
|------|----------|---------|
| 196 | `retained_shader_reference_keeps_stable_allocation_and_dirty_budget` | Tests that retained shader reference keeps stable allocation and correct dirty budget over 120 updates. |
| 227 | `legacy_arc_copy_on_write_reproduction_is_full_canvas` | Demonstrates that Arc::get_mut on a cloned Arc returns None, forcing 33MB fallback clone (documents removed CoW fallback). |
| 237 | `packed_update_is_exact_and_bounds_checked` | Tests TextureUpdate::pack produces correct rows and rejects invalid regions. |
| 253 | `diagnostic_4k_dirty_staging_latency` | Diagnostic benchmark (ignored) measuring 4K dirty region staging latency and byte reduction vs legacy. |
### `hcie-iced-gui` — src/selection/state.rs
| Line | Function | Summary |
|------|----------|---------|
| 188 | `selection_texture_encodes_membership_and_border_once` | Tests encode_selection_texture correctly classifies interior (128), border (255), and empty (0). |
| 212 | `feathered_mask_uses_existing_threshold` | Tests feathered mask encoding: values >127 become 255 (border), ≤127 become 0 (outside). |
### `hcie-iced-gui` — src/panels/menus.rs
| Line | Function | Summary |
|------|----------|---------|
| 1205 | `enabled_menu_leaves_have_commands` | Verifies enabled menu items always have a command and submenus never have commands. |
| 1232 | `recent_file_commands_are_path_based` | Tests recent file menu items use path-based commands, not positional indices. |
| 1253 | `implemented_static_menu_leaves_match_audited_set` | Snapshot test: verifies all 153 enabled menu entries match expected paths. |
| 1423 | `context_cut_is_enabled_and_distinct_from_copy` | Verifies context Cut uses MenuCommand::Cut with enabled=true. |
| 1432 | `shared_menu_metrics_keep_rows_compact_and_gutters_stable` | Verifies MENU_ROW_HEIGHT, paddings, gutters, and arrow character are within expected ranges. |
### `hcie-iced-gui` — src/panels/styles.rs
| Line | Function | Summary |
|------|----------|---------|
| 319 | `tooltip_balloon_is_opaque_and_uses_theme_contrast_tokens` | Tests tooltip balloon background opacity, text color, border, and shadow in two themes. |
### `hcie-iced-gui` — src/panels/custom_shapes.rs
| Line | Function | Summary |
|------|----------|---------|
| 211 | `responsive_grid_adds_columns_as_width_grows` | Tests grid_column_count adds one column per ~64px of width (with margin). |
### `hcie-iced-gui` — src/panels/brushes.rs
| Line | Function | Summary |
|------|----------|---------|
| 874 | `catalog_contains_every_engine_brush_style` | Asserts BRUSH_STYLES has exactly 34 entries. |
| 879 | `category_filter_keeps_expected_groups` | Tests category_matches_style for various category combinations. |
| 900 | `media_crates_expose_complete_unique_catalog` | Verifies all media brush crates combined give exactly 47 unique presets. |
### `hcie-iced-gui` — src/panels/svg_editor.rs
| Line | Function | Summary |
|------|----------|---------|
| 874 | `straight_paths_retain_author_nodes` | Tests straight SVG paths retain their exact node count. |
| 882 | `curved_paths_fall_back_to_dense_visual_nodes` | Tests curved SVG paths flatten to ≥19 visual nodes. |
| 892 | `selection_updates_numeric_inputs_and_snap_is_deterministic` | Tests node selection updates x/y inputs, snap function works correctly, and toggling snap off. |
### `hcie-iced-gui` — src/panels/title_bar.rs
| Line | Function | Summary |
|------|----------|---------|
| 299 | `menu_anchors_are_deterministic_across_viewport_widths` | Tests menu_anchor_x calculation for various indices and viewport widths. |
### `hcie-iced-gui` — src/vector_edit.rs
| Line | Function | Summary |
|------|----------|---------|
| 386 | `overlap_selection_cycles_without_external_counter` | Tests cycle_selection cycles through hit indices in reverse order without external state. |
| 397 | `handle_hit_area_is_screen_constant_across_zoom` | Tests hit_test_handle returns correct handle at two different zoom levels. |
| 416 | `rotation_handle_offset_is_screen_constant_at_low_zoom` | Tests rotation handle offset is screen-constant at 0.25 zoom. |
| 430 | `every_resize_handle_prevents_inversion_and_nan` | Tests all 8 resize handles prevent inversion and NaN with extreme/finite deltas. |
| 463 | `shift_aspect_and_alt_center_constraints_hold` | Tests Shift+Alt resize preserves 2:1 aspect ratio and original center. |
| 480 | `drag_is_deterministic_and_rejects_non_finite_input` | Tests transform_shape returns correct moved bounds and handles NaN gracefully. |
| 498 | `rotated_handle_hit_test_uses_rotated_position` | Tests hit_test_handle works correctly with a 90° rotated shape. |
### `hcie-iced-gui` — src/widgets/plain_slider.rs
| Line | Function | Summary |
|------|----------|---------|
| 442 | `percentage_format_parse_and_clamp_are_stable` | Tests slider format_value with "%" suffix and parse_value clamping. |
| 450 | `hover_typing_accepts_only_numeric_fragments` | Tests typing state accepts "-" and numeric fragments, rejects "px". |
| 460 | `pointer_mapping_respects_endpoints_and_step` | Tests value_at maps 0→0%, 100→100%, 33→~33%. |
### `hcie-iced-gui` — src/dock/state.rs
| Line | Function | Summary |
|------|----------|---------|
| 161 | `pane_labels_round_trip` | Tests PaneType::from_label round-trip is case-sensitive. |
| 168 | `pane_drops_support_all_regions_and_preserve_one_canvas` | Tests all dock drop regions accept non-Canvas panes and reject Center for non-Canvas. |
| 195 | `canvas_drop_is_rejected_and_auto_hide_restores_uniquely` | Tests Canvas pane drops reject, auto-hide/restore works, and invariants hold. |
| 214 | `floating_panel_redocks_at_preview_target_and_can_minimize` | Tests floating panel float, redock at target, auto-hide floating, and invariants. |
| 234 | `global_release_clears_click_only_and_floating_drag_state` | Tests cancel_transient_drags clears both drag and floating_drag state. |
### `hcie-iced-gui` — src/dock/manager.rs
| Line | Function | Summary |
|------|----------|---------|
| 145 | `policy_matrix_allows_only_tool_edges` | Tests DockDropPolicy::accepts rejects Canvas for Center and allows non-Canvas for edges. |
| 162 | `document_cannot_close_auto_hide_or_float` | Tests DockDropPolicy::accepts_placement rejects Canvas for Closed, AutoHidden, Floating. |
### `hcie-iced-gui` — src/dock/sizing.rs
| Line | Function | Summary |
|------|----------|---------|
| 436 | `policy_values_prioritize_canvas_and_bound_color_picker` | Tests panel_size_policy values for Canvas (min 320×240, grow priority) and ColorPicker (preferred 280×460, bounded). |
| 451 | `subtree_constraints_follow_split_axis` | Tests aggregate_subtree_policy produces correct min/max for Canvas+ColorPicker split. |
| 462 | `default_and_compact_viewports_have_feasible_bounds` | Tests both 1280×820 and 1100×700 viewports satisfy all panel minimums in default dock. |
| 483 | `color_picker_does_not_receive_vertical_surplus_with_list_sibling` | Tests vertical surplus distribution keeps ColorPicker within its height bounds with a Layers sibling. |
| 509 | `structure_rebalance_avoids_oversized_color_picker` | Tests StructureChanged rebalance corrects 50/50 split to give Canvas >60%. |
| 526 | `user_resize_preserves_valid_and_clamps_invalid_ratios` | Tests constrain_user_resize_ratio preserves 0.7 and clamps 0.95 to a feasible range. |
| 536 | `window_growth_gives_surplus_to_canvas` | Tests WindowResize rebalance gives all extra width to Canvas, not utility panels. |
| 555 | `color_picker_minimum_height_is_420` | Asserts ColorPicker minimum height policy is exactly 420 pixels. |
### `hcie-iced-gui` — src/dock/persistence.rs
| Line | Function | Summary |
|------|----------|---------|
| 171 | `persisted_layout_round_trips_without_runtime_ids` | Tests PersistedDockLayout serialization strips runtime Pane IDs and round-trips with valid invariants. |
| 180 | `malformed_tree_deduplicates_and_injects_canvas` | Tests restore handles duplicate panels (two Layers) by deduplicating and injecting Canvas. |
| 201 | `missing_new_fields_are_serde_compatible` | Tests that minimal JSON ({"tree":null}) deserializes with empty auto_hidden and floating. |
| 208 | `ratio_sanitization_accepts_extreme_finite_values_only` | Tests sanitized_ratio accepts 0.02, clamps 0.999→0.99, and converts NaN→0.5. |
| 221 | `floating_round_trip_clamps_and_redocks_uniquely` | Tests floating panel serialization, clamp within viewport, and unique redock. |
### `hcie-iced-gui` — src/dock/view.rs
| Line | Function | Summary |
|------|----------|---------|
| 707 | `title_bar_uses_explicit_drag_handle_and_separate_controls` | Verifies the dock title bar uses explicit mouse_area drag handle and separate controls, not Fill space. |
### `hcie-iced-gui` — src/dock/preview.rs
| Line | Function | Summary |
|------|----------|---------|
| 198 | `centers_are_never_approved` | Tests approved_target returns None for grid center point. |
| 210 | `outer_and_pane_edges_are_approved` | Tests approved_target correctly identifies left outer edge and top pane edge. |
| 230 | `narrow_viewport_clamps_to_empty_bounds` | Tests narrow viewport (toolbox > viewport width) produces zero-size grid. |
| 239 | `edge_classification_matches_iced_thirds_and_priority` | Tests pane_edge returns correct edge within first third and None in middle. |
| 257 | `outer_edge_uses_iced_dynamic_thickness_and_priority` | Tests outer_edge returns correct edge within first 10px and None beyond. |
### `hcie-iced-gui` — src/dock/floating.rs
| Line | Function | Summary |
|------|----------|---------|
| 118 | `default_rect_clamps_to_small_viewports` | Tests default_rect clamps position so 240×180 window fits in 4-pane viewport. |
---
## Brush Catalog Crates
| Crate | File | Line | Function | Summary |
|-------|------|------|----------|---------|
| `hcie-dry-media-brushes` | src/lib.rs | 246 | `dry_media_catalog_is_complete_and_unique` | Verifies exactly 19 dry media presets with unique IDs. |
| `hcie-paint-brushes` | src/lib.rs | 129 | `paint_catalog_is_complete_and_unique` | Verifies exactly 7 paint presets with unique IDs. |
| `hcie-digital-brushes` | src/lib.rs | 144 | `digital_catalog_separates_raster_and_vector_tools` | Verifies 5 digital presets and 2 vector brush presets. |
| `hcie-watercolor-brushes` | src/lib.rs | 438 | `presets_count` | Verifies exactly 8 watercolor presets. |
| `hcie-watercolor-brushes` | src/lib.rs | 443 | `all_presets_use_watercolor_style` | Verifies all watercolor presets use BrushStyle::Watercolor. |
| `hcie-watercolor-brushes` | src/lib.rs | 450 | `splat_dimensions` | Verifies render_watercolor_splat produces SPLAT_SIZE×SPLAT_SIZE×4 pixels. |
| `hcie-watercolor-brushes` | src/lib.rs | 456 | `splat_has_nonzero_alpha` | Verifies the rendered splat has at least one visible (non-zero alpha) pixel. |
| `hcie-ink-brushes` | src/lib.rs | 141 | `ink_catalog_is_complete_and_unique` | Verifies exactly 8 ink presets with unique IDs. |
---
## Summary
| Category | Approx. Count |
|----------|--------------|
| Layer 1: DATA (protocol, color) | 27 |
| Layer 2: ENGINE CORE (blend, brush, draw, composite, filter, selection, vector, history, fx, io, psd, vision, build-info) | ~155 |
| Layer 4: ENGINE API | 15 |
| Layer 6: GUI — egui (canvas_engine, gui_audit, widget_ui, brush_import) | ~90 |
| Layer 6: GUI — iced (selection, feature_scorecard, raster, app, dock, panels, widgets, color, ai, etc.) | ~120+ |
| Brush catalog crates | 8 |
| **Total** | **~415+** |