static int testdarray_from_lit(void);
static int testdarray_append_lit(void);
static int testdarray_prepend_lit(void);

static void testLits(void) {
	testing(darray_from_lit);
	ok1(testdarray_from_lit());
	
	testing(testdarray_append_lit);
	ok1(testdarray_append_lit());
	
	testing(testdarray_prepend_lit);
	ok1(testdarray_prepend_lit());
}

static int testdarray_from_lit(void) {
	darray_char a = darray_new();
	size_t testsPassed = 0;
	size_t len = 0;
	
	@forEachRandomString
		/* Test @i */
		darray_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;
		darray_free(a);
		darray_init(a);
		testsPassed++;
	@end
	
end:
	darray_free(a);
	return testsPassed == @amount;
}

typedef struct {
	char *item;
	size_t size;
} testLits_string;

static int testdarray_append_lit(void) {
	darray_char a = darray_new();
	darray(testLits_string) strings = darray_new();
	testLits_string *i;
	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;
		darray_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);
		darray_append(strings, append);
		testsPassed++;
	@end
	
	if (strings.size != @amount)
		goto end;
	
	darray_foreach(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:
	darray_free(a);
	darray_foreach(i, strings)
		free(i->item);
	darray_free(strings);
	return testsPassed == @amount+1;
}

static int testdarray_prepend_lit(void) {
	darray_char a = darray_new();
	darray(testLits_string) strings = darray_new();
	testLits_string *i;
	size_t testsPassed = 0;
	size_t oldSize;
	testLits_string append;
	size_t offs;
	
	@forEachRandomString
		/* Test @i */
		append.size = sizeof(@str)-1;
		oldSize = a.size;
		darray_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);
		darray_append(strings, append);
		testsPassed++;
	@end
	
	offs = a.size;
	if (a.item[offs])
		goto end;
	if (strings.size != @amount)
		goto end;
	darray_foreach(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:
	darray_free(a);
	darray_foreach(i, strings)
		free(i->item);
	darray_free(strings);
	return testsPassed == @amount+1;
}
