--- /dev/null
+static int testarray_from_lit(void);
+static int testarray_append_lit(void);
+static int testarray_prepend_lit(void);
+
+static void testLits(void) {
+ testing(array_from_lit);
+ ok1(testarray_from_lit());
+
+ testing(testarray_append_lit);
+ ok1(testarray_append_lit());
+
+ testing(testarray_prepend_lit);
+ ok1(testarray_prepend_lit());
+}
+
+static int testarray_from_lit(void) {
+ #ifndef ARRAY_USE_TALLOC
+ array_char a = array_new();
+ #else
+ array_char a = array_new(NULL);
+ #endif
+ size_t testsPassed = 0;
+ size_t len = 0;
+
+ @forEachRandomString
+ /* Test @i */
+ array_from_lit(a, @str);
+ len = strlen(@str);
+ if (len != sizeof(@str)-1)
+ goto end;
+ if (a.size != len)
+ goto end;
+ if (a.size > a.alloc)
+ goto end;
+ if (strcmp(a.item, @str))
+ goto end;
+ array_free(a);
+ #ifndef ARRAY_USE_TALLOC
+ array_init(a);
+ #else
+ array_init(a, NULL);
+ #endif
+ testsPassed++;
+ @end
+
+end:
+ array_free(a);
+ return testsPassed == @amount;
+}
+
+typedef struct {
+ char *item;
+ size_t size;
+} testLits_string;
+
+static int testarray_append_lit(void) {
+ #ifndef ARRAY_USE_TALLOC
+ array_char a = array_new();
+ array(testLits_string) strings = array_new();
+ #else
+ array_char a = array_new(NULL);
+ array(testLits_string) strings = array_new(NULL);
+ #endif
+ size_t testsPassed = 0;
+ size_t oldSize;
+ testLits_string append;
+ size_t offs = 0;
+
+ @forEachRandomString
+ /* Test @i */
+ append.size = sizeof(@str)-1;
+ oldSize = a.size;
+ array_append_lit(a, @str);
+ if (a.size != oldSize+append.size)
+ goto end;
+ if (a.size > a.alloc)
+ goto end;
+ if (a.item[a.size])
+ goto end;
+ if (memcmp(a.item+oldSize, @str, a.size-oldSize))
+ goto end;
+ append.item = strdup(@str);
+ array_append(strings, append);
+ testsPassed++;
+ @end
+
+ if (strings.size != @amount)
+ goto end;
+ array_for(i, strings,
+ if (a.size-offs < i->size)
+ goto end;
+ if (memcmp(a.item+offs, i->item, i->size))
+ goto end;
+ offs += i->size;
+ );
+ if (offs != a.size)
+ goto end;
+ if (a.item[offs])
+ goto end;
+ testsPassed++;
+
+end:
+ array_free(a);
+ array_for(i, strings, free(i->item));
+ array_free(strings);
+ return testsPassed == @amount+1;
+}
+
+static int testarray_prepend_lit(void) {
+ #ifndef ARRAY_USE_TALLOC
+ array_char a = array_new();
+ array(testLits_string) strings = array_new();
+ #else
+ array_char a = array_new(NULL);
+ array(testLits_string) strings = array_new(NULL);
+ #endif
+ size_t testsPassed = 0;
+ size_t oldSize;
+ testLits_string append;
+ size_t offs;
+
+ @forEachRandomString
+ /* Test @i */
+ append.size = sizeof(@str)-1;
+ oldSize = a.size;
+ array_prepend_lit(a, @str);
+ if (a.size != oldSize+append.size)
+ goto end;
+ if (a.size > a.alloc)
+ goto end;
+ if (a.item[a.size])
+ goto end;
+ if (memcmp(a.item, @str, a.size-oldSize))
+ goto end;
+ append.item = strdup(@str);
+ array_append(strings, append);
+ testsPassed++;
+ @end
+
+ offs = a.size;
+ if (a.item[offs])
+ goto end;
+ if (strings.size != @amount)
+ goto end;
+ array_for(i, strings,
+ if (offs < i->size)
+ goto end;
+ offs -= i->size;
+ if (memcmp(a.item+offs, i->item, i->size))
+ goto end;
+ );
+ if (offs)
+ goto end;
+ testsPassed++;
+
+end:
+ array_free(a);
+ array_for(i, strings, free(i->item));
+ array_free(strings);
+ return testsPassed == @amount+1;
+}