/* test_path.cc - Test path functionality part of the minizip-ng project Copyright (C) Nathan Moinvaziri https://github.com/zlib-ng/minizip-ng This program is distributed under the terms of the same license as zlib. See the accompanying LICENSE file for the full text of the license. */ #include "mz.h" #include "mz_os.h" #include #include struct resolve_path_param { const char *path; const char *expected_path; friend std::ostream &operator<<(std::ostream &os, const resolve_path_param ¶m) { return os << "path: " << param.path; } }; constexpr resolve_path_param resolve_path_tests[] = { { "c:\\test\\.", "c:\\test\\"}, { "c:\\test\\.\\", "c:\\test\\"}, { "c:\\test\\.\\.", "c:\\test\\"}, { "c:\\test\\..", "c:\\"}, { "c:\\test\\..\\", "c:\\"}, { "c:\\test\\.\\..", "c:\\"}, { "c:\\test\\.\\\\..", "c:\\"}, { ".", "."}, { ".\\", ""}, { "..", ""}, { "..\\", ""}, { ".\\test\\123", "test\\123"}, { ".\\..\\test\\123", "test\\123"}, { "..\\..\\test\\123", "test\\123"}, { "test\\.abc.txt", "test\\.abc.txt"}, { "c:\\test\\123\\.\\abc.txt", "c:\\test\\123\\abc.txt"}, { "c:\\test\\123\\..\\abc.txt", "c:\\test\\abc.txt"}, { "c:\\test\\123\\..\\..\\abc.txt", "c:\\abc.txt"}, {"c:\\test\\123\\..\\..\\..\\abc.txt", "abc.txt"}, { "c:\\test\\123\\..\\.\\..\\abc.txt", "c:\\abc.txt"}, }; class path_resolve : public ::testing::TestWithParam {}; INSTANTIATE_TEST_SUITE_P(os, path_resolve, testing::ValuesIn(resolve_path_tests)); TEST_P(path_resolve, os) { const auto ¶m = GetParam(); std::string path = param.path; std::string expected_path = param.expected_path; char output[256]; memset(output, 'z', sizeof(output)); // archiving and unarchiving data on a system should preserve its structure if (!mz_os_is_dir_separator('\\')) { std::replace(path.begin(), path.end(), '\\', '/'); std::replace(expected_path.begin(), expected_path.end(), '\\', '/'); } mz_path_resolve(path.c_str(), output, sizeof(output)); EXPECT_STREQ(output, expected_path.c_str()); }