#include #include #include "test.h" #include "dynarr.h" typedef struct { int x; int y; } Point; static void test_double_array(void) { double *arr = da_new(double); double vals[] = {1.5, 2.5, 3.5}; da_append(arr, vals[0]); da_append(arr, vals[1]); da_append(arr, vals[2]); ASSERT_EQ(da_length(arr), (size_t)3); /* memcmp avoids -Wfloat-equal; values are exact binary fractions */ for (size_t i = 0; i < 3; i++) ASSERT(memcmp(&arr[i], &vals[i], sizeof(double)) == 0); da_free(arr); } static void test_struct_array(void) { Point *arr = da_new(Point); Point p1 = {1, 2}; Point p2 = {3, 4}; Point p3 = {5, 6}; da_append(arr, p1); da_append(arr, p2); da_append(arr, p3); ASSERT_EQ(da_length(arr), (size_t)3); ASSERT_EQ(arr[0].x, 1); ASSERT_EQ(arr[0].y, 2); ASSERT_EQ(arr[1].x, 3); ASSERT_EQ(arr[1].y, 4); ASSERT_EQ(arr[2].x, 5); ASSERT_EQ(arr[2].y, 6); da_free(arr); } static void test_pointer_array(void) { int a = 10, b = 20, c = 30; int **arr = da_new(int *); da_append(arr, &a); da_append(arr, &b); da_append(arr, &c); ASSERT_EQ(da_length(arr), (size_t)3); ASSERT_EQ(*arr[0], 10); ASSERT_EQ(*arr[1], 20); ASSERT_EQ(*arr[2], 30); da_free(arr); } static void test_struct_pop_and_last(void) { Point *arr = da_new(Point); Point a = {10, 20}; Point b = {30, 40}; da_append(arr, a); da_append(arr, b); Point last = da_last(arr); ASSERT_EQ(last.x, 30); ASSERT_EQ(last.y, 40); Point popped = da_pop(arr); ASSERT_EQ(popped.x, 30); ASSERT_EQ(popped.y, 40); ASSERT_EQ(da_length(arr), (size_t)1); da_free(arr); } static void test_struct_get(void) { Point *arr = da_new(Point); for (int i = 0; i < 5; i++) { Point p = {i, i * 2}; da_append(arr, p); } for (size_t i = 0; i < 5; i++) { Point p = da_get(arr, i); ASSERT_EQ(p.x, (int)i); ASSERT_EQ(p.y, (int)(i * 2)); } da_free(arr); } static void test_struct_growth(void) { /* structs are larger than int — verify growth accounting is correct */ Point *arr = da_new(Point); for (int i = 0; i < 20; i++) { Point p = {i, -i}; da_append(arr, p); } ASSERT_EQ(da_length(arr), (size_t)20); for (size_t i = 0; i < 20; i++) { ASSERT_EQ(arr[i].x, (int)i); ASSERT_EQ(arr[i].y, -(int)i); } da_free(arr); } int main(void) { test_double_array(); test_struct_array(); test_pointer_array(); test_struct_pop_and_last(); test_struct_get(); test_struct_growth(); printf("test_dynarr_types: all tests passed\n"); return 0; }