16ccccaaaSGlenn Strauss #include "first.h"
26ccccaaaSGlenn Strauss
3c98d89a4SGlenn Strauss #undef NDEBUG
42e385a1aSGlenn Strauss #include <assert.h>
56ccccaaaSGlenn Strauss #include <stdio.h>
66ccccaaaSGlenn Strauss #include <stdlib.h>
76ccccaaaSGlenn Strauss
8bab0e5d0SGlenn Strauss #include "buffer.c"
96ccccaaaSGlenn Strauss
run_buffer_path_simplify(buffer * psrc,buffer * pdest,const char * in,size_t in_len,const char * out,size_t out_len)106ccccaaaSGlenn Strauss static void run_buffer_path_simplify(buffer *psrc, buffer *pdest, const char *in, size_t in_len, const char *out, size_t out_len) {
116ccccaaaSGlenn Strauss buffer_copy_string_len(psrc, in, in_len);
12980554bcSGlenn Strauss pdest = psrc; /*(buffer_path_simplify() now takes only one arg)*/
136ccccaaaSGlenn Strauss
14980554bcSGlenn Strauss buffer_path_simplify(pdest);
156ccccaaaSGlenn Strauss
1617e0b6feSGlenn Strauss if (!buffer_eq_slen(pdest, out, out_len)) {
176ccccaaaSGlenn Strauss fprintf(stderr,
186ccccaaaSGlenn Strauss "%s.%d: buffer_path_simplify('%s') failed: expected '%s', got '%s'\n",
196ccccaaaSGlenn Strauss __FILE__,
206ccccaaaSGlenn Strauss __LINE__,
216ccccaaaSGlenn Strauss in,
226ccccaaaSGlenn Strauss out,
2322e8f600SGlenn Strauss pdest->ptr);
246ccccaaaSGlenn Strauss fflush(stderr);
256ccccaaaSGlenn Strauss abort();
266ccccaaaSGlenn Strauss } else {
27980554bcSGlenn Strauss buffer_path_simplify(pdest);
286ccccaaaSGlenn Strauss
2917e0b6feSGlenn Strauss if (!buffer_eq_slen(pdest, out, out_len)) {
306ccccaaaSGlenn Strauss fprintf(stderr,
316ccccaaaSGlenn Strauss "%s.%d: buffer_path_simplify('%s') failed - not idempotent: expected '%s', got '%s'\n",
326ccccaaaSGlenn Strauss __FILE__,
336ccccaaaSGlenn Strauss __LINE__,
34e8e59396SGlenn Strauss in,
356ccccaaaSGlenn Strauss out,
3622e8f600SGlenn Strauss pdest->ptr);
376ccccaaaSGlenn Strauss fflush(stderr);
386ccccaaaSGlenn Strauss abort();
396ccccaaaSGlenn Strauss }
406ccccaaaSGlenn Strauss }
416ccccaaaSGlenn Strauss }
426ccccaaaSGlenn Strauss
test_buffer_path_simplify_with(buffer * psrc,buffer * pdest)436ccccaaaSGlenn Strauss static void test_buffer_path_simplify_with(buffer *psrc, buffer *pdest) {
446ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(""), CONST_STR_LEN(""));
456ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/"), CONST_STR_LEN("/"));
466ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("//"), CONST_STR_LEN("/"));
47e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc"), CONST_STR_LEN("abc"));
48e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc//"), CONST_STR_LEN("abc/"));
49e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz"), CONST_STR_LEN("abc/xyz"));
50e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/.//xyz"), CONST_STR_LEN("abc/xyz"));
516ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz"), CONST_STR_LEN("/xyz"));
526ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz"), CONST_STR_LEN("/abc/xyz"));
536ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc//./xyz"), CONST_STR_LEN("/abc/xyz"));
546ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz"), CONST_STR_LEN("/xyz"));
556ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz/."), CONST_STR_LEN("/xyz/"));
566ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz/."), CONST_STR_LEN("/xyz/"));
57e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz/.."), CONST_STR_LEN("abc/"));
586ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz/.."), CONST_STR_LEN("/abc/"));
59e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("."), CONST_STR_LEN(""));
60e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".."), CONST_STR_LEN(""));
61e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("..."), CONST_STR_LEN("..."));
62e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("...."), CONST_STR_LEN("...."));
63e8e59396SGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".../"), CONST_STR_LEN(".../"));
646ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("./xyz/.."), CONST_STR_LEN("/"));
656ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".//xyz/.."), CONST_STR_LEN("/"));
666ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/./xyz/.."), CONST_STR_LEN("/"));
676ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".././xyz/.."), CONST_STR_LEN("/"));
686ccccaaaSGlenn Strauss run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/.././xyz/.."), CONST_STR_LEN("/"));
696ccccaaaSGlenn Strauss }
706ccccaaaSGlenn Strauss
test_buffer_path_simplify(void)716ccccaaaSGlenn Strauss static void test_buffer_path_simplify(void) {
726ccccaaaSGlenn Strauss buffer *psrc = buffer_init();
736ccccaaaSGlenn Strauss
746ccccaaaSGlenn Strauss /* test with using the same buffer and with using different buffers */
756ccccaaaSGlenn Strauss test_buffer_path_simplify_with(psrc, psrc);
766ccccaaaSGlenn Strauss
776ccccaaaSGlenn Strauss buffer_free(psrc);
786ccccaaaSGlenn Strauss }
796ccccaaaSGlenn Strauss
test_buffer_to_lower_upper(void)802e385a1aSGlenn Strauss static void test_buffer_to_lower_upper(void) {
812e385a1aSGlenn Strauss buffer *psrc = buffer_init();
822e385a1aSGlenn Strauss
832e385a1aSGlenn Strauss buffer_copy_string_len(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"));
842e385a1aSGlenn Strauss buffer_to_lower(psrc);
8517e0b6feSGlenn Strauss assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")));
862e385a1aSGlenn Strauss buffer_to_upper(psrc);
8717e0b6feSGlenn Strauss assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
882e385a1aSGlenn Strauss buffer_to_upper(psrc);
8917e0b6feSGlenn Strauss assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ")));
902e385a1aSGlenn Strauss buffer_to_lower(psrc);
9117e0b6feSGlenn Strauss assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")));
922e385a1aSGlenn Strauss
932e385a1aSGlenn Strauss buffer_free(psrc);
942e385a1aSGlenn Strauss }
952e385a1aSGlenn Strauss
test_buffer_string_space(void)96aba45f68SGlenn Strauss static void test_buffer_string_space(void) {
97aba45f68SGlenn Strauss buffer *b = buffer_init();
98aba45f68SGlenn Strauss size_t space;
99aba45f68SGlenn Strauss
100aba45f68SGlenn Strauss space = buffer_string_space(b);
101aba45f68SGlenn Strauss assert(0 == space);
102aba45f68SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN(""));
103aba45f68SGlenn Strauss space = buffer_string_space(b);
104aba45f68SGlenn Strauss assert(space > 0);
105aba45f68SGlenn Strauss assert(space + buffer_string_length(b) == b->size - 1);
106aba45f68SGlenn Strauss buffer_commit(b, b->size - 1);
107aba45f68SGlenn Strauss assert(b->used == b->size);
108aba45f68SGlenn Strauss space = buffer_string_space(b);
109aba45f68SGlenn Strauss assert(0 == space);
110aba45f68SGlenn Strauss
111aba45f68SGlenn Strauss buffer_free(b);
112aba45f68SGlenn Strauss }
113aba45f68SGlenn Strauss
test_buffer_append_path_len(void)11477c01f98SGlenn Strauss static void test_buffer_append_path_len(void) {
11577c01f98SGlenn Strauss buffer *b = buffer_init();
11677c01f98SGlenn Strauss
11777c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("a"));
11817e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
11977c01f98SGlenn Strauss buffer_clear(b);
12077c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("a"));
12117e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
12277c01f98SGlenn Strauss buffer_clear(b);
12377c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("/a"));
12417e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
12577c01f98SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN("/"));
12677c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("a"));
12717e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
12877c01f98SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN("/"));
12977c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("/a"));
13017e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("/a")));
13177c01f98SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN("a"));
13277c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("a"));
13317e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("a/a")));
13477c01f98SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN("a/"));
13577c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("a"));
13617e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("a/a")));
13777c01f98SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN("a/"));
13877c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("/a"));
13917e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("a/a")));
14077c01f98SGlenn Strauss buffer_copy_string_len(b, CONST_STR_LEN("/a/"));
14177c01f98SGlenn Strauss buffer_append_path_len(b, CONST_STR_LEN("/a"));
14217e0b6feSGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("/a/a")));
14377c01f98SGlenn Strauss
14477c01f98SGlenn Strauss buffer_free(b);
14577c01f98SGlenn Strauss }
14677c01f98SGlenn Strauss
test_buffer_append_bs_escaped(void)147*91ce3b08SGlenn Strauss static void test_buffer_append_bs_escaped(void) {
148*91ce3b08SGlenn Strauss buffer *b = buffer_init();
149*91ce3b08SGlenn Strauss
150*91ce3b08SGlenn Strauss buffer_append_bs_escaped_json(b, CONST_STR_LEN(" "));
151*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN(" ")));
152*91ce3b08SGlenn Strauss buffer_clear(b);
153*91ce3b08SGlenn Strauss buffer_append_bs_escaped_json(b, CONST_STR_LEN("\0"));
154*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("\\u0000")));
155*91ce3b08SGlenn Strauss buffer_clear(b);
156*91ce3b08SGlenn Strauss buffer_append_bs_escaped_json(b, CONST_STR_LEN("\1"));
157*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("\\u0001")));
158*91ce3b08SGlenn Strauss buffer_clear(b);
159*91ce3b08SGlenn Strauss buffer_append_bs_escaped_json(b, CONST_STR_LEN("\n"));
160*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("\\n")));
161*91ce3b08SGlenn Strauss buffer_clear(b);
162*91ce3b08SGlenn Strauss buffer_append_bs_escaped_json(b, CONST_STR_LEN("é"));
163*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("é")));
164*91ce3b08SGlenn Strauss buffer_clear(b);
165*91ce3b08SGlenn Strauss buffer_append_bs_escaped_json(b, CONST_STR_LEN("ö"));
166*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("ö")));
167*91ce3b08SGlenn Strauss
168*91ce3b08SGlenn Strauss #if 0
169*91ce3b08SGlenn Strauss buffer_clear(b);
170*91ce3b08SGlenn Strauss magnet_buffer_append_bsdec(b, CONST_STR_LEN("\\u00E9"));
171*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("é")));
172*91ce3b08SGlenn Strauss buffer_clear(b);
173*91ce3b08SGlenn Strauss magnet_buffer_append_bsdec(b, CONST_STR_LEN("\\u00F6"));
174*91ce3b08SGlenn Strauss assert(buffer_eq_slen(b, CONST_STR_LEN("ö")));
175*91ce3b08SGlenn Strauss #endif
176*91ce3b08SGlenn Strauss
177*91ce3b08SGlenn Strauss /* TODO: more */
178*91ce3b08SGlenn Strauss
179*91ce3b08SGlenn Strauss buffer_free(b);
180*91ce3b08SGlenn Strauss }
181*91ce3b08SGlenn Strauss
182bab0e5d0SGlenn Strauss void test_buffer (void);
test_buffer(void)183bab0e5d0SGlenn Strauss void test_buffer (void)
184bab0e5d0SGlenn Strauss {
1856ccccaaaSGlenn Strauss test_buffer_path_simplify();
1862e385a1aSGlenn Strauss test_buffer_to_lower_upper();
187aba45f68SGlenn Strauss test_buffer_string_space();
18877c01f98SGlenn Strauss test_buffer_append_path_len();
189*91ce3b08SGlenn Strauss test_buffer_append_bs_escaped();
1906ccccaaaSGlenn Strauss }
191