On this page:
for-all
expect
expect-within
expect-member-of
expect-range
==>

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 muß festgelegt werden, welchen Vertrag die Werte der Variable erfüllen sollen. Eigenschaften mit Variablen werden mit der for-all-Form erzeugt:

(for-all ((id contr) ...) expr)
Dies bindet die Variablen id in der Eigenschaft expr. Zu jeder Variable gehört ein Vertrag contr, der von den Werten der Variable erfüllt werden muß.

Beispiel:

  (for-all ((x integer))
    (= x (/ (* x 2) 2)))

(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.

(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.

(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.

(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).

(==> expr expr)
Der erste Operand ist ein boolescher Ausdruck, der zweite Operand eine Eigenschaft: (==> c p) legt fest, daß die Eigenschaft p nur erfüllt sein muß, wenn c (die Bedingung) #t ergibt, also erfüllt ist.

  (for-all ((x integer))
    (==> (even? x)
         (= x (* 2 (/ x 2)))))