Milan Stephan
Fotografie & IT

Zurück zur SP1 Übersicht

lilo-test-nudelsalat.c

/* * * * * * * * * * * * * * * *
 *   nudelsalat's lilo Test    *
 *    milan.stephan@fau.de     *
 * https://sp.milanstephan.de  *
 * * * * * * * * * * * * * * * */
/*

Version: SS 2017

Anleitung:
- In eine neue Datei lilo-test.c kopieren (gleiches Verzeichnis, wie die lilo.c)
- Nach jeder Änderung der lilo.c neu kompilieren:
  gcc -std=c11 -D_XOPEN_SOURCE=700 -Werror -Wall -pedantic -g -o lilo-test-nudelsalat lilo-test-nudelsalat.c -Wl,-enudeltest
- Mit ./lilo-test-nudelsalat ausführen
- Zusätzlich mit valgrind auf Speickerlecks und böse Speicherzugriffe testen: valgrind ./lilo-test-nudelsalat

*/

#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <unistd.h>
#include "lilo.c" // bitte nicht nachmachen, keine .c-Dateien includen!


static int ret = 0;

static void test_title(char *s) {
	printf("\x1B[1;37m~~\x1B[0m - %s \x1B[1;31m", (s));
	fflush(stdout);
}

static void test_update(bool b) {
	if (b) {
		printf("\r\x1B[0m\x1B[32mOK\x1B[0m\n");
	} else {
		ret = 1;
		printf("\r\x1B[0m\x1B[1;31m!!\x1B[0m\n");
	}
}

int nudeltest(void) {

	printf("\x1B[1;37mlilo-Test von nudelsalat | milan.stephan@fau.de | https://sp.milanstephan.de\x1B[0m\n");
	printf("\x1B[31mImmer den zuerst aufgelisteten Fehler beheben, da Folgefehler!\x1B[0m\n");
	printf("Die Tests sollten so ziemlich sofort (auf jeden Fall innerhalb einer Sekunde) durchlaufen.\n");
	printf("Falls nicht, gibt es wahrscheinlich irgendwo eine Endlosschleife.\n");
	printf("\n\x1B[1;37m~~\x1B[0m = laeuft, \x1B[32mOK\x1B[0m = bestanden, \x1B[1;31m!!\x1B[0m = fehlgeschlagen\n");

	printf("\nTest der Kernfunktionen:\n");

	test_title("removeElement bei leerer Liste");
	test_update(removeElement() == -1);



	test_title("1 Element hinzufuegen");
	test_update(insertElement(47) == 47);

	test_title("1 Element entfernen");
	test_update(removeElement() == 47);

	test_title("Liste ist nach Hinzufuegen/Entfernen leer");
	test_update(removeElement() == -1);



	test_title("-1 bei insertElement mit negativer Zahl");
	test_update(insertElement(-42) == -1);

	test_title("Liste ist nach insertElement mit negativer Zahl leer");
	test_update(removeElement() == -1);



	test_title("0 hinzufuegen");
	test_update(insertElement(0) == 0);

	test_title("0 entfernen");
	test_update(removeElement() == 0);

	test_title("Liste ist nach Hinzufuegen/Entfernen leer");
	test_update(removeElement() == -1);



	test_title("Einen zuvor entfernten Wert erneut hinzufuegen und wieder entfernen");
	test_update(insertElement(47) == 47
	&& removeElement() == 47);

	// 2016
	test_title("Haeufiges remove auf leere Liste");
	char b = 1;
	for (int i = 0; i < 100; i++) {
		if (removeElement() != -1) {
			b = 0;
		}
	}
	test_update(b);



	printf("\nKombinierte Tests:\n");

	test_title("3 Elemente zuerst hinzufuegen und dann wieder entfernen, Test ob Liste leer ist");
	test_update(insertElement(47) == 47
	&& insertElement(11) == 11
	&& insertElement(1337) == 1337
	&& removeElement() == 47
	&& removeElement() == 11
	&& removeElement() == 1337
	&& removeElement() == -1);

	test_title("Hinzufuegen und Entfernen mehrerer Elemente, gemischte Reihenfolge, Test ob Liste leer ist");
	test_update(insertElement(47) == 47
	&& insertElement(11) == 11
	&& insertElement(42) == 42
	&& removeElement() == 47
	&& insertElement(66) == 66
	&& removeElement() == 11
	&& removeElement() == 42
	&& removeElement() == 66
	&& removeElement() == -1);

	test_title("Hinzufuegen und Entfernen mehrerer Elemente, gemischte Reihenfolge, Einfuegen eines zuvor entfernten Wertes, Test ob Liste leer ist");
	test_update(insertElement(47) == 47
	&& insertElement(11) == 11
	&& insertElement(42) == 42
	&& removeElement() == 47
	&& insertElement(47) == 47
	&& removeElement() == 11
	&& removeElement() == 42
	&& removeElement() == 47
	&& removeElement() == -1);



	printf("\nDuplikat-Tests:\n");

	test_title("Bereits vorhandenen Wert einfuegen, der weder am Anfang noch am Ende der Liste steht");
	test_update(insertElement(42) == 42
	&& insertElement(11) == 11
	&& insertElement(22) == 22
	&& insertElement(11) == -1);

	test_title("Elemente wieder entfernen, Test ob Liste leer ist");
	test_update(removeElement() == 42
	&& removeElement() == 11
	&& removeElement() == 22
	&& removeElement() == -1);

	test_title("Bereits vorhandenen Wert einfuegen, der am Ende der Liste steht");
	test_update(insertElement(42) == 42
	&& insertElement(11) == 11
	&& insertElement(11) == -1
	&& insertElement(22) == 22);

	test_title("Elemente wieder entfernen, Test ob Liste leer ist");
	test_update(removeElement() == 42
	&& removeElement() == 11
	&& removeElement() == 22
	&& removeElement() == -1);

	test_title("Bereits vorhandenen Wert einfuegen, der am Anfang der Liste steht");
	test_update(insertElement(42) == 42
	&& insertElement(11) == 11
	&& insertElement(42) == -1);

	test_title("Elemente wieder entfernen, Test ob Liste leer ist");
	test_update(removeElement() == 42
	&& removeElement() == 11
	&& removeElement() == -1);

	_exit(ret);
}