尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

bat 语法高亮回归测试:以 Markdown 内嵌 TypeScript 测试文件为例

bat 语法高亮回归测试:以 Markdown 内嵌 TypeScript 测试文件为例 bat 语法高亮回归测试以 Markdown 内嵌 TypeScript 测试文件为例【免费下载链接】batA cat(1) clone with wings.项目地址: https://gitcode.com/GitHub_Trending/ba/battests/syntax-tests/source/Markdown/typescript.md是 bat 语法高亮测试体系中的一个典型“源文件”source fixture它是一个 Markdown 文档正文内嵌了一整段 TypeScript 代码块。bat 会用内置的 TextMate 语法资产对该文件做高亮渲染并把带 ANSI 转义序列的输出固化到tests/syntax-tests/highlighted/Markdown/typescript.md作为黄金快照。读完本文你能完整理解这个测试样本覆盖的 TypeScript 语法点、它在 bat 高亮回归测试流水线中的角色以及如何用仓库自带的脚本本地复现和比对高亮结果。一、测试源文件的完整内容该文件位于 tests/syntax-tests/source/Markdown/typescript.md全部内容如下标题加一段typescript围栏代码块enum Status { Pending, InProgress, Completed, } interface Task { id: number; title: string; status: Status; assignee?: string; } class TaskManagerT extends Task { private tasks: T[] []; addTask(task: T): void { this.tasks.push(task); } getTasksByStatus(status: Status): T[] { return this.tasks.filter(task task.status status); } async fetchTasks(): PromiseT[] { // Simulate async fetch return new Promise(resolve setTimeout(() resolve(this.tasks), 500)); } } // Type guard function isTask(obj: any): obj is Task { return typeof obj.id number typeof obj.title string; } // Usage const manager new TaskManagerTask(); manager.addTask({ id: 1, title: Write docs, status: Status.Pending }); manager.addTask({ id: 2, title: Review PR, status: Status.InProgress, assignee: Alice }); (async () { const allTasks await manager.fetchTasks(); allTasks.forEach(task { if (isTask(task)) { console.log(Task #${task.id}: ${task.title} [${Status[task.status]}]); } }); })(); // Type assertion const unknownValue: unknown { id: 3, title: Test, status: Status.Completed }; const assertedTask unknownValue as Task; console.log(assertedTask.title);这段代码覆盖了哪些 TypeScript 高亮场景从代码块的内容组织来看它是刻意“浓缩”了 TypeScript 的几类典型词法结构便于验证语法文件对不同 token 的着色是否正确enum声明Status覆盖枚举关键字与枚举成员标识符的着色其中成员Pending、InProgress、Completed应走“常量/变量”一类 scope。interface声明Task覆盖接口关键字、属性名、类型注解number、string、Status以及可选属性语法assignee?中的?操作符。带约束的泛型类TaskManagerT extends Task覆盖泛型形参列表、extends约束关键字、private访问修饰符、箭头函数、字符串字面量与注释// Simulate async fetch。异步与 Promiseasync/await/new Promise等异步相关关键字以及模板字符串反引号中的${...}插值表达式。类型保护type guardfunction isTask(obj: any): obj is Task中的谓词语法obj is Task是对语法文件中“类型谓词”scope 路由的典型检验点。类型断言type assertionunknownValue as Task中的as断言语法以及unknown类型。常规语句const声明、对象字面量、方法调用链、IIFE(async () {...})()。二、它在 bat 高亮回归测试流水线中的位置bat 仓库的tests/syntax-tests/目录采用“源文件 快照”的成对结构源文件source/语言/文件名如 tests/syntax-tests/source/Markdown/typescript.md快照文件tests/syntax-tests/highlighted/Markdown/typescript.md内容是 bat 渲染后的完整输出包含 24 位色 ANSI 转义序列无行号、无头部纯正文高亮流。生成快照固定参数的create_highlighted_versions.pytests/syntax-tests/create_highlighted_versions.py 会遍历source/下所有文件用一组完全固定的 bat 参数渲染把 stdout 原样写入highlighted/对应路径。核心配置如下BAT_OPTIONS [ --no-config, # 不读取任何 bat 配置文件排除用户配置干扰 --styleplain, # 只保留正文去掉行号、文件头、网格 --coloralways, # 即使输出重定向到文件也强制输出颜色 --themeMonokai Extended, # 固定主题排除默认主题随终端外观变化的不确定性 --italic-textalways, # 强制斜体使斜体下划线转义序列稳定可复现 ]为保证跨环境可复现脚本还会从子进程环境中删除BAT_CACHE_PATH、BAT_CONFIG_DIR、BAT_CONFIG_PATH、BAT_OPTS、BAT_PAGER、BAT_STYLE、BAT_TABS、BAT_THEME、NO_COLOR、PAGER等环境变量防止本机配置“污染”快照设置COLORTERMtruecolor确保输出使用 24 位真彩色即38;2;R;G;B形式而非退化的 256 色或 8 色。tests/syntax-tests/update.sh 是对该脚本的一行封装python3 create_highlighted_versions.py -O highlighted用于在语法资产变更后重新生成全部快照。比对快照compare_highlighted_versions.pytests/syntax-tests/compare_highlighted_versions.py 接收新旧两个输出目录对其中每一对同名文件做difflib.unified_diff比对任一对文件有差异或新目录中出现尚无快照的语言文件则打印Error: files with changes have been found并以退出码 1 结束全部一致时输出Directories are the same并以退出码 0 结束。因此它的退出码可以直接作为 CI 步骤的判定依据bat 的语法资产、主题或渲染逻辑发生任何会改变终端输出字节的行为都会在这里以 diff 形式暴露。快照长什么样解读本文件的 ANSI 输出对照 tests/syntax-tests/highlighted/Markdown/typescript.md 的前几行可以直观验证上面的参数确实生效位置ANSI 序列SGR含义第 1 行# Typescript test38;2;253;151;31Markdown 标题着红色24 位真彩色第 3 行38;2;255;255;255围栏标记为白色第 3 行typescript38;2;190;132;255围栏语言标识着紫色Markdown 语法对信息字符串的着色第 4 行enum3;38;2;102;217;2393;前缀即斜体--italic-textalways浅蓝色为关键字色第 4 行Status38;2;166;226;46类型/实体名着绿色每一行正文都被逐片段拆开着色如第 5 行中Pending、,各自独立携带序列说明 Markdown 语法在围栏代码块内部把 scope 交给了 TypeScript 语法继续路由。三、为什么“Markdown 内嵌 TypeScript”是有代表性的测试样本从源码结构看bat 的高亮核心依赖 TextMate 语法资产assets/syntaxes/下的语法与主题资源构建时打包为syntaxes.bin/themes.bin。其中 Markdown 这类“宿主语法”需要在遇到围栏时根据信息字符串这里是typescript把后续 scope 切换到对应的嵌入式语法直到围栏结束再切回。这个测试文件恰好同时压测了该机制的两个方向宿主层#标题、围栏标记、围栏语言标识必须按 Markdown 语法规则着色快照第 1–3 行嵌入层围栏内部 50 余行 TypeScript 必须按 TypeScript 语法规则着色快照第 4 行起包括关键字、类型名、字符串、注释、模板字符串插值等细粒度 scope。若任一层的 scope 路由、上下文进出或关键字匹配发生变化highlighted/Markdown/typescript.md的字节序列就会改变从而被比对脚本捕获。这也是 bat 用“真实感代码样本 逐字节快照”方式守护高亮质量的思路不验证语义正确性TypeScript 代码本身不被编译执行只验证终端输出字节级的稳定性与着色正确性。四、本地复现步骤在仓库根目录下可以按以下流程验证该测试均为查看/运行操作不修改仓库内容# 1. 用与快照完全一致的参数渲染源文件肉眼查看高亮效果 bat --no-config --styleplain --coloralways \ --themeMonokai Extended --italic-textalways \ tests/syntax-tests/source/Markdown/typescript.md # 2. 需要重新生成全部快照时例如更新了语法资产 bash tests/syntax-tests/update.sh # 3. 比对两个高亮输出目录是否一致CI 用法 python3 tests/syntax-tests/compare_highlighted_versions.py 旧目录 新目录 echo $? # 0 一致1 存在差异或新增无快照的语言注意事项复现快照要求 PATH 中可执行bat脚本通过subprocess调用bat命令且终端/Python 环境不额外注入NO_COLOR、BAT_*等变量——脚本内部会主动清理这些变量但手工运行第 1 条命令时请自行保证环境干净固定主题为 “Monokai Extended”该名称对应assets/themes/下的 Monokai Extended 主题资源主题变更会直接体现为快照 diff快照文件是二进制安全的原始 stdout 落盘wb模式写入因此比对是逐字节严格的任何渲染细节变化都会触发失败。小结tests/syntax-tests/source/Markdown/typescript.md虽然只是一个 Markdown 测试样本但它以一段覆盖枚举、接口、泛型类、类型保护与类型断言的 TypeScript 代码同时检验了 bat 的宿主/嵌入双层 scope 路由配合 create_highlighted_versions.py 的固定参数渲染、compare_highlighted_versions.py 的逐字节比对与 update.sh 的快照再生成构成了 bat 守护语法高亮稳定性的完整闭环。理解这一模式后你可以把同样的方法推广到source/下其他语言目录如 TypeScript、Rust、Python 等验证 bat 对各类 TextMate 语法资产的高亮行为。【免费下载链接】batA cat(1) clone with wings.项目地址: https://gitcode.com/GitHub_Trending/ba/bat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表