Skip to content

Commit d94f9be

Browse files
committed
Guard receive autosave callbacks and document the test pause
1 parent 5fd63e9 commit d94f9be

7 files changed

Lines changed: 433 additions & 21 deletions

File tree

‎docs/testing-coverage.md‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
# 功能覆盖责任矩阵
22

3-
更新日期:2026-10-10
3+
更新日期:2026-10-11
44

55
本文件用于落实 [测试计划](testing-plan.md),不是通过案例数量推导出的“全覆盖”声明。实际执行环境、报告及已知失败见 [实施记录](testing-progress.md),旧案例迁移见 [迁移记录](testing-migration.md)。
66

7+
2026-10-11 按用户要求收尾,测试扩展暂停。历史记录交换已有项目顺序及原生 Move 对照已撤除,不再作为产品覆盖缺口;其他未完成范围保留,仅供以后恢复参考。
8+
79
## 阅读约定
810

911
- “已验证”只表示列出的行为在记录的环境通过,不表示整项功能或所有部署形态完成
@@ -106,8 +108,8 @@
106108
| --- | --- | --- |
107109
| Settings | 38 条 WinUI/逻辑:草稿、预览覆盖、真实 Expander/按钮更新;两条生产 App E2E 已编写但环境启动失败;含发送与网络页案例的最新控件宿主全套 96 项通过;夹具终结显式 Dispose | 两条 E2E 实际验收,全部设置及平台分支 |
108110
| Send | 16 条生产辅助逻辑/Windows API 与 32 条 SendDeviceResolver 解析/真实节点案例;另六条真实生产设备卡片/身份卡片 UI:七状态与发送/探测的禁用门控、窄/宽布局设备重排和最新回调、收藏快照与原生菜单、空/降级/故障恢复、终结 effect 与 ElementChanged 清理;初始夹具失败及生产终结遗漏的首轮失败均保留;全套 96 项通过 | 生产页面选择文件/文件夹/文本、系统剪贴板入口、队列、设备选择、发送/取消真实用户流程;收藏文件持久化、页面卸载取消接线、真实 LAN、多地址与注册阶段取消/异常完整矩阵;全部组件销毁路径审计 |
109-
| Receive | 共享业务真实接收;新增 12 个页面控件案例已编写但无实际通过报告,页面改为使用传入设置,不能记为 UI 已验收 | 先构建和验证新增专项;自动接受、PIN、等待/进度/取消状态实际 UI |
110-
| History | 独立 CLI 历史验证,不是该页 UI 测试;页面存储依赖隔离已写入但尚未验收 | 存储调整构建及页面专项;列表更新、定位/打开、删除/清空、分享实际 UI |
111+
| Receive | 15 条真实生产页控件案例通过:七节点状态的链接接收门控与原生 UIA 导航、三种自动保存模式及最新设置保留、别名/身份/页头动态更新、待处理数量/空闲播放器切换、空选择及真实模板重应用不保存并保留下一次编辑;首次 12 项失败定位 Toolkit 模板清空/恢复回传,生产回调过滤无效/未变化值后通过 | 自动接受、PIN、等待/进度/取消状态实际 UI;系统输入、生产导航和最终 AOT 包仍未验收 |
112+
| History | 保留九条生产页控件案例,旧全套报告中均通过:外部存储新增/删除/清空、订阅释放、文件/目录/不存在路径菜单门控、原生 UIA 单项删除、取消/确认清空且文件字节保留、详情导航/缺失 ID 消费、存储替换后的最新命令。交换已有记录顺序及原生 Move 对照按用户要求撤除,旧失败报告仅作为历史诊断保留 | 打开/定位文件的真实系统操作、持久化失败、分享、系统输入和生产 App 流程 |
111113
| DeviceDetails | 无直接页面 UI 案例 | 详情/收藏/网络地址更新及导航保留 |
112114
| NetworkInterfaces | 四条真实 WinUI 生产页面案例:两种名单模式互斥/规则移交、保留其他设置、同一 Checkbox/TextBox、草稿不随无关刷新丢失、程序化失焦提交、native UIA Add/Remove 即时更新;只读本机接口,回调内存隔离;夹具显式 Dispose,最新全套 WinUI 96 项通过 | 主 App 导航和真实输入、OS 接口变化/异常、筛选卡片实际变化及持久化;控件宿主不冒充用户 E2E |
113115
| WebShare | Core/CLI 浏览器 HTTP 验证,不是该页 UI 测试 | 页面分享/接收切换、链接复制、授权实际 UI |
@@ -119,6 +121,8 @@
119121

