// Copyright 2018 The Fuchsia 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 "src/ledger/lib/files/detached_path.h"

#include "gtest/gtest.h"

namespace ledger {
namespace {

TEST(DetachedPathTest, Creation) {
  DetachedPath path1;
  EXPECT_EQ(path1.root_fd(), AT_FDCWD);
  EXPECT_EQ(path1.path(), ".");

  DetachedPath path2(1);
  EXPECT_EQ(path2.root_fd(), 1);
  EXPECT_EQ(path2.path(), ".");

  DetachedPath path3(1, "foo");
  EXPECT_EQ(path3.root_fd(), 1);
  EXPECT_EQ(path3.path(), "foo");
}

TEST(DetachedPathTest, RelativeToDotSubPath) {
  DetachedPath path(1);
  DetachedPath subpath1 = path.SubPath("foo");
  EXPECT_EQ(subpath1.root_fd(), 1);
  EXPECT_EQ(subpath1.path(), "./foo");
  DetachedPath subpath2 = path.SubPath({"foo", "bar"});
  EXPECT_EQ(subpath2.root_fd(), 1);
  EXPECT_EQ(subpath2.path(), "./foo/bar");
}

TEST(DetachedPathTest, RelativeToDirSubPath) {
  DetachedPath path(1, "base");
  DetachedPath subpath1 = path.SubPath("foo");
  EXPECT_EQ(subpath1.root_fd(), 1);
  EXPECT_EQ(subpath1.path(), "base/foo");
  DetachedPath subpath2 = path.SubPath({"foo", "bar"});
  EXPECT_EQ(subpath2.root_fd(), 1);
  EXPECT_EQ(subpath2.path(), "base/foo/bar");
}

TEST(DetachedPathTest, AbsoluteSubPath) {
  DetachedPath path(1, "/base");
  DetachedPath subpath1 = path.SubPath("foo");
  EXPECT_EQ(subpath1.root_fd(), 1);
  EXPECT_EQ(subpath1.path(), "/base/foo");
  DetachedPath subpath2 = path.SubPath({"foo", "bar"});
  EXPECT_EQ(subpath2.root_fd(), 1);
  EXPECT_EQ(subpath2.path(), "/base/foo/bar");
}

}  // namespace
}  // namespace ledger
