/*
 * Copyright (C) 2021 The Dagger Authors.
 *
 * 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 buildtests;

import static com.google.common.truth.Truth.assertThat;
import static org.gradle.testkit.runner.TaskOutcome.SUCCESS;

import java.io.File;
import java.io.IOException;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

// This is a regression test for https://github.com/google/dagger/issues/3133
@RunWith(JUnit4.class)
public class TransitiveMapKeyTest {
  @Rule public TemporaryFolder folder = new TemporaryFolder();

  @Test
  public void testTransitiveMapKey_WithImplementation() throws IOException {
    BuildResult result = setupRunnerWith("implementation").buildAndFail();
    assertThat(result.getOutput()).contains("Task :app:compileJava FAILED");
    assertThat(result.getOutput())
        .contains(
            "Missing map key annotation for method: library1.MyModule#provideString(). "
                + "That method was annotated with: "
                + "@dagger.Provides,"
                + "@dagger.multibindings.IntoMap,"
                + "@library2.MyMapKey(\"some-key\")");
  }

  @Test
  public void testTransitiveMapKey_WithApi() throws IOException {
    // Test that if we use an "api" dependency for the custom map key things work properly.
    BuildResult result = setupRunnerWith("api").build();
    assertThat(result.task(":app:assemble").getOutcome()).isEqualTo(SUCCESS);
  }

  private GradleRunner setupRunnerWith(String dependencyType) throws IOException {
    File projectDir = folder.getRoot();
    GradleModule.create(projectDir)
        .addSettingsFile(
            "include 'app'",
            "include 'library1'",
            "include 'library2'")
        .addBuildFile(
            "buildscript {",
            "  ext {",
            String.format("dagger_version = \"%s\"", System.getProperty("dagger_version")),
            "  }",
            "}",
            "",
            "allprojects {",
            "  repositories {",
            "    mavenCentral()",
            "    mavenLocal()",
            "  }",
            "}");

    GradleModule.create(projectDir, "app")
        .addBuildFile(
            "plugins {",
            "  id 'java'",
            "  id 'application'",
            "}",
            "dependencies {",
            "  implementation project(':library1')",
            "  implementation \"com.google.dagger:dagger:$dagger_version\"",
            "  annotationProcessor \"com.google.dagger:dagger-compiler:$dagger_version\"",
            "}")
        .addSrcFile(
            "MyComponent.java",
            "package app;",
            "",
            "import dagger.Component;",
            "import library1.MyModule;",
            "import java.util.Map;",
            "",
            "@Component(modules = MyModule.class)",
            "public interface MyComponent {",
            "  Map<String, String> multiMap();",
            "}");

    GradleModule.create(projectDir, "library1")
        .addBuildFile(
            "plugins {",
            "  id 'java'",
            "  id 'java-library'",
            "}",
            "dependencies {",
            dependencyType + " project(':library2')",
            "  implementation \"com.google.dagger:dagger:$dagger_version\"",
            "  annotationProcessor \"com.google.dagger:dagger-compiler:$dagger_version\"",
            "}")
        .addSrcFile(
            "MyModule.java",
            "package library1;",
            "",
            "import dagger.Module;",
            "import dagger.Provides;",
            "import dagger.multibindings.IntoMap;",
            "import library2.MyMapKey;",
            "",
            "@Module",
            "public interface MyModule {",
            "  @Provides",
            "  @IntoMap",
            "  @MyMapKey(\"some-key\")",
            "  static String provideString() {",
            "    return \"\";",
            "  }",
            "}");

    GradleModule.create(projectDir, "library2")
        .addBuildFile(
            "plugins {",
            "  id 'java'",
            "  id 'java-library'",
            "}",
            "dependencies {",
            "  implementation \"com.google.dagger:dagger:$dagger_version\"",
            "  annotationProcessor \"com.google.dagger:dagger-compiler:$dagger_version\"",
            "}")
        .addSrcFile(
            "MyMapKey.java",
            "package library2;",
            "",
            "import dagger.MapKey;",
            "",
            "@MapKey",
            "public @interface MyMapKey {",
            "  String value();",
            "}");

    return GradleRunner.create()
        .withArguments("--stacktrace", "build")
        .withProjectDir(projectDir);
  }
}
