/*
* 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.jvm.java.DefaultJavaPackageFinder;
import com.facebook.buck.util.HumanReadableException;
import com.google.common.collect.ImmutableList;
import java.nio.file.Paths;
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.of());
assertEquals(Paths.get(""), javaPackageFinder.findJavaPackageFolder(Paths.get("Base.java")));
assertEquals(
Paths.get("java/com/example/base/"),
javaPackageFinder.findJavaPackageFolder(Paths.get("java/com/example/base/Base.java")));
}
@Test
public void testSinglePathFromRoot() {
DefaultJavaPackageFinder javaPackageFinder =
DefaultJavaPackageFinder.createDefaultJavaPackageFinder(ImmutableList.of("/java/"));
assertEquals(
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(Paths.get("java/com/example/base/Base.java")));
assertEquals(
"com.example.base",
javaPackageFinder.findJavaPackage(Paths.get("java/com/example/base/Base.java")));
assertEquals(
Paths.get(""), javaPackageFinder.findJavaPackageFolder(Paths.get("java/Weird.java")));
assertEquals("", javaPackageFinder.findJavaPackage(Paths.get("java/Weird.java")));
assertEquals(
"When there is no match, the project root should be treated as a Java source root.",
Paths.get("notjava/"),
javaPackageFinder.findJavaPackageFolder(Paths.get("notjava/Weird.java")));
assertEquals(
"When there is no match, the project root should be treated as a Java source root.",
"notjava",
javaPackageFinder.findJavaPackage(Paths.get("notjava/Weird.java")));
}
@Test
public void testOverlappingPathsFromRoot() {
DefaultJavaPackageFinder javaPackageFinder =
DefaultJavaPackageFinder.createDefaultJavaPackageFinder(
ImmutableList.of("/java", "/java/more/specific", "/javatests"));
assertEquals(
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(Paths.get("java/com/example/base/Base.java")));
assertEquals(
Paths.get("base/"),
javaPackageFinder.findJavaPackageFolder(Paths.get("java/more/specific/base/Base.java")));
assertEquals(
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(
Paths.get("javatests/com/example/base/BaseTest.java")));
}
@Test
public void testSinglePathElement() {
DefaultJavaPackageFinder javaPackageFinder =
DefaultJavaPackageFinder.createDefaultJavaPackageFinder(ImmutableList.of("src"));
assertEquals(
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(
Paths.get("java/main/src/com/example/base/Base.java")));
assertEquals(
"When the path element appears more than once, use the rightmost instance as the base.",
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(
Paths.get("java/main/src/other/project/src/com/example/base/Base.java")));
assertEquals(
Paths.get(""), javaPackageFinder.findJavaPackageFolder(Paths.get("src/Weird.java")));
assertEquals(
"When there is no match, the project root should be treated as a Java source root.",
Paths.get("notjava/"),
javaPackageFinder.findJavaPackageFolder(Paths.get("notjava/Weird.java")));
}
@Test
public void testMultiplePathElements() {
DefaultJavaPackageFinder javaPackageFinder =
DefaultJavaPackageFinder.createDefaultJavaPackageFinder(ImmutableList.of("src", "src-gen"));
assertEquals(
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(
Paths.get("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",
Paths.get("com/example/base/"),
javaPackageFinder.findJavaPackageFolder(
Paths.get("/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());
}
}
}