diff options
Diffstat (limited to 't/unit-tests/u-strbuf.c')
| -rw-r--r-- | t/unit-tests/u-strbuf.c | 119 | 
1 files changed, 119 insertions, 0 deletions
diff --git a/t/unit-tests/u-strbuf.c b/t/unit-tests/u-strbuf.c new file mode 100644 index 0000000000..caa5d78aa3 --- /dev/null +++ b/t/unit-tests/u-strbuf.c @@ -0,0 +1,119 @@ +#include "unit-test.h" +#include "strbuf.h" + +/* wrapper that supplies tests with an empty, initialized strbuf */ +static void setup(void (*f)(struct strbuf*, const void*), +		  const void *data) +{ +	struct strbuf buf = STRBUF_INIT; + +	f(&buf, data); +	strbuf_release(&buf); +	cl_assert_equal_i(buf.len, 0); +	cl_assert_equal_i(buf.alloc, 0); +} + +/* wrapper that supplies tests with a populated, initialized strbuf */ +static void setup_populated(void (*f)(struct strbuf*, const void*), +			    const char *init_str, const void *data) +{ +	struct strbuf buf = STRBUF_INIT; + +	strbuf_addstr(&buf, init_str); +	cl_assert_equal_i(buf.len, strlen(init_str)); +	f(&buf, data); +	strbuf_release(&buf); +	cl_assert_equal_i(buf.len, 0); +	cl_assert_equal_i(buf.alloc, 0); +} + +static void assert_sane_strbuf(struct strbuf *buf) +{ +	/* Initialized strbufs should always have a non-NULL buffer */ +	cl_assert(buf->buf != NULL); +	/* Buffers should always be NUL-terminated */ +	cl_assert(buf->buf[buf->len] == '\0'); +	/* +         * In case the buffer contains anything, `alloc` must alloc must +         * be at least one byte larger than `len`. +         */ +	if (buf->len) +            cl_assert(buf->len < buf->alloc); +} + +void test_strbuf__static_init(void) +{ +	struct strbuf buf = STRBUF_INIT; + +	cl_assert_equal_i(buf.len, 0); +	cl_assert_equal_i(buf.alloc, 0); +	cl_assert(buf.buf[0] == '\0'); +} + +void test_strbuf__dynamic_init(void) +{ +	struct strbuf buf; + +	strbuf_init(&buf, 1024); +	assert_sane_strbuf(&buf); +	cl_assert_equal_i(buf.len, 0); +	cl_assert(buf.alloc >= 1024); +	cl_assert(buf.buf[0] == '\0'); +	strbuf_release(&buf); +} + +static void t_addch(struct strbuf *buf, const void *data) +{ +	const char *p_ch = data; +	const char ch = *p_ch; +	size_t orig_alloc = buf->alloc; +	size_t orig_len = buf->len; + +	assert_sane_strbuf(buf); +	strbuf_addch(buf, ch); +	assert_sane_strbuf(buf); +	cl_assert_equal_i(buf->len, orig_len + 1); +	cl_assert(buf->alloc >= orig_alloc); +	cl_assert(buf->buf[buf->len] == '\0'); +} + +static void t_addstr(struct strbuf *buf, const void *data) +{ +	const char *text = data; +	size_t len = strlen(text); +	size_t orig_alloc = buf->alloc; +	size_t orig_len = buf->len; + +	assert_sane_strbuf(buf); +	strbuf_addstr(buf, text); +	assert_sane_strbuf(buf); +	cl_assert_equal_i(buf->len, orig_len + len); +	cl_assert(buf->alloc >= orig_alloc); +	cl_assert(buf->buf[buf->len] == '\0'); +	cl_assert_equal_s(buf->buf + orig_len, text); +} + +void test_strbuf__add_single_char(void) +{ +	setup(t_addch, "a"); +} + +void test_strbuf__add_empty_char(void) +{ +	setup(t_addch, ""); +} + +void test_strbuf__add_append_char(void) +{ +	setup_populated(t_addch, "initial value", "a"); +} + +void test_strbuf__add_single_str(void) +{ +	setup(t_addstr, "hello there"); +} + +void test_strbuf__add_append_str(void) +{ +	setup_populated(t_addstr, "initial value", "hello there"); +}  | 
