Prism 有一个测试套件,可确保匹配正确的标记。
运行测试套件很简单:只需调用 npm test
。
所有测试文件都独立运行。为每个测试用例创建一个新的 Prism 实例。这会稍微降低测试运行器的速度,但我们可以确保没有任何内容泄漏到下一个测试用例中。
要仅针对一种语言运行测试,可以使用 language
参数
npm run test:languages -- --language=markup
甚至可以指定多种语言
npm run test:languages -- --language=markup --language=css
感谢编写测试!测试太棒了!它们确保我们可以在不破坏任何内容的情况下改进代码库。此外,通过这种方式,我们可以确保 Prism 升级对您尽可能轻松。
可以通过在位于 /tests/languages/${language}
的测试目录中创建新的测试用例文件(带有 .test
文件扩展名)来添加新测试。
所有测试都按目录归类到 tests/languages
目录中。每个目录名称编码您当前正在测试的语言。
所有语言名称都必须与 components.json
中定义的名称相匹配。
只需将测试文件放入您要测试的语言目录中。
因此,如果您想测试 CSS,请将您的测试文件放入 /tests/languages/css
中以仅测试 CSS。如果您在此目录中创建一个测试用例,测试运行器将确保正确加载 css
语言定义(包括所有必需的语言定义)。
如果您想测试语言注入,通常需要加载两种或多种语言,其中一种语言是正在测试的“主”语言,而所有其他语言都被注入其中。
您需要使用 +
号将多种语言分隔开来以定义多种语言:markup+php
。
语言按顺序加载,因此首先加载标记(+ 依赖项),然后加载 php(+ 依赖项)。测试加载器将确保没有语言被加载超过一次(例如,如果两种语言具有相同的依赖关系)。
默认情况下,最后一种语言是主语言:php+markup
会将 markup
作为主语言。这与将您的代码放入以下代码块中相同
...
<pre><code class="language-markup">
<!-- your code here -->
</code><pre>
...
如果您需要按照特定顺序加载语言,但不想将最后一种语言用作主语言,则可以使用叹号来标记主语言:php!+markup
。这会使用 php
作为主语言。(您只能定义一种主语言。测试运行器会使具有一个以上主语言的目录中的所有测试都失败。)
注意:通过加载多种语言,可以进行集成测试(确保同时加载两种或多种语言不会破坏任何内容)。
首先,您需要在您想要测试的语言目录中创建一个新文件。
为测试用例使用一个合适的名称。请使用下列约定中的一种情况
issue{issueid}
:引用一个 Github 问题 ID(示例:issue588.test
)。{featurename}_feature
:将所有测试分组到一个文件中的一个功能(示例:string_interpolation_feature.test
)。{language}_inclusion
:测试一种语言包含在另一种语言中(示例:markup!+css/css_inclusion.test
将测试 CSS 包含在标记中)。您可以前缀使用所有约定,因此 string_interpolation_feature_inline.test
是可能的。但是请花一两分钟的时间考虑测试用例文件的合适名称。您不仅为计算机,也为其他开发人员编写代码。
测试用例文件由两到三部分构成,以十个或更多破折号 -
分隔,从行开始。这些部分如下
--update
标志 来覆盖它。这是一个示例
var a = 5;
----------------------------------------------------
[
["keyword", "var"],
" a ",
["operator", "="],
["number", "5"],
["punctuation", ";"]
]
----------------------------------------------------
This is a comment explaining this test case.
创建一或多个新测试用例的简单方法是
tests/languages/{language}/{test-case}.test
。npm run test:languages
。更新现有测试用例文件也很容易!
npm run test:languages -- --update
。它的工作原理是让测试运行器将您测试代码的实际标记流作为预期标记流插入。仔细检查已插入的标记流是否实际上符合您的预期,否则测试毫无意义!
在创建和修改语言时,必须更新它们的测试文件才能对语言进行妥善测试。可以利用以下命令自动完成更新测试文件的繁琐任务
npm run test:languages -- --update
更新(覆盖)所有失败的测试文件的预期标记流。运行此命令后,语言测试一定会通过。
请注意:此命令让创建/更新测试文件变得轻而易举,但这并不意味着测试是正确的。务必仔细检查插入/更新的标记流!
Prism 在高亮显示时会将源代码转换成一个标记流。这本质上是嵌套标记(数组或字符串)的树。
由于难以手工编写这些树,所以测试运行程序采用了其简化版本。
它使用以下规则
标记
对象会转换成一个数组:[标记.类型, 标记.内容]
( 标记.内容
可以是嵌套结构)。简化标记流不包含标记的别名。
有关更多信息:阅读测试运行程序的测试(tests/testrunner-tests.js
)将帮您理解该转换。
有时,使用标记流测试还不够强大。通过创建扩展名为 .html.test
的测试文件(而不是 .test
),可以让 Prism 高亮显示任意代码块,并检查其 HTML 结果。
语言由包含测试文件所在文件夹确定,如前一节所述。
例如,测试文件结构如下所示
&
A
----------------------------------------------------
<span class="token entity named-entity" title="&">&amp;</span>
<span class="token entity" title="A">&#x41;</span>
----------------------------------------------------
This is a comment explaining this test case.
测试运行程序本身在单独的测试用例中进行测试。您可以在 tests/testrunner-tests.js
中找到所有与“测试核心”相关的测试。
除了修改测试运行程序代码之外,您无需再接触此文件。
全局测试流程如下