/*
 * Copyright 2012-present Facebook, Inc.
 *
 * 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.facebook.buck.cli;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import com.facebook.buck.java.DefaultJavaPackageFinder;
import com.facebook.buck.util.HumanReadableException;
import com.google.common.collect.ImmutableList;

import org.junit.Test;

public class DefaultJavaPackageFinderTest {

  /**
   * If no paths are specified, then the project root should be considered a Java source root.
   */
  @Test
  public void testNoPathsSpecified() {
    DefaultJavaPackageFinder javaPackageFinder = DefaultJavaPackageFinder
        .createDefaultJavaPackageFinder(ImmutableList.<String>of());
    assertEquals("", javaPackageFinder.findJavaPackageFolderForPath("Base.java"));
    assertEquals("java/com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/com/example/base/Base.java"));
  }

  @Test
  public void testSinglePathFromRoot() {
    DefaultJavaPackageFinder javaPackageFinder = DefaultJavaPackageFinder
        .createDefaultJavaPackageFinder(ImmutableList.of("/java/"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/com/example/base/"));
    assertEquals("com.example.base",
        javaPackageFinder.findJavaPackageForPath("java/com/example/base/"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/com/example/base/Base.java"));
    assertEquals("com.example.base",
        javaPackageFinder.findJavaPackageForPath("java/com/example/base/Base.java"));
    assertEquals("",
        javaPackageFinder.findJavaPackageFolderForPath("java/Weird.java"));
    assertEquals("",
        javaPackageFinder.findJavaPackageForPath("java/Weird.java"));
    assertEquals(
        "When there is no match, the project root should be treated as a Java source root.",
        "notjava/",
        javaPackageFinder.findJavaPackageFolderForPath("notjava/Weird.java"));
    assertEquals(
        "When there is no match, the project root should be treated as a Java source root.",
        "notjava",
        javaPackageFinder.findJavaPackageForPath("notjava/Weird.java"));
  }

  @Test
  public void testOverlappingPathsFromRoot() {
    DefaultJavaPackageFinder javaPackageFinder = DefaultJavaPackageFinder
        .createDefaultJavaPackageFinder(ImmutableList.of(
            "/java",
            "/java/more/specific",
            "/javatests"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/com/example/base/Base.java"));
    assertEquals("base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/more/specific/base/Base.java"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("javatests/com/example/base/BaseTest.java"));
  }

  @Test
  public void testSinglePathElement() {
    DefaultJavaPackageFinder javaPackageFinder = DefaultJavaPackageFinder
        .createDefaultJavaPackageFinder(ImmutableList.of("src"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/main/src/com/example/base/"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/main/src/com/example/base/Base.java"));
    assertEquals(
        "When the path element appears more than once, use the rightmost instance as the base.",
        "com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath(
            "java/main/src/other/project/src/com/example/base/Base.java"));
    assertEquals("",
        javaPackageFinder.findJavaPackageFolderForPath("src/Weird.java"));
    assertEquals(
        "When there is no match, the project root should be treated as a Java source root.",
        "notjava/",
        javaPackageFinder.findJavaPackageFolderForPath("notjava/Weird.java"));
  }

  @Test
  public void testMultiplePathElements() {
    DefaultJavaPackageFinder javaPackageFinder = DefaultJavaPackageFinder
        .createDefaultJavaPackageFinder(ImmutableList.of("src", "src-gen"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("java/main/src/com/example/base/"));
    assertEquals("com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath(
            "java/main/src-gen/other/project/src/com/example/base/Base.java"));
  }

  @Test
  public void testMixOfPrefixesAndPathElements() {
    DefaultJavaPackageFinder javaPackageFinder = DefaultJavaPackageFinder
        .createDefaultJavaPackageFinder(ImmutableList.of("/java", "src"));
    assertEquals(
        "Prefixes take precedence over path elements",
        "com/example/base/",
        javaPackageFinder.findJavaPackageFolderForPath("/java/main/src/com/example/base/Base.java"));
  }

  @Test
  public void testInvalidPath() {
    try {
      DefaultJavaPackageFinder.createDefaultJavaPackageFinder(ImmutableList.of("src/"));
      fail("Should have thrown HumanReadableException.");
    } catch (HumanReadableException e) {
      assertEquals(
          "Path pattern that does not start with a slash cannot contain a slash: src/",
          e.getHumanReadableErrorMessage());
    }
  }
}
