// Copyright 2017 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.vfs;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertThrows;

import com.google.common.testing.EqualsTester;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests the unix implementation of {@link Path}. */
@RunWith(JUnit4.class)
public class UnixPathTest extends PathAbstractTest {

  @Test
  public void testEqualsAndHashCodeUnix() {
    new EqualsTester()
        .addEqualityGroup(create("/something/else"))
        .addEqualityGroup(create("/"), create("//////"))
        .testEquals();
  }

  @Test
  public void testRelativeToUnix() {
    assertThat(create("/").relativeTo(create("/")).getPathString()).isEmpty();
    assertThat(create("/foo").relativeTo(create("/foo")).getPathString()).isEmpty();
    assertThat(create("/foo/bar/baz").relativeTo(create("/foo")).getPathString())
        .isEqualTo("bar/baz");
    assertThat(create("/foo/bar/baz").relativeTo(create("/foo/bar")).getPathString())
        .isEqualTo("baz");
    assertThat(create("/foo").relativeTo(create("/")).getPathString()).isEqualTo("foo");
    assertThrows(
        IllegalArgumentException.class, () -> create("/foo/bar/baz").relativeTo(create("foo")));
    assertThrows(
        IllegalArgumentException.class, () -> create("/foo").relativeTo(create("/foo/bar/baz")));
  }

  @Test
  public void testGetRelativeUnix() {
    assertThat(create("/a").getRelative("b").getPathString()).isEqualTo("/a/b");
    assertThat(create("/a/b").getRelative("c/d").getPathString()).isEqualTo("/a/b/c/d");
    assertThat(create("/c/d").getRelative("/a/b").getPathString()).isEqualTo("/a/b");
    assertThat(create("/a").getRelative("").getPathString()).isEqualTo("/a");
    assertThat(create("/").getRelative("").getPathString()).isEqualTo("/");
    assertThat(create("/a/b").getRelative("../foo").getPathString()).isEqualTo("/a/foo");

    // Make sure any fast path of Path#getRelative(PathFragment) works
    assertThat(create("/a/b").getRelative(PathFragment.create("../foo")).getPathString())
        .isEqualTo("/a/foo");

    // Make sure any fast path of Path#getRelative(PathFragment) works
    assertThat(create("/c/d").getRelative(PathFragment.create("/a/b")).getPathString())
        .isEqualTo("/a/b");

    // Test normalization
    assertThat(create("/a").getRelative(".").getPathString()).isEqualTo("/a");
  }

  @Test
  public void testEmptyPathToEmptyPathUnix() {
    // compare string forms
    assertThat(create("/").getPathString()).isEqualTo("/");
    // compare fragment forms
    assertThat(create("/")).isEqualTo(create("/"));
  }

  @Test
  public void testRedundantSlashes() {
    // compare string forms
    assertThat(create("///").getPathString()).isEqualTo("/");
    // compare fragment forms
    assertThat(create("///")).isEqualTo(create("/"));
    // compare string forms
    assertThat(create("/foo///bar").getPathString()).isEqualTo("/foo/bar");
    // compare fragment forms
    assertThat(create("/foo///bar")).isEqualTo(create("/foo/bar"));
    // compare string forms
    assertThat(create("////foo//bar").getPathString()).isEqualTo("/foo/bar");
    // compare fragment forms
    assertThat(create("////foo//bar")).isEqualTo(create("/foo/bar"));
  }

  @Test
  public void testSimpleNameToSimpleNameUnix() {
    // compare string forms
    assertThat(create("/foo").getPathString()).isEqualTo("/foo");
    // compare fragment forms
    assertThat(create("/foo")).isEqualTo(create("/foo"));
  }

  @Test
  public void testSimplePathToSimplePathUnix() {
    // compare string forms
    assertThat(create("/foo/bar").getPathString()).isEqualTo("/foo/bar");
    // compare fragment forms
    assertThat(create("/foo/bar")).isEqualTo(create("/foo/bar"));
  }

  @Test
  public void testGetParentDirectoryUnix() {
    assertThat(create("/foo/bar/wiz").getParentDirectory()).isEqualTo(create("/foo/bar"));
    assertThat(create("/foo/bar").getParentDirectory()).isEqualTo(create("/foo"));
    assertThat(create("/foo").getParentDirectory()).isEqualTo(create("/"));
    assertThat(create("/").getParentDirectory()).isNull();
  }

  @Test
  public void testBasenameUnix() throws Exception {
    assertThat(create("/foo/bar").getBaseName()).isEqualTo("bar");
    assertThat(create("/foo/").getBaseName()).isEqualTo("foo");
    assertThat(create("/foo").getBaseName()).isEqualTo("foo");
    assertThat(create("/").getBaseName()).isEmpty();
  }

  @Test
  public void testStartsWithUnix() {
    Path foobar = create("/foo/bar");

    // (path, prefix) => true
    assertThat(foobar.startsWith(foobar)).isTrue();
    assertThat(foobar.startsWith(create("/"))).isTrue();
    assertThat(foobar.startsWith(create("/foo"))).isTrue();
    assertThat(foobar.startsWith(create("/foo/"))).isTrue();
    assertThat(foobar.startsWith(create("/foo/bar/"))).isTrue(); // Includes trailing slash.

    // (prefix, path) => false
    assertThat(create("/foo").startsWith(foobar)).isFalse();
    assertThat(create("/").startsWith(foobar)).isFalse();

    // (path, sibling) => false
    assertThat(create("/foo/wiz").startsWith(foobar)).isFalse();
    assertThat(foobar.startsWith(create("/foo/wiz"))).isFalse();
  }

  @Test
  public void testNormalizeUnix() {
    assertThat(create("/a/b")).isEqualTo(create("/a/b"));
    assertThat(create("/a/b/")).isEqualTo(create("/a/b"));
    assertThat(create("/a/./b")).isEqualTo(create("/a/b"));
    assertThat(create("/a/../b")).isEqualTo(create("/b"));
    assertThat(create("/..")).isEqualTo(create("/.."));
  }

  @Test
  public void testParentOfRootIsRootUnix() {
    assertThat(create("/..")).isEqualTo(create("/"));
    assertThat(create("/../../../../../..")).isEqualTo(create("/"));
    assertThat(create("/../../../foo")).isEqualTo(create("/foo"));
  }
}
