pcbjam/tests/wasm-app/standalone/toolbar/toolbar_test.cpp
Viktor Vaczi 53e4603a41 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>
2025-11-29 16:19:13 +01:00

188 lines
4.9 KiB
C++

// wxToolBar/wxStatusBar Test - Tests toolbar and statusbar in WASM
// KiCad uses toolbars extensively for actions
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/artprov.h"
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
class ToolbarTestApp : public wxApp
{
public:
virtual bool OnInit() override;
};
class ToolbarTestFrame : public wxFrame
{
public:
ToolbarTestFrame();
private:
wxTextCtrl* m_log;
void LogEvent(const wxString& msg);
void OnToolNew(wxCommandEvent& evt);
void OnToolOpen(wxCommandEvent& evt);
void OnToolSave(wxCommandEvent& evt);
void OnToolZoomIn(wxCommandEvent& evt);
void OnToolZoomOut(wxCommandEvent& evt);
void OnToolToggle(wxCommandEvent& evt);
wxDECLARE_EVENT_TABLE();
};
enum {
ID_TOOL_NEW = wxID_HIGHEST + 1,
ID_TOOL_OPEN,
ID_TOOL_SAVE,
ID_TOOL_ZOOM_IN,
ID_TOOL_ZOOM_OUT,
ID_TOOL_TOGGLE
};
wxBEGIN_EVENT_TABLE(ToolbarTestFrame, wxFrame)
EVT_TOOL(ID_TOOL_NEW, ToolbarTestFrame::OnToolNew)
EVT_TOOL(ID_TOOL_OPEN, ToolbarTestFrame::OnToolOpen)
EVT_TOOL(ID_TOOL_SAVE, ToolbarTestFrame::OnToolSave)
EVT_TOOL(ID_TOOL_ZOOM_IN, ToolbarTestFrame::OnToolZoomIn)
EVT_TOOL(ID_TOOL_ZOOM_OUT, ToolbarTestFrame::OnToolZoomOut)
EVT_TOOL(ID_TOOL_TOGGLE, ToolbarTestFrame::OnToolToggle)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(ToolbarTestApp);
bool ToolbarTestApp::OnInit()
{
if (!wxApp::OnInit())
return false;
ToolbarTestFrame* frame = new ToolbarTestFrame();
frame->Show(true);
return true;
}
ToolbarTestFrame::ToolbarTestFrame()
: wxFrame(nullptr, wxID_ANY, "wxToolBar/wxStatusBar WASM Test",
wxDefaultPosition, wxSize(700, 500))
{
// Create toolbar
wxToolBar* toolbar = CreateToolBar(wxTB_HORIZONTAL | wxTB_TEXT);
toolbar->AddTool(ID_TOOL_NEW, "New",
wxArtProvider::GetBitmap(wxART_NEW, wxART_TOOLBAR),
"Create new file");
toolbar->AddTool(ID_TOOL_OPEN, "Open",
wxArtProvider::GetBitmap(wxART_FILE_OPEN, wxART_TOOLBAR),
"Open existing file");
toolbar->AddTool(ID_TOOL_SAVE, "Save",
wxArtProvider::GetBitmap(wxART_FILE_SAVE, wxART_TOOLBAR),
"Save current file");
toolbar->AddSeparator();
toolbar->AddTool(ID_TOOL_ZOOM_IN, "Zoom In",
wxArtProvider::GetBitmap(wxART_PLUS, wxART_TOOLBAR),
"Zoom in");
toolbar->AddTool(ID_TOOL_ZOOM_OUT, "Zoom Out",
wxArtProvider::GetBitmap(wxART_MINUS, wxART_TOOLBAR),
"Zoom out");
toolbar->AddSeparator();
toolbar->AddCheckTool(ID_TOOL_TOGGLE, "Toggle",
wxArtProvider::GetBitmap(wxART_TICK_MARK, wxART_TOOLBAR),
wxNullBitmap,
"Toggle tool example");
toolbar->Realize();
// Create status bar with multiple fields
CreateStatusBar(3);
SetStatusText("Ready", 0);
SetStatusText("X: 0, Y: 0", 1);
SetStatusText("Zoom: 100%", 2);
// Set status bar field widths
int widths[] = {-1, 150, 100};
GetStatusBar()->SetStatusWidths(3, widths);
// Main content
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
wxStaticText* desc = new wxStaticText(this, wxID_ANY,
"wxToolBar and wxStatusBar Test\n\n"
"KiCad uses toolbars for quick access to tools.\n"
"Click toolbar buttons to see events.");
mainSizer->Add(desc, 0, wxALL, 10);
wxStaticBoxSizer* logBox = new wxStaticBoxSizer(wxVERTICAL, this, "Event Log");
m_log = new wxTextCtrl(this, wxID_ANY, "",
wxDefaultPosition, wxSize(-1, 200), wxTE_MULTILINE | wxTE_READONLY);
logBox->Add(m_log, 1, wxEXPAND | wxALL, 5);
mainSizer->Add(logBox, 1, wxEXPAND | wxALL, 10);
SetSizer(mainSizer);
LogEvent("Toolbar test app started");
LogEvent("Toolbar created with 6 tools");
LogEvent("Status bar created with 3 fields");
#ifdef __EMSCRIPTEN__
EM_ASM({
console.log('[TOOLBAR_TEST] wxToolBar test app started successfully');
});
#endif
}
void ToolbarTestFrame::LogEvent(const wxString& msg)
{
m_log->AppendText(msg + "\n");
SetStatusText(msg, 0);
#ifdef __EMSCRIPTEN__
EM_ASM({
console.log('[TOOLBAR_EVENT] ' + UTF8ToString($0));
}, msg.c_str().AsChar());
#endif
}
void ToolbarTestFrame::OnToolNew(wxCommandEvent& WXUNUSED(evt))
{
LogEvent("Toolbar: New clicked");
}
void ToolbarTestFrame::OnToolOpen(wxCommandEvent& WXUNUSED(evt))
{
LogEvent("Toolbar: Open clicked");
}
void ToolbarTestFrame::OnToolSave(wxCommandEvent& WXUNUSED(evt))
{
LogEvent("Toolbar: Save clicked");
}
void ToolbarTestFrame::OnToolZoomIn(wxCommandEvent& WXUNUSED(evt))
{
LogEvent("Toolbar: Zoom In clicked");
SetStatusText("Zoom: 150%", 2);
}
void ToolbarTestFrame::OnToolZoomOut(wxCommandEvent& WXUNUSED(evt))
{
LogEvent("Toolbar: Zoom Out clicked");
SetStatusText("Zoom: 75%", 2);
}
void ToolbarTestFrame::OnToolToggle(wxCommandEvent& evt)
{
bool checked = evt.IsChecked();
LogEvent(wxString::Format("Toolbar: Toggle %s", checked ? "ON" : "OFF"));
}