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をテストする場合は、CSSのみをテストするには/tests/languages/css
にテストファイルを入れます。このディレクトリにテストケースを作成すると、テストランナーはすべての必要な言語定義を含めたcss
言語定義が正しくロードされていることを確認します。
言語インジェクションをテストする場合は、通常、2つ以上の言語をロードする必要があります。1つの言語はテストされている「メイン」言語で、他のすべての言語はそれにインジェクトされます。
+
記号を使用してそれらを分離することで、複数の言語を定義する必要があります:markup+php
。
言語は順番にロードされ、最初にmarkup(+依存関係)がロードされ、その後php(+依存関係)がロードされます。テストローダーは、どの言語も一度にロードされることがないことを保証します(たとえば、2つの言語に同じ依存関係がある場合)。
デフォルトでは、最後の言語がメイン言語です:php+markup
は、markup
をメイン言語として持つことになります。これは、次のコードブロックにコードを配置するのと同じです
...
<pre><code class="language-markup">
<!-- your code here -->
</code><pre>
...
与えられた順番で言語をロードする必要があるが、最後の言語をメイン言語として使用したくない場合は、感嘆符を使用してメイン言語をマークできます:php!+markup
。これにより、php
がメイン言語として使用されます。(メイン言語は1つしか定義できません。テストランナーは、メイン言語が複数のディレクトリにある場合はすべてのテストを失敗させます。)
注:複数の言語をロードすることで、統合テストを実行できます(2つ以上の言語を一緒にロードしても何も壊れないことを確認できます)。
まず、テストする言語ディレクトリに新しいファイルを作成する必要があります。
テストケースに適切な名前を使用します。次の規則のいずれかのケースを使用してください
issue{issueid}
:githubの問題IDを参照します(例:issue588.test
)。{featurename}_feature
:1つのファイル内の1つの機能にすべてのテストをグループ化します(例:string_interpolation_feature.test
)。{language}_inclusion
:一方の言語に別の言語を含めることをテストします(例:markup!+css/css_inclusion.test
は、markupへのCSSのインクルージョンをテストします)。接頭辞としてすべての規則を使用できるので、string_interpolation_feature_inline.test
は可能です。ただし、テストケースファイルの適切な名前を考えるために数分時間を費やしてください。コードはコンピュータだけでなく、開発者仲間のためにも記述するのです。
テストケースファイルは、行の頭に 10 個以上のダッシュ (-
) を区切りとして置いた 2 つまたは 3 つのセクションで構成されます。セクションは以下のとおりです。
--update
フラグ を使用して上書きできます。以下に例を示します。
var a = 5;
----------------------------------------------------
[
["keyword", "var"],
" a ",
["operator", "="],
["number", "5"],
["punctuation", ";"]
]
----------------------------------------------------
This is a comment explaining this test case.
1 つまたは複数の新しいテストケースを作成する簡単な方法は次のとおりです。
tests/languages/{language}/{test-case}.test
npm run test:languages
を実行します。既存のテストケースファイルの更新も簡単です!
npm run test:languages -- --update
を実行します。これは、テストランナーにテストコードの実際のトークンストリームを期待されるトークンストリームとして挿入させることによって機能します。挿入されたトークンストリームが実際に自分の期待どおりであることを注意深く確認してください。そうでなければテストの意味がありません!
言語を作成および変更すると、そのテストファイルを更新して言語を適切にテストする必要があります。テストファイルの更新という面倒な作業は、次のコマンドを使用して自動化できます。
npm run test:languages -- --update
すべての失敗したテストファイルの期待されるトークンストリームを更新 (上書き) します。このコマンドを実行すると、言語テストがすべて合格します。
注意: このコマンドを使用すると、テストファイルの作成/更新は簡単になります。しかし、テストは正確であるとは限りません。挿入/更新されたトークンストリームは必ず注意深く確認してください!
Prism は、ハイライトするときにソースコードをトークンストリームに変換します。これは基本的にネストされたトークン (または配列、または文字列) のツリーです。
これらのツリーを手動で記述するのは難しいため、テストランナーはこれの簡略化されたバージョンを使用します。
次のルールを使用します。
トークン
オブジェクトは配列に変換されます: [token.type, token.content]
(ただし token.content
はネストされた構造体である可能性があります)。簡略化されたトークンストリームにはトークンのエイリアスは含まれません。
詳細については、テストランナーのテスト (tests/testrunner-tests.js
) を読むと、変換を理解できます。
場合によっては、トークンストリームテストでは十分に強力ではありません。ファイル拡張子を .test
ではなく .html.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
で「テストコア」に関連するすべてのテストを見つけることができます。
テストランナーコードを変更しない限り、このファイルを触る必要はありません。
グローバルテストの流れは以下のようになります。