| /* |
| * |
| * Copyright (C) 2006-2007 Peter Johnson |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "libyasm/file.h" |
| |
| typedef struct Test_Entry { |
| /* splitpath function to test */ |
| size_t (*splitpath) (const char *path, const char **tail); |
| |
| /* input path */ |
| const char *input; |
| |
| /* correct head length returned */ |
| size_t headlen; |
| |
| /* correct tail returned */ |
| const char *tail; |
| } Test_Entry; |
| |
| static Test_Entry tests[] = { |
| /* UNIX split */ |
| {yasm__splitpath_unix, "", 0, ""}, |
| {yasm__splitpath_unix, "./file.ext", 0, "file.ext"}, |
| {yasm__splitpath_unix, "../../file.ext", 5, "file.ext"}, |
| {yasm__splitpath_unix, "file.ext", 0, "file.ext"}, |
| {yasm__splitpath_unix, "/file.ext", 1, "file.ext"}, |
| {yasm__splitpath_unix, "/foo/file.ext", 4, "file.ext"}, |
| {yasm__splitpath_unix, "/foo/bar/file.ext", 8, "file.ext"}, |
| {yasm__splitpath_unix, "foo/file.ext", 3, "file.ext"}, |
| {yasm__splitpath_unix, "foo/bar/file.ext", 7, "file.ext"}, |
| {yasm__splitpath_unix, "foo/bar//file.ext", 7, "file.ext"}, |
| {yasm__splitpath_unix, "/", 1, ""}, |
| {yasm__splitpath_unix, "/foo/", 4, ""}, |
| {yasm__splitpath_unix, "/foo/bar/", 8, ""}, |
| {yasm__splitpath_unix, "foo/", 3, ""}, |
| {yasm__splitpath_unix, "foo/bar/", 7, ""}, |
| {yasm__splitpath_unix, "foo/bar//", 7, ""}, |
| /* Windows split */ |
| {yasm__splitpath_win, "", 0, ""}, |
| {yasm__splitpath_win, "file.ext", 0, "file.ext"}, |
| {yasm__splitpath_win, "./file.ext", 0, "file.ext"}, |
| {yasm__splitpath_win, "/file.ext", 1, "file.ext"}, |
| {yasm__splitpath_win, "/foo/file.ext", 4, "file.ext"}, |
| {yasm__splitpath_win, "/foo/bar/file.ext", 8, "file.ext"}, |
| {yasm__splitpath_win, "foo/file.ext", 3, "file.ext"}, |
| {yasm__splitpath_win, "foo/bar/file.ext", 7, "file.ext"}, |
| {yasm__splitpath_win, "foo/bar//file.ext", 7, "file.ext"}, |
| {yasm__splitpath_win, "..\\..\\file.ext", 5, "file.ext"}, |
| {yasm__splitpath_win, "c:file.ext", 2, "file.ext"}, |
| {yasm__splitpath_win, "c:.\\file.ext", 2, "file.ext"}, |
| {yasm__splitpath_win, "d:/file.ext", 3, "file.ext"}, |
| {yasm__splitpath_win, "e:/foo/file.ext", 6, "file.ext"}, |
| {yasm__splitpath_win, "f:/foo/bar/file.ext", 10, "file.ext"}, |
| {yasm__splitpath_win, "g:foo/file.ext", 5, "file.ext"}, |
| {yasm__splitpath_win, "h:foo/bar/file.ext", 9, "file.ext"}, |
| {yasm__splitpath_win, "i:foo/bar//file.ext", 9, "file.ext"}, |
| {yasm__splitpath_win, "d:\\file.ext", 3, "file.ext"}, |
| {yasm__splitpath_win, "e:\\foo/file.ext", 6, "file.ext"}, |
| {yasm__splitpath_win, "f:/foo\\bar\\file.ext", 10, "file.ext"}, |
| {yasm__splitpath_win, "g:foo\\file.ext", 5, "file.ext"}, |
| {yasm__splitpath_win, "h:foo/bar\\file.ext", 9, "file.ext"}, |
| {yasm__splitpath_win, "i:foo\\bar//\\file.ext", 9, "file.ext"}, |
| {yasm__splitpath_win, "\\", 1, ""}, |
| {yasm__splitpath_win, "c:", 2, ""}, |
| {yasm__splitpath_win, "d:\\", 3, ""}, |
| {yasm__splitpath_win, "e:\\foo/", 6, ""}, |
| {yasm__splitpath_win, "f:/foo\\bar\\", 10, ""}, |
| {yasm__splitpath_win, "g:foo\\", 5, ""}, |
| {yasm__splitpath_win, "h:foo/bar\\", 9, ""}, |
| {yasm__splitpath_win, "i:foo\\bar//\\", 9, ""}, |
| }; |
| |
| static char failed[1000]; |
| static char failmsg[100]; |
| |
| static int |
| run_test(Test_Entry *test) |
| { |
| size_t headlen; |
| const char *tail; |
| const char *funcname; |
| |
| if (test->splitpath == &yasm__splitpath_unix) |
| funcname = "unix"; |
| else |
| funcname = "win"; |
| |
| headlen = test->splitpath(test->input, &tail); |
| if (headlen != test->headlen) { |
| sprintf(failmsg, |
| "splitpath_%s(\"%s\") bad head len: expected %lu, got %lu!", |
| funcname, test->input, (unsigned long)test->headlen, |
| (unsigned long)headlen); |
| return 1; |
| } |
| |
| if (strcmp(tail, test->tail) != 0) { |
| sprintf(failmsg, |
| "splitpath_%s(\"%s\") bad tail: expected \"%s\", got \"%s\"!", |
| funcname, test->input, test->tail, tail); |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| int |
| main(void) |
| { |
| int nf = 0; |
| int numtests = sizeof(tests)/sizeof(Test_Entry); |
| int i; |
| |
| failed[0] = '\0'; |
| printf("Test splitpath_test: "); |
| for (i=0; i<numtests; i++) { |
| int fail = run_test(&tests[i]); |
| printf("%c", fail>0 ? 'F':'.'); |
| fflush(stdout); |
| if (fail) |
| sprintf(failed, "%s ** F: %s\n", failed, failmsg); |
| nf += fail; |
| } |
| |
| printf(" +%d-%d/%d %d%%\n%s", |
| numtests-nf, nf, numtests, 100*(numtests-nf)/numtests, failed); |
| return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE; |
| } |