1 #include "first.h" 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 #include "buffer.h" 7 8 static void run_buffer_path_simplify(buffer *psrc, buffer *pdest, const char *in, size_t in_len, const char *out, size_t out_len) { 9 buffer_copy_string_len(psrc, in, in_len); 10 11 buffer_path_simplify(pdest, psrc); 12 13 if (!buffer_is_equal_string(pdest, out, out_len)) { 14 fprintf(stderr, 15 "%s.%d: buffer_path_simplify('%s') failed: expected '%s', got '%s'\n", 16 __FILE__, 17 __LINE__, 18 in, 19 out, 20 pdest->ptr ? pdest->ptr : ""); 21 fflush(stderr); 22 abort(); 23 } else { 24 #if 0 25 fprintf(stdout, 26 "%s.%d: buffer_path_simplify('%s') succeeded: got '%s'\n", 27 __FILE__, 28 __LINE__, 29 in, 30 out); 31 #endif 32 33 if (psrc != pdest) buffer_copy_buffer(psrc, pdest); 34 buffer_path_simplify(pdest, psrc); 35 36 if (!buffer_is_equal_string(pdest, out, out_len)) { 37 fprintf(stderr, 38 "%s.%d: buffer_path_simplify('%s') failed - not idempotent: expected '%s', got '%s'\n", 39 __FILE__, 40 __LINE__, 41 out, 42 out, 43 pdest->ptr ? pdest->ptr : ""); 44 fflush(stderr); 45 abort(); 46 } 47 } 48 } 49 50 static void test_buffer_path_simplify_with(buffer *psrc, buffer *pdest) { 51 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(""), CONST_STR_LEN("")); 52 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(" "), CONST_STR_LEN("/")); 53 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/"), CONST_STR_LEN("/")); 54 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("//"), CONST_STR_LEN("/")); 55 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc"), CONST_STR_LEN("/abc")); 56 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc//"), CONST_STR_LEN("/abc/")); 57 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz"), CONST_STR_LEN("/abc/xyz")); 58 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/.//xyz"), CONST_STR_LEN("/abc/xyz")); 59 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz"), CONST_STR_LEN("/xyz")); 60 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz"), CONST_STR_LEN("/abc/xyz")); 61 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc//./xyz"), CONST_STR_LEN("/abc/xyz")); 62 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz"), CONST_STR_LEN("/xyz")); 63 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/../xyz/."), CONST_STR_LEN("/xyz/")); 64 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/../xyz/."), CONST_STR_LEN("/xyz/")); 65 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("abc/./xyz/.."), CONST_STR_LEN("/abc/")); 66 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/abc/./xyz/.."), CONST_STR_LEN("/abc/")); 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 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/./xyz/.."), CONST_STR_LEN("/")); 70 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN(".././xyz/.."), CONST_STR_LEN("/")); 71 run_buffer_path_simplify(psrc, pdest, CONST_STR_LEN("/.././xyz/.."), CONST_STR_LEN("/")); 72 } 73 74 static void test_buffer_path_simplify(void) { 75 buffer *psrc = buffer_init(); 76 buffer *pdest = buffer_init(); 77 78 /* test with using the same buffer and with using different buffers */ 79 test_buffer_path_simplify_with(psrc, psrc); 80 test_buffer_path_simplify_with(pdest, psrc); 81 82 buffer_free(psrc); 83 buffer_free(pdest); 84 } 85 86 int main() { 87 test_buffer_path_simplify(); 88 89 return 0; 90 } 91