/*
 * Copyright 2014-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.java;

import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import com.facebook.buck.graph.MutableDirectedGraph;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.rules.ActionGraph;
import com.facebook.buck.rules.BuildContext;
import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.BuildTargetSourcePath;
import com.facebook.buck.rules.FakeBuildContext;
import com.facebook.buck.rules.FakeBuildRuleParamsBuilder;
import com.facebook.buck.rules.FakeBuildableContext;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.TestSourcePath;
import com.facebook.buck.step.Step;
import com.facebook.buck.step.fs.CopyStep;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet;

import org.easymock.EasyMock;
import org.junit.Test;

import java.nio.file.Path;

public class JavaSourceJarTest {

  @Test
  public void outputNameShouldIndicateThatTheOutputIsASrcZip() {
    JavaSourceJar rule = new JavaSourceJar(
        new FakeBuildRuleParamsBuilder("//example:target").build(),
        new SourcePathResolver(new BuildRuleResolver()),
        ImmutableSortedSet.<SourcePath>of());

    Path output = rule.getPathToOutputFile();

    assertTrue(output.toString().endsWith(Javac.SRC_ZIP));
  }

  @Test
  public void shouldOnlyIncludePathBasedSources() {
    SourcePathResolver pathResolver = new SourcePathResolver(new BuildRuleResolver());
    SourcePath fileBased = new TestSourcePath("some/path/File.java");
    SourcePath ruleBased = new BuildTargetSourcePath(
        new FakeProjectFilesystem(),
        BuildTargetFactory.newInstance("//cheese:cake"));

    JavaPackageFinder finderStub = createNiceMock(JavaPackageFinder.class);
    expect(finderStub.findJavaPackageFolderForPath((String) anyObject())).andStubReturn("cheese");
    expect(finderStub.findJavaPackageForPath((String) anyObject())).andStubReturn("cheese");

    // No need to verify. It's a stub. I don't care about the interactions.
    EasyMock.replay(finderStub);

    JavaSourceJar rule = new JavaSourceJar(
        new FakeBuildRuleParamsBuilder("//example:target").build(),
        pathResolver,
        ImmutableSortedSet.of(fileBased, ruleBased));

    assertEquals(
        ImmutableList.of(pathResolver.getPath(fileBased)),
        rule.getInputsToCompareToOutput());

    BuildContext buildContext = FakeBuildContext.newBuilder(new FakeProjectFilesystem())
        .setActionGraph(new ActionGraph(new MutableDirectedGraph<BuildRule>()))
        .setJavaPackageFinder(finderStub)
        .build();
    ImmutableList<Step> steps = rule.getBuildSteps(
        buildContext,
        new FakeBuildableContext());

    // There should be a CopyStep per file being copied. Count 'em.
    int copyStepsCount = FluentIterable.from(steps)
        .filter(Predicates.instanceOf(CopyStep.class))
        .size();

    assertEquals(1, copyStepsCount);
  }
}
