import "testing/script"

このパッケージはチャネルを利用しているコードのテストを支援します。

パッケージファイル

script.go

Perform関数

func Perform(seed int64, events []*Event) (err os.Error)

Performは、与えられたイベントのセットから通信準備が整っているイベント(predecessorsフィールド内のすべてのイベントが事象発生済み状態である)のリストを抽出します。そのリストから、擬似乱数を使って実行するイベントを選択します。選択されたイベントが送信イベントのときは、送信を行い、事象発生済みとマークし、通信準備が整ったイベントの一覧を抽出し直します。選択されたイベントが受信イベントのときは、全イベントのチャネルから最初に受信できた値を受け取り、先程のリストと比較し、最初に一致したイベントを事象発生済みとみなします。その後、通信準備が整ったイベントの一覧を抽出し直します。

Performは、すべてのEventが事象発生済みとなるまで繰り返し処理します。

Performからリターンしたあとも、終了していないgoroutinesによって、チャネルから読み込みが行われる可能性があることに注意してください。

例として、ひとつのチャネルから値を読み込み、それを2つの出力チャネルにそのまま送信する関数のテストを試みます。これをテストするために、3つのイベント(送信イベント1つと、受信イベント2つ)を作成します。各受信イベントには、送信イベントのリストをpredecessorに指定する必要がありますが、受信イベントの記述は順不同です。

send := NewEvent("send", nil, Send{c, 1})
recv1 := NewEvent("recv 1", []*Event{send}, Recv{c, 1})
recv2 := NewEvent("recv 2", []*Event{send}, Recv{c, 1})
Perform(0, []*Event{send, recv1, recv2})

最初の時点で、通信準備が出来ているのは送信イベントだけであり、Performはその送信イベントの入力チャネルに値を送信します。すると2つの受信イベントの通信準備が整うので、Performは、受信イベントの出力チャネルから読み込んだ値を、各受信イベントと比較します。

これにより、イベントのpredecessors内にセットされている受信イベントがひとつ無効化されます。各受信処理では、すべての受信チャンネルから受信するため、通信準備が整ったカレントのイベントリストにないイベントから値を受信する可能性があり、この場合はエラーとなります。

Close型

Closeは、与えたチャネルのクローズを行います。

type Close struct {
    Channel interface{}
}

Closed型

Closedアクションは、与えられたチャネルがクローズされているときに一致します。クローズ中はステートではなくイベントとして扱われますので、Closedは与えられたチャネルと一度だけしかマッチしません。

type Closed struct {
    Channel interface{}
}

Event型

Eventは、チャネルへ値を送信するか、もしくはチャネルから値を受信する半順序集合です。

type Event struct {
    // contains unexported fields
}

NewEvent関数

func NewEvent(name string, predecessors []*Event, action action) *Event

ReceivedUnexpected型

ReceivedUnexpectedは、アクティブなイベントと、チャネルから受信した値が一致しなかったときのエラー結果です。

type ReceivedUnexpected struct {
    Value interface{}
    // contains unexported fields
}

(ReceivedUnexpected) String関数

func (r ReceivedUnexpected) String() string

Recv型

Recvアクションは、チャネルから値を読み込み、それをreflect.DeepMatchを使用して期待値との比較を行います。

type Recv struct {
    Channel  interface{}
    Expected interface{}
}

RecvMatch型

RecvMatchは、チャネルから値を読み込み、関数を呼び出して値の比較を行います。

type RecvMatch struct {
    Channel interface{}
    Match   func(interface{}) bool
}

Send型

Sendアクションは、チャネルに値を送信します。値は、チャネルの型がinterface{}でない限り、チャネルの型と完全一致する必要があります。

type Send struct {
    Channel interface{}
    Value   interface{}
}

SetupError型

SetupErrorは、イベントセット内に誤りがあったときの結果です。

type SetupError string

(SetupError) String関数

func (s SetupError) String() string