120122
当前机器没有 Windows Sandbox,生产 App E2E 不回退至开发者的正式安装或生产数据目录。没有可用的前台输入环境也不能改成直接调用回调后报绿。
121123

124+
2026-10-11 最近完整 WinUI 报告为 `receive-history-complete-win-20261011-203850/winui/`:实际执行 128 项,126 通过、2 失败、0 跳过,控制器退出 2 且输出排空。两项失败是随后按用户要求撤除的 History 重排和独立原生 Move 对照;旧报告不改写为通过。收尾后的常规套件保留 126 项,入口数量下限同步为 126;没有重新执行全套,不宣称当前工作区全套通过。保留的本批案例为 Receive 15、History 页面 9,其余类别 102 项(含 6 项复数资源案例)。
125+
122126
## 其余产品和验收次序
123127

124128
| 范围 | 已验证内容 | 未完成范围 |

‎docs/testing-plan.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
# Core、CLI 与 App 完整测试体系建设计划
22

3-
状态:目标方案已整理;工作区已有部分迁移与验证代码,完整实施及 CI 验收尚未完成
3+
状态:测试建设已按用户要求暂停(2026-10-11);已有成果保留,完整实施及 CI 验收尚未完成
44

55
制定日期:2026-10-07
66

77
计划复核日期:2026-10-10
88

99
本文件定义目标结构、覆盖责任、实施顺序和验收标准,不是已完成测试清单。阶段复选框只在对应验收条件全部满足后更新,局部通过不能视为整个阶段完成。
1010

11+
收尾约定(2026-10-11):不继续扩大测试范围;历史记录交换已有项目顺序不是当前产品需求,相应页面重排测试及原生 ItemsRepeater Move 对照已撤除,不列为待修复项或发布门禁。以下未完成任务仅作为以后恢复时的参考,不代表正在执行。
12+
1113
实际迁移、运行结果与剩余缺口见 [testing-progress.md](testing-progress.md)。
1214

1315
现有功能、逐命令和页面的首轮覆盖责任矩阵见 [testing-coverage.md](testing-coverage.md);未完成项保留明确的验证责任,不以解析成功或某套件通过替代整体覆盖。

‎docs/testing-progress.md‎

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,43 @@
11
# 测试实施记录
22

3-
更新日期:2026-10-10
3+
更新日期:2026-10-11
44

55
目标见 [testing-plan.md](testing-plan.md)。本记录只声明已核验的范围,不代表完整计划已完成。
66

77
旧案例的保留、改写、合并或删除逐项记录见 [testing-migration.md](testing-migration.md)。
88

99
逐功能、逐 CLI 命令和 App 页面对应的证据及缺口见 [testing-coverage.md](testing-coverage.md)。矩阵是首轮责任审计,不将语法转发或控件宿主成功视为整个产品能力完成。
1010

