1.16 Eigenschaften
Eine Eigenschaft definiert eine Aussage über einen Scheme-Ausdruck, die experimentell überprüft werden kann. Der einfachste Fall einer Eigenschaft ist ein boolescher Ausdruck. Die folgende Eigenschaft gilt immer:
(= 1 1)
Es ist auch möglich, in einer Eigenschaft Variablen zu verwenden, für die verschiedene Werte eingesetzt werden. Dafür müssen die Variablen gebunden und quantifiziert werden, d.h. es muss festgelegt werden, welche Signatur die Werte der Variable erfüllen sollen. Eigenschaften mit Variablen werden mit der for-all-Form erzeugt:
syntax
(for-all ((id sig) ...) expr)
Dies bindet die Variablen id in der Eigenschaft
expr. Zu jeder Variable gehört eine Signatur
sig, der von den Werten der Variable erfüllt werden
muss.
Beispiel:
(for-all ((x integer)) (= x (/ (* x 2) 2)))
syntax
(expect expr expr)
Ein expect-Ausdruck ergibt eine Eigenschaft, die dann gilt,
wenn die Werte von expr und expr gleich sind, im
gleichen Sinne wie bei check-expect.
syntax
(expect-within expr expr expr)
Wie expect, aber entsprechend check-within mit einem
weiteren Ausdruck, der als Wert eine Zahl delta hat. Die
resultierende Eigenschaft gilt, wenn jede Zahl im Resultat des ersten
expr maximal um delta von der entsprechenden Zahl
im zweiten expr abweicht.
syntax
(expect-member-of expr expr ...)
Wie expect, aber entsprechend check-member-of mit
weiteren Ausdrücken, die mit dem ersten verglichen werden. Die
resultierende Eigenschaft gilt, wenn das erste Argument gleich
einem der anderen Argumente ist.
syntax
(expect-range expr expr expr)
Wie expect, aber entsprechend check-range: Die
Argumente müssen Zahlen sein. Die Eigenschaft gilt, wenn die erste Zahl
zwischen der zweiten und dritten Zahl liegt (inklusive).
syntax
(==> expr expr)
Der erste Operand ist ein boolescher Ausdruck, der zweite Operand eine
Eigenschaft: (==> c p) legt fest, dass die Eigenschaft
p nur erfüllt sein muss, wenn c (die
Bedingung) #t ergibt, also erfüllt ist.
(for-all ((x integer)) (==> (even? x) (= x (* 2 (/ x 2)))))