====== record and replay ======
Die beiden Attribute dienen vorrangig dazu tests zu vereinfachen. Funktionen können so drei Modi erhalten: normal, record und play.
Im Modus normal und record wird die Funktion normal ausgegeführt. Beispiel: gets().
Im normalen Modus wird ein String abgefragt. Im record-Modus erhält wird zusätzlich ein DOM übergeben, worin die Parameter übergeben werden und die Nummer des Aufrufs dieser Funktion. Die Funktion kann nun ihre Rückgaben in den DOM schreiben.
Ausgaben werden im DOM mitaufgezeichnet.
===== Play-Modus =====
Bei Play wird die Funktion nicht mehr ausgeführt, sondern die zuvor aufgenommene Eingabe wird aus dem DOM zurückkopiert. get_s fragt also nicht mehr den User, sondern kopiert die zuvor eingegebene Antwort.
Der Play-Modus gibt alle Antworten automatisch wieder an die rufenden Funktionen. Das Programm sollte so identisch ablaufen.
===== diff =====
Diff arbeitet wie Play, vergleicht aber zusätzlich die Ausgaben. Mit Verbose werden die Ausgaben ausgegeben, sonst unterdrückt, sofern sie den Erwartungen entsprechen.
===== Ein einfaches Beispiel =====
print "Hallo Welt";
gsys --rec hw.grc helloWorld.g
Das Programm gibt "Hallo Welt" aus und fertig.
Ob das Programm sich genauso wieder verhält, kann man nun mit
gsys --diff hw.grc helloWorld.g
liefert keine Ausgabe, da "Hello World" gedruckt und auch erwartet wurde.
===== Beispiel für eigene record und play-Funktionen =====
myValue is code -> int
{
return 4711;
record( data as dom )
{
print "Aufnahme von ", data.value$; // <- print hier wird nicht gespeichert, sondern ausgegeben
}
play( dom ); // result : data.value; // <- muss ich nicht definieren, ist durch record schon definiert. Ich könnte aber was dazupacken
}
print myValue()$ + "\n";
===== Anwendungsbeispiel =====
myValue is code -> int
{
return 4711;
}
print myValue()$ + "\n";
Nun rufe ich ''gc --rec test.grc value.g'' auf und erhalte die Ausgabe "4711\n". Die Ausgabe von myValue wird in test.grc gespeichert.
Nun wiederhole ich das mit ''gc --play test.grc value.g''. print liefert "4711" aus.
Mit ''gc --diff test.grc value.g'' erhalte ich keine Ausgabe, da alles korrekt ist. Nun verändere ich die Datei:
myValue is code -> int
{
return 4712;
}
print myValue()$ + "\n";
Mit ''gc --diff test.grc value.g'' erhalte ich nun folgende Ausgabe:
diff:
- 4711
+ 4712