From 9adc48da82d97129eb2db52e98f56c937223d0e1 Mon Sep 17 00:00:00 2001 From: nitrix Date: Sat, 7 Mar 2020 01:21:29 +0100 Subject: [PATCH] implement struct tests --- src/test/struct/struct.c | 85 ++++++++++++++++++++++++++++++++++++++++ src/test/struct/struct.h | 31 +++++++++++++++ 2 files changed, 116 insertions(+) create mode 100644 src/test/struct/struct.c create mode 100644 src/test/struct/struct.h diff --git a/src/test/struct/struct.c b/src/test/struct/struct.c new file mode 100644 index 0000000..c6d31e7 --- /dev/null +++ b/src/test/struct/struct.c @@ -0,0 +1,85 @@ +#include +#include +#include "struct.h" +#include "../print/print.h" + +// C equivalent implementations of the funcitons written in k +struct testStruct* cGetTestStruct(long a, bool b, long c) { + struct testStruct* result = (struct testStruct*) malloc(sizeof(struct testStruct)); + result->a = a; + result->b = b; + result->c = c; + return result; +} + +struct testStructRec* cGetTestStructRec(long a, struct testStructRec* b) { + struct testStructRec* result = (struct testStructRec*) malloc(sizeof(struct testStructRec)); + result->a = a; + result->b = b; + return result; +} + +int struct_testExpected(char *name, long expected, long result) +{ + if (expected == result) + { + succ(name, expected, result); + return 0; + } + else + { + err(name, expected, result); + return 1; + } +} + +int testStructCreation() { + printf("\nStruct creation tests\n"); + struct testStruct* result = getTestStruct(1, false, 20); + + struct_testExpected("init field a", 1, result->a); + struct_testExpected("init field b", false, result->b); + struct_testExpected("init field c", 20, result->c); + + free(result); + + printf("\n Recursive struct creation tests\n"); + struct testStructRec* innerStruct = getTestStructRec(20, NULL); + struct testStructRec* resultRec = getTestStructRec(10, innerStruct); + + struct_testExpected("init rec field a", 10, resultRec->a); + struct_testExpected("init rec field b", innerStruct, resultRec->b); + struct_testExpected("init inner field a", 20, resultRec->b->a); + struct_testExpected("init inner field b", NULL, resultRec->b->b); + + free(resultRec); + free(innerStruct); +} + +int testStructGet() { + printf("\nStruct getter tests\n"); + struct testStruct* result = getTestStruct(1, false, 20); + + struct_testExpected("get field a", 1, getStructFieldA(result)); + struct_testExpected("get field b", false, getStructFieldB(result)); + struct_testExpected("get field c", 20, getStructFieldC(result)); + + free(result); + + printf("\nStruct getter tests\n"); + struct testStructRec* innerStruct = getTestStructRec(1, NULL); + struct testStructRec* resultRec = getTestStructRec(20, innerStruct); + + struct_testExpected("get rec field a", 20, getStructFieldRecA(resultRec)); + struct_testExpected("get rec field b", innerStruct, getStructFieldRecB(resultRec)); + struct_testExpected("get inner field a", 1, getStructFieldRecA(getStructFieldRecB(resultRec))); + struct_testExpected("get inner field b", NULL, getStructFieldRecB(getStructFieldRecB(resultRec))); + + free(resultRec); + free(innerStruct); +} + +void runStructTests() { + testStructCreation(); + testStructGet(); +} \ No newline at end of file diff --git a/src/test/struct/struct.h b/src/test/struct/struct.h new file mode 100644 index 0000000..80e68a8 --- /dev/null +++ b/src/test/struct/struct.h @@ -0,0 +1,31 @@ +#include + +struct testStruct +{ + long a; + bool b; + long c; +}; + +struct testStructRec +{ + long a; + struct testStructRec *b; +}; + +struct testStruct* getTestStruct(long a, bool b, long c); +struct testStructRec* getTestStructRec(long a, struct testStructRec* b); + +long getStructFieldA(struct testStruct *); +bool getStructFieldB(struct testStruct *); +long getStructFieldC(struct testStruct *); + +struct testStruct *setStructFieldA(struct testStruct *t, long a); +struct testStruct *setStructFieldB(struct testStruct *t, bool b); +struct testStruct *setStructFieldC(struct testStruct *t, long c); + +long getStructFieldRecA(struct testStructRec *t); +struct testStructRec *getStructFieldRecB(struct testStructRec *t); + +struct testStructRec *setStructFieldRecA(struct testStructRec *t, long a); +struct testStructRec *setStructFieldRecB(struct testStructRec *t, struct testStructRec *b); \ No newline at end of file