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

import static org.junit.Assert.assertEquals;

import com.facebook.buck.event.BuckEventBusFactory;
import com.facebook.buck.rules.BuildDependencies;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.testutil.IdentityPathRelativizer;
import com.facebook.buck.testutil.TestConsole;
import com.facebook.buck.util.ProjectFilesystem;
import com.facebook.buck.util.environment.Platform;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;

import org.easymock.EasyMockSupport;
import org.junit.Test;

import java.io.File;
import java.nio.file.Path;

public class JavacInMemoryStepTest extends EasyMockSupport {

  @Test
  public void testFindFailedImports() throws Exception {
    String lineSeperator = System.getProperty("line.separator");

    String stderrOutput = Joiner.on(lineSeperator).join(ImmutableList.of(
        "java/com/foo/bar.java:5: package javax.annotation.concurrent does not exist",
        "java/com/foo/bar.java:99: error: cannot access com.facebook.Raz",
        "java/com/foo/bar.java:142: cannot find symbol: class ImmutableSet",
        "java/com/foo/bar.java:999: you are a clown"));

    ImmutableSet<String> missingImports =
        JavacInMemoryStep.findFailedImports(stderrOutput);
    assertEquals(
        ImmutableSet.of("javax.annotation.concurrent", "com.facebook.Raz", "ImmutableSet"),
        missingImports);
  }

  @Test
  public void testJavacCommand() {
    ExecutionContext context = ExecutionContext.builder()
        .setProjectFilesystem(new ProjectFilesystem(new File(".")) {
          @Override
          public Function<String, Path> getPathRelativizer() {
            return IdentityPathRelativizer.getIdentityRelativizer();
          }
        })
        .setConsole(new TestConsole())
        .setEventBus(BuckEventBusFactory.newInstance())
        .setPlatform(Platform.detect())
        .build();

    JavacInMemoryStep firstOrder = createTestStep(BuildDependencies.FIRST_ORDER_ONLY);
    JavacInMemoryStep warn = createTestStep(BuildDependencies.WARN_ON_TRANSITIVE);
    JavacInMemoryStep transitive = createTestStep(BuildDependencies.TRANSITIVE);

    assertEquals("javac -target 6 -source 6 -g -d . -classpath foo.jar foobar.java",
        firstOrder.getDescription(context));
    assertEquals("javac -target 6 -source 6 -g -d . -classpath foo.jar foobar.java",
        warn.getDescription(context));
    assertEquals("javac -target 6 -source 6 -g -d . -classpath bar.jar" + File.pathSeparator +
        "foo.jar foobar.java",
        transitive.getDescription(context));
  }

  private JavacInMemoryStep createTestStep(BuildDependencies buildDependencies) {
    return new JavacInMemoryStep(
          /* outputDirectory */ ".",
          /* javaSourceFilePaths */ ImmutableSet.of("foobar.java"),
          /* transitiveClasspathEntries */ ImmutableSet.of("bar.jar", "foo.jar"),
          /* declaredClasspathEntries */ ImmutableSet.of("foo.jar"),
          /* JavacOptions */ JavacOptions.DEFAULTS,
          /* pathToOutputAbiFile */ Optional.<String>absent(),
          /* invokingRule */ Optional.<String>absent(),
          /* buildDependencies */ buildDependencies,
          /* suggestBuildRules */ Optional.<JavacInMemoryStep.SuggestBuildRules>absent());
  }
}
