メインコンテンツへスキップ

XTL 適合性スイート

このディレクトリには 適合性コーパス を収めています。XTL の実装が適合性を主張するために通過しなければならないテストフィクスチャ群です。このコーパスは XTL の挙動を実行可能な形で定義したものです。

ディレクトリ構成

conformance/
├── README.md ← このファイル
├── AUTHORING.md ← フィクスチャの追加方法(JS を真実とみなす罠を避ける)
├── runner-protocol.md ← 実装がスイートを実行する方法
└── fixtures/
└── <NNN>-<slug>/
├── template.xlsx
├── data.xlsx
├── expected.xlsx ← 正規の期待出力(単一ファイルの場合)
├── expected/ ← もしくは複数ファイル(または出力ゼロ)の場合のディレクトリ
│ └── *.xlsx
├── no expected output ← expected_error フィクスチャ向け
├── no static expected ← expected_dynamic フィクスチャ向け
└── meta.yaml ← 説明、仕様セクション参照、タグ

「合格」の意味

静的出力フィクスチャは、template.xlsxdata.xlsx が与えられたときに実装が生成する出力が expected.xlsx(または expected/ の内容)と一致すれば合格です。ステージ 1 のランナーは、より高レベルのワークシート/セル値での比較を行うことができます。ステージ 2 のランナーは OOXML zip の 正規化(canonical normalization) を行ったうえで、バイト等価なワークブック内容を比較します。

  • zip 内のファイルを名前順にソート
  • XML を決定的な正規形でシリアライズ
  • テキストラン内の空白は保持
  • 生成元メタデータを除去(creator、modifiedBy、lastModified)

比較ステージと正規化ルールについては runner-protocol.md を参照してください。

エラーフィクスチャは、実装がフィクスチャの expected_error テキストを含むエラーを報告した場合に合格となります。エラーフィクスチャは expected.xlsxexpected/ ディレクトリを持ちません。

動的フィクスチャは、実装の出力が meta.yamlexpected_dynamic で宣言された動的アサーションと一致した場合に合格となります。動的フィクスチャも expected.xlsxexpected/ ディレクトリを持ちません。

バージョニング

各フィクスチャディレクトリには meta.yaml があり、必要とする最小仕様バージョン(spec_version: 0.1)を宣言します。実装は自身がターゲットとする仕様バージョンを報告し、スイートはそれに応じてフィクスチャをフィルタリングします。

静的出力フィクスチャは comparison_stage も宣言できます。このフィールドはデフォルトで 1 であり、正規 OOXML 比較を必要とするフィクスチャは comparison_stage: 2 を宣言します。

フィクスチャメタデータ

コーパスで使用される meta.yaml のフィールド:

フィールド必須適用対象意味
descriptionはいすべてのフィクスチャフィクスチャが主張する 1 行の契約。
spec_sectionはいすべてのフィクスチャ当該挙動を定義する仕様または ADR のセクション。
spec_versionはいすべてのフィクスチャフィクスチャが要求する最小 XTL バージョン。
tagsはいすべてのフィクスチャレポートおよび絞り込み実行のためのフィルタ可能なカテゴリ。
verified_byいいえすべてのフィクスチャ独立した作成時チェック(例: handmanual-script)。
expected_warningsいいえすべてのフィクスチャ実装が発するべき安定した警告部分文字列。
expected_errorいいえエラーフィクスチャ安定したエラー部分文字列。静的な期待出力は省略する。
expected_dynamicいいえ動的フィクスチャ動的アサーションの種類。現在は utc_today
dynamic_cellsexpected_dynamic と併用動的フィクスチャランナーが計算するシート/セル/フォーマットのアサーション。
comparison_stageいいえ静的出力フィクスチャ最小比較ステージ。デフォルトは 1、OOXML に敏感なチェックには 2 を使用する。
skip_reasonいいえすべてのフィクスチャ既知の壊れたフィクスチャをスキップする一時的な理由。

expected_errorexpected_dynamic は相互排他です。静的出力フィクスチャは expected.xlsx または expected/ を使用します。空の expected/ ディレクトリは出力ファイルがゼロであることを意味します。エラーフィクスチャと動的フィクスチャは静的な期待出力を省略します。

フィクスチャカタログ

XTL 0.1 のブートストラップコーパスには現在以下のフィクスチャが含まれています:

IDフィクスチャ契約
001bracket-substitution単一の角括弧付きソース列式は、ソース行ごとに 1 つの出力行として描画される。
002if-functionIF(condition, then, else) は現在のデータ行内で比較を評価する。
003list-sheet-filter@filter [field] in _ListSheet は一致する行を残し、リストシートを出力から削除する。
004repeat-right-default明示的なカウントを伴わない @repeat rightcolSpan = 1 をデフォルトとする。
005round-half-away-from-zeroROUND() は Excel スタイルの「ゼロから離れる丸め」を使用する。
006filename-forbidden-chars禁止されたファイル名文字は _ に置換される。
007filename-reserved-nameWindows 予約デバイス名のベース名には末尾に 1 つの _ を付ける。
008numfmt-numeric-string-coercion数値テンプレートフォーマットは数値文字列を数値に強制変換する。
009numfmt-date-string-coercion日付テンプレートフォーマットは日付らしい文字列を日付値に強制変換する。
010numfmt-text-format-coercionテキストフォーマット @ は単一式の値を文字列に強制変換する。
011text-date-formatTEXT(date, "YYYY-MM-DD") は XTL の日付トークンを使った文字列を返す。
012text-number-formatTEXT(number, format) は XTL 0.1 の最小数値フォーマットサブセットをサポートする。
013rich-text-template-expressionリッチテキストのテンプレートセルは、式検出の前にテキストランを連結して解析される。
014source-formula-cached-resultソース数式セルはキャッシュされた結果を使用し、XTL では再計算されない。
015source-sheet-prefix-first-matchsource_sheet のプレフィックスパターンは、ワークブック順で最初に一致するワークシートを選択する。
016text-number-negative-rounding数値 TEXT() フォーマットは負の .5 境界をゼロから離れる方向に丸める。
017source-sheet-prefix-no-match-errorsource_sheet プレフィックスが一致しない場合は安定したエラーを報告する。
018source-formula-missing-cached-result-errorキャッシュされた結果のないソース数式セルは安定したエラーを報告する。
019filename-empty-basename-errorファイル名のサニタイズはベース名が空の場合にエラーを報告する。
020filename-length-overflow-errorファイル名のサニタイズは 255 バイト制限を超えた場合にエラーを報告する。
021numfmt-number-coercion-error数値テンプレートフォーマットは強制変換に失敗した場合にエラーを報告する。
022numfmt-date-coercion-error日付テンプレートフォーマットは強制変換に失敗した場合にエラーを報告する。
023today-utc-dynamicTODAY() は動的アサーションを介してランナー開始時刻の UTC 日付を描画する。
024stage2-merge-preservationステージ 2 比較は、展開されたデータブロックの下にあるマージ範囲が保持されていることを検証する。
025stage2-style-numfmt-preservationステージ 2 比較は、描画されたセルがテンプレートのスタイルと numFmt を保持していることを検証する。
026stage2-splice-merge-style-preservationステージ 2 比較は、行の展開がシフトされたマージとスタイル付き/数値書式付きの描画セルの両方を保持することを検証する。
027stage2-cross-writer-canonicalizationステージ 2 比較は、既知の OOXML ライター差異が同一のワークブック内容に正規化されることを検証する。
028source-table-row-shorthandsource_table = N は行 N をソース列名として選択し、その下の行を読み込む。
029source-table-open-rangesource_table = B3:D は列ウィンドウを選択し、使用済み行末まで下の行を読み込む。
030source-table-finite-rangesource_table = B3:D4 は宣言された終了行で読み込みを停止する。
031source-table-zero-data-rangesource_table = B3:D3 は有効であり、ソース行ゼロを生成する。
032source-table-empty-column-name-error選択されたスパン内に空のソース列名がある場合は安定したエラーを報告する。
033source-table-duplicate-column-name-error重複したソース列名は安定したエラーを報告する。
034source-table-invalid-selector-error行ゼロのような無効なセレクタは安定したエラーを報告する。
035source-table-rich-text-headerリッチテキストのソース列名セルは source_table 解析前に連結される。
036source-table-formula-header数式によるソース列名セルはキャッシュされた結果を使用する。
037source-table-formula-header-missing-cache-errorキャッシュされた結果のない数式ソース列名セルは安定したエラーを報告する。
038source-sheet-exact-match-beats-prefixsource_sheet の完全一致はプレフィックスパターンより優先される。
039source-sheet-default-first-worksheetsource_sheet が省略された場合、ワークブック順で最初のワークシートが使用される。
040list-sheet-hidden-states-removed非表示および非常に非表示のリストシートも出力ワークブックから削除される。
041row-function-inside-repeat-blockROW() はリピートブロック内の現在の描画データ行の 1 始まりインデックスを返す。
042row-function-outside-repeat-block-errorリピートブロック外で ROW() を呼ぶと安定したエラーを報告する。
043ifempty-functionIFEMPTY() は空値の場合にフォールバックを返し、非空値はそのまま通過させる。
044sort-and-top-order@sort@top より先に実行され、上位 N 行はソート済み集合から選ばれる。
045list-sheet-not-in-filter@filter ... !in _Sheet はリストシートに値がない行を残し、リストシートを出力から削除する。
046count-field-non-emptyCOUNT([field]) は現在の行集合の非空値をカウントする。
047aggregate-functions中核の集計関数は現在描画中の行集合に対して動作する。
048if-and-comparison-boundaries比較演算子はゼロ境界周辺で IF() および @filter の挙動を決定する。
049filename-sanitization-warning描画されたファイル名のサニタイズは、出力セマンティクスを変更せずに警告を発する。
050empty-ifempty-whitespace-onlyIFEMPTY は ADR-0007 に従い、空白文字のみの文字列を空として扱う。
051empty-ifempty-zero-not-emptyIFEMPTY は数値 0 を保持する。数値は ADR-0007 に従い決して空ではない。
052empty-count-field-whitespace-zero-falseCOUNT([field]) は ADR-0007 に従って非空値をカウントする — 空白は空、0 と FALSE は非空。
053empty-row-skip-whitespace-onlyすべてのセルが ADR-0007 に従って空であるソース行はスキップされる(空白文字のみのセルを含む)。
054empty-list-membershipリストシートは読み込み時に空エントリを除外する。空のソース行値は ADR-0007 に従い @filter ... in _Sheet には決して一致しない。
055if-truthy-zero-and-emptyIF は ADR-0008 に従い 0 と空値を falsy として扱う。ゼロでない数値、非空文字列、TRUE は truthy。
056if-truthy-string-zero-not-specialIF("0", …)IF("false", …) は truthy 分岐を取る — 文字列型フラグ値に特例はない。
057if-truthy-booleanBoolean のソースセルは ADR-0008 に従い、IF の truthy 判定を直接駆動する。
058if-comparison-result比較式の Boolean 結果は ADR-0008 に従い、IF の truthy 判定に直接供給される。
059compare-numeric-string-vs-number比較は ADR-0009 に従い、共有の compareValues の下で数値と数値文字列を解析する。
060compare-string-codepoint-order文字列のフォールバック比較は ADR-0009 に従い Unicode コードポイント順を使用する — ロケール依存の照合は行わない。
061concat-canonical-form& は ADR-0009 に従い、被演算子を正規文字列形式に文字列化する(boolean は大文字、整数は小数点なし)。
062concat-empty-stringifies-to-empty& における空の被演算子は ADR-0009 に従い空文字列を寄与する。
063compare-empty-vs-value2 つの空の被演算子は等価。片方だけが空のとき = は ADR-0009 のルール 1 と 2 に従い false となる。
064compare-unicode-minus-not-numericUnicode マイナス(U+2212)を含む文字列は数値として解析されない。比較は ADR-0009 に従い正規文字列フォールバックに落ちる。
065input-text-default-applied_inputs のテキスト入力デフォルトは、ホストが値を省略した場合に補完される(ADR-0010)。
066input-text-host-suppliedホスト提供の入力はセル、シート名、出力ファイル名パターンを通って流れる(ADR-0010)。
067input-missing-required-errorデフォルトなしの必須 _inputs 宣言をホストが省略した場合はエラー(ADR-0010)。
068input-select-host-suppliedselect 入力は、宣言された `
069source-multi-declaration__sources__ シートが追加の名前付きソースを宣言する。集計はその全行集合に対して動作する(ADR-0012)。
070source-aggregate-cross-source名前付きソースに対する COUNT/MIN/MAX は ADR-0012 に従い、その全行集合に対して動作する。
071source-directive-active@source SourceName はデータブロックのスコープを指定し、その内側では [Column] がそのソースに解決される(ADR-0012)。
072source-undeclared-error__sources__ で宣言されていないソースを参照する @source は ADR-0012 に従いパース時エラー。
073source-row-cross-error非アクティブなソースの列に対する行レベル参照は ADR-0012 に従いエラー。
074xlookup-basic3 引数 XLOOKUP は ADR-0013 に従い、lookup-array が一致する最初の行の return-array 列を返す。
075xlookup-fallback4 引数 XLOOKUP は ADR-0013 に従い、一致がない場合はフォールバックを返す。
076xlookup-no-match-error3 引数 XLOOKUP はフォールバックなしで一致がない場合 ADR-0013 に従いエラー。
077xlookup-source-mismatch-errorXLOOKUP の引数 2 と引数 3 は ADR-0013 に従い同じソースを参照しなければならない。
078xlookup-bare-bracket-errorXLOOKUP の引数 2 / 引数 3 は ADR-0013 に従いソースプレフィックス付きの角括弧参照を必要とする。
079join-basic-inner@join は ADR-0014 に従い、各プライマリ行を最初に一致する結合行とペアにする。
080join-no-match-dropped@join は ADR-0014 に従い inner セマンティクスを使用する — 一致のないプライマリ行は破棄される。
081join-undeclared-source-error__sources__ で宣言されていないソースを参照する @join は ADR-0014 に従いパース時エラー。
082join-bad-on-clause-error@join の on 句は ADR-0014 に従い、結合先ソースとブロックのプライマリソースを参照しなければならない。
083sort-stable-equal-keys@sort は安定 — キーが等しい行は ADR-0016 に従いソース順序を保持する。
084sort-multi-stable-priority複数の @sort ディレクティブは最初を主キー、後続をタイブレーカーとして適用される(ADR-0016)。
085file-group-first-seen-orderファイルグループは ADR-0016 に従い、ソース行に対して最初に出現した順で出力される。
086sheet-group-first-seen-orderファイル内のシートグループは ADR-0016 に従い最初に出現した順で出力される。
087date-canonical-string-concat& 内の Date は ADR-0017 に従い YYYY-MM-DD(深夜)または YYYY-MM-DDTHH:mm:ss を生成する。
088date-comparison-equalityDate 値は ADR-0017 に従い、文字列フィルタ値と正規文字列形式を介して比較される。
089error-sentinel-emptyExcel のエラーセル(#N/A#VALUE! など)は ADR-0017 に従い空として読み取られる。
090percentage-numeric-flowパーセンテージ書式のセルは ADR-0017 に従い、その基となる Number として流れる(50% → 0.5)。

ステータス

XTL 0.1 のコーパスは ブートストラップ状態 にあります。フィクスチャは spec/README.md で既に述べられている挙動についてのみ追加すべきです。CommonMark のような標準化プロジェクトと同じパターンに従います: 散文がルールを定義し、フィクスチャがルールを実行可能にし、実装はどのフィクスチャをパスするかを報告します。

リファレンス実装はそれ自身の挙動を規範的なものとはしません。フィクスチャと実装が食い違う場合は、spec/README.md の仕様優先順位に従って実装またはフィクスチャを更新してください。

XTL 0.1 の中核挙動に関するフィクスチャは、spec/language.md の最小テーブル外の TEXT() フォーマットのような、実装定義拡張を避けます。