// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "gn/source_dir.h"
#include "gn/err.h"
#include "gn/source_file.h"
#include "gn/value.h"
#include "util/build_config.h"
#include "util/test/test.h"

TEST(SourceDir, ResolveRelativeFile) {
  Err err;
  SourceDir base("//base/");
#if defined(OS_WIN)
  std::string_view source_root("C:/source/root");
#else
  std::string_view source_root("/source/root");
#endif

  // Empty input is an error.
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, std::string()), &err,
                                       source_root) == SourceFile());
  EXPECT_TRUE(err.has_error());

  // These things are directories, so should be an error.
  err = Err();
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//foo/bar/"), &err,
                                       source_root) == SourceFile());
  EXPECT_TRUE(err.has_error());

  err = Err();
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "bar/"), &err,
                                       source_root) == SourceFile());
  EXPECT_TRUE(err.has_error());

  // Absolute paths should be passed unchanged.
  err = Err();
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//foo"), &err,
                                       source_root) == SourceFile("//foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "/foo"), &err,
                                       source_root) == SourceFile("/foo"));
  EXPECT_SUCCESS(err);

  // Basic relative stuff.
  EXPECT_TRUE(
      base.ResolveRelativeFile(Value(nullptr, "foo"), &err, source_root) ==
      SourceFile("//base/foo"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(
      base.ResolveRelativeFile(Value(nullptr, "./foo"), &err, source_root) ==
      SourceFile("//base/foo"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "../foo"), &err,
                                       source_root) == SourceFile("//foo"));
  EXPECT_SUCCESS(err);

// If the given relative path points outside the source root, we
// expect an absolute path.
#if defined(OS_WIN)
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "../../foo"), &err,
                                       source_root) ==
              SourceFile("/C:/source/foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(
      base.ResolveRelativeFile(Value(nullptr, "//../foo"), &err, source_root) ==
      SourceFile("/C:/source/foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../root/foo"), &err,
                                       source_root) ==
              SourceFile("/C:/source/root/foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../../../foo/bar"),
                                       &err,
                                       source_root) == SourceFile("/foo/bar"));
  EXPECT_SUCCESS(err);
#else
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "../../foo"), &err,
                                       source_root) ==
              SourceFile("/source/foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(
      base.ResolveRelativeFile(Value(nullptr, "//../foo"), &err, source_root) ==
      SourceFile("/source/foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../root/foo"), &err,
                                       source_root) ==
              SourceFile("/source/root/foo"));
  EXPECT_SUCCESS(err);

  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "//../../../foo/bar"),
                                       &err,
                                       source_root) == SourceFile("/foo/bar"));
  EXPECT_SUCCESS(err);
#endif

#if defined(OS_WIN)
  // Note that we don't canonicalize the backslashes to forward slashes.
  // This could potentially be changed in the future which would mean we should
  // just change the expected result.
  EXPECT_TRUE(base.ResolveRelativeFile(Value(nullptr, "C:\\foo\\bar.txt"), &err,
                                       source_root) ==
              SourceFile("/C:/foo/bar.txt"));
  EXPECT_SUCCESS(err);
#endif
}

TEST(SourceDir, ResolveRelativeDir) {
  Err err;
  SourceDir base("//base/");
#if defined(OS_WIN)
  std::string_view source_root("C:/source/root");
#else
  std::string_view source_root("/source/root");
#endif

  // Empty input is an error.
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, std::string()), &err,
                                      source_root) == SourceDir());
  EXPECT_TRUE(err.has_error());

  // Absolute paths should be passed unchanged.
  err = Err();
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "//foo"), &err,
                                      source_root) == SourceDir("//foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "/foo"), &err,
                                      source_root) == SourceDir("/foo/"));
  EXPECT_SUCCESS(err);

  // Basic relative stuff.
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "foo"), &err,
                                      source_root) == SourceDir("//base/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "./foo"), &err,
                                      source_root) == SourceDir("//base/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "../foo"), &err,
                                      source_root) == SourceDir("//foo/"));
  EXPECT_SUCCESS(err);

// If the given relative path points outside the source root, we
// expect an absolute path.
#if defined(OS_WIN)
  EXPECT_TRUE(
      base.ResolveRelativeDir(Value(nullptr, "../../foo"), &err, source_root) ==
      SourceDir("/C:/source/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(
      base.ResolveRelativeDir(Value(nullptr, "//../foo"), &err, source_root) ==
      SourceDir("/C:/source/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "//.."), &err,
                                      source_root) == SourceDir("/C:/source/"));
  EXPECT_SUCCESS(err);
#else
  EXPECT_TRUE(
      base.ResolveRelativeDir(Value(nullptr, "../../foo"), &err, source_root) ==
      SourceDir("/source/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(
      base.ResolveRelativeDir(Value(nullptr, "//../foo"), &err, source_root) ==
      SourceDir("/source/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "//.."), &err,
                                      source_root) == SourceDir("/source/"));
  EXPECT_SUCCESS(err);
#endif

#if defined(OS_WIN)
  // Canonicalize the existing backslashes to forward slashes and add a
  // leading slash if necessary.
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "\\C:\\foo"), &err) ==
              SourceDir("/C:/foo/"));
  EXPECT_SUCCESS(err);
  EXPECT_TRUE(base.ResolveRelativeDir(Value(nullptr, "C:\\foo"), &err) ==
              SourceDir("/C:/foo/"));
  EXPECT_SUCCESS(err);
#endif
}

TEST(SourceDir, SourceWithNoTrailingSlash) {
  Err err;
  SourceDir base("//base/");
  SourceDir base_no_slash("//base/");
  EXPECT_EQ(base.SourceWithNoTrailingSlash(), "//base");
  EXPECT_EQ(base_no_slash.SourceWithNoTrailingSlash(), "//base");

  SourceDir relative_root("//");
  EXPECT_EQ(relative_root.SourceWithNoTrailingSlash(), "//");

#if defined(OS_WIN)
  SourceDir root("C:/");
  SourceDir root_no_slash("C:");
  EXPECT_EQ(root.SourceWithNoTrailingSlash(), "C:");
  EXPECT_EQ(root_no_slash.SourceWithNoTrailingSlash(), "C:");
#else
  SourceDir root("/");
  EXPECT_EQ(root.SourceWithNoTrailingSlash(), "/");
#endif
}