11-
## 暂停交接点(2026-10-10)
11+
## 收尾交接(2026-10-11)
12+
13+
按用户要求暂停测试扩展,不标记完整计划完成,也不继续调查非产品需求的控件边界。
14+
15+
- 撤除历史页交换已有两条记录顺序的案例,以及纯原生 ItemsRepeater Move 对照。当前历史功能仅新增、删除、清空;交换已有记录顺序不是产品需求,不再作为缺口或门禁。
16+
- 历史页保留九个有效控件案例,接收页保留十五个案例及无效/重复选择不保存的防御性处理。WinUI 常规套件数量下限由 128 调整为 126。
17+
- 撤回尚未配套测试的设备详情页收藏存储注入改动,包括 `IFavoriteDeviceStore`;设备详情页恢复原实现,不遗留半成品测试接口。
18+
- 旧 TRX、诊断与首次失败记录保留。撤除案例不改写旧报告为通过;最近完整运行仍为 128 执行、126 通过、2 失败。收尾仅做编译检查,不重新运行完整套件,不能声称当前 126 项已重新全套通过。
19+
- 真实输入、生产 App E2E、集成 CLI、最终 MSIX、其余平台及 CI 的未验收范围继续保留,但暂停实施;没有提交、发布或修改生产安装与数据。
20+
- 收尾编译:`dotnet build tests/Tonarink.App.WinUI.Tests/Tonarink.App.WinUI.Tests.csproj -c Release -p:Platform=x64 --no-restore --nologo` 成功,包含主 App 项目引用,0 警告、0 错误;未运行测试。
21+
22+
以下为收尾前的实施记录,不再表示下一步执行安排。
23+
24+
## 恢复实施:Receive / History 真实控件(2026-10-11,历史记录)
25+
26+
目标已恢复,仍保持完整计划范围,不标记完成。本批只使用独立非打包 WinUI 测试宿主、内存设置/历史边界及自有临时文件;没有启动生产网络服务、安装 App、修改正式设置/联系人、启用 Windows 功能或运行发布。
27+
28+
接收页首次编译失败保留在 `artifacts/test-results/receive-page-20261011-201832/controller/`:CsWinRT1032 要求传给投影边界的两个集合表达式显式转换为 `IncomingTransferRequest[]`。修正后真实 12 项均因初始化保存回传失败,报告 `receive-page-fixed-20261011-201926/`。进一步三个自动保存案例的值序列为 `-1 → 原模式`;`receive-selection-stack-20261011-202514/` 的实际栈指向 `CommunityToolkit.WinUI.Controls.Segmented.OnApplyTemplate()`,而不是此前怀疑的 ItemsHost 重建。保留这次根因修正,不将先前猜测当作结论。
29+
30+
生产 `ReceivePage` 现在忽略无效模式及与当前传入设置相同的模式。测试不再把页头从 null 插入导致的夹具布局替换、相同 runtime 值不触发 UseState 重渲染、同一 dispatcher 回合中连续写原生属性而未等待受控值渲染的行为混入生产回归。真实导航宿主、设置更新回调和“初始化不能保存”的断言都保留;每次操作等待实际渲染完成后仍严格要求一次回调。新增三个空选择/模板重新应用/下一次编辑案例,接收页共 15 项通过。
31+
32+
历史页新增十个生产页面案例和一个原生框架对照。只替换 `IReceiveHistoryStore`,不复制 HistoryPage 或绕过命令;菜单/确认按钮通过 native UIA Invoke 执行,外部文件打开/资源管理器启动不执行。通过的九项验证空态到新增/删除/清空、订阅终结、三种路径门控、单项删除只影响目标 ID、清空取消/确认而文件字节不变、真实 ContentDialog 元数据、已知/缺失导航 ID 消费、切换存储后的订阅与命令更新。初始 `history-page-first-20261011-203030/` 六项失败中,回收池控件误计入显示行和未挂载 XamlRoot 的夹具读取已修正;现在只按 ItemsRepeater 的有效索引读取行,不强制 GetOrCreateElement,也不取消虚拟化。
33+
34+
仍失败的重排有可重复的运行证据:`history-sized-viewport-20261011-203520/` 使用 1000×640 宿主,repeater 实际 928×515、数据两项,而显示索引为 `+,-`、第一项仍显示旧内容。`history-native-move-20261011-203706/` 使用原生 ItemsRepeater、普通 DataTemplate 和 `ObservableCollection<string>.Move`,完全不经过 Reactor,仍显示 `first,null`。这只证明故障能够在原生路径复现,不足以宣布已定位到 WinUI、CsWinRT 或某个版本的具体内部原因;不能归因于 HistoryPage 的自定义工厂。微软[ItemsRepeater 数据源说明](https://learn.microsoft.com/en-us/windows/apps/develop/ui/controls/items-repeater#configure-the-data-source)说明 INotifyCollectionChanged 支持 Move,IObservableVector 没有 Move 动作,投影使用哪条路径仍需进一步核验。未引入列表整体重建、未屏蔽或忽略这两条失败。
35+
36+
完整统一入口结果:`artifacts/test-results/receive-history-complete-win-20261011-203850/winui/`,128 执行 / 126 通过 / 2 失败 / 0 跳过;MTP 和控制器均退出 2、输出排空,外层脚本正确非零失败。TRX 的类别数量为 Expander 2、FilePreviewContent 1、FilePreviewSettings 15、History 11、NetworkInterfaces 4、PluralMessage 6、Receive 15、SelectedSendItem 16、SendDeviceResolver 32、SendDevicesCard 6、SettingsInputDraft 20。该次命令使用数量下限 122,随后按实际清单将入口下限改为 128;不把旧 96 项报告当作当前工作区的数量或通过状态。
37+
38+
被测 App DLL SHA-256 `07FC34083417D8BA6FF41A8D7C435A383D6E6F2AC879150375F01AF082BA0D62`,WinUI 测试 DLL `68A30F698A6223E558979C744353629CF8E23DD428965DABC7BDB0B26504FD45`;ReceivePage 源码 `57C1DB7A9F9BEB8FAEAAD51AEBE206636D6A7C316E02CE8F8DB43673523D1425`、Receive 用例 `7F29FF0809E1FB619632F57BA4949E02CB7D79F23AF75AFEEEEED8FC0C1D16B2`。首次失败与中间报告均保留。本批尚不能认定 History 重排、完整 WinUI、真实用户输入、生产 App 导航、集成 CLI、最终 MSIX 或其他 OS/架构验收通过;后续继续定位 Move 运行时路径并推进其余计划缺口。
39+
40+
## 暂停交接点(2026-10-10,历史记录)
1241

1342
按用户要求收尾,测试建设目标保持暂停,不标记整体完成。本次只核对现有文件、TRX、控制器结果及进程状态,更新交接记录;没有启动新测试、构建、CI 或发布。
1443

‎src/Tonarink.App/Pages/Receive/ReceivePage.cs‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,20 @@ fingerprint is null
116116
},
117117
Segmented(
118118
selectedIndex: (int)Props.Settings.AutoSave,
119-
onSelectedIndexChanged: index => Props.UpdateSettings(settings => settings with
119+
onSelectedIndexChanged: index =>
120120
{
121-
AutoSave = (AutoSaveMode)index,
122-
FavoritesOnly = (AutoSaveMode)index == AutoSaveMode.Favorites,
123-
}),
121+
// Segmented reapplies its template by clearing and
122+
// restoring selection. Those events aren't user edits.
123+
if (!Enum.IsDefined((AutoSaveMode)index)
124+
|| index == (int)Props.Settings.AutoSave)
125+
return;
126+
127+
Props.UpdateSettings(settings => settings with
128+
{
129+
AutoSave = (AutoSaveMode)index,
130+
FavoritesOnly = (AutoSaveMode)index == AutoSaveMode.Favorites,
131+
});
132+
},
124133
items: autoSaveItems)
125134
.HAlign(HorizontalAlignment.Stretch)) with
126135
{

0 commit comments

Comments
 (0)