Files
frostbyte/src/vecTest.c
T

117 lines
2.4 KiB
C

#include "ktest.h"
#include "vec.h"
KTEST(vecPushPopGrows)
{
Vec v;
vecInit(&v, sizeof(int));
KT_TRUE(t, vecIsEmpty(&v));
KT_EQ(t, vecCap(&v), 0);
for (int i = 0; i < 20; i++)
KT_TRUE(t, vecPush(&v, &i));
KT_EQ(t, vecLen(&v), 20);
KT_GE(t, vecCap(&v), 20);
for (int i = 0; i < 20; i++)
KT_EQ(t, *(int*)vecAt(&v, (usize)i), i);
int popped = -1;
KT_TRUE(t, vecPop(&v, &popped));
KT_EQ(t, popped, 19);
KT_EQ(t, vecLen(&v), 19);
vecFree(&v);
}
KTEST(vecPopEmptyFails)
{
Vec v;
vecInit(&v, sizeof(int));
int out;
KT_FALSE(t, vecPop(&v, &out));
KT_NULL(t, vecAt(&v, 0));
vecFree(&v);
}
KTEST(vecSetAt)
{
Vec v;
vecInit(&v, sizeof(int));
for (int i = 0; i < 5; i++)
vecPush(&v, &i);
int replacement = 99;
KT_TRUE(t, vecSet(&v, 2, &replacement));
KT_EQ(t, *(int*)vecAt(&v, 2), 99);
KT_FALSE(t, vecSet(&v, 10, &replacement)); /* out of range */
vecFree(&v);
}
KTEST(vecInsertRemoveShifts)
{
Vec v;
vecInit(&v, sizeof(int));
for (int i = 0; i < 5; i++)
vecPush(&v, &i); /* 0 1 2 3 4 */
int inserted = 100;
KT_TRUE(t, vecInsert(&v, 2, &inserted)); /* 0 1 100 2 3 4 */
KT_EQ(t, vecLen(&v), 6);
KT_EQ(t, *(int*)vecAt(&v, 2), 100);
KT_EQ(t, *(int*)vecAt(&v, 3), 2);
KT_EQ(t, *(int*)vecAt(&v, 5), 4);
int removed = -1;
KT_TRUE(t, vecRemove(&v, 2, &removed)); /* back to 0 1 2 3 4 */
KT_EQ(t, removed, 100);
KT_EQ(t, vecLen(&v), 5);
for (int i = 0; i < 5; i++)
KT_EQ(t, *(int*)vecAt(&v, (usize)i), i);
vecFree(&v);
}
KTEST(vecClearKeepsCapacity)
{
Vec v;
vecInit(&v, sizeof(int));
for (int i = 0; i < 8; i++)
vecPush(&v, &i);
usize capBefore = vecCap(&v);
vecClear(&v);
KT_EQ(t, vecLen(&v), 0);
KT_TRUE(t, vecIsEmpty(&v));
KT_EQ(t, vecCap(&v), capBefore); /* clear does not free backing storage */
int again = 7;
KT_TRUE(t, vecPush(&v, &again));
KT_EQ(t, *(int*)vecAt(&v, 0), 7);
vecFree(&v);
}
KTEST(vecStructElements)
{
typedef struct { int32 x; int32 y; } Point;
Vec v;
vecInit(&v, sizeof(Point));
Point a = { 1, 2 };
Point b = { 3, 4 };
vecPush(&v, &a);
vecPush(&v, &b);
Point* pa = (Point*)vecAt(&v, 0);
Point* pb = (Point*)vecAt(&v, 1);
KT_EQ(t, pa->x, 1);
KT_EQ(t, pa->y, 2);
KT_EQ(t, pb->x, 3);
KT_EQ(t, pb->y, 4);
vecFree(&v);
}