1 #include "first.h" 2 3 #undef NDEBUG 4 #include <assert.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 #include "buffer.c" 9 10 static void run_buffer_path_simplify(buffer *psrc, buffer *pdest, const char *in, size_t in_len, const char *out, size_t out_len) { 11 buffer_copy_string_len(psrc, in, in_len); 12 pdest = psrc; /*(buffer_path_simplify() now takes only one arg)*/ 13 14 buffer_path_simplify(pdest); 15 16 if (!buffer_eq_slen(pdest, out, out_len)) { 17 fprintf(stderr, 18 "%s.%d: buffer_path_simplify('%s') failed: expected '%s', got '%s'\n", 19 __FILE__, 20 __LINE__, 21 in, 22 out, 23 pdest->ptr); 24 fflush(stderr); 25 abort(); 26 } else { 27 buffer_path_simplify(pdest); 28 29 if (!buffer_eq_slen(pdest, out, out_len)) { 30 fprintf(stderr, 31 "%s.%d: buffer_path_simplify('%s') failed - not idempotent: expected '%s', got '%s'\n", 32 __FILE__, 33 __LINE__, 34 in, 35 out, 36 pdest->ptr); 37 fflush(stderr); 38 abort(); 39 } 40 } 41 } 42 43 static void test_buffer_path_simplify_with(buffer *psrc, buffer *pdest) { 44 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(""), CONST_STR_LEN("")); 45 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/"), CONST_STR_LEN("/")); 46 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("//"), CONST_STR_LEN("/")); 47 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc"), CONST_STR_LEN("abc")); 48 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc//"), CONST_STR_LEN("abc/")); 49 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz"), CONST_STR_LEN("abc/xyz")); 50 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/.//xyz"), CONST_STR_LEN("abc/xyz")); 51 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz"), CONST_STR_LEN("/xyz")); 52 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz"), CONST_STR_LEN("/abc/xyz")); 53 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc//./xyz"), CONST_STR_LEN("/abc/xyz")); 54 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz"), CONST_STR_LEN("/xyz")); 55 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz/."), CONST_STR_LEN("/xyz/")); 56 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz/."), CONST_STR_LEN("/xyz/")); 57 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz/.."), CONST_STR_LEN("abc/")); 58 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz/.."), CONST_STR_LEN("/abc/")); 59 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("."), CONST_STR_LEN("")); 60 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".."), CONST_STR_LEN("")); 61 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("..."), CONST_STR_LEN("...")); 62 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("...."), CONST_STR_LEN("....")); 63 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".../"), CONST_STR_LEN(".../")); 64 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("./xyz/.."), CONST_STR_LEN("/")); 65 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".//xyz/.."), CONST_STR_LEN("/")); 66 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/./xyz/.."), CONST_STR_LEN("/")); 67 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".././xyz/.."), CONST_STR_LEN("/")); 68 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/.././xyz/.."), CONST_STR_LEN("/")); 69 } 70 71 static void test_buffer_path_simplify(void) { 72 buffer *psrc = buffer_init(); 73 74 /* test with using the same buffer and with using different buffers */ 75 test_buffer_path_simplify_with(psrc, psrc); 76 77 buffer_free(psrc); 78 } 79 80 static void test_buffer_to_lower_upper(void) { 81 buffer *psrc = buffer_init(); 82 83 buffer_copy_string_len(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")); 84 buffer_to_lower(psrc); 85 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"))); 86 buffer_to_upper(psrc); 87 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))); 88 buffer_to_upper(psrc); 89 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))); 90 buffer_to_lower(psrc); 91 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"))); 92 93 buffer_free(psrc); 94 } 95 96 static void test_buffer_string_space(void) { 97 buffer *b = buffer_init(); 98 size_t space; 99 100 space = buffer_string_space(b); 101 assert(0 == space); 102 buffer_copy_string_len(b, CONST_STR_LEN("")); 103 space = buffer_string_space(b); 104 assert(space > 0); 105 assert(space + buffer_string_length(b) == b->size - 1); 106 buffer_commit(b, b->size - 1); 107 assert(b->used == b->size); 108 space = buffer_string_space(b); 109 assert(0 == space); 110 111 buffer_free(b); 112 } 113 114 static void test_buffer_append_path_len(void) { 115 buffer *b = buffer_init(); 116 117 buffer_append_path_len(b, CONST_STR_LEN("a")); 118 assert(buffer_eq_slen(b, CONST_STR_LEN("/a"))); 119 buffer_clear(b); 120 buffer_append_path_len(b, CONST_STR_LEN("a")); 121 assert(buffer_eq_slen(b, CONST_STR_LEN("/a"))); 122 buffer_clear(b); 123 buffer_append_path_len(b, CONST_STR_LEN("/a")); 124 assert(buffer_eq_slen(b, CONST_STR_LEN("/a"))); 125 buffer_copy_string_len(b, CONST_STR_LEN("/")); 126 buffer_append_path_len(b, CONST_STR_LEN("a")); 127 assert(buffer_eq_slen(b, CONST_STR_LEN("/a"))); 128 buffer_copy_string_len(b, CONST_STR_LEN("/")); 129 buffer_append_path_len(b, CONST_STR_LEN("/a")); 130 assert(buffer_eq_slen(b, CONST_STR_LEN("/a"))); 131 buffer_copy_string_len(b, CONST_STR_LEN("a")); 132 buffer_append_path_len(b, CONST_STR_LEN("a")); 133 assert(buffer_eq_slen(b, CONST_STR_LEN("a/a"))); 134 buffer_copy_string_len(b, CONST_STR_LEN("a/")); 135 buffer_append_path_len(b, CONST_STR_LEN("a")); 136 assert(buffer_eq_slen(b, CONST_STR_LEN("a/a"))); 137 buffer_copy_string_len(b, CONST_STR_LEN("a/")); 138 buffer_append_path_len(b, CONST_STR_LEN("/a")); 139 assert(buffer_eq_slen(b, CONST_STR_LEN("a/a"))); 140 buffer_copy_string_len(b, CONST_STR_LEN("/a/")); 141 buffer_append_path_len(b, CONST_STR_LEN("/a")); 142 assert(buffer_eq_slen(b, CONST_STR_LEN("/a/a"))); 143 144 buffer_free(b); 145 } 146 147 static void test_buffer_append_bs_escaped(void) { 148 buffer *b = buffer_init(); 149 150 buffer_append_bs_escaped_json(b, CONST_STR_LEN(" ")); 151 assert(buffer_eq_slen(b, CONST_STR_LEN(" "))); 152 buffer_clear(b); 153 buffer_append_bs_escaped_json(b, CONST_STR_LEN("\0")); 154 assert(buffer_eq_slen(b, CONST_STR_LEN("\\u0000"))); 155 buffer_clear(b); 156 buffer_append_bs_escaped_json(b, CONST_STR_LEN("\1")); 157 assert(buffer_eq_slen(b, CONST_STR_LEN("\\u0001"))); 158 buffer_clear(b); 159 buffer_append_bs_escaped_json(b, CONST_STR_LEN("\n")); 160 assert(buffer_eq_slen(b, CONST_STR_LEN("\\n"))); 161 buffer_clear(b); 162 buffer_append_bs_escaped_json(b, CONST_STR_LEN("é")); 163 assert(buffer_eq_slen(b, CONST_STR_LEN("é"))); 164 buffer_clear(b); 165 buffer_append_bs_escaped_json(b, CONST_STR_LEN("ö")); 166 assert(buffer_eq_slen(b, CONST_STR_LEN("ö"))); 167 168 #if 0 169 buffer_clear(b); 170 magnet_buffer_append_bsdec(b, CONST_STR_LEN("\\u00E9")); 171 assert(buffer_eq_slen(b, CONST_STR_LEN("é"))); 172 buffer_clear(b); 173 magnet_buffer_append_bsdec(b, CONST_STR_LEN("\\u00F6")); 174 assert(buffer_eq_slen(b, CONST_STR_LEN("ö"))); 175 #endif 176 177 /* TODO: more */ 178 179 buffer_free(b); 180 } 181 182 void test_buffer (void); 183 void test_buffer (void) 184 { 185 test_buffer_path_simplify(); 186 test_buffer_to_lower_upper(); 187 test_buffer_string_space(); 188 test_buffer_append_path_len(); 189 test_buffer_append_bs_escaped(); 190 } 191