From dce8aac03d0cecc86d4c1535596c8014ba0c0175 Mon Sep 17 00:00:00 2001 From: liu weikai Date: Thu, 15 Oct 2026 14:19:57 +0800 Subject: [PATCH] test(ui): align native card checks and refresh Tracker capture --- .../firmware-tracker-card-native.png | Bin 12996 -> 11958 bytes docs/uiux/pages/tracker_item_cards.md | 10 ++++++++++ tests/site/tracker-page.test.mjs | 4 +++- tests/site/two-pane-layout.test.mjs | 10 ++++++---- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/docs/images/release-1.0.0/firmware-tracker-card-native.png b/docs/images/release-1.0.0/firmware-tracker-card-native.png index 883ced64cae09c469518c6c1927b8cea70aa15ad..20e9b3489ad494bbdd225a6e4543c1506472f833 100644 GIT binary patch literal 11958 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 a!?aKnj8%9rN_sz!4p5X;lL1SaMf@LhWk8Go literal 12996 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 diff --git a/docs/uiux/pages/tracker_item_cards.md b/docs/uiux/pages/tracker_item_cards.md index 43a5949b..21c66696 100644 --- a/docs/uiux/pages/tracker_item_cards.md +++ b/docs/uiux/pages/tracker_item_cards.md @@ -21,6 +21,12 @@ Clicking the card also opens its existing action menu. Touch gestures and keyboard selection remain available. The title has at most two lines; the region can scroll within its row. +![Wio L2 Tracker route card](../../images/release-1.0.0/firmware-tracker-card-native.png) + +This full-page native LVGL capture uses the CI-built Wio L2 preview, sample KML +and simulated GPS. No administrative map dataset is installed in the preview, +so it shows an unknown region. It is not a physical-device screenshot. + Title extraction shares the current selected-file read (at most 64 KiB) with first-position extraction. Its bounded XML workspace is transient PSRAM and is freed after the read. No per-route metadata cache or geometry collection is @@ -31,3 +37,7 @@ against LVGL at 320×240, 480×222 and 240×320, checks control bounds and Actio and exercises title decoding, UTF-8 truncation, hash fallback and combined title/coordinate reads. The surrounding native page is a test scaffold, not a physical device capture. Physical acceptance of this revision is pending. + +The full-page native tests also exercise recording, KML document titles, Actions, +previous/next selection and widget reuse on Pager, T-Deck and Wio L2. The shorter +Pager recording card hides the format row to keep location and controls visible. diff --git a/tests/site/tracker-page.test.mjs b/tests/site/tracker-page.test.mjs index 2c3793f2..482fe769 100644 --- a/tests/site/tracker-page.test.mjs +++ b/tests/site/tracker-page.test.mjs @@ -21,7 +21,9 @@ for(const device of ['pager','tdeck','wio-tracker-l2']) { const stop=snapshot().find(item=>item.button&&item.text==='Stop recording'); assert.equal(stop.w,action.w,'Start and stop share a stable button width'); assert.equal(stop.x,action.x,'Start and stop share a stable right-aligned position'); - assert.ok(snapshot().some(item=>item.text==='GPX | Recording'),'New recording appears with readable file type/status'); + assert.ok(snapshot().some(item=>!item.button&&/^track-\d+$/.test(item.text)),`${device}: new recording has a readable title without the file extension`); + if(device!=='pager')assert.ok(snapshot().some(item=>item.text==='GPX | Recording'),`${device}: recording card shows file type/status`); + else assert.ok(!snapshot().some(item=>item.text==='GPX | Recording'),'Short Pager recording card preserves room for location and actions by hiding the format row'); click('Routes'); assert.ok(!snapshot().some(item=>['Recording','Stop recording'].includes(item.text)),'Route mode has its own status and actions'); click('Tracks'); diff --git a/tests/site/two-pane-layout.test.mjs b/tests/site/two-pane-layout.test.mjs index 1ad85cb2..5a8ee971 100644 --- a/tests/site/two-pane-layout.test.mjs +++ b/tests/site/two-pane-layout.test.mjs @@ -12,7 +12,7 @@ for(const [device,width,height] of [['pager',480,222],['tdeck',320,240],['wio-tr onFrame(pointer){framePointer=pointer;},print(){},printErr(){}, }); runtime._native_init(device==='pager'?0:1); - for(const [page,filterText,contentText,maxTextGap] of [[5,'Direct','Alex',16],[12,'Contacts','No contacts yet',6],[14,'Tracks','Not recording',5]]) { + for(const [page,filterText,contentText,maxTextGap] of [[5,'Direct','Alex',16],[12,'Contacts','No nodes',14],[14,'Tracks','Not recording',5]]) { runtime._native_open_page(page); for(let i=0;i<5;i++)runtime._native_tick(50); const snapshot=JSON.parse(runtime.UTF8ToString(runtime._native_snapshot())); @@ -23,14 +23,16 @@ for(const [device,width,height] of [['pager',480,222],['tdeck',320,240],['wio-tr // Message text includes the card's own inset; compare actual rendered geometry. const limit=device==='tdeck'&&page===5?24:maxTextGap; assert.ok(gap>=0&&gap<=limit,`${device}:${page}: content lost width to a ${gap}px gap`); + // Contacts deliberately places its heading eight pixels inside the card. + const verticalInset=page===12?8:0; // T-Deck's message name is vertically inset inside its richer info card. - if(device!=='tdeck'||page!==5)assert.ok(Math.abs(content.y-filter.y)<=3,`${device}:${page}: first rows align`); + if(device!=='tdeck'||page!==5)assert.ok(Math.abs(content.y-filter.y-verticalInset)<=3,`${device}:${page}: first rows align with their intended inset`); const pixels=new Uint16Array(runtime.HEAPU8.buffer,framePointer,width*height); const y=height-50; const background=pixels[y*width+10]; - // Tracker now deliberately uses colored item cards. Its seam must remain + // Contacts and Tracker deliberately use colored item cards. Their seam must remain // continuous, while the content card may contrast with the pane background. - const seamEnd=page===14?content.x:width-10; + const seamEnd=page===12?content.x-11:page===14?content.x:width-10; for(let x=10;x