1 #include "first.h" 2 3 #undef NDEBUG 4 #include <assert.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 8 #include "buffer.h" 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 13 buffer_path_simplify(pdest, psrc); 14 15 if (!buffer_eq_slen(pdest, out, out_len)) { 16 fprintf(stderr, 17 "%s.%d: buffer_path_simplify('%s') failed: expected '%s', got '%s'\n", 18 __FILE__, 19 __LINE__, 20 in, 21 out, 22 pdest->ptr ? pdest->ptr : ""); 23 fflush(stderr); 24 abort(); 25 } else { 26 if (psrc != pdest) buffer_copy_buffer(psrc, pdest); 27 buffer_path_simplify(pdest, psrc); 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 ? 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 buffer *pdest = buffer_init(); 74 75 /* test with using the same buffer and with using different buffers */ 76 test_buffer_path_simplify_with(psrc, psrc); 77 test_buffer_path_simplify_with(pdest, psrc); 78 79 buffer_free(psrc); 80 buffer_free(pdest); 81 } 82 83 static void test_buffer_to_lower_upper(void) { 84 buffer *psrc = buffer_init(); 85 86 buffer_copy_string_len(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz")); 87 buffer_to_lower(psrc); 88 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"))); 89 buffer_to_upper(psrc); 90 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))); 91 buffer_to_upper(psrc); 92 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"))); 93 buffer_to_lower(psrc); 94 assert(buffer_eq_slen(psrc, CONST_STR_LEN("0123456789abcdefghijklmnopqrstuvwxyz"))); 95 96 buffer_free(psrc); 97 } 98 99 static void test_buffer_string_space(void) { 100 buffer *b = buffer_init(); 101 size_t space; 102 103 space = buffer_string_space(b); 104 assert(0 == space); 105 buffer_copy_string_len(b, CONST_STR_LEN("")); 106 space = buffer_string_space(b); 107 assert(space > 0); 108 assert(space + buffer_string_length(b) == b->size - 1); 109 buffer_commit(b, b->size - 1); 110 assert(b->used == b->size); 111 space = buffer_string_space(b); 112 assert(0 == space); 113 114 buffer_free(b); 115 } 116 117 static void test_buffer_append_path_len(void) { 118 buffer *b = buffer_init(); 119 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_clear(b); 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("/")); 132 buffer_append_path_len(b, CONST_STR_LEN("/a")); 133 assert(buffer_eq_slen(b, CONST_STR_LEN("/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 buffer_copy_string_len(b, CONST_STR_LEN("/a/")); 144 buffer_append_path_len(b, CONST_STR_LEN("/a")); 145 assert(buffer_eq_slen(b, CONST_STR_LEN("/a/a"))); 146 147 buffer_free(b); 148 } 149 150 int main() { 151 test_buffer_path_simplify(); 152 test_buffer_to_lower_upper(); 153 test_buffer_string_space(); 154 test_buffer_append_path_len(); 155 156 return 0; 157 } 158