pcbjam/tests/apps/standalone/earlysize/earlysize_test.cpp
Viktor Vaczi a26b40c063 Reorganize project structure for clarity
- Rename tests/wasm-app/ to tests/apps/ for brevity
- Move lib/gl_immediate_shim.js to wasm/shims/ (consolidates WASM files)
- Delete docs/ directory (outdated Nov 2024 research docs)
- Delete patches/ directory (already applied to fork submodules)
- Delete wasm/patches/ and wasm/config/ (empty/unused)
- Update all file references in scripts, configs, and documentation
- Update .gitignore for new tests/apps/ paths

Verified both build workflows pass:
- wxWidgets tests: 255 passed
- Docker KiCad build: completed successfully

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 14:06:23 +01:00

154 lines
4.7 KiB
C++

// Early Size Test - Reproduces KiCad's pattern of calling GetClientSize() before Show()
// This tests whether wxWidgets WASM port returns correct sizes during frame construction.
//
// KiCad's EDA_BASE_FRAME::commonInit() does:
// m_frameSize = defaultSize(); // 1280x720
// GetClientSize(&m_frameSize.x, &m_frameSize.y); // Overwrites with actual client size
//
// In WASM, GetClientSize() returns 20x20 if called before the frame is shown/sized.
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "wx/display.h"
#ifdef __EMSCRIPTEN__
#include <emscripten/emscripten.h>
#endif
class EarlySizeTestApp : public wxApp
{
public:
virtual bool OnInit() override;
};
class EarlySizeTestFrame : public wxFrame
{
public:
EarlySizeTestFrame();
private:
wxSize m_earlyClientSize; // Captured before Show()
wxSize m_earlyFrameSize;
wxStaticText* m_resultLabel;
void OnPaint(wxPaintEvent& evt);
wxDECLARE_EVENT_TABLE();
};
wxBEGIN_EVENT_TABLE(EarlySizeTestFrame, wxFrame)
EVT_PAINT(EarlySizeTestFrame::OnPaint)
wxEND_EVENT_TABLE()
wxIMPLEMENT_APP(EarlySizeTestApp);
bool EarlySizeTestApp::OnInit()
{
if (!wxApp::OnInit())
return false;
// Create frame with wxDefaultSize (like KiCad does)
EarlySizeTestFrame* frame = new EarlySizeTestFrame();
// Show the frame (this is where sizing should happen)
frame->Show(true);
return true;
}
EarlySizeTestFrame::EarlySizeTestFrame()
: wxFrame(nullptr, wxID_ANY, "Early Size Test",
wxDefaultPosition, wxDefaultSize) // No explicit size!
{
// === THIS IS THE KEY TEST ===
// KiCad calls GetClientSize() in commonInit(), BEFORE Show()
// In WASM, this should NOT return 20x20
GetClientSize(&m_earlyClientSize.x, &m_earlyClientSize.y);
m_earlyFrameSize = GetSize();
#ifdef __EMSCRIPTEN__
EM_ASM({
console.log('[EARLYSIZE_TEST] Constructor called - BEFORE Show()');
console.log('[EARLYSIZE_TEST] Early client size: ' + $0 + 'x' + $1);
console.log('[EARLYSIZE_TEST] Early frame size: ' + $2 + 'x' + $3);
}, m_earlyClientSize.x, m_earlyClientSize.y,
m_earlyFrameSize.x, m_earlyFrameSize.y);
#endif
// Create UI
wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
wxStaticText* desc = new wxStaticText(this, wxID_ANY,
"Early Size Test\n\n"
"This test reproduces KiCad's pattern:\n"
"- Frame created with wxDefaultSize\n"
"- GetClientSize() called in constructor BEFORE Show()\n"
"- Size should NOT be 20x20!");
mainSizer->Add(desc, 0, wxALL, 10);
// Results
wxStaticBoxSizer* resultBox = new wxStaticBoxSizer(wxVERTICAL, this, "Results (from constructor)");
wxString resultText = wxString::Format(
"Early Client Size: %dx%d\nEarly Frame Size: %dx%d",
m_earlyClientSize.x, m_earlyClientSize.y,
m_earlyFrameSize.x, m_earlyFrameSize.y);
m_resultLabel = new wxStaticText(this, wxID_ANY, resultText);
resultBox->Add(m_resultLabel, 0, wxALL, 5);
mainSizer->Add(resultBox, 0, wxEXPAND | wxALL, 10);
SetSizer(mainSizer);
// Maximize like KiCad does
Maximize(true);
#ifdef __EMSCRIPTEN__
EM_ASM({
console.log('[EARLYSIZE_TEST] Early size test app started');
});
#endif
}
void EarlySizeTestFrame::OnPaint(wxPaintEvent& evt)
{
evt.Skip();
// Log final result after first paint
static bool logged = false;
if (!logged) {
logged = true;
wxSize currentClient;
GetClientSize(&currentClient.x, &currentClient.y);
wxSize currentFrame = GetSize();
#ifdef __EMSCRIPTEN__
// The key assertion: early client size should be > 100
// If it's 20x20, that's the bug!
bool earlyClientOk = (m_earlyClientSize.x > 100 && m_earlyClientSize.y > 100);
bool earlyFrameOk = (m_earlyFrameSize.x > 100 && m_earlyFrameSize.y > 100);
EM_ASM({
console.log('[EARLYSIZE_TEST] After Show() - current client: ' + $0 + 'x' + $1);
console.log('[EARLYSIZE_TEST] After Show() - current frame: ' + $2 + 'x' + $3);
if ($4 && $5) {
console.log('[EARLYSIZE_TEST] PASS: Early sizes were reasonable');
} else {
console.error('[EARLYSIZE_TEST] FAIL: Early sizes were tiny!');
console.error('[EARLYSIZE_TEST] Early client was: ' + $6 + 'x' + $7);
console.error('[EARLYSIZE_TEST] Early frame was: ' + $8 + 'x' + $9);
}
}, currentClient.x, currentClient.y,
currentFrame.x, currentFrame.y,
earlyClientOk ? 1 : 0, earlyFrameOk ? 1 : 0,
m_earlyClientSize.x, m_earlyClientSize.y,
m_earlyFrameSize.x, m_earlyFrameSize.y);
#endif
}
}