# 7.9.0 QA 测试用例集:容器内 App 手动排序 ## 1. 测试目标 验证用户可以在同一容器内拖动 App 改变显示顺序,并确保顺序在刷新、重启、语言切换、导入导出、恢复、SmartStart 等路径中保持一致,同时不破坏现有跨容器拖动改标签行为。 ## 2. 测试范围 - 数据模型兼容性。 - 同容器拖动排序。 - 旧拖拽行为回归。 - 多显示模式和标签位置。 - 导入导出、恢复、重置、SmartStart。 - macOS 14 兼容性。 ## 3. 测试环境 - macOS 14 Apple Silicon 真机。 - 当前开发机最新 macOS。 - 干净用户数据一份。 - 旧版 `tags.json` fixture 一份。 - 含多标签 App、未分类 App、Apple 内置 App、已卸载 path 的测试数据一份。 ## 4. 自动化用例 | ID | 优先级 | 类型 | 用例 | 期望结果 | | --- | --- | --- | --- | --- | | DATA-001 | P0 | 自动 | 旧 `tags.json` 无 `containerAppOrder` 字段时解码 | 加载成功,默认顺序与旧版本一致 | | DATA-002 | P0 | 自动 | 新 `tags.json` 含 `containerAppOrder` 字段时解码 | 加载成功,顺序字段保留 | | DATA-003 | P0 | 自动 | 导出后再导入含顺序的分类与布局 | 导入后每个容器顺序一致 | | DATA-004 | P0 | 自动 | `CategorySchemeFingerprint` 包含顺序字段 | 只改变顺序也能触发上一方案快照 | | DATA-005 | P0 | 自动 | 恢复上一方案 | 标签、App 归属、容器内顺序都恢复 | | DATA-006 | P0 | 自动 | 重置为未分类 | 清空旧普通标签归属,并按既定策略清理旧容器顺序 | | DATA-007 | P0 | 自动 | SmartStart replace | 新方案顺序可预测,不复用旧容器顺序 | | DATA-008 | P1 | 自动 | tag rename/delete/relocalize | 顺序 key 正确迁移或清理 | | DATA-009 | P1 | 自动 | 卸载 App path 出现在顺序字段 | 不显示空位,不崩溃,必要时懒清理 | | DATA-010 | P1 | 自动 | 新 App 不在顺序字段内 | 已排序 App 保持,新增 App 追加并按默认名称排序 | ## 5. 手工功能用例 | ID | 优先级 | 用例 | 步骤 | 期望结果 | | --- | --- | --- | --- | --- | | UI-001 | P0 | 同容器拖动到最前 | 在某容器中把第 3 个 App 拖到第 1 个位置 | App 顺序立即改变,不启动 App | | UI-002 | P0 | 同容器拖动到中间 | 把最后一个 App 拖到中间位置 | 插入位置正确,顺序保存 | | UI-003 | P0 | 跨行/跨列拖动 | 在网格容器中跨行拖动 App | 目标位置正确,无错位 | | UI-004 | P0 | 拖回原位 | 长按拖动后放回原位置 | 不写入无意义变更,不闪烁 | | UI-005 | P0 | 松手未移动 | 长按 App 后直接松手 | 不启动 App,不改变顺序 | | UI-006 | P0 | 多标签 App 独立顺序 | App 同时在 A/B 容器,重排 A | A 顺序改变,B 顺序不变 | | UI-007 | P0 | 重开 App Grid | 排序后关闭再打开 App Grid | 顺序保持 | | UI-008 | P0 | 重启 App | 排序后退出并重启 TagLauncher | 顺序保持 | | UI-009 | P1 | 语言切换 | 排序后切换中英文/日文 | 顺序保持,显示名变化不影响位置 | | UI-010 | P1 | 新安装 App | 排序后新增一个 App 并刷新 | 旧顺序保持,新 App 按默认规则追加 | ## 6. 旧拖拽行为回归 | ID | 优先级 | 用例 | 步骤 | 期望结果 | | --- | --- | --- | --- | --- | | DRAG-001 | P0 | 跨容器移动标签 | 从 A 容器拖 App 到 B 容器 | App 获得/移动到 B 标签,旧逻辑保持 | | DRAG-002 | P0 | Option 复制标签 | 按住 Option 从 A 拖到 B | App 同时保留 A/B 标签 | | DRAG-003 | P0 | 拖到空白移除来源标签 | 从容器拖到空白区域 | 继续出现现有确认逻辑 | | DRAG-004 | P0 | 拖到未分类 | 拖到未分类目标 | 继续走未分类确认与记忆逻辑 | | DRAG-005 | P0 | 拖到 Apple 内置组 | 拖到 Mac 自带 / Apple 内置组 | 继续被保护,不改变标签 | | DRAG-006 | P1 | 标签栏拖拽排序 | 拖动顶部/侧边标签排序 | 不受 App 排序拖拽影响 | ## 7. 显示模式矩阵 | ID | 优先级 | displayMode | 验收 | | --- | --- | --- | --- | | MODE-001 | P0 | `flat` | 顺序读取一致;是否允许拖动按产品最终边界验收 | | MODE-002 | P0 | `container` | 可同容器排序 | | MODE-003 | P0 | `coloredContainer` | 可同容器排序,颜色填充不遮挡插入提示 | | MODE-004 | P0 | `gridContainer` | 可同容器排序,跨行插入正确 | | MODE-005 | P0 | `coloredGridContainer` | 可同容器排序,跨行插入正确 | ## 8. 标签位置矩阵 | ID | 优先级 | 标签位置 | 验收 | | --- | --- | --- | --- | | NAV-001 | P1 | 左侧 | App 排序和标签导航互不冲突 | | NAV-002 | P1 | 右侧 | App 排序和标签导航互不冲突 | | NAV-003 | P1 | 顶部 | App 排序和标签导航互不冲突 | ## 9. 尺寸与显示矩阵 | ID | 优先级 | 条件 | 验收 | | --- | --- | --- | --- | | VIEW-001 | P1 | hide app names 开 | 拖动排序时不因名称隐藏误触发气泡 | | VIEW-002 | P1 | hide app names 关 | 名称不遮挡插入提示 | | VIEW-003 | P1 | icon size 40 | 小图标可拖动,命中正确 | | VIEW-004 | P1 | icon size 64 | 默认尺寸可拖动 | | VIEW-005 | P1 | icon size 80 | 大图标可拖动,布局不重叠 | ## 10. 异常与取消 | ID | 优先级 | 用例 | 期望结果 | | --- | --- | --- | --- | | EDGE-001 | P0 | 拖出窗口后松手 | 状态清理干净,不残留拖拽影子 | | EDGE-002 | P1 | 拖动中按 Esc | 取消拖动,顺序不变 | | EDGE-003 | P1 | 拖动中滚动 | 不出现错位插入;若暂不支持滚动拖拽,边界表现明确 | | EDGE-004 | P1 | 拖动中切换 Space/窗口 | 不崩溃,不残留 hover/bubble 状态 | | EDGE-005 | P1 | 拖动中打开 Quick Search/Settings | 拖动状态清理,窗口行为正常 | ## 11. 现有 QA 脚本 实现完成后至少运行;本轮 `7.9.0 (20260611.2212)` 已按下列脚本回归: ```bash cd /Users/ar/Projects/Taglauncher/src bash Scripts/app_ordering_data_qa.sh bash Scripts/macos14_availability_typecheck_qa.sh bash Scripts/macos14_build_metadata_qa.sh bash Scripts/quick_search_app_name_qa.sh bash Scripts/quick_search_system_app_qa.sh bash Scripts/smartstart_catalog_resource_qa.sh bash Scripts/window_logic_qa.sh ``` 自动化覆盖说明: - `Scripts/app_ordering_data_qa.sh` 覆盖排序字段兼容、JSON roundtrip、分类方案 fingerprint、导入导出、备份恢复、SmartStart 清理、ContentView wiring、AppGrid 同容器 payload 和 AppDragCoordinator 解析。 - `Scripts/window_logic_qa.sh` 覆盖 Dock 重开、Quick Search、Settings、文件面板、全屏/Split View、隐藏 Dock 场景下的窗口行为回归。 - macOS 14 专项脚本覆盖 `arm64-apple-macosx14.0` typecheck 和构建 metadata。 ## 12. 发布阻断条件 - 顺序在刷新、重启、语言切换、导入导出、恢复上一方案任一路径丢失。 - 同容器排序破坏跨容器移动、Option 复制、拖空白移除、Apple 内置保护。 - 旧数据无法加载或升级后默认顺序改变。 - macOS 14 typecheck/build metadata/window logic 任一失败。 - 手工发现拖拽残影、误启动 App、窗口关闭、UI 重叠或插入位置不可理解。