Git fork
at reftables-rust 119 lines 2.8 kB view raw
1#include "unit-test.h" 2#include "strbuf.h" 3 4/* wrapper that supplies tests with an empty, initialized strbuf */ 5static void setup(void (*f)(struct strbuf*, const void*), 6 const void *data) 7{ 8 struct strbuf buf = STRBUF_INIT; 9 10 f(&buf, data); 11 strbuf_release(&buf); 12 cl_assert_equal_i(buf.len, 0); 13 cl_assert_equal_i(buf.alloc, 0); 14} 15 16/* wrapper that supplies tests with a populated, initialized strbuf */ 17static void setup_populated(void (*f)(struct strbuf*, const void*), 18 const char *init_str, const void *data) 19{ 20 struct strbuf buf = STRBUF_INIT; 21 22 strbuf_addstr(&buf, init_str); 23 cl_assert_equal_i(buf.len, strlen(init_str)); 24 f(&buf, data); 25 strbuf_release(&buf); 26 cl_assert_equal_i(buf.len, 0); 27 cl_assert_equal_i(buf.alloc, 0); 28} 29 30static void assert_sane_strbuf(struct strbuf *buf) 31{ 32 /* Initialized strbufs should always have a non-NULL buffer */ 33 cl_assert(buf->buf != NULL); 34 /* Buffers should always be NUL-terminated */ 35 cl_assert(buf->buf[buf->len] == '\0'); 36 /* 37 * In case the buffer contains anything, `alloc` must alloc must 38 * be at least one byte larger than `len`. 39 */ 40 if (buf->len) 41 cl_assert(buf->len < buf->alloc); 42} 43 44void test_strbuf__static_init(void) 45{ 46 struct strbuf buf = STRBUF_INIT; 47 48 cl_assert_equal_i(buf.len, 0); 49 cl_assert_equal_i(buf.alloc, 0); 50 cl_assert(buf.buf[0] == '\0'); 51} 52 53void test_strbuf__dynamic_init(void) 54{ 55 struct strbuf buf; 56 57 strbuf_init(&buf, 1024); 58 assert_sane_strbuf(&buf); 59 cl_assert_equal_i(buf.len, 0); 60 cl_assert(buf.alloc >= 1024); 61 cl_assert(buf.buf[0] == '\0'); 62 strbuf_release(&buf); 63} 64 65static void t_addch(struct strbuf *buf, const void *data) 66{ 67 const char *p_ch = data; 68 const char ch = *p_ch; 69 size_t orig_alloc = buf->alloc; 70 size_t orig_len = buf->len; 71 72 assert_sane_strbuf(buf); 73 strbuf_addch(buf, ch); 74 assert_sane_strbuf(buf); 75 cl_assert_equal_i(buf->len, orig_len + 1); 76 cl_assert(buf->alloc >= orig_alloc); 77 cl_assert(buf->buf[buf->len] == '\0'); 78} 79 80static void t_addstr(struct strbuf *buf, const void *data) 81{ 82 const char *text = data; 83 size_t len = strlen(text); 84 size_t orig_alloc = buf->alloc; 85 size_t orig_len = buf->len; 86 87 assert_sane_strbuf(buf); 88 strbuf_addstr(buf, text); 89 assert_sane_strbuf(buf); 90 cl_assert_equal_i(buf->len, orig_len + len); 91 cl_assert(buf->alloc >= orig_alloc); 92 cl_assert(buf->buf[buf->len] == '\0'); 93 cl_assert_equal_s(buf->buf + orig_len, text); 94} 95 96void test_strbuf__add_single_char(void) 97{ 98 setup(t_addch, "a"); 99} 100 101void test_strbuf__add_empty_char(void) 102{ 103 setup(t_addch, ""); 104} 105 106void test_strbuf__add_append_char(void) 107{ 108 setup_populated(t_addch, "initial value", "a"); 109} 110 111void test_strbuf__add_single_str(void) 112{ 113 setup(t_addstr, "hello there"); 114} 115 116void test_strbuf__add_append_str(void) 117{ 118 setup_populated(t_addstr, "initial value", "hello there"); 119}