Skip to content

Testing and Verification

ZORKERB Publication edited this page Nov 13, 2026 · 2 revisions

日本語 | English

検証

ZORKERB I・ZORKERB II について行った検証の環境、方法、範囲、結果をまとめます。

検証に使ったツール、試験データ、比較用の解釈系と原作 story、生の報告は、開発用の非公開リポジトリに保存しています。この文書は、その記録から確認済みの結果だけをまとめたものです。結果は試験した範囲についてのもので、原作のすべての経路で同じ動作をすることを保証するものではありません。

実行環境

項目 内容
エンジン PyEmuera 3.0.0(未改変、SHA-256 8a7b3697b97155c4dc994c8349c6756bb0401000d3bbccd8e85ff046e3774b35)。以下の検証記録で使ったエンジンです
OS と Python Linux x86_64、Python 3.13
比較相手(I) 原作 story(Release 119 / Serial 880429、SHA-256 37084966477dff679282de42974b2077156b1bd68fad92a65d4ea94d8eb64d79)
比較相手(II) 原作 story(Release 63 / Serial 860811、SHA-256 3ae7d5558943e9721f3e4b273c8a7faec1a03a604e1ae4ee1cde472c21cb24ac)
原作を動かす解釈系 Frotz 2.56pre(dumb インターフェース、同じ実行ファイル)

本家 Emuera(Windows)での確認は互換性と既知の制限にあります。

方法(収録作品に共通)

凍結した1回の実行

  1. 開始時に、ソース・試験・ツール、生成したゲーム、エンジンの SHA-256 を記録します。
  2. すべての検査を行います。
  3. 終了時に、記録した値から何も変わっていないことを確かめます。ソースを変えた場合は最初からやり直します。

原作との比較

同じ入力を原作と移植版に与え、1手ごとの応答を比べます。

  • 乱数列を揃えた比較: 入力の先頭に原作のデバッグ命令 #random 数 を加え、両者が同じ乱数列を引くようにして、文章と状態を厳密に比べます。完成の判定にはこの比較を使います。
  • 文章の正規化: ASCII の空白(改行位置を含む)と、Frotz のハイフンでの折り返しだけです。語句は正規化しません。
  • 状態の比較: セーブから現在地、得点、手数、持ち物の順序、指定した物体の親子関係とフラグ、IT を比較しました。メモリ全体の比較ではありません。
  • 状態の比較: 各入力直前の物体251個の位置と属性、大域変数、時計などを比較しました。除外項目と理由は開発記録にあります。メモリ全体の比較ではありません。

ZORKERB I の結果

検査 結果
回帰試験 1,596件中1,596件 PASS(検査条件7,033件、状態の確認1,985回)。期待値は原作の応答と原典の処理に基づいています
セーブの拒否 PASS。r1〜r19、r21〜r25、r27、r28 のセーブと、意図的に壊したセーブを読み込まないことを確認
検証ツールの単体試験 306件 PASS
構文表 原作 story から取り出した表と一致
原作との比較(乱数列を揃えた比較、801件) 下表
プローブ(41本、10,324手) 10,320手が厳密に一致。2手は SAVE・RESTORE の場面でのファイル名入力の表示の違い。2手は120文字を超える入力
全経路(557手) 557手すべて厳密に一致
通常の入力だけの完走 SAVE・RESTORE や検証用の命令を使わずに、350点・613手で終幕に到達
原典の ROUTINE ごとの対応 GAP 0(VERIFIED 175、IMPLEMENTED 265、UNREFERENCED 1)。詳細は ZIL 原典と ERB 実装の対応
比較集合 件数 文章が厳密に一致 状態が一致
pseudo 56 56 56
holdout 62 62 62
edges 24 24 24
older(以前の版の18集合) 659 657 657

older の残り2件は、IT が物体0を指したまま examine it とする経路です。原作はこの操作で物体0に対する命令を実行し、厳格な解釈系はそこで停止します。寛容な解釈系(Frotz の -Z 1)で再実行すると、解釈系の警告行を除いて、文章・応答数・状態が一致します。この2件は厳密な一致の件数に含めていません。

ZORKERB II の結果

検査 結果
原作との比較 240件、74,130の比較ステップで表示が一致
乱数 原作と移植版の乱数の呼び出し47,650回で、順序・値・呼び出し元が一致(予測可能なモードで、すべて値まで比較)
状態 74,114時点で、原作のメモリから読んだ状態と移植版の状態が一致
完走 400点の経路を完走
保存と復元 10個のスロットへの保存と、別のプロセスでの復元。原作の SAVE・RESTORE との比較も一致
原典の ROUTINE ごとの対応 原作の439ルーチンすべてに対応する実装がある(370は ZIL から生成、ほかは手で記述)
呪文と割り込み 呪文12種、時計の割り込み23種のすべてを試験で通過
分岐の網羅 ERB の分岐 2,648 のうち 1,689(63.8%)を試験で通過。通っていない分岐は開発資料に一覧があります

独立した監査

開発担当とは別の監査担当が、次を確かめました。

監査 結果
配布物の検査 PASS。収録ファイルの SHA-256、同梱の通知、静的検査、展開したゲームでの400点の完走、3つの保存形式、スロット0〜9の別プロセスでの復元
原作との直接の比較 固定した原作 story と Frotz を監査担当が新たに実行し、10経路・1,718応答がすべて一致
原典 ZIL からの再構築 原典 ZIL と原作 story から生成をやり直し、生成物8ファイルと配布物のゲーム23ファイルがバイト単位で一致(2回の実行で同じ結果)
記録の再集計 乱数47,650回・状態74,114時点の記録を、開発側のツールを使わずに数え直して一致

配布物の検査

配布物については、次を確かめています。

  • ZIP の SHA-256、ZIP 内の SHA256SUMS.txt、重複・危険なパス・開発用のファイルがないこと
  • 収録した各作品の ERB/・CSV/ が、検証したゲームとバイト単位で一致すること、同梱の PyEmuera が上記の SHA-256 であること
  • 文書の相対リンクが配布物の中で解決すること
  • 展開した配布物で、収録した起動バッチと同じコマンドが各作品を起動すること

Clone this wiki locally