VST3のテストについて その１

[VST3制作の過去記事一覧はこちら](https://qiita.com/aike@github/items/05a14911bb89db8b6c2c)

# はじめに
音楽制作用DAWのプラグイン仕様VST3のテストついてインターネットのヤホーで調べました。
長くなったので2回に分けました。続きの記事は[こちら](https://qiita.com/aike@github/items/3366ccb9dd4b9f297302)です。

この記事はVST3プラグインを書く人向けの内容です。

# テストツール
VST3 SDKには公式テストツールとしてvalidatorが含まれています。
validatorはコマンドラインツールで、以下のように使います。

```
> validator <vst3_plugin_name>
```

また、VST3.7から含まれるVST3_Project_Generatorで生成したプロジェクトは、ビルドイベントとしてvalidatorによるチェック処理が毎回走るようになっています。

# 一般的なテストフレームワークとの類似点・相違点

* toEqualのようなMatcherは用意されていない
* テストクラスはITestインタフェースを実装する
* setup()で前処理、run()でテスト実行、teardown()で後処理、getDescription()で説明文を返すよう実装する
* run()でfalseを返すとテストNGとしてカウントされる
* setup()でfalseを返すとrun()は実行されない。**テストNGにならない**ので注意！
* FactoryクラスのcreateTests()でparentSuite->addTest()してテストを登録する
* Visual Studioのテストエクスプローラーに組み込めるテストアダプターは用意されていない
* たぶんテスト用プロジェクトとリリース用プロジェクトを分けない設計思想。独自のテストを書いた場合、製品版にテストコードが含まれないようにするのは結構大変

# validatorのビルトインテスト

validatorはプラグイン側に何もしなくても以下のテストを行います。

## (1) 一般テスト

|テスト名|テスト内容|
|---|---|
|Scan Editor Classes|エディットコントローラはプロセッサと同一か別かチェック。エディットコントローラが正しいクラスIDを返さないとFail|
|Scan Buses|オーディオバスとイベントバスの数をチェック。バス数が0やバス名がついていないとFail|
|Scan Parameters|パラメータの数と型、Unit使用の有無をチェック。IDの重複や初期値の不正、同時に使えないフラグなどがあればFail|
|MIDI Mapping|MIDI CCの対応状態をチェック。不正なCCナンバーにアサインされていたりするとFail|
|MIDI Learn|MIDI Learn機能をサポートしているかどうかチェック|
|Scan Units|パラメータ階層化(Unit)機能を使っているかチェック。IDなどの不正があればFail|
|Scan Programs|パラメータのプリセット機能を使用しているかチェック。ID不正や無名プリセットがあるとFail|
|Terminate/Initialize|プラグインのterminate()関数、initialize()関数を呼んで、異常ステータスが返ればFail|
|Check Unit Structure|パラメータ階層化(Unit)の階層参照関係に不正があればFail|
|Valid State Transition|setActive()、terminate()、initialize()を繰り返して、異常ステータスが返ればFail|
|Bus Consistency|最初に全バス情報を取得、その後ランダムに各バス情報を取得して最初に取得した内容と異なればFail|
|Bus Activation|バスのアクティブ状態を変更して、異常ステータスが返ればFail|
|Check Audio Bus Arrangement|オーディオバスの情報を取得して、異常ステータスが返ればFail|
|SideChain Arrangement|サイドチェーンバスの有無をチェック。もしあればバス状態を変更指示して指示通りに変更されていなければFail。サイドチェーンバスかどうかはbusTypeで判断（通常のオーディオバスはkMain、サイドチェーンはkAux）|
|Suspend/Resume|setActive(true/false)を繰り返して、異常ステータスが返ればFail|
|Note Expression|Note Expression関係の各種情報を取得して、異常ステータスが返ればFail|
|Keyswitch|キースイッチ関係の各種情報を取得して、異常ステータスが返ればFail|
|ProcessContext Requirements|VST3.7から必須になった、プラグインがシステム時間、テンポ、コードなどの情報を必要とするかを返す機能のチェック。バージョン3.7以降のSDKを使っていてIProcessContextRequirementsインタフェースを実装していないとFail|

## (2) 32bit処理テスト

|テスト名|テスト内容|
|---|---|
|Process Test|エフェクターをアクティブ化してprocess()関数を呼び、異常ステータスが返ればFail。※以降のテストはこのProcessTestを継承しておりprocess()関数を呼ぶ前処理・後処理を書きやすくしている|
|Process function running in another thread|新規スレッドでprocess()関数を呼び、異常ステータスが返ればFail|
|Silence Flags|サイレンスフラグの各ビットパターンでprocess()関数を呼び、異常ステータスが返ればFail|
|Silence Processing|出力があるのにサイレンスフラグが立っていたり、無音なのにサイレンスフラグを立てていなければ警告|
|Parameters Flush (no Buffer)|入出力バス数0、バッファnullptrでオートメーション関数やprocess()関数を呼び、異常ステータスが返ればFail|
|Parameters Flush 2 (only numChannel==0)|入出力チャンネル数0、バッファnullptrでオートメーション関数やprocess()関数を呼び、異常ステータスが返ればFail|
|Parameters Flush 3 (no Buffer, no parameter change)|入出力バス数0、バッファnullptrでprocess()関数を呼び、異常ステータスが返ればFail|
|Variable Block Size|サンプリングバッファのサイズをランダムに変えてprocess()関数を呼び、異常ステータスが返ればFail。TOUGHTESTSを#defineすると不正なサイズを渡してテストする|
|Process Format|サンプリングレートを22050～384000Hzまで変えてprocess()関数を呼び、異常ステータスが返ればFail。その後1234.5678Hzのような実数でもテストする|
|Parameter Bypass persistence|Bypass機能の有効・無効を指示して指示通りに変更されていなければFail|
|Speaker Arrangement|サポートしている入出力オーディオバスのチャンネル数をチェック。チャンネル数を変更指示して指示通りに変更されていなければFail|
|Automation|ランダムにオートメーションパラメータの値を変えてチェックする|


## (3) 64bit処理テスト

前項の32bit処理テストと同じ内容を64bitでもおこなう。

## おわりに

今回はVST3 SDKのvalidatorについて概要をまとめました。
次回は独自のテストを自作プラグインに組み込む方法を説明します。

次の記事：VST3のテストについて その２
https://qiita.com/aike@github/items/3366ccb9dd4b9f297302

[VST3制作の過去記事一覧はこちら](https://qiita.com/aike@github/items/05a14911bb89db8b6c2c)