123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- //===----------------------------------------------------------------------===//
- //
- // The LLVM Compiler Infrastructure
- //
- // This file is dual licensed under the MIT and the University of Illinois Open
- // Source Licenses. See LICENSE.TXT for details.
- //
- //===----------------------------------------------------------------------===//
- // UNSUPPORTED: c++98, c++03
- // <experimental/filesystem>
- // class path
- // int compare(path const&) const noexcept;
- // int compare(string_type const&) const;
- // int compare(value_type const*) const;
- //
- // bool operator==(path const&, path const&) noexcept;
- // bool operator!=(path const&, path const&) noexcept;
- // bool operator< (path const&, path const&) noexcept;
- // bool operator<=(path const&, path const&) noexcept;
- // bool operator> (path const&, path const&) noexcept;
- // bool operator>=(path const&, path const&) noexcept;
- //
- // size_t hash_value(path const&) noexcept;
- #include "filesystem_include.hpp"
- #include <type_traits>
- #include <vector>
- #include <cassert>
- #include "test_macros.h"
- #include "test_iterators.h"
- #include "count_new.hpp"
- #include "filesystem_test_helper.hpp"
- struct PathCompareTest {
- const char* LHS;
- const char* RHS;
- int expect;
- };
- #define LONGA "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
- #define LONGB "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
- #define LONGC "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
- #define LONGD "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"
- const PathCompareTest CompareTestCases[] =
- {
- {"", "", 0},
- {"a", "", 1},
- {"", "a", -1},
- {"a/b/c", "a/b/c", 0},
- {"b/a/c", "a/b/c", 1},
- {"a/b/c", "b/a/c", -1},
- {"a/b", "a/b/c", -1},
- {"a/b/c", "a/b", 1},
- {"a/b/", "a/b/.", 0},
- {"a/b//////", "a/b/////.", 0},
- {"a/.././b", "a///..//.////b", 0},
- {"//foo//bar///baz////", "//foo/bar/baz/", 0}, // duplicate separators
- {"///foo/bar", "/foo/bar", 0}, // "///" is not a root directory
- {"/foo/bar/", "/foo/bar", 1}, // trailing separator
- {"//" LONGA "////" LONGB "/" LONGC "///" LONGD, "//" LONGA "/" LONGB "/" LONGC "/" LONGD, 0},
- { LONGA "/" LONGB "/" LONGC, LONGA "/" LONGB "/" LONGB, 1}
- };
- #undef LONGA
- #undef LONGB
- #undef LONGC
- #undef LONGD
- static inline int normalize_ret(int ret)
- {
- return ret < 0 ? -1 : (ret > 0 ? 1 : 0);
- }
- int main()
- {
- using namespace fs;
- for (auto const & TC : CompareTestCases) {
- const path p1(TC.LHS);
- const path p2(TC.RHS);
- const std::string R(TC.RHS);
- const std::string_view RV(TC.RHS);
- const int E = TC.expect;
- { // compare(...) functions
- DisableAllocationGuard g; // none of these operations should allocate
- // check runtime results
- int ret1 = normalize_ret(p1.compare(p2));
- int ret2 = normalize_ret(p1.compare(R));
- int ret3 = normalize_ret(p1.compare(TC.RHS));
- int ret4 = normalize_ret(p1.compare(RV));
- assert(ret1 == ret2 && ret1 == ret3 && ret1 == ret4);
- assert(ret1 == E);
- // check signatures
- ASSERT_NOEXCEPT(p1.compare(p2));
- }
- { // comparison operators
- DisableAllocationGuard g; // none of these operations should allocate
- // Check runtime result
- assert((p1 == p2) == (E == 0));
- assert((p1 != p2) == (E != 0));
- assert((p1 < p2) == (E < 0));
- assert((p1 <= p2) == (E <= 0));
- assert((p1 > p2) == (E > 0));
- assert((p1 >= p2) == (E >= 0));
- // Check signatures
- ASSERT_NOEXCEPT(p1 == p2);
- ASSERT_NOEXCEPT(p1 != p2);
- ASSERT_NOEXCEPT(p1 < p2);
- ASSERT_NOEXCEPT(p1 <= p2);
- ASSERT_NOEXCEPT(p1 > p2);
- ASSERT_NOEXCEPT(p1 >= p2);
- }
- { // check hash values
- auto h1 = hash_value(p1);
- auto h2 = hash_value(p2);
- assert((h1 == h2) == (p1 == p2));
- // check signature
- ASSERT_SAME_TYPE(size_t, decltype(hash_value(p1)));
- ASSERT_NOEXCEPT(hash_value(p1));
- }
- }
- }
|