//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

// UNSUPPORTED: c++03

// <filesystem>

// path proximate(const path& p, error_code &ec)
// path proximate(const path& p, const path& base = current_path())
// path proximate(const path& p, const path& base, error_code& ec);

#include "filesystem_include.h"
#include <string>
#include <type_traits>
#include <cassert>

#include "test_macros.h"
#include "test_iterators.h"
#include "count_new.h"
#include "filesystem_test_helper.h"


static void test_signature_0() {
  fs::path p("");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(fs::current_path()));
}

static void test_signature_1() {
  fs::path p(".");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(fs::current_path()));
}

static void test_signature_2() {
  static_test_env static_env;
  fs::path p(static_env.File);
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.File));
}

static void test_signature_3() {
  static_test_env static_env;
  fs::path p(static_env.Dir);
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir));
}

static void test_signature_4() {
  static_test_env static_env;
  fs::path p(static_env.SymlinkToDir);
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir));
}

static void test_signature_5() {
  static_test_env static_env;
  fs::path p(static_env.SymlinkToDir / "dir2/.");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir / "dir2"));
}

static void test_signature_6() {
  static_test_env static_env;
  // FIXME? If the trailing separator occurs in a part of the path that exists,
  // it is omitted. Otherwise it is added to the end of the result.
  fs::path p(static_env.SymlinkToDir / "dir2/./");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir / "dir2"));
}

static void test_signature_7() {
  static_test_env static_env;
  fs::path p(static_env.SymlinkToDir / "dir2/DNE/./");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir / "dir2/DNE/"));
}

static void test_signature_8() {
  static_test_env static_env;
  fs::path p(static_env.SymlinkToDir / "dir2");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir2));
}

static void test_signature_9() {
  static_test_env static_env;
  fs::path p(static_env.SymlinkToDir / "dir2/../dir2/DNE/..");
  const fs::path output = fs::weakly_canonical(p);
  // weakly_canonical has a quirk - if the path is considered to exist,
  // it's returned without a trailing slash, otherwise it's returned with
  // one (see a note in fs.op.weakly_canonical/weakly_canonical.pass.cpp).
  // On Windows, a path like existent/nonexistentsubdir/.. is considered
  // to exist, on posix it's considered to not exist. Therefore, the
  // result here differs in the trailing slash.
#ifdef _WIN32
  assert(output == fs::path::string_type(static_env.Dir2));
#else
  assert(output == fs::path::string_type(static_env.Dir2 / ""));
#endif
}

static void test_signature_10() {
  static_test_env static_env;
  fs::path p(static_env.SymlinkToDir / "dir2/dir3/../DNE/DNE2");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir2 / "DNE/DNE2"));
}

static void test_signature_11() {
  static_test_env static_env;
  fs::path p(static_env.Dir / "../dir1");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir));
}

static void test_signature_12() {
  static_test_env static_env;
  fs::path p(static_env.Dir / "./.");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir));
}

static void test_signature_13() {
  static_test_env static_env;
  fs::path p(static_env.Dir / "DNE/../foo");
  const fs::path output = fs::weakly_canonical(p);
  assert(output == fs::path::string_type(static_env.Dir / "foo"));
}

int main(int, char**) {
  test_signature_0();
  test_signature_1();
  test_signature_2();
  test_signature_3();
  test_signature_4();
  test_signature_5();
  test_signature_6();
  test_signature_7();
  test_signature_8();
  test_signature_9();
  test_signature_10();
  test_signature_11();
  test_signature_12();
  test_signature_13();

  return 0;
}
