|
Packit |
fd8b60 |
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
Packit |
fd8b60 |
/* util/support/t_path.c - Path manipulation tests */
|
|
Packit |
fd8b60 |
/*
|
|
Packit |
fd8b60 |
* Copyright (C) 2011 by the Massachusetts Institute of Technology.
|
|
Packit |
fd8b60 |
* All rights reserved.
|
|
Packit |
fd8b60 |
*
|
|
Packit |
fd8b60 |
* Export of this software from the United States of America may
|
|
Packit |
fd8b60 |
* require a specific license from the United States Government.
|
|
Packit |
fd8b60 |
* It is the responsibility of any person or organization contemplating
|
|
Packit |
fd8b60 |
* export to obtain such a license before exporting.
|
|
Packit |
fd8b60 |
*
|
|
Packit |
fd8b60 |
* WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
|
|
Packit |
fd8b60 |
* distribute this software and its documentation for any purpose and
|
|
Packit |
fd8b60 |
* without fee is hereby granted, provided that the above copyright
|
|
Packit |
fd8b60 |
* notice appear in all copies and that both that copyright notice and
|
|
Packit |
fd8b60 |
* this permission notice appear in supporting documentation, and that
|
|
Packit |
fd8b60 |
* the name of M.I.T. not be used in advertising or publicity pertaining
|
|
Packit |
fd8b60 |
* to distribution of the software without specific, written prior
|
|
Packit |
fd8b60 |
* permission. Furthermore if you modify this software you must label
|
|
Packit |
fd8b60 |
* your software as modified software and not distribute it in such a
|
|
Packit |
fd8b60 |
* fashion that it might be confused with the original M.I.T. software.
|
|
Packit |
fd8b60 |
* M.I.T. makes no representations about the suitability of
|
|
Packit |
fd8b60 |
* this software for any purpose. It is provided "as is" without express
|
|
Packit |
fd8b60 |
* or implied warranty.
|
|
Packit |
fd8b60 |
*/
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
#include <k5-platform.h>
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
/* For testing purposes, use a different symbol for Windows path semantics. */
|
|
Packit |
fd8b60 |
#ifdef _WIN32
|
|
Packit |
fd8b60 |
#define WINDOWS_PATHS
|
|
Packit |
fd8b60 |
#endif
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
/*
|
|
Packit |
fd8b60 |
* The ultimate arbiter of these tests is the dirname, basename, and isabs
|
|
Packit |
fd8b60 |
* methods of the Python posixpath and ntpath modules.
|
|
Packit |
fd8b60 |
*/
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
struct {
|
|
Packit |
fd8b60 |
const char *path;
|
|
Packit |
fd8b60 |
const char *posix_dirname;
|
|
Packit |
fd8b60 |
const char *posix_basename;
|
|
Packit |
fd8b60 |
const char *win_dirname;
|
|
Packit |
fd8b60 |
const char *win_basename;
|
|
Packit |
fd8b60 |
} split_tests[] = {
|
|
Packit |
fd8b60 |
{ "", "", "", "", "" },
|
|
Packit |
fd8b60 |
{ "a/b/c", "a/b", "c", "a/b", "c" },
|
|
Packit |
fd8b60 |
{ "a/b/", "a/b", "", "a/b", "" },
|
|
Packit |
fd8b60 |
{ "a\\b\\c", "", "a\\b\\c", "a\\b", "c" },
|
|
Packit |
fd8b60 |
{ "a\\b\\", "", "a\\b\\", "a\\b", "" },
|
|
Packit |
fd8b60 |
{ "a/b\\c", "a", "b\\c", "a/b", "c" },
|
|
Packit |
fd8b60 |
{ "a//b", "a", "b", "a", "b" },
|
|
Packit |
fd8b60 |
{ "a/\\/b", "a/\\", "b", "a", "b" },
|
|
Packit |
fd8b60 |
{ "a//b/c", "a//b", "c", "a//b", "c" },
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
{ "/", "/", "", "/", "" },
|
|
Packit |
fd8b60 |
{ "\\", "", "\\", "\\", "" },
|
|
Packit |
fd8b60 |
{ "/a/b/c", "/a/b", "c", "/a/b", "c" },
|
|
Packit |
fd8b60 |
{ "\\a/b/c", "\\a/b", "c", "\\a/b", "c" },
|
|
Packit |
fd8b60 |
{ "/a", "/", "a", "/", "a" },
|
|
Packit |
fd8b60 |
{ "//a", "//", "a", "//", "a" },
|
|
Packit |
fd8b60 |
{ "\\//\\a", "\\", "\\a", "\\//\\", "a" },
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
{ "/:", "/", ":", "/:", "" },
|
|
Packit |
fd8b60 |
{ "c:\\", "", "c:\\", "c:\\", "" },
|
|
Packit |
fd8b60 |
{ "c:/", "c:", "", "c:/", "" },
|
|
Packit |
fd8b60 |
{ "c:/\\a", "c:", "\\a", "c:/\\", "a" },
|
|
Packit |
fd8b60 |
{ "c:a", "", "c:a", "c:", "a" },
|
|
Packit |
fd8b60 |
};
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
struct {
|
|
Packit |
fd8b60 |
const char *path1;
|
|
Packit |
fd8b60 |
const char *path2;
|
|
Packit |
fd8b60 |
const char *posix_result;
|
|
Packit |
fd8b60 |
const char *win_result;
|
|
Packit |
fd8b60 |
} join_tests[] = {
|
|
Packit |
fd8b60 |
{ "", "", "", "" },
|
|
Packit |
fd8b60 |
{ "", "a", "a", "a" },
|
|
Packit |
fd8b60 |
{ "", "/a", "/a", "/a" },
|
|
Packit |
fd8b60 |
{ "", "c:", "c:", "c:" },
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
{ "a", "", "a/", "a\\" },
|
|
Packit |
fd8b60 |
{ "a/", "", "a/", "a/" },
|
|
Packit |
fd8b60 |
{ "a\\", "", "a\\/", "a\\" },
|
|
Packit |
fd8b60 |
{ "a/\\", "", "a/\\/", "a/\\" },
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
{ "a", "b", "a/b", "a\\b" },
|
|
Packit |
fd8b60 |
{ "a", "/b", "/b", "/b" },
|
|
Packit |
fd8b60 |
{ "a", "c:", "a/c:", "a\\c:" },
|
|
Packit |
fd8b60 |
{ "a", "c:/", "a/c:/", "c:/" },
|
|
Packit |
fd8b60 |
{ "a", "c:/a", "a/c:/a", "c:/a" },
|
|
Packit |
fd8b60 |
{ "a", "/:", "/:", "a/:" },
|
|
Packit |
fd8b60 |
{ "a/", "b", "a/b", "a/b" },
|
|
Packit |
fd8b60 |
{ "a/", "", "a/", "a/" },
|
|
Packit |
fd8b60 |
{ "a\\", "b", "a\\/b", "a\\b" },
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
{ "a//", "b", "a//b", "a//b" },
|
|
Packit |
fd8b60 |
{ "a/\\", "b", "a/\\/b", "a/\\b" },
|
|
Packit |
fd8b60 |
};
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
struct {
|
|
Packit |
fd8b60 |
const char *path;
|
|
Packit |
fd8b60 |
int posix_result;
|
|
Packit |
fd8b60 |
int win_result;
|
|
Packit |
fd8b60 |
} isabs_tests[] = {
|
|
Packit |
fd8b60 |
{ "", 0, 0 },
|
|
Packit |
fd8b60 |
{ "/", 1, 1 },
|
|
Packit |
fd8b60 |
{ "/a", 1, 1 },
|
|
Packit |
fd8b60 |
{ "a/b", 0, 0 },
|
|
Packit |
fd8b60 |
{ "\\", 0, 1 },
|
|
Packit |
fd8b60 |
{ "\\a", 0, 1 },
|
|
Packit |
fd8b60 |
{ "c:", 0, 0 },
|
|
Packit |
fd8b60 |
{ "/:", 1, 0 },
|
|
Packit |
fd8b60 |
{ "\\:", 0, 0 },
|
|
Packit |
fd8b60 |
{ "c:/a", 0, 1 },
|
|
Packit |
fd8b60 |
{ "c:\\a", 0, 1 },
|
|
Packit |
fd8b60 |
{ "c:a", 0, 0 },
|
|
Packit |
fd8b60 |
{ "c:a/b", 0, 0 },
|
|
Packit |
fd8b60 |
{ "/:a/b", 1, 0 },
|
|
Packit |
fd8b60 |
};
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
int
|
|
Packit |
fd8b60 |
main(void)
|
|
Packit |
fd8b60 |
{
|
|
Packit |
fd8b60 |
char *dirname, *basename, *joined;
|
|
Packit |
fd8b60 |
const char *edirname, *ebasename, *ejoined, *ipath, *path1, *path2;
|
|
Packit |
fd8b60 |
int result, eresult, status = 0;
|
|
Packit |
fd8b60 |
size_t i;
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
for (i = 0; i < sizeof(split_tests) / sizeof(*split_tests); i++) {
|
|
Packit |
fd8b60 |
ipath = split_tests[i].path;
|
|
Packit |
fd8b60 |
#ifdef WINDOWS_PATHS
|
|
Packit |
fd8b60 |
edirname = split_tests[i].win_dirname;
|
|
Packit |
fd8b60 |
ebasename = split_tests[i].win_basename;
|
|
Packit |
fd8b60 |
#else
|
|
Packit |
fd8b60 |
edirname = split_tests[i].posix_dirname;
|
|
Packit |
fd8b60 |
ebasename = split_tests[i].posix_basename;
|
|
Packit |
fd8b60 |
#endif
|
|
Packit |
fd8b60 |
if (k5_path_split(ipath, NULL, NULL) != 0)
|
|
Packit |
fd8b60 |
abort();
|
|
Packit |
fd8b60 |
if (k5_path_split(ipath, &dirname, NULL) != 0)
|
|
Packit |
fd8b60 |
abort();
|
|
Packit |
fd8b60 |
free(dirname);
|
|
Packit |
fd8b60 |
if (k5_path_split(ipath, NULL, &basename) != 0)
|
|
Packit |
fd8b60 |
abort();
|
|
Packit |
fd8b60 |
free(basename);
|
|
Packit |
fd8b60 |
if (k5_path_split(ipath, &dirname, &basename) != 0)
|
|
Packit |
fd8b60 |
abort();
|
|
Packit |
fd8b60 |
if (strcmp(dirname, edirname) != 0) {
|
|
Packit |
fd8b60 |
fprintf(stderr, "Split test %d: dirname %s != expected %s\n",
|
|
Packit |
fd8b60 |
(int)i, dirname, edirname);
|
|
Packit |
fd8b60 |
status = 1;
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
if (strcmp(basename, ebasename) != 0) {
|
|
Packit |
fd8b60 |
fprintf(stderr, "Split test %d: basename %s != expected %s\n",
|
|
Packit |
fd8b60 |
(int)i, basename, ebasename);
|
|
Packit |
fd8b60 |
status = 1;
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
free(dirname);
|
|
Packit |
fd8b60 |
free(basename);
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
for (i = 0; i < sizeof(join_tests) / sizeof(*join_tests); i++) {
|
|
Packit |
fd8b60 |
path1 = join_tests[i].path1;
|
|
Packit |
fd8b60 |
path2 = join_tests[i].path2;
|
|
Packit |
fd8b60 |
#ifdef WINDOWS_PATHS
|
|
Packit |
fd8b60 |
ejoined = join_tests[i].win_result;
|
|
Packit |
fd8b60 |
#else
|
|
Packit |
fd8b60 |
ejoined = join_tests[i].posix_result;
|
|
Packit |
fd8b60 |
#endif
|
|
Packit |
fd8b60 |
if (k5_path_join(path1, path2, &joined) != 0)
|
|
Packit |
fd8b60 |
abort();
|
|
Packit |
fd8b60 |
if (strcmp(joined, ejoined) != 0) {
|
|
Packit |
fd8b60 |
fprintf(stderr, "Join test %d: %s != expected %s\n",
|
|
Packit |
fd8b60 |
(int)i, joined, ejoined);
|
|
Packit |
fd8b60 |
status = 1;
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
free(joined);
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
for (i = 0; i < sizeof(isabs_tests) / sizeof(*isabs_tests); i++) {
|
|
Packit |
fd8b60 |
#ifdef WINDOWS_PATHS
|
|
Packit |
fd8b60 |
eresult = isabs_tests[i].win_result;
|
|
Packit |
fd8b60 |
#else
|
|
Packit |
fd8b60 |
eresult = isabs_tests[i].posix_result;
|
|
Packit |
fd8b60 |
#endif
|
|
Packit |
fd8b60 |
result = k5_path_isabs(isabs_tests[i].path);
|
|
Packit |
fd8b60 |
if (result != eresult) {
|
|
Packit |
fd8b60 |
fprintf(stderr, "isabs test %d: %d != expected %d\n",
|
|
Packit |
fd8b60 |
(int)i, result, eresult);
|
|
Packit |
fd8b60 |
status = 1;
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
}
|
|
Packit |
fd8b60 |
|
|
Packit |
fd8b60 |
return status;
|
|
Packit |
fd8b60 |
}
|