diff --git a/crates/app-iced/tests/no_hardcoded_tokens.rs b/crates/app-iced/tests/no_hardcoded_tokens.rs index 5c1edff..fc019ad 100644 --- a/crates/app-iced/tests/no_hardcoded_tokens.rs +++ b/crates/app-iced/tests/no_hardcoded_tokens.rs @@ -202,20 +202,26 @@ fn size_literal(argument: &str) -> Option { Some(number) } +/// 尺寸字面量守门:`src/shell` + `src/pages` 都扫。 +/// +/// P2-3(M84 复审):原先只扫 `shell`,新增的 `pages/` **没被覆盖**(页面里写 `.width(24)` 没人发现)。 +/// `pages/layout.rs` 允许有布局常量(它是布局系统的定义点),控件调用点上不许再出现字面量。 #[test] -fn shell_takes_every_size_from_tokens() { +fn layout_sources_take_every_size_from_tokens() { let mut files = Vec::new(); - rust_files(&manifest_dir().join("src").join("shell"), &mut files); + for dir in ["shell", "pages"] { + rust_files(&manifest_dir().join("src").join(dir), &mut files); + } assert!( - files.len() >= 2, - "shell 模块至少有两个文件(mod.rs + nav.rs),实际扫到 {}", + files.len() >= 10, + "shell + pages 至少 10 个文件(shell 2 + pages 8+),实际扫到 {}:扫描逻辑坏了,这条门禁等于没跑", files.len() ); let mut offenders = Vec::new(); for path in files { - let text = std::fs::read_to_string(&path).expect("读 shell 源文件"); + let text = std::fs::read_to_string(&path).expect("读布局源文件"); for (index, line) in text.lines().enumerate() { // 文档注释是散文不是代码:里面写 `.width(24)` 是在解释坑,不该判违规 @@ -247,6 +253,48 @@ fn shell_takes_every_size_from_tokens() { ); } +/// 图标语汇守门(视觉复审 P2-3):`pages/` 里只用**描边**字形。 +/// +/// 令牌层把 `Play` / `Stop` / `More` 定义成填充字形,其余是描边;页面骨架里混用会让同屏线宽 +/// 语汇打架。将来要支持「主操作允许实心图标」,应由 `components/` 统一定义并只留一处。 +#[test] +fn pages_use_only_stroked_icons() { + const FILLED: [&str; 3] = ["IconKind::Play", "IconKind::Stop", "IconKind::More"]; + + let mut files = Vec::new(); + rust_files(&manifest_dir().join("src").join("pages"), &mut files); + assert!( + files.len() >= 8, + "pages 至少 8 个文件,实扫 {}", + files.len() + ); + + let mut offenders = Vec::new(); + for path in files { + let text = std::fs::read_to_string(&path).expect("读 pages 源文件"); + for (index, line) in text.lines().enumerate() { + if line.trim_start().starts_with("//") { + continue; + } + for kind in FILLED { + if line.contains(kind) { + offenders.push(format!("{}:{} {line:?}", path.display(), index + 1)); + } + } + } + } + + assert!( + offenders.is_empty(), + "pages 里出现了填充字形图标(令牌层 Play/Stop/More),与同屏描边语汇冲突: +{}", + offenders.join( + " +" + ) + ); +} + /// 依赖行里出现 `slint` 就算违规(注释行放过:说明并存期要提到 slint)。 fn manifest_has_slint_dependency(manifest: &str) -> Vec { manifest