srfi.252
- プロパティテスト ¶プロパティテストは、テストしたいコンポーネントにランダムな入力を供給して 満たすべき属性(プロパティ)が満たされるかをテストする方法です。 HaskellのQuickCheckによってポピュラーになりました。
このモジュールでは、プロパティテストを実行するためのAPI群と、 ランダムな入力を生成するためのAPI群のふたつを提供します。
テスト手続きはgauche.test
と統合されています
(gauche.test
- 単体テスト参照)。また、このSRFIはSRFI-64と併せて使えるように
設計されており、GaucheでもSRFI-64と併用することができます
(srfi.64
- SchemeテストスイートAPI参照)。
ランダムな入力を生成するジェネレータはdata.random
の上に
構築されています (data.random
- ランダムデータの生成参照)。
これは簡便のために提供されています。必要なら、独自にジェネレータを作っても構いません。
[SRFI-252]{srfi.252
}
generator-listにあるジェネレータが生成した値を引数として、
property-checkを呼びます。それをruns回繰り返します。
property-checkは手続きに評価される式で、プロパティが満たされたら#t
を、
そうでなければ#f
を返します。
引数はgenerator-listにリストされた各ジェネレータが生成します。
generator-listはproperty-checkが受け取る引数と
同数のジェネレータから構成されていなければなりません。
省略可能なruns引数は非負の整数で、property-checkを何回呼び出すかを 指定します。省略された場合はシステムのデフォルトが使われます (Gaucheでは今のところ30。但し将来変わる可能性はあります)。
test-property
が最も基本的なもので、全てのproperty-checkの呼び出しが
成功であれば成功します。
test-property-expect-fail
は逆に、全てのproperyt-check
の呼び出しが失敗した場合に成功します (つまり、失敗することを期待したチェックです)。
test-property-skip
はproperty-checkは呼び出さず、
runs回のテストをスキップしたということだけを記録します。
最後に、test-property-error
とtest-property-error-type
は
property-checkが常にエラーを投げることを期待します。
test-property-error-type
はそれに加え、投げられるエラーが
error-typeコンディションタイプであることを期待します。
SRFIではこれらのテストはSRFI-64のフレームワーク上で実行されることを
想定していますが、srfi.64
をロードせずにgauche.test
のテストの
一環として実行することも可能です。
[SRFI-252]{srfi.252
}
Returns a SRFI-64 test runner object specialized for property testing.
In Gauche, this simply returns SRFI-64 simple runner, but other
implementations may have some additional features. It is recommended
that portable code sets the runner created with this procedure
before calling property test procedures.
These are procedures that create generators of specific types.
You can find similar generator procedurs in data.random
(see data.random
- ランダムデータの生成)
and srfi.194
(see srfi.194
- ランダムデータジェネレータ (SRFI)),
but the procedures here creates generators with one specific
property suitable for testing: They start generating certain
pre-defined values–typical, or boundary values–before generating
random values.
All created generators captures the value of parameter
random-data-random-source
(see data.random
- ランダムデータの生成) when created.
If you want to have reproducible results, you can provide your own
random source.
[SRFI-252]{srfi.252
}
Returns a generator that yields #t
and #f
, then
a random boolean values in equal probability.
See also booleans$
in data.random
(see data.random
- ランダムデータの生成).
[SRFI-252]{srfi.252
}
Returns a generator that yields an empty bytevector #u8()
first,
then bytevectors of random length and random content subsequently.
In Gauche, it is realized as follows (see data.random
- ランダムデータの生成,
for sequences-of
and integers$
).
The constant sequence-max-size
is currently 33 but may be
changed.
(gcons* '#u8() (sequences-of <u8vector> (integers$ sequence-max-size) (integers$ 256))))
[SRFI-252]{srfi.252
}
Returns a character generator that yields #\null
, then
random characters subsequently. Currently we sample
charactres uniformly from the entire Unicode range, but that
causes most of the characters to be very infrequently used ones.
We might change it in future.
See also chars$
in data.random
(see data.random
- ランダムデータの生成).
[SRFI-252]{srfi.252
}
Returns a string generator that yields an empty string ""
,
then strings of random length and random content subsequently.
In Gauche, it is realized as follows (see data.random
- ランダムデータの生成,
for strings-of
and integers$
).
The constant sequence-max-size
is currently 33 but may be
changed.
(gcons* "" (strings-of (integers$ sequence-max-size) (chars$ char-set:full)))
Note that the chracters are sampled uniformly from the entire Unicode range, which causes almost all strings to consist of very infrequently used characters. We might address this in future.
[SRFI-252]{srfi.252
}
Returns a symbol generator that yields a symbol whose name
is empty (||
), then symbols of random length and
random content subsequently. It is basically
(gmap string->symbol (string-generator))
.
Note that the chracters are sampled uniformly from the entire Unicode range, which causes almost all symbols to consist of very infrequently used characters. We might address this in future.
[SRFI-252]{srfi.252
}
Returns a generator that yields the following inexact complex
numbers, followed by random complex numbers.
0.0 -0.0 0.5 -0.5 1.0 -1.0 0.0+1.0i 0.0-1.0i -0.0+1.0i -0.0-1.0i 0.5+0.5i 0.5-0.5i -0.5+0.5i -0.5-0.5i 1.0+1.0i 1.0-1.0i -1.0+1.0i -1.0-1.0i +inf.0+inf.0i +inf.0-inf.0i -inf.0+inf.0i -inf.0-inf.0i +nan.0+nan.0i +inf.0 -inf.0 +nan.0
Note: SRFI specifies complex-generator
to return
both exact and inexact complex numbers if the implementation supports
them. Gauche doesn’t have exact complex numbers, so it is the
same as inexact-complex-generator
.
In Gauche, a random complex number is created by
uniformly sampled finite flonums for real and imaginary parts.
Note that “uniformly sampled finite flonums” are not the same
as “uniformly sampled real numbers”; See finite-flonums$
for the details (see data.random
- ランダムデータの生成).
[SRFI-252]{srfi.252
}
Gauche does not support exact complex numbers, and these procedures
raise an error when called.
[SRFI-252]{srfi.252
}
Return generators that yields integers, exact integers,
and inexact integers, respectively.
The exact integer generator always yield 0
, 1
, and -1
at the beginning, then random integers follow.
The inexact integer generator always yield 0.0
, -0.0
,
1.0
, and -1.0
at the beginning, then random integers follow.
The general integer generator created by integer-generator
samples evenly from an exact integer genratgor and an inexact
integer generator.
Since the range of exact integers is only bounded by the memory, uniform sampling from the entire possible range is infeasible; almost all samples would become a huge integer. Instead, we split integer range into 3: relatively small integers, fixnums, and bignums, and sample evenly from these three generators. Small integers and fixnums are sampled uniformly within its range, and bignums are sampled according to the power law; so, we see a lot more bignums closer to fixnum range, with occasional really big numbers sprinkled in.
[SRFI-252]{srfi.252
}
Return generators that yields rational numbers, exact rational numbers,
and inexact rational numbers, respectively.
The exact rational number generator yields
0
, 1
, -1
, 1/2
, and -1/2
at
the beginning, then generate (/ a b)
where a
, b
are generated in the same way as exact-integer-generator
’s
distribution, except 0 is excluded from b
.
The inexact rational number generator yields
0.0
, -0.0
, 0.5
, =0.5
, 1.0
, and -1.0
at the beginning, then proceed to generate random inexact rational numbers.
In Gauche, inexact rational numbers are finite flonums, and we uniformly
samples from all possible finite flonums (which is not the same
as uniform sample from a range of real numbers).
See finite-flonums$
in data.random
- ランダムデータの生成.
The general rational number generator created by rational-generator
evenly samples from an exact rational number generator and
an inexact rational number generator.
[SRFI-252]{srfi.252
}
Return generators that yields real numbers, exact real numbers,
and inexact real numbers, respectively.
In Gauche, the set of exact real numbers are exactly the same as
the set of exact rational numbers (infinites and NaNs are inexact),
so exact-real-generator
is the same as
exact-rational-generator
.
The inexact real number generator yields
0.0
, -0.0
, 0.5
, -0.5
,
1.0
, -1.0
, +inf.0
, -inf.0
, and +nan.0
at the beginning, followed by inexact real numbers uniformly sampled
from all possible finite flonums (which is not the same
as uniform sample from a range of real numbers).
See finite-flonums$
in data.random
- ランダムデータの生成.
The general real number generator created by real-generator
evenly samples from an exact real number generator and
an inexact real number generator.
[SRFI-252]{srfi.252
}
In Gauche, the set of exact numbers is the same as
the set of exact rational numbers (we don’t have exact complex),
and the set of inexact numbers
is the same as the set of inexact complex numbers.
Thus exact-number-generator
is the same as
exact-rational-generator
, and
inexact-number-generator
is the same as
inexact-complex-generator
.
The general number generator created by number-generator
evenly samples from an exact number generator and
an inexact number generator.
[SRFI-252]{srfi.252
}
Return generators that yield a list/vector of random length
up to max-length,
and elements generated by elt-generator, respectively.
Similar to lists-of
/vectors-of
in data.random
.
When max-length is omitted, we leave the length to the default
of lists-of
/vectors-of
,
which is determined by the parameter
default-sizer
in data.random
.
See data.random
- ランダムデータの生成, for the details.
[SRFI-252]{srfi.252
}
Returns a generator that yields pairs, whose car is generated
with car-generator
and whose cdr is generated
with cdr-generator
. If cdr-generator is omitted,
car-generator
is used.
[SRFI-252]{srfi.252
}
Returns a generator that yields procedures, which accepts
any number of arguments and returns a value generated with
value-generator.