From 28615aba028210d590cc306c112dfb4ed75c611a Mon Sep 17 00:00:00 2001 From: Istvan Matejcsok <119620946+matejcsok-ee@users.noreply.github.com> Date: Mon, 15 Jun 2026 18:41:18 +0200 Subject: [PATCH] =?UTF-8?q?test:=20=F0=9F=92=8D=20select=20height=20wxWidg?= =?UTF-8?q?et?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/apps/Makefile.wasm | 10 +- .../selectheight/selectheight_test.cpp | 105 ++++++++++++++++++ .../selectheight-01-loaded.png | Bin 0 -> 19389 bytes .../selectheight-02-result.png | Bin 0 -> 19389 bytes tests/e2e/selectheight.spec.ts | 56 ++++++++++ 5 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 tests/apps/standalone/selectheight/selectheight_test.cpp create mode 100644 tests/baseline-screenshots/selectheight-01-loaded.png create mode 100644 tests/baseline-screenshots/selectheight-02-result.png create mode 100644 tests/e2e/selectheight.spec.ts diff --git a/tests/apps/Makefile.wasm b/tests/apps/Makefile.wasm index 5e08b67..e434f45 100644 --- a/tests/apps/Makefile.wasm +++ b/tests/apps/Makefile.wasm @@ -167,6 +167,7 @@ all: minimal_test.html \ $(S)/regions/regions_test.html \ $(S)/maximize/maximize_test.html \ $(S)/earlysize/earlysize_test.html \ + $(S)/selectheight/selectheight_test.html \ $(S)/threadpool/threadpool_test.html \ $(S)/logerror/logerror_test.html \ $(S)/retinascale/retinascale_test.html \ @@ -508,6 +509,12 @@ $(S)/earlysize/earlysize_test.o: $(S)/earlysize/earlysize_test.cpp $(S)/earlysize/earlysize_test.html: $(S)/earlysize/earlysize_test.o $(WX_CORE_LIB) $(JS_FILES) $(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@ +$(S)/selectheight/selectheight_test.o: $(S)/selectheight/selectheight_test.cpp + $(CXX) -c $(CXXFLAGS) $< -o $@ + +$(S)/selectheight/selectheight_test.html: $(S)/selectheight/selectheight_test.o $(WX_CORE_LIB) $(JS_FILES) + $(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@ + # Thread Pool test (pthread) - reproduces KiCad deadlock when hardware_concurrency() > PTHREAD_POOL_SIZE $(S)/threadpool/threadpool_test.o: $(S)/threadpool/threadpool_test.cpp $(CXX) -c $(CXXFLAGS) -pthread $< -o $@ @@ -604,6 +611,7 @@ bitmask: $(S)/bitmask/bitmask_test.html regions: $(S)/regions/regions_test.html maximize: $(S)/maximize/maximize_test.html earlysize: $(S)/earlysize/earlysize_test.html +selectheight: $(S)/selectheight/selectheight_test.html threadpool: $(S)/threadpool/threadpool_test.html logerror: $(S)/logerror/logerror_test.html @@ -627,7 +635,7 @@ clean: rm -f $(S)/*/*_test*.html $(S)/*/*_test*.js $(S)/*/*_test*.wasm rm -f $(S)/*/*_repro*.html $(S)/*/*_repro*.js $(S)/*/*_repro*.wasm -.PHONY: all clean menu contextmenu scrollbar clipboard filedialog layout aui toolbar grid dialog timer tree dataview htmlwin stc print dnd propgrid pickers collapsible listctrl infobar dataviewvirtual auinotebook wizard gridedit calendar gridrenderers printpreview bitmapbuttons specialized validators ownerdrawn popup xml wasmedge fontenum textdecor bitmask regions maximize earlysize threadpool logerror retinascale coroutine coroutine-nested asyncify-races +.PHONY: all clean menu contextmenu scrollbar clipboard filedialog layout aui toolbar grid dialog timer tree dataview htmlwin stc print dnd propgrid pickers collapsible listctrl infobar dataviewvirtual auinotebook wizard gridedit calendar gridrenderers printpreview bitmapbuttons specialized validators ownerdrawn popup xml wasmedge fontenum textdecor bitmask regions maximize earlysize selectheight threadpool logerror retinascale coroutine coroutine-nested asyncify-races # === Coroutine pthread variant — reproduces the KiCad Asyncify-fiber x pthreads crash === # Same modal-free harness as `coroutine`, but compiled/linked with pthreads to match diff --git a/tests/apps/standalone/selectheight/selectheight_test.cpp b/tests/apps/standalone/selectheight/selectheight_test.cpp new file mode 100644 index 0000000..4d7ba5d --- /dev/null +++ b/tests/apps/standalone/selectheight/selectheight_test.cpp @@ -0,0 +1,105 @@ +// Select Height Test - Regression guard for the wxChoice ('s height only +// resolves once the browser lays it out, but DoGetBestSize() is frequently +// queried BEFORE layout (wxAuiToolBar freezes a control's min size at AddControl +// time, panel sizers measure during construction). The DOM reported ~0 height, +// so the layout system pinned the control to an unusable sliver. +// +// The fix is wxChoice::DoGetBestSize() (src/wasm/choice.cpp), which floors the +// height to GetCharHeight() + 8 when the DOM-measured height is too small. +// +// This test creates ONE wxChoice and queries GetBestSize() in the constructor, +// BEFORE the frame is shown / laid out. On pre-fix code best.y is ~0 (FAIL); +// with the fix it is GetCharHeight() + 8 (PASS). + +#include "wx/wxprec.h" + +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif + +#ifdef __EMSCRIPTEN__ +#include +#endif + +class SelectHeightTestApp : public wxApp +{ +public: + virtual bool OnInit() override; +}; + +class SelectHeightTestFrame : public wxFrame +{ +public: + SelectHeightTestFrame(); + +private: + wxSize m_earlyBestSize; // wxChoice best size captured before Show()/layout +}; + +wxIMPLEMENT_APP(SelectHeightTestApp); + +bool SelectHeightTestApp::OnInit() +{ + if (!wxApp::OnInit()) + return false; + + SelectHeightTestFrame* frame = new SelectHeightTestFrame(); + frame->Show(true); + return true; +} + +SelectHeightTestFrame::SelectHeightTestFrame() + : wxFrame(nullptr, wxID_ANY, "Select Height Test", + wxDefaultPosition, wxSize(400, 200)) +{ + wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL); + + mainSizer->Add(new wxStaticText(this, wxID_ANY, + "Select Height Test\n\n" + "One wxChoice; its GetBestSize() is queried in the constructor,\n" + "before layout. Height must NOT collapse to ~0px."), + 0, wxALL, 10); + + // The single control under test. wxDefaultSize so the caller does not force + // a height -- the height must come from DoGetBestSize(). + wxString items[] = { "Red", "Green", "Blue" }; + wxChoice* choice = new wxChoice(this, wxID_ANY, wxDefaultPosition, + wxDefaultSize, 3, items); + choice->SetSelection(0); + + // === THE KEY MEASUREMENT === + // Query best size BEFORE Show()/layout, where the bug manifested. Nothing is + // cached yet, so this recomputes via wxChoice::DoGetBestSize(). + m_earlyBestSize = choice->GetBestSize(); + + // The bug was height-specific; width comes from intrinsic content sizing and + // was never broken. A real control is at least a line of text tall. + const int minHeight = GetCharHeight() + 8; + const bool heightOk = (m_earlyBestSize.y >= minHeight); + +#ifdef __EMSCRIPTEN__ + EM_ASM({ + console.log('[SELECTHEIGHT_TEST] Choice best size: ' + $0 + 'x' + $1); + console.log('[SELECTHEIGHT_TEST] Expected min height: ' + $2); + if ($3) { + console.log('[SELECTHEIGHT_TEST] PASS: select has a real height'); + } else { + console.error('[SELECTHEIGHT_TEST] FAIL: select height collapsed to ' + + $1 + 'px (expected >= ' + $2 + ')'); + } + }, m_earlyBestSize.x, m_earlyBestSize.y, minHeight, heightOk ? 1 : 0); +#endif + + choice->SetSelection(0); + mainSizer->Add(choice, 0, wxALL, 10); + + SetSizer(mainSizer); + +#ifdef __EMSCRIPTEN__ + EM_ASM({ + console.log('[SELECTHEIGHT_TEST] Select height test app started'); + }); +#endif +} diff --git a/tests/baseline-screenshots/selectheight-01-loaded.png b/tests/baseline-screenshots/selectheight-01-loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3fa21b6cd170d39b258354590a838a7e684d3a GIT binary patch literal 19389 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 H!{`440A^Bd literal 0 HcmV?d00001 diff --git a/tests/baseline-screenshots/selectheight-02-result.png b/tests/baseline-screenshots/selectheight-02-result.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3fa21b6cd170d39b258354590a838a7e684d3a GIT binary patch literal 19389 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 H!{`440A^Bd literal 0 HcmV?d00001 diff --git a/tests/e2e/selectheight.spec.ts b/tests/e2e/selectheight.spec.ts new file mode 100644 index 0000000..8eaa38d --- /dev/null +++ b/tests/e2e/selectheight.spec.ts @@ -0,0 +1,56 @@ +// Select Height Test - Regression guard for the wxChoice ('s height only resolves after layout, but DoGetBestSize() is queried +// before layout; the DOM used to report ~0 height, collapsing the control. The +// fix floors the height in wxChoice::DoGetBestSize(). The C++ app queries one +// wxChoice's GetBestSize() in its constructor (before Show()) and logs it. +import { test, expect, tryLoadApp } from './utils/fixtures'; + +test.describe('Select Height Tests', () => { + + test('Select height test app loads successfully', async ({ page, testLogger }) => { + await page.goto('/standalone/selectheight/selectheight_test.html'); + const loaded = await tryLoadApp(page); + + await page.screenshot({ path: 'test-results/selectheight-01-loaded.png', fullPage: true }); + + const hasStartup = testLogger.consoleLogs.some(l => l.includes('[SELECTHEIGHT_TEST] Select height test app started')); + + expect(loaded, 'Select height app should load').toBe(true); + expect(hasStartup, 'Startup log should be present').toBe(true); + expect(testLogger.errors.filter(e => !e.includes('favicon'))).toHaveLength(0); + }); + + test('wxChoice best size has a real height before layout', async ({ page, testLogger }) => { + await page.goto('/standalone/selectheight/selectheight_test.html'); + const loaded = await tryLoadApp(page); + expect(loaded, 'App should load').toBe(true); + + // Wait for the app to finish initialization + await page.waitForTimeout(500); + + await page.screenshot({ path: 'test-results/selectheight-02-result.png', fullPage: true }); + + // Parse the best size logged from the constructor (before Show()/layout) + const bestSizeLogs = testLogger.consoleLogs.filter(l => l.includes('[SELECTHEIGHT_TEST] Choice best size:')); + expect(bestSizeLogs.length).toBeGreaterThan(0); + + const bestMatch = bestSizeLogs[0].match(/Choice best size: (\d+)x(\d+)/); + expect(bestMatch, 'Best size log should contain dimensions').not.toBeNull(); + + if (bestMatch) { + const height = parseInt(bestMatch[2]); + + // The key assertion: the