pcbjam/tests/WHATWORKS.md
Viktor Vaczi 7629ab978d test(e2e): fix wx suite — header deps, port pinning, drop legacy-GL tests, wx+pthread worker fix
Suite went 64 failed → 291 passed / 0 failed:
- Makefile.wasm: compile with -MMD -MP and include .d files — stale objects
  relinked against a newer wx lib crashed apps at startup with "function
  signature mismatch" after any header/vtable change
- playwright(.coroutine).config.ts: pin the server port for the whole run
  (resolvePort from playwright-kicad.config.ts); the 60s freshness window made
  workers restarted after a failure rotate to a dead port (ERR_CONNECTION_REFUSED
  cascade across ~50 tests)
- drop legacy-GL testing: KiCad renders via WebGL GAL (gal-webgl.spec.ts);
  remove minimal_test's OpenGL tab/GLTestCanvas, opengl.spec.ts, GL z-order
  describes, -sLEGACY_GL_EMULATION + gl_immediate_shim.js from the test build,
  and the orphaned GL baselines
- coroutine-pthread repro apps join the `all` target (make clean used to delete
  them while all never rebuilt them); clean no longer eats checked-in JS like
  worker_dom_stub.js
- bump wxwidgets: guard module-eval document access so wx+pthread apps
  (threadpool tests) survive Web Worker eval

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-10 13:40:00 +02:00

23 KiB

wxWidgets WASM Test Status

Last updated: 2025-12-04

Test Summary

All core Playwright tests pass

Category Status Notes
Main App Load WORKS minimal_test.html loads and renders correctly
Standalone Apps WORKS 38 standalone test apps (244 total tests passing)
wxGrid WORKS Grid renders with cells, labels, and event handling
wxTreeCtrl WORKS Tree renders with expand/collapse, selection, add/delete items
wxTimer WORKS Timer start/stop/interval all functional
wxDialog WORKS Modal dialogs render correctly with Asyncify
wxDataViewCtrl WORKS List and tree views for Zone Manager, Net Inspector
wxHtmlWindow WORKS HTML rendering for About dialogs, error formatting
wxStyledTextCtrl WORKS Syntax highlighting for DRC rules, Python console
wxPrinting WORKS Print preview, print dialog, browser print via window.print()
wxDragDrop WORKS HTML5 file drop support for external files
wxPropertyGrid WORKS Property panels with categories, types, events
wxColourPickerCtrl WORKS Color pickers for layer colors
wxFontPickerCtrl WORKS Font pickers for text preferences
wxCollapsiblePane WORKS Expandable/collapsible property sections
wxListCtrl (virtual) WORKS Virtual mode for 10000+ item lists
wxInfoBar WORKS Notification bar for messages and warnings
wxDataViewCtrl (virtual) WORKS Virtual mode for 10,000+ items in Zone Manager/Net Inspector
wxAuiNotebook WORKS Closeable, reorderable tabbed panels
wxWizard WORKS Step-by-step dialog for Footprint Wizard
wxGrid cell editing WORKS Full editing support with text, number, choice, checkbox
wxCalendarCtrl WORKS Date selection with navigation
wxGrid cell renderers WORKS Custom color swatches, icon+text, striped rows
wxPrintPreview WORKS Print preview frame with zoom, navigation
wxBitmapButton WORKS Toolbar buttons with custom icons
wxTreebook WORKS Hierarchical settings pages
wxBitmapComboBox WORKS Dropdown with color swatch icons
wxCheckListBox WORKS List with checkboxes for layer visibility
wxValidator WORKS Input validation (text, integer, floating point, custom)
wxOwnerDrawnComboBox WORKS Custom dropdown rendering (layer selectors, font choosers)
wxPopupWindow WORKS Transient popups (toolbar palettes, color pickers)
wxXmlDocument WORKS XML parsing for config/project files (665 KiCad occurrences)

KiCad wxWidgets Usage Coverage

This section maps KiCad's wxWidgets usage to our test coverage.

Critical for KiCad - WORKING

KiCad Feature wxWidgets Class Test Status Evidence
Main window frame wxFrame WORKS All apps show frame with title
Menu bar (File, Edit, etc.) wxMenuBar WORKS menu-03-file-clicked.png shows dropdown
Toolbars wxToolBar WORKS toolbar-01-loaded.png shows icons
Status bar (coords, zoom) wxStatusBar WORKS 3-field status bar like KiCad
Dockable panels wxAuiManager WORKS aui-01-loaded.png shows Properties/Layers/Messages
Tab panels wxNotebook WORKS 7 tabs switching correctly
Property editor panels wxSplitterWindow WORKS layout-01-loaded.png shows split panes
Scrollable content wxScrolledWindow WORKS 20 items scrollable in each pane
OpenGL canvas wxGLCanvas WORKS covered by gal-webgl tests (WebGL GAL)
OpenGL context wxGLContext WORKS covered by gal-webgl tests (WebGL GAL)
Drawing/painting wxDC WORKS 08-drawing-done.png shows strokes
Mouse events wxMouseEvent WORKS Drawing strokes captured

Controls - WORKING

KiCad Use wxWidgets Class Test Status Evidence
Action buttons wxButton WORKS "Click Me" button functional
Toggle tools wxToggleButton WORKS Toggle button in Controls tab
Options wxCheckBox WORKS "Enable feature" checkbox
Selection groups wxRadioButton WORKS Option A/B/C working
Value adjustment wxSlider WORKS Slider draggable
Progress display wxGauge WORKS Gauge renders
Numeric input wxSpinCtrl WORKS spinctrl-01-visible.png shows control
Search fields wxSearchCtrl WORKS Search field with placeholder
Item lists wxListBox WORKS Item selection with highlight
Dropdowns wxChoice WORKS 10a-choice-dropdown-open.png shows popup
Editable dropdowns wxComboBox WORKS Visible in Text Input tab

Text Input - WORKING

KiCad Use wxWidgets Class Test Status Evidence
Single-line entry wxTextCtrl WORKS Text input accepts typing
Multi-line entry wxTextCtrl (multiline) WORKS Line 1/2/3 typed successfully
Password fields wxTextCtrl (password) WORKS Password field visible

OpenGL Rendering

KiCad renders through the WebGL GAL path; see gal-webgl.spec.ts (26 scenarios). The legacy-GL-emulation tests (immediate mode via -sLEGACY_GL_EMULATION and gl_immediate_shim.js) were removed 2026-06-10 along with minimal_test's OpenGL tab.

File Operations - PARTIAL

KiCad Use wxWidgets Class Test Status Notes
Open file dialog wxFileDialog (FD_OPEN) PARTIAL Dialog events fire, browser file picker
Save file dialog wxFileDialog (FD_SAVE) PARTIAL Dialog events fire, browser file picker
Multiple file selection wxFileDialog (FD_MULTIPLE) PARTIAL Events fire

Previously BROKEN Features (Now Fixed)

wxTreeCtrl - WORKS ✓

  • Status: Tree control fully functional with expand/collapse, selection, add/delete
  • KiCad Impact: HIGH - KiCad uses wxTreeCtrl for hierarchy browsers, component trees
  • Evidence: tree-01-loaded.png shows tree with KiCad-like hierarchy
  • Fix: Added null guard in LogEvent() - events fired before m_log was initialized

wxMessageBox/wxDialog - WORKING ✓

  • Status: Modal dialogs render correctly with Asyncify
  • KiCad Impact: MEDIUM - Alert messages, confirmations
  • Evidence: dialog-02-info-clicked.png shows Info dialog with icon, title, message, OK button
  • Fix: Enabled Asyncify in build flags (-sASYNCIFY=1 -sASYNCIFY_IMPORTS=['startModal'])
  • Details: ShowModal() now properly blocks until user closes dialog

wxClipboard - WORKS ✓

  • Status: Full clipboard support via browser Clipboard API with Asyncify
  • KiCad Impact: MEDIUM - Copy/paste operations
  • Evidence: clipboard-03-copy-clicked.png shows successful copy, all 6 clipboard tests pass
  • Fix: Implemented browser Clipboard API integration with Asyncify for async-to-sync bridging
  • Details: Added js_writeTextToClipboard, js_readTextFromClipboard, js_clipboardHasText, js_clearClipboard to ASYNCIFY_IMPORTS

wxDataViewCtrl - WORKS ✓

  • Status: Both wxDataViewListCtrl and wxDataViewTreeCtrl fully functional
  • KiCad Impact: CRITICAL - Zone Manager, Net Inspector, Symbol/Footprint library browsers
  • Evidence: dataview-01-loaded.png shows list with columns, dataview-02-tree-tab.png shows hierarchical tree
  • Tests: 10/10 pass - List rendering, tree expand/collapse, tab switching, column headers
  • Details: Test app mimics KiCad Zone Manager with zone data (name, net, priority, layer)

wxHtmlWindow - WORKS ✓

  • Status: HTML rendering works including tables, styled text, and scrolling
  • KiCad Impact: MEDIUM - About dialogs, error message formatting, help content
  • Evidence: htmlwin-01-loaded.png shows HTML rendering, htmlwin-04-about.png shows KiCad-style About dialog
  • Tests: 8/8 pass - Basic HTML, tables, long content scrolling, KiCad About dialog
  • Details: Test app demonstrates HTML features used in KiCad dialogs

wxStyledTextCtrl (Scintilla) - WORKS ✓

  • Status: Syntax highlighting, line numbers, code folding all functional
  • KiCad Impact: MEDIUM - DRC rules editor, Python console, custom script editors
  • Evidence: stc-01-loaded.png shows Python syntax highlighting with colors
  • Tests: 10/10 pass - Python lexer, DRC Rules lexer, plain text, line numbers toggle, fold all
  • Details: Test app demonstrates Python and DRC rules syntax highlighting like KiCad uses

wxPrinting - WORKS ✓

  • Status: Print preview, print dialog, page setup, and browser print all functional
  • KiCad Impact: MEDIUM - Schematic and PCB printing
  • Evidence: print-01-loaded.png shows print test app, print-04-preview-clicked.png shows preview frame
  • Tests: 8/8 pass - App load, preview, print dialog, browser print, page setup, callbacks
  • Details:
    • wxPrintout callbacks all fire correctly (OnBeginPrinting, OnPrintPage, OnEndDocument, etc.)
    • wxPrintPreview opens and renders preview frame
    • wxPrinter::Print() shows print dialog
    • Browser Print triggers window.print() for native browser print dialog
    • Page Setup dialog works with margins configuration

wxDragDrop (HTML5 File Drop) - WORKS ✓

  • Status: External file drops via HTML5 drag and drop API fully functional
  • KiCad Impact: HIGH - Loading projects, schematics, PCBs via file drops
  • Evidence: dnd-01-loaded.png shows test app, dnd-05-drop.png shows file drop processing
  • Tests: 9/9 pass - App load, handlers registered, dragenter, dragleave, drop, file write, event fire
  • Details:
    • HTML5 drag/drop events (dragenter, dragleave, drop) captured on canvas
    • Files read via File.arrayBuffer() and written to WASM /tmp/ filesystem
    • wxDropFilesEvent dispatched to target window via C++ callback
    • Multiple file drops supported
    • KiCad file types (.kicad_pcb, .kicad_sch, .kicad_pro, etc.) work correctly

Standalone Test Apps

Organized in apps/standalone/ folders:

App Status Tests KiCad Relevance
menu/menu_test WORKS 5/5 Menu system
toolbar/toolbar_test WORKS 6/6 Tool palettes
layout/layout_test WORKS 5/5 Split panel layout
aui/aui_test WORKS 5/5 Dockable panels
clipboard/clipboard_test WORKS 6/6 Copy/paste
filedialog/filedialog_test WORKS 5/5 Open/save dialogs
grid/grid_test WORKS 2/2 Property grids
dialog/dialog_test WORKS 5/5 Alerts/confirmations
timer/timer_test WORKS 4/4 Auto-save, animations
tree/tree_test WORKS 7/7 Hierarchy browsers
dataview/dataview_test WORKS 10/10 Zone Manager, Net Inspector
htmlwin/htmlwin_test WORKS 8/8 About dialogs, error formatting
stc/stc_test WORKS 10/10 DRC rules editor, Python console
print/print_test WORKS 8/8 Schematic/PCB printing
dnd/dnd_test WORKS 9/9 External file drop support
propgrid/propgrid_test WORKS 4/4 Property panels (KiCad property editor)
pickers/pickers_test WORKS 4/4 Color/font pickers (layer colors)
collapsible/collapsible_test WORKS 5/5 Collapsible sections (property groups)
listctrl/listctrl_test WORKS 5/5 Virtual list (large component lists)
infobar/infobar_test WORKS 5/5 Notification bar (DRC messages)
gridrenderers/gridrenderers_test WORKS 5/5 Custom cell renderers (color swatches, icons)
printpreview/printpreview_test WORKS 5/5 Print preview frame, page setup
bitmapbuttons/bitmapbuttons_test WORKS 7/7 Toolbar buttons, toggle state
specialized/specialized_test WORKS 8/8 Treebook, BitmapComboBox, layer list
validators/validators_test WORKS 6/6 Input validation (KiCad dialog validators)
ownerdrawn/ownerdrawn_test WORKS 5/5 Custom dropdown rendering (layer selectors)
popup/popup_test WORKS 6/6 Transient popups (toolbar palettes)
xml/xml_test WORKS 6/6 XML parsing (config/project files)
wasmedge/wasmedge_test WORKS 8/8 WASM edge cases (file system, threading, fonts)
fontenum/fontenum_test WORKS 1/1 Font enumeration via Local Font Access API
textdecor/textdecor_test WORKS 1/1 Text underline/strikethrough decorations
bitmask/bitmask_test WORKS 1/1 Bitmap masking with wxMask transparency
regions/regions_test WORKS 1/1 Non-rectangular region clipping

Main App Test Coverage

Controls Tab

  • wxButton: Click events logged
  • wxToggleButton: Toggle state changes
  • wxCheckBox: Check/uncheck works
  • wxRadioButton: Selection switches between options
  • wxSlider: Value changes on drag
  • wxGauge: Renders progress bar

Text Input Tab

  • Single-line wxTextCtrl: Keyboard input works
  • Multi-line wxTextCtrl: Multiple lines typed
  • Password wxTextCtrl: Masked input
  • wxComboBox: Editable dropdown

Drawing Tab

  • Mouse down/up events captured
  • Line strokes drawn on wxPanel
  • Clear Canvas button works
  • wxDC drawing operations functional

Lists Tab

  • wxListBox: Item selection with blue highlight

  • Add/Remove buttons functional

  • wxChoice: Dropdown opens with items (Red, Green, Blue, Yellow, Purple)

  • Vertex arrays: Working

  • Matrix operations: Working

  • State management: Working

  • Texture coordinates: Working

Grid Tab

  • wxSpinCtrl: Renders with up/down arrows
  • wxSearchCtrl: Renders with search icon and clear button
  • wxGrid: WORKS - Grid renders with cells, labels, and event handling

Dialogs Tab

  • wxMessageBox: Info, Yes/No, Error dialogs render with icons and buttons
  • wxDialog: Custom dialogs render with title bar, content, OK/Cancel buttons
  • wxTimer: Start/Stop buttons, counter display
  • Working: Modal dialogs block and wait for user input via Asyncify

KiCad Readiness Assessment

Ready for KiCad

  1. Window management (wxFrame, wxMenuBar, wxToolBar, wxStatusBar)
  2. Panel docking (wxAuiManager)
  3. Layout controls (wxSplitterWindow, wxScrolledWindow, wxNotebook)
  4. Basic controls (buttons, checkboxes, radio buttons, sliders)
  5. Text input (single/multi-line)
  6. List controls (wxListBox, wxChoice, wxComboBox)
  7. Drawing/painting (wxDC, mouse events)
  8. wxMessageBox/wxDialog - Modal dialogs with Asyncify
  9. wxGrid - Property grids with cells, labels, and events
  10. wxTreeCtrl - Hierarchy browsers with expand/collapse, selection, add/delete
  11. wxClipboard - Copy/paste via browser Clipboard API with Asyncify
  12. wxDataViewCtrl - Zone Manager, Net Inspector, Library browsers
  13. wxHtmlWindow - About dialogs, error message formatting
  14. wxStyledTextCtrl - DRC rules editor, Python console, script editors
  15. wxPrinting - Print preview, print dialog, browser print via window.print()
  16. wxDragDrop - External file drops via HTML5 drag and drop API
  17. wxPropertyGrid - Property panels with categories, various property types
  18. wxPropertyGridManager - Multi-page property organization
  19. wxColourPickerCtrl - Color pickers for layer colors
  20. wxFontPickerCtrl - Font pickers for text preferences
  21. wxCollapsiblePane - Expandable/collapsible property sections
  22. wxListCtrl (virtual) - Virtual mode for 10000+ item lists
  23. wxInfoBar - Notification bar for DRC messages, warnings
  24. wxDataViewCtrl (virtual) - Virtual mode for 10,000+ items (Zone Manager, Net Inspector)
  25. wxAuiNotebook - Closeable, reorderable tabbed panels
  26. wxWizard - Step-by-step Footprint Wizard dialog
  27. wxGrid cell editing - Full editing with text, number, choice, checkbox editors
  28. wxCalendarCtrl - Date picker with month/year navigation
  29. wxGrid custom renderers - Color swatches, icon+text, striped rows for layer manager
  30. wxPrintPreview frame - Print preview with zoom, page navigation
  31. wxBitmapButton - Toolbar buttons with custom bitmap icons
  32. wxTreebook - Hierarchical settings pages (General, Display>Colors, etc.)
  33. wxBitmapComboBox - Layer chooser dropdown with color swatch icons
  34. wxCheckListBox - Layer visibility list with checkboxes
  35. wxValidator - Input validation (text, integer, float, custom validators)
  36. wxOwnerDrawnComboBox - Custom dropdown rendering (layer selectors, font choosers)
  37. wxPopupWindow - Transient popups (toolbar palettes, color pickers)
  38. wxXmlDocument - XML parsing for config and project files
  39. wxFontEnumerator - Font enumeration via Local Font Access API (Chrome 103+)
  40. wxMask (bitmap masking) - Color-keyed transparency for toolbar icons
  41. Text decorations - Underline/strikethrough in wxDC text rendering
  42. wxRegion clipping - Non-rectangular clipping for complex shapes

All KiCad-Critical Features Tested

All previously untested features have now been implemented and tested:

Feature KiCad Usage Priority Status
wxDataViewCtrl virtual mode Zone Manager, Net Inspector (large data) HIGH ✓ TESTED
wxAuiNotebook Tab panels (variant) MEDIUM ✓ TESTED
wxWizard Footprint wizard MEDIUM ✓ TESTED
wxGrid cell editing Property editing MEDIUM ✓ TESTED
wxCalendarCtrl Date selection LOW ✓ TESTED
wxGrid custom renderers Layer manager color swatches HIGH ✓ TESTED
wxPrintPreview frame Schematic/PCB print preview MEDIUM ✓ TESTED
wxBitmapButton Toolbar icons MEDIUM ✓ TESTED
wxTreebook Settings dialogs (hierarchical) MEDIUM ✓ TESTED
wxBitmapComboBox Layer chooser with swatches MEDIUM ✓ TESTED
wxCheckListBox Layer visibility toggles MEDIUM ✓ TESTED

Current Coverage: ~100% of KiCad-critical features tested (244 tests across 38 apps)

Not Needed for KiCad

  1. wxRichTextCtrl - Disabled in WASM build, KiCad doesn't use it
  2. wxGraphicsContext - KiCad uses OpenGL GAL directly, not wxGraphicsContext

WASM Implementation Limitations

Some wxWidgets features have incomplete WASM implementations. These are documented below with their current status.

Known WASM Limitations

Feature Status Details
wxGraphicsContext NOT NEEDED KiCad uses OpenGL GAL directly (via WebGL in WASM)
Threading (wxThread) STUBBED WASM is single-threaded, API exists but no-op
wxFileName::GetSize STUBBED Returns wxInvalidSize for virtual filesystem

Recently Implemented WASM Features

These features were implemented to improve KiCad compatibility:

Feature Status Implementation Notes
wxFontEnumerator WORKS Uses Local Font Access API (Chrome 103+) with Asyncify
Bitmap masking WORKS wxMask with color-keyed transparency via Canvas composite ops
Text decorations WORKS Underline/strikethrough via Canvas textDecoration property
Non-rectangular regions WORKS wxRegion clipping via Canvas path-based clip() with multiple rects

WASM Edge Cases Tested

The wasmedge_test app verifies WASM-specific behaviors:

  • File System: /tmp/ virtual filesystem read/write works
  • Threading: wxUSE_THREADS defined but stubbed (expected)
  • Font Enumeration: Works via Local Font Access API (Chrome 103+)
  • Clipboard: Works via Asyncify browser integration
  • Memory Growth: WASM memory growth works (10MB+ allocations)
  • OS Info: wxGetOsVersion returns stubbed values (expected)
  • URL Launch: wxLaunchDefaultBrowser works via window.open()
  • wxFileName: Path manipulation functions work correctly

Build Notes

GL vs Non-GL Apps

  • All wx test apps (including minimal_test) link with LDFLAGS_NOGL; legacy GL emulation was removed 2026-06-10. WebGL rendering is tested by gal-webgl.

Build Command

Always use the build script:

cd tests/apps && ./build-test-apps.sh

Baseline Screenshots

The test suite captures screenshots during test runs for visual regression testing. These screenshots are compared against a baseline to detect unexpected visual changes.

Directory Structure

tests/
├── baseline-screenshots/     # Known-good reference screenshots (146+ files)
├── test-results/            # Screenshots from latest test run
└── apps/
    └── e2e/                 # Playwright test specs

Comparing Screenshots

Use the comparison script to check for visual regressions:

./scripts/compare-screenshots.sh

This will:

  • Compare all baseline screenshots with current test results
  • Report identical, different, and missing screenshots
  • Show file size differences (useful for detecting changes)

Example output:

=== Screenshot Comparison ===
Baseline:     /path/to/tests/baseline-screenshots
Test Results: /path/to/tests/test-results

=== Comparing Baseline Screenshots ===
DIFFERENT: dialogs-msgbox-info-open.png (baseline: 47468B, current: 47478B, diff: 10B / .02%)

=== Summary ===
Total baseline screenshots: 121
Identical:                  54
Different:                  67
Missing from test results:  0

Understanding Differences

Small byte differences (<2%) are typically caused by:

  • Timestamps in event logs (e.g., [19:45:35] vs [18:49:35])
  • PNG compression variations between runs
  • Anti-aliasing differences

These are not visual regressions. Visually inspect screenshots if you see larger differences.

Updating Baseline Screenshots

After verifying changes are intentional, update the baseline:

# Copy current screenshots to baseline
cp tests/test-results/*.png tests/baseline-screenshots/

# Or selectively update specific screenshots
cp tests/test-results/dialog-*.png tests/baseline-screenshots/

Running Tests with Screenshots

cd tests/apps
npm test                    # Run all tests (saves screenshots to test-results/)
npx playwright test --ui    # Interactive mode with screenshot preview

Screenshots Reference

Screenshot Shows
03-after-load.png Controls tab with all widgets
06-text-input-typed.png Text input with typed content
08-drawing-done.png Drawing strokes on canvas
09-lists-tab.png ListBox and Choice controls
10a-choice-dropdown-open.png Dropdown menu open
aui-01-loaded.png AUI dockable panels
menu-03-file-clicked.png File menu dropdown
toolbar-01-loaded.png Toolbar with icons
layout-01-loaded.png Splitter window
spinctrl-01-visible.png SpinCtrl and SearchCtrl
wxgrid-dedicated-page.png wxGrid with cells, labels, and data
dialog-02-info-clicked.png Info dialog with icon, message, OK button
dialog-03-yesno-clicked.png Yes/No/Cancel confirmation dialog
dialogs-custom-open.png Custom wxDialog modal
dataview-01-loaded.png wxDataViewListCtrl with zone data
dataview-02-tree-tab.png wxDataViewTreeCtrl with hierarchical data
htmlwin-01-loaded.png wxHtmlWindow with basic HTML
htmlwin-04-about.png KiCad-style About dialog
stc-01-loaded.png wxStyledTextCtrl with Python syntax highlighting
stc-03-drc-mode.png DRC rules syntax highlighting
fontenum.png Font enumeration via Local Font Access API
textdecor.png Text decorations (underline, strikethrough, combined)
bitmask.png Bitmap masking with wxMask color-keyed transparency
regions.png Non-rectangular region clipping (union, subtract, complex shapes)