Add standalone test apps and Playwright specs for wxWidgets WASM

- Add 10 standalone test apps for isolated component testing:
  - menu, toolbar, layout, aui, clipboard, filedialog, grid
  - dialog, timer, tree (3 new)
- Add 12 Playwright e2e test specs for automated testing
- Update Makefile with GL/non-GL build configurations
- Update build script to list all standalone tests
- Add WHATWORKS.md documenting KiCad wxWidgets coverage
- Update .gitignore for build artifacts

Test results:
- 79 Playwright tests pass
- wxGrid crashes (memory access out of bounds)
- wxTreeCtrl crashes (similar issue)
- wxDialog/wxMessageBox events fire but no visual popup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Viktor Vaczi 2025-11-29 16:19:13 +01:00
commit 53e4603a41
26 changed files with 5070 additions and 30 deletions

View file

@ -0,0 +1,143 @@
// wxAuiManager Test - Tests AUI docking functionality in WASM
// KiCad uses AUI extensively for dockable panels
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/aui/aui.h"
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
class AuiTestApp : public wxApp
{
public:
virtual bool OnInit() override;
};
class AuiTestFrame : public wxFrame
{
public:
AuiTestFrame();
~AuiTestFrame();
private:
wxAuiManager m_mgr;
wxTextCtrl* m_log;
void LogEvent(const wxString& msg);
void OnPaneClose(wxAuiManagerEvent& evt);
wxDECLARE_EVENT_TABLE();
};
wxBEGIN_EVENT_TABLE(AuiTestFrame, wxFrame)
EVT_AUI_PANE_CLOSE(AuiTestFrame::OnPaneClose)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(AuiTestApp);
bool AuiTestApp::OnInit()
{
if (!wxApp::OnInit())
return false;
AuiTestFrame* frame = new AuiTestFrame();
frame->Show(true);
return true;
}
AuiTestFrame::AuiTestFrame()
: wxFrame(nullptr, wxID_ANY, "wxAuiManager WASM Test",
wxDefaultPosition, wxSize(800, 600))
{
m_mgr.SetManagedWindow(this);
// Create center pane with event log
m_log = new wxTextCtrl(this, wxID_ANY, "",
wxDefaultPosition, wxDefaultSize,
wxTE_MULTILINE | wxTE_READONLY);
m_mgr.AddPane(m_log, wxAuiPaneInfo().Name("log").Caption("Event Log")
.Center().CloseButton(false));
// Create left panel (like KiCad's properties panel)
wxPanel* leftPanel = new wxPanel(this);
leftPanel->SetBackgroundColour(*wxLIGHT_GREY);
wxBoxSizer* leftSizer = new wxBoxSizer(wxVERTICAL);
leftSizer->Add(new wxStaticText(leftPanel, wxID_ANY, "Properties Panel"), 0, wxALL, 10);
leftSizer->Add(new wxStaticText(leftPanel, wxID_ANY, "Like KiCad's"), 0, wxALL, 5);
leftSizer->Add(new wxStaticText(leftPanel, wxID_ANY, "property editor"), 0, wxALL, 5);
leftPanel->SetSizer(leftSizer);
m_mgr.AddPane(leftPanel, wxAuiPaneInfo().Name("properties").Caption("Properties")
.Left().Layer(1).Position(1).CloseButton(true).MaximizeButton(true)
.MinSize(150, 200));
// Create right panel (like KiCad's layer manager)
wxPanel* rightPanel = new wxPanel(this);
rightPanel->SetBackgroundColour(wxColour(240, 240, 255));
wxBoxSizer* rightSizer = new wxBoxSizer(wxVERTICAL);
rightSizer->Add(new wxStaticText(rightPanel, wxID_ANY, "Layers Panel"), 0, wxALL, 10);
rightSizer->Add(new wxStaticText(rightPanel, wxID_ANY, "Like KiCad's"), 0, wxALL, 5);
rightSizer->Add(new wxStaticText(rightPanel, wxID_ANY, "layer manager"), 0, wxALL, 5);
rightPanel->SetSizer(rightSizer);
m_mgr.AddPane(rightPanel, wxAuiPaneInfo().Name("layers").Caption("Layers")
.Right().Layer(1).Position(1).CloseButton(true).MaximizeButton(true)
.MinSize(150, 200));
// Create bottom panel (like KiCad's message panel)
wxPanel* bottomPanel = new wxPanel(this);
bottomPanel->SetBackgroundColour(wxColour(255, 255, 240));
wxBoxSizer* bottomSizer = new wxBoxSizer(wxVERTICAL);
bottomSizer->Add(new wxStaticText(bottomPanel, wxID_ANY,
"Message Panel - Like KiCad's message area"), 0, wxALL, 5);
bottomPanel->SetSizer(bottomSizer);
m_mgr.AddPane(bottomPanel, wxAuiPaneInfo().Name("messages").Caption("Messages")
.Bottom().Layer(0).Position(1).CloseButton(true)
.MinSize(-1, 80));
m_mgr.Update();
CreateStatusBar();
SetStatusText("AUI Manager ready - try dragging and docking panels");
LogEvent("AUI test app started");
LogEvent("Created dockable panels: Properties, Layers, Messages");
#ifdef __EMSCRIPTEN__
EM_ASM({
console.log('[AUI_TEST] wxAuiManager test app started successfully');
});
#endif
}
AuiTestFrame::~AuiTestFrame()
{
m_mgr.UnInit();
}
void AuiTestFrame::LogEvent(const wxString& msg)
{
m_log->AppendText(msg + "\n");
SetStatusText(msg);
#ifdef __EMSCRIPTEN__
EM_ASM({
console.log('[AUI_EVENT] ' + UTF8ToString($0));
}, msg.c_str().AsChar());
#endif
}
void AuiTestFrame::OnPaneClose(wxAuiManagerEvent& evt)
{
wxAuiPaneInfo* pane = evt.GetPane();
if (pane) {
LogEvent(wxString::Format("Pane closing: %s", pane->name));
}
}