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
。
語言會依照順序載入,所以會先載入 markup(以及相依關係),再載入 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 包入到 markup 中)。你可以使用所有慣例作為前置詞,因此 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 會將您的原始程式碼轉換為標記流。這基本上是嵌套標記的樹狀結構(或陣列,或字串)。
由於這些樹狀結構難以手動撰寫,因此測試執行器使用一個簡化的版本。
它使用下列規則
Token
物件轉換為陣列:[token.type, token.content]
(其中 token.content
可以是 nested structure)。簡化的標記流不包含標記的別名。
如需進一步資訊:閱讀測試執行器的測試(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
中找到所有與「測試核心」相關的測試。
您不應該需要觸碰這個檔案,除非您修改了測試執行器程式碼。
整體的測試流程如下