import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' // module 13 task 243:壳层换皮成 admin.html 蓝白浅色 —— 侧栏 252px 浅底、顶栏 76px、 // 角色胶囊 + 次级退出按钮、去掉顶栏重复 logo、菜单激活态浅蓝渐变+左蓝条。 test('test_task_243_shell_normal_primary_path', () => { const css = readSource('src/styles/main.css') assert.match(css, /\.admin-sidebar\s*\{[^}]*flex:\s*0\s*0\s*252px/, '侧栏宽度应为 252px') assert.match(css, /\.admin-topbar\s*\{[^}]*min-height:\s*76px/, '顶栏高度应为 76px') assert.match(css, /linear-gradient\(180deg,\s*var\(--admin-sidebar\)\s*0%,/, '侧栏应为浅色渐变底') }) test('test_task_243_shell_normal_variant_input', () => { // 正常变体:菜单激活态为浅蓝渐变 + inset 蓝条,不再是靛蓝渐变。 const css = readSource('src/styles/main.css') assert.match(css, /inset 3px 0 0 #5f85ad/, '激活态需含左侧 3px 蓝条') assert.match(css, /linear-gradient\(90deg,\s*#dce9f5,\s*#edf4fa\)/, '激活态需为浅蓝渐变') assert.equal(/#6366f1|rgba\(99,\s*102,\s*241/.test(css), false, '壳层不得残留 indigo 主色') }) test('test_task_243_shell_normal_repeated_operation_is_idempotent', () => { const css = readSource('src/styles/main.css') const first = /\.admin-topbar\s*\{[^}]*min-height:\s*76px/.test(css) const second = /\.admin-topbar\s*\{[^}]*min-height:\s*76px/.test(css) assert.equal(first, true) assert.equal(first, second) }) test('test_task_243_shell_boundary_empty_input', () => { // 边界:验收反馈已移除收起菜单按钮;窄屏适配保留。 const css = readSource('src/styles/main.css') assert.match(css, /@media \(max-width:\s*820px\)/) const layout = readSource('src/layout/AdminLayout.vue') assert.ok(!layout.includes('sidebar-collapse'), '收起按钮已移除') }) test('test_task_243_shell_boundary_single_item', () => { // 边界:顶栏不再放第二个 logo;用户角色以胶囊呈现。 const layout = readSource('src/layout/AdminLayout.vue') assert.equal(/admin-topbar-logo/.test(layout), false, '顶栏不应再出现 logo 元素') assert.match(layout, /admin-user-role/, '需有角色胶囊类') assert.match(layout, /admin-user-logout/, '退出按钮需为次级胶囊化按钮') }) test('test_task_243_shell_boundary_limit_or_missing_field', () => { const css = readSource('src/styles/main.css') assert.match(css, /\.admin-user-role\s*\{[^}]*border-radius:\s*999px/, '角色应为胶囊') assert.match(css, /\.admin-kicker\s*\{[^}]*font-size:\s*10px/, 'kicker 应为 10px') assert.match(css, /\.admin-brand-copy strong\s*\{[^}]*color:\s*var\(--admin-text\)/, '品牌名应使用浅色文本 token') }) test('test_task_243_shell_invalid_input_rejected', () => { // 异常:旧壳层暗色/白字样式不得残留(会令浅色侧栏不可读)。 const css = readSource('src/styles/main.css') assert.equal(/#aeb8cc|#929db4|#b9c2d5/.test(css), false, '壳层不得残留原深色侧栏的白灰文字色') assert.equal(/#192132|#121827/.test(css), false, '不得残留深色侧栏底色') }) test('test_task_243_shell_dependency_failure_returns_actionable_message', () => { // 依赖失败:侧栏文本/强调色 token 已落盘并被引用(防硬编码漂移)。 const css = readSource('src/styles/main.css') assert.match(css, /--admin-sidebar-text:\s*#536a81/) assert.match(css, /--admin-primary-strong:\s*#2f5d8b/) assert.match(css, /var\(--admin-sidebar-text\)/) assert.match(css, /var\(--admin-primary-strong\)/) })