117 lines
2.4 KiB
C
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);
|
|
}
|