torgtaitai/BCDice — pull request #8 by ochaochaocha3 (2014-12-07 08:39:12+00:00)
Title: テストデータのゲームシステム単位への分割

テストデータのゲームシステム単位への分割の提案です。Ruby 1.9 以降用の実装がほぼ完了していますが、大きな変更のためぜひご意見を伺いたいです。よろしくお願いいたします。

背景
====

現在 testData.txt が 30,000 行（約 1 MB）以上と非常に大きくなっています。それに伴い、以下のような問題の発生が懸念されます。

* GitHub 上で表示できないほどデータ量が多く、全容を把握しにくい。
* 以下の理由により編集時の負担が大きい。
* 数万行の中から目的の行を探すのは一般に利用者の負担が大きい作業である。
* データ量の大きさのためにエディタに大きな負荷がかかる。
* 現在の test.rb の仕様では、一部のテストデータを使用する場合でも全テストデータを読み込んでおり、テスト時も負荷が大きい。

これらの問題の解決には、テストデータを分割して少量ずつ読み込めるようにすることが効果的と考えられます。ダイスボットはゲームシステムごとに作られていることから、テストデータもゲームシステムごとに分割するのが自然ではないかと考え、別ブランチで実装作業を行ってきました。

テストデータ分割の詳細
======================

テストデータの変更点は以下の 3 点です。従来の形式をあまり変えないよう意識しました。

テストデータのパス
------------------

/src/test/testData.txt を /src/test/data/`GAME_TYPE`.txt（`GAME_TYPE`: ゲームシステム名。通常 /src/diceBot/\*.rb のファイル名と合わせます）へと分割します。

### 例

ソード・ワールド（SwordWorld）のテストデータを /src/test/data/SwordWorld.txt に書く。

ゲームシステムを示す行の追加
----------------------------

各ファイルの最初にゲームシステムを示す行を追加します。`GAME_TYPE` には従来 `Input:` の最後に書いていた項目を書きます。

```
gameType: GAME_TYPE
```

### 例

#### ソード・ワールド（SwordWorld.txt）

```
gameType:SwordWorld
============================
（以下テストデータ）
```

#### ガープス（Gurps.txt）

```
gameType:GURPS
============================
（以下テストデータ）
```

Input の修正
------------

上記の変更により、ゲームシステムを示す内容を書く必要がなくなります。

また、現在の複数のコマンドをタブ区切りで書く書き方が `Output:` と対称でないため、1 コマンド 1 行とする変更を提案します。

### 例

#### ソード・ワールド（SwordWorld.txt）

```
============================
input:
2d6>=4
output:
SwordWorld : (2D6>=4) ＞ 9[6,3] ＞ 9 ＞ 成功
rand:6/6,3/6
```

#### シークレットロール（PlotTest.txt）

```
============================
input:
S2d6
Open Dice!
output:
DiceBot : (2D6) ＞ 3[1,2] ＞ 3###secret dice###
DiceBot : (2D6) ＞ 3[1,2] ＞ 3###secret dice###
rand:1/6,2/6
```

test.rb の変更
==============

テストデータの変更に伴い、test.rb のインターフェースが若干変更されます。

全テストデータを使用する場合
----------------------------

/src/test/data/\*.txt すべてがテストデータとして読み込まれ、テストが実行されます。

ゲームシステムを指定してテストする場合
--------------------------------------

テストデータのファイル名を指定するように変更します。ここで指定した名前に `.txt` を加えた名前のテストデータファイルのみが読み込まれます。

### 例

```bash
cd /path/to/BCDice/src/

ruby test.rb SwordWorld # /src/test/data/SwordWorld.txt が読み込まれる
# ...............................................................................................................................................................................................................................................
#
# OK.

ruby test.rb SwordWorld2_0 # /src/test/data/SwordWorld2_0.txt が読み込まれる
# ..........
#
# OK.
```

テストデータ番号を指定してテストする場合
----------------------------------------

ゲームシステムごとにテストデータ番号が振られるように変更します。現在の私の実装では、引数の解析の都合で 1 から始まるようになっています。

### 例

```bash
cd /path/to/BCDice/src/

ruby test.rb SwordWorld 1
# setCardPlace @card_place : 1
# setCardPlace @card_place : 1
# setGameByTitle gameTitle : "SwordWorld"
# （省略）
# on_public end
# .
#
# OK.
```

テストデータが見つからなかった場合
----------------------------------

テストデータファイルが見つからなかった場合や指定した番号のテストデータが見つからなかった場合には、エラーメッセージを表示します。

### 例

```bash
cd /path/to/BCDice/src/

ruby test.rb BadName
# No matched test data!

ruby test.rb SwordWorld 9999
# No matched test data!
```

実装状況
========

Windows、Linux、OSX の Ruby 1.9 以降での動作を確認しました。Ruby 1.8 への対応が必要な場合、/src/test/DiceBotTest.rb のファイル読み込み部等を一部修正します。