/*
 * Copyright 2016 The Bazel Authors. All rights reserved.
 *
 * 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.google.idea.blaze.android.rendering;

import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;

import com.android.tools.idea.rendering.RenderErrorContributor;
import com.android.tools.idea.rendering.RenderErrorModelFactory;
import com.android.tools.idea.rendering.RenderResult;
import com.android.tools.idea.rendering.errors.ui.RenderErrorModel;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.idea.blaze.android.sync.model.AndroidResourceModule;
import com.google.idea.blaze.android.sync.model.AndroidResourceModuleRegistry;
import com.google.idea.blaze.base.BlazeTestCase;
import com.google.idea.blaze.base.ideinfo.AndroidIdeInfo;
import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
import com.google.idea.blaze.base.ideinfo.JavaIdeInfo;
import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
import com.google.idea.blaze.base.ideinfo.TargetKey;
import com.google.idea.blaze.base.ideinfo.TargetMap;
import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
import com.google.idea.blaze.base.lang.buildfile.references.BuildReferenceManager;
import com.google.idea.blaze.base.model.BlazeProjectData;
import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder;
import com.google.idea.blaze.base.model.primitives.Label;
import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
import com.google.idea.blaze.base.settings.BlazeImportSettings;
import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
import com.google.idea.blaze.base.settings.BlazeImportSettingsManagerLegacy;
import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
import com.google.idea.blaze.base.targetmaps.SourceToTargetMap;
import com.google.idea.blaze.base.targetmaps.TransitiveDependencyMap;
import com.intellij.mock.MockModule;
import com.intellij.mock.MockPsiFile;
import com.intellij.mock.MockPsiManager;
import com.intellij.mock.MockVirtualFile;
import com.intellij.openapi.extensions.ExtensionPoint;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.fileTypes.FileTypeManager;
import com.intellij.openapi.fileTypes.MockFileTypeManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.JavaPsiFacadeImpl;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.ProjectScopeBuilder;
import com.intellij.psi.search.ProjectScopeBuilderImpl;
import com.intellij.psi.util.PsiUtil.NullPsiClass;
import java.io.File;
import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Unit tests for {@link BlazeRenderErrorContributor}. */
@RunWith(JUnit4.class)
public class BlazeRenderErrorContributorTest extends BlazeTestCase {
  private static final String BLAZE_BIN = "blaze-out/crosstool/bin";
  private static final String GENERATED_RESOURCES_ERROR = "Generated resources";
  private static final String NON_STANDARD_MANIFEST_NAME_ERROR = "Non-standard manifest name";
  private static final String MISSING_CLASS_DEPENDENCIES_ERROR = "Missing class dependencies";

  private static final WorkspaceRoot workspaceRoot = new WorkspaceRoot(new File("/"));
  private Module module;
  private MockBlazeProjectDataManager projectDataManager;
  private BlazeRenderErrorContributor.BlazeProvider provider;

  @Override
  protected void initTest(Container applicationServices, Container projectServices) {
    super.initTest(applicationServices, projectServices);
    applicationServices.register(FileTypeManager.class, new MockFileTypeManager());

    projectServices.register(BuildReferenceManager.class, new MockBuildReferenceManager(project));
    projectServices.register(TransitiveDependencyMap.class, new TransitiveDependencyMap(project));
    projectServices.register(ProjectScopeBuilder.class, new ProjectScopeBuilderImpl(project));
    projectServices.register(
        AndroidResourceModuleRegistry.class, new AndroidResourceModuleRegistry());

    BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager(project);
    BlazeImportSettings settings = new BlazeImportSettings("", "", "", "", "", BuildSystem.Blaze);
    importSettingsManager.setImportSettings(settings);
    projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
    projectServices.register(
        BlazeImportSettingsManagerLegacy.class, new BlazeImportSettingsManagerLegacy(project));

    createPsiClassesAndSourceToTargetMap(projectServices);

    projectDataManager = new MockBlazeProjectDataManager();
    projectServices.register(BlazeProjectDataManager.class, projectDataManager);

    ExtensionPoint<RenderErrorContributor.Provider> extensionPoint =
        registerExtensionPoint(
            ExtensionPointName.create("com.android.rendering.renderErrorContributor"),
            RenderErrorContributor.Provider.class);
    extensionPoint.registerExtension(new RenderErrorContributor.Provider());
    extensionPoint.registerExtension(new BlazeRenderErrorContributor.BlazeProvider());

    module = new MockModule(project, () -> {});

    // For the isApplicable tests.
    provider = new BlazeRenderErrorContributor.BlazeProvider();
  }

  @Test
  public void testProviderIsApplicable() {
    assertThat(provider.isApplicable(project)).isTrue();
  }

  @Test
  public void testProviderNotApplicableIfNotBlaze() {
    BlazeImportSettingsManager.getInstance(project).loadState(null);
    assertThat(provider.isApplicable(project)).isFalse();
  }

  @Test
  public void testNoIssuesIfNoErrors() {
    PsiFile file = new MockPsiFile(new MockPsiManager(project));
    file.putUserData(ModuleUtilCore.KEY_MODULE, module);
    RenderResult result = RenderResult.createBlank(file);
    RenderErrorModel errorModel = RenderErrorModelFactory.createErrorModel(result, null);
    assertThat(errorModel.getIssues()).isEmpty();
  }

  @Test
  public void testNoBlazeIssuesIfNoRelatedErrors() {
    RenderErrorModel errorModel = createRenderErrorModelWithBrokenClasses();
    errorModel
        .getIssues()
        .forEach(
            issue ->
                assertThat(issue.getSummary())
                    .isNoneOf(
                        GENERATED_RESOURCES_ERROR,
                        NON_STANDARD_MANIFEST_NAME_ERROR,
                        MISSING_CLASS_DEPENDENCIES_ERROR));
  }

  @Test
  public void testReportGeneratedResources() {
    createTargetMapWithGeneratedResources();
    RenderErrorModel errorModel = createRenderErrorModelWithBrokenClasses();

    RenderErrorModel.Issue generatedResourcesIssue =
        Iterables.getOnlyElement(
            errorModel
                .getIssues()
                .stream()
                .filter(issue -> issue.getSummary().equals(GENERATED_RESOURCES_ERROR))
                .collect(Collectors.toList()));

    assertThat(generatedResourcesIssue.getHtmlContent())
        .isEqualTo(
            "Generated resources will not be discovered by the IDE:"
                + "<DL>"
                + "<DD>-&NBSP;"
                + "com/google/example/dependency/generated/res "
                + "from <A HREF=\"file:///src/com/google/example/dependency/BUILD\">"
                + "//com/google/example:generated</A>"
                + "<DD>-&NBSP;"
                + "com/google/example/main/generated/res "
                + "from <A HREF=\"file:///src/com/google/example/main/BUILD\">"
                + "//com/google/example:main</A>"
                + "<DD>-&NBSP;"
                + "com/google/example/transitive/generated/one/res "
                + "from <A HREF=\"file:///src/com/google/example/transitive/BUILD\">"
                + "//com/google/example/transitive:generated</A>"
                + "<DD>-&NBSP;"
                + "com/google/example/transitive/generated/two/res "
                + "from <A HREF=\"file:///src/com/google/example/transitive/BUILD\">"
                + "//com/google/example/transitive:generated</A>"
                + "</DL>"
                + "Please avoid using generated resources, then "
                + "<A HREF=\"action:sync\">sync the project</A> and "
                + "<A HREF=\"refreshRender\">refresh the layout</A>.");
  }

  @Test
  public void testReportNonStandardAndroidManifestName() {
    createTargetMapWithNonStandardAndroidManifestName();
    RenderErrorModel errorModel = createRenderErrorModelWithBrokenClasses();

    RenderErrorModel.Issue nonStandardManifestNameIssue =
        Iterables.getOnlyElement(
            errorModel
                .getIssues()
                .stream()
                .filter(issue -> issue.getSummary().equals(NON_STANDARD_MANIFEST_NAME_ERROR))
                .collect(Collectors.toList()));

    assertThat(nonStandardManifestNameIssue.getHtmlContent())
        .isEqualTo(
            "<A HREF=\"file:///src/com/google/example/main/BUILD\">"
                + "//com/google/example:main</A> "
                + "uses a non-standard name for the Android manifest: "
                + "<A HREF=\"file:///src/com/google/example/main/WeirdManifest.xml\">"
                + "WeirdManifest.xml</A>"
                + "<BR/>"
                + "Please rename it to AndroidManifest.xml, then "
                + "<A HREF=\"action:sync\">sync the project</A> and "
                + "<A HREF=\"refreshRender\">refresh the layout</A>.");
  }

  @Test
  public void testNoReportNonStandardAndroidManifestNameInDependency() {
    createTargetMapWithNonStandardAndroidManifestNameInDependency();
    RenderErrorModel errorModel = createRenderErrorModelWithBrokenClasses();

    errorModel
        .getIssues()
        .forEach(
            issue -> assertThat(issue.getSummary()).isNotEqualTo(NON_STANDARD_MANIFEST_NAME_ERROR));
  }

  @Test
  public void testReportMissingClassDependencies() {
    createTargetMapWithMissingClassDependency();
    RenderErrorModel errorModel =
        createRenderErrorModelWithMissingClasses(
            "com.google.example.independent.LibraryView",
            "com.google.example.independent.LibraryView2",
            "com.google.example.independent.Library2View",
            "com.google.example.dependent.LibraryView",
            "com.google.example.ResourceView");

    RenderErrorModel.Issue missingClassDependenciesIssue =
        Iterables.getOnlyElement(
            errorModel
                .getIssues()
                .stream()
                .filter(issue -> issue.getSummary().equals(MISSING_CLASS_DEPENDENCIES_ERROR))
                .collect(Collectors.toList()));

    assertThat(missingClassDependenciesIssue.getHtmlContent())
        .isEqualTo(
            "<A HREF=\"file:///src/com/google/example/BUILD\">"
                + "//com/google/example:resources</A> "
                + "contains resource files that reference these classes:"
                + "<DL>"
                + "<DD>-&NBSP;"
                + "<A HREF=\"openClass:com.google.example.independent.Library2View\">"
                + "com.google.example.independent.Library2View</A> "
                + "from <A HREF=\"file:///src/com/google/example/BUILD\">"
                + "//com/google/example/independent:library2</A> "
                + "<DD>-&NBSP;"
                + "<A HREF=\"openClass:com.google.example.independent.LibraryView\">"
                + "com.google.example.independent.LibraryView</A> "
                + "from <A HREF=\"file:///src/com/google/example/BUILD\">"
                + "//com/google/example/independent:library</A> "
                + "<DD>-&NBSP;"
                + "<A HREF=\"openClass:com.google.example.independent.LibraryView2\">"
                + "com.google.example.independent.LibraryView2</A> "
                + "from <A HREF=\"file:///src/com/google/example/BUILD\">"
                + "//com/google/example/independent:library</A> "
                + "</DL>"
                + "Please fix your dependencies so that "
                + "<A HREF=\"file:///src/com/google/example/BUILD\">"
                + "//com/google/example:resources</A> "
                + "correctly depends on these classes, then "
                + "<A HREF=\"action:sync\">sync the project</A> and "
                + "<A HREF=\"refreshRender\">refresh the layout</A>."
                + "<BR/>"
                + "<BR/>"
                + "<B>NOTE: blaze can still build with the incorrect dependencies "
                + "due to the way it handles resources, "
                + "but the layout editor needs them to be correct.</B>");
  }

  @Test
  public void testNoReportMissingClassDependenciesIfClassInSameTarget() {
    createTargetMapWithMissingClassDependency();
    RenderErrorModel errorModel =
        createRenderErrorModelWithMissingClasses("com.google.example.ResourceView");

    errorModel
        .getIssues()
        .forEach(
            issue -> assertThat(issue.getSummary()).isNotEqualTo(MISSING_CLASS_DEPENDENCIES_ERROR));
  }

  @Test
  public void testNoReportMissingClassDependenciesIfClassInDependency() {
    createTargetMapWithMissingClassDependency();
    RenderErrorModel errorModel =
        createRenderErrorModelWithMissingClasses("com.google.example.dependent.LibraryView");

    errorModel
        .getIssues()
        .forEach(
            issue -> assertThat(issue.getSummary()).isNotEqualTo(MISSING_CLASS_DEPENDENCIES_ERROR));
  }

  private RenderErrorModel createRenderErrorModelWithBrokenClasses() {
    PsiFile file = new MockPsiFile(new MockPsiManager(project));
    file.putUserData(ModuleUtilCore.KEY_MODULE, module);
    RenderResult result = RenderResult.createBlank(file);
    result
        .getLogger()
        .addBrokenClass("com.google.example.CustomView", new Exception("resource not found"));
    return RenderErrorModelFactory.createErrorModel(result, null);
  }

  private RenderErrorModel createRenderErrorModelWithMissingClasses(String... classNames) {
    PsiFile file = new MockPsiFile(new MockPsiManager(project));
    file.putUserData(ModuleUtilCore.KEY_MODULE, module);
    RenderResult result = RenderResult.createBlank(file);
    for (String className : classNames) {
      result.getLogger().addMissingClass(className);
    }
    return RenderErrorModelFactory.createErrorModel(result, null);
  }

  private static ArtifactLocation artifact(String relativePath, boolean isSource) {
    return ArtifactLocation.builder()
        .setIsSource(isSource)
        .setRootExecutionPathFragment(isSource ? "" : BLAZE_BIN)
        .setRelativePath(relativePath)
        .build();
  }

  private void createTargetMapWithGeneratedResources() {
    Label mainResourcesTarget = new Label("//com/google/example:main");
    Label dependencyGeneratedResourceTarget = new Label("//com/google/example:generated");
    Label dependencySourceResourceTarget = new Label("//com/google/example:source");
    Label transitiveGeneratedResourcesTarget =
        new Label("//com/google/example/transitive:generated");
    Label transitiveSourceResourceTarget = new Label("//com/google/example/transitive:source");
    Label unrelatedGeneratedResourceTarget = new Label("//com/google/unrelated:generated");
    Label unrelatedSourceResourceTarget = new Label("//com/google/unrelated:source");

    ArtifactLocation mainGeneratedResource =
        artifact("com/google/example/main/generated/res", false);
    ArtifactLocation mainSourceResource = artifact("com/google/example/main/source/res", true);
    ArtifactLocation dependencyGeneratedResource =
        artifact("com/google/example/dependency/generated/res", false);
    ArtifactLocation dependencySourceResource =
        artifact("com/google/example/dependency/source/res", true);
    ArtifactLocation transitiveGeneratedResourceOne =
        artifact("com/google/example/transitive/generated/one/res", false);
    ArtifactLocation transitiveGeneratedResourceTwo =
        artifact("com/google/example/transitive/generated/two/res", false);
    ArtifactLocation transitiveSourceResource =
        artifact("com/google/example/transitive/source/res", true);
    ArtifactLocation unrelatedGeneratedResource =
        artifact("com/google/unrelated/generated/res", false);
    ArtifactLocation unrelatedSourceResource = artifact("com/google/unrelated/source/res", true);

    ArtifactLocation mainBuildFile = artifact("com/google/example/main/BUILD", true);
    ArtifactLocation dependencyBuildFile = artifact("com/google/example/dependency/BUILD", true);
    ArtifactLocation transitiveBuildFile = artifact("com/google/example/transitive/BUILD", true);
    ArtifactLocation unrelatedBuildFile = artifact("com/google/unrelated/BUILD", true);

    AndroidResourceModuleRegistry registry = AndroidResourceModuleRegistry.getInstance(project);
    registry.put(
        module,
        AndroidResourceModule.builder(TargetKey.forPlainTarget(mainResourcesTarget))
            // .addResource(mainGeneratedResource) // Dropped.
            .addResource(mainSourceResource)
            .addTransitiveResourceDependency(dependencyGeneratedResourceTarget)
            .addTransitiveResource(dependencyGeneratedResource)
            .addTransitiveResourceDependency(dependencySourceResourceTarget)
            .addTransitiveResource(dependencySourceResource)
            .addTransitiveResourceDependency(transitiveGeneratedResourcesTarget)
            .addTransitiveResource(transitiveGeneratedResourceOne)
            .addTransitiveResource(transitiveGeneratedResourceTwo)
            .addTransitiveResourceDependency(transitiveSourceResourceTarget)
            .addTransitiveResource(transitiveSourceResource)
            .build());
    // Not using these, but they should be in the registry.
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(dependencyGeneratedResourceTarget))
            // .addResource(dependencyGeneratedResource) // Dropped.
            .addTransitiveResourceDependency(transitiveSourceResourceTarget)
            .addTransitiveResource(transitiveSourceResource)
            .build());
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(dependencySourceResourceTarget))
            .addResource(dependencySourceResource)
            .addTransitiveResourceDependency(transitiveGeneratedResourcesTarget)
            .addTransitiveResource(transitiveGeneratedResourceOne)
            .addTransitiveResource(transitiveGeneratedResourceTwo)
            .build());
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(transitiveGeneratedResourcesTarget))
            // .addResource(transitiveGeneratedResourceOne) // Dropped.
            // .addResource(transitiveGeneratedResourceTwo) // Dropped.
            .build());
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(transitiveSourceResourceTarget))
            .addResource(transitiveSourceResource)
            .build());
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(unrelatedGeneratedResourceTarget))
            // .addResource(unrelatedGeneratedResource) // Dropped.
            .build());
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(unrelatedSourceResourceTarget))
            .addResource(unrelatedSourceResource)
            .build());

    TargetMap targetMap =
        TargetMapBuilder.builder()
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(mainResourcesTarget)
                    .setBuildFile(mainBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(mainGeneratedResource)
                            .addResource(mainSourceResource))
                    .addDependency(dependencyGeneratedResourceTarget)
                    .addDependency(dependencySourceResourceTarget))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(dependencyGeneratedResourceTarget)
                    .setBuildFile(dependencyBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(dependencyGeneratedResource))
                    .addDependency(transitiveSourceResourceTarget))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(dependencySourceResourceTarget)
                    .setBuildFile(dependencyBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(dependencySourceResource))
                    .addDependency(transitiveGeneratedResourcesTarget))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(transitiveGeneratedResourcesTarget)
                    .setBuildFile(transitiveBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(transitiveGeneratedResourceOne)
                            .addResource(transitiveGeneratedResourceTwo)))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(transitiveSourceResourceTarget)
                    .setBuildFile(transitiveBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(transitiveSourceResource)))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(unrelatedGeneratedResourceTarget)
                    .setBuildFile(unrelatedBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(unrelatedGeneratedResource)))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(unrelatedSourceResourceTarget)
                    .setBuildFile(unrelatedBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .addResource(unrelatedSourceResource)))
            .build();

    projectDataManager.setTargetMap(targetMap);
  }

  private void createTargetMapWithNonStandardAndroidManifestName() {
    Label mainResourceTarget = new Label("//com/google/example:main");

    ArtifactLocation mainManifest = artifact("com/google/example/main/WeirdManifest.xml", true);
    ArtifactLocation mainResource = artifact("com/google/example/main/res", true);
    ArtifactLocation mainBuildFile = artifact("com/google/example/main/BUILD", true);

    AndroidResourceModuleRegistry registry = AndroidResourceModuleRegistry.getInstance(project);
    registry.put(
        module,
        AndroidResourceModule.builder(TargetKey.forPlainTarget(mainResourceTarget))
            .addResource(mainResource)
            .build());

    TargetMap targetMap =
        TargetMapBuilder.builder()
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(mainResourceTarget)
                    .setBuildFile(mainBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .setManifestFile(mainManifest)
                            .addResource(mainResource)))
            .build();

    projectDataManager.setTargetMap(targetMap);
  }

  private void createTargetMapWithNonStandardAndroidManifestNameInDependency() {
    Label mainResourceTarget = new Label("//com/google/example:main");
    Label dependencyResourceTarget = new Label("//com/google/example:dependency");

    ArtifactLocation mainManifest = artifact("com/google/example/main/AndroidManifest.xml", true);
    ArtifactLocation mainResource = artifact("com/google/example/main/res", true);
    ArtifactLocation mainBuildFile = artifact("com/google/example/main/BUILD", true);

    ArtifactLocation dependencyManifest =
        artifact("com/google/example/dependency/MyManifest.xml", true);
    ArtifactLocation dependencyResource = artifact("com/google/example/dependency/res", true);
    ArtifactLocation dependencyBuildFile = artifact("com/google/example/dependency/BUILD", true);

    AndroidResourceModuleRegistry registry = AndroidResourceModuleRegistry.getInstance(project);
    registry.put(
        module,
        AndroidResourceModule.builder(TargetKey.forPlainTarget(mainResourceTarget))
            .addResource(mainResource)
            .addTransitiveResourceDependency(dependencyResourceTarget)
            .addTransitiveResource(dependencyResource)
            .build());
    registry.put(
        mock(Module.class),
        AndroidResourceModule.builder(TargetKey.forPlainTarget(dependencyResourceTarget))
            .addResource(dependencyResource)
            .build());

    TargetMap targetMap =
        TargetMapBuilder.builder()
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(mainResourceTarget)
                    .setBuildFile(mainBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .setManifestFile(mainManifest)
                            .addResource(mainResource)))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(dependencyResourceTarget)
                    .setBuildFile(dependencyBuildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .setManifestFile(dependencyManifest)
                            .addResource(dependencyResource)))
            .build();

    projectDataManager.setTargetMap(targetMap);
  }

  private void createTargetMapWithMissingClassDependency() {
    Label parentTarget = new Label("//com/google/example:app");
    Label independentLibraryTarget = new Label("//com/google/example/independent:library");
    Label independentLibrary2Target = new Label("//com/google/example/independent:library2");
    Label dependentLibraryTarget = new Label("//com/google/example/dependent:library");
    Label resourcesTarget = new Label("//com/google/example:resources");

    ArtifactLocation manifest = artifact("com/google/example/AndroidManifest.xml", true);
    ArtifactLocation resources = artifact("com/google/example/res", true);
    ArtifactLocation buildFile = artifact("com/google/example/BUILD", true);

    AndroidResourceModuleRegistry registry = AndroidResourceModuleRegistry.getInstance(project);
    registry.put(
        module,
        AndroidResourceModule.builder(TargetKey.forPlainTarget(resourcesTarget))
            .addResource(resources)
            .build());

    TargetMap targetMap =
        TargetMapBuilder.builder()
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(parentTarget)
                    .setBuildFile(buildFile)
                    .addDependency(independentLibraryTarget)
                    .addDependency(resourcesTarget))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(independentLibraryTarget)
                    .setBuildFile(buildFile)
                    .setJavaInfo(JavaIdeInfo.builder())
                    .addDependency(independentLibrary2Target))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(independentLibrary2Target)
                    .setBuildFile(buildFile)
                    .setJavaInfo(JavaIdeInfo.builder()))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(resourcesTarget)
                    .setBuildFile(buildFile)
                    .setAndroidInfo(
                        AndroidIdeInfo.builder()
                            .setGenerateResourceClass(true)
                            .setManifestFile(manifest)
                            .addResource(resources))
                    .addDependency(dependentLibraryTarget))
            .addTarget(
                TargetIdeInfo.builder()
                    .setLabel(dependentLibraryTarget)
                    .setBuildFile(buildFile)
                    .setJavaInfo(JavaIdeInfo.builder()))
            .build();

    projectDataManager.setTargetMap(targetMap);
  }

  private void createPsiClassesAndSourceToTargetMap(Container projectServices) {
    PsiManager psiManager = new MockPsiManager(project);

    VirtualFile independentLibraryView =
        new MockVirtualFile("src/com/google/example/independent/LibraryView.java");
    VirtualFile independentLibraryView2 =
        new MockVirtualFile("src/com/google/example/independent/LibraryView2.java");
    VirtualFile independentLibrary2View =
        new MockVirtualFile("src/com/google/example/independent/Library2View.java");
    VirtualFile dependentLibraryView =
        new MockVirtualFile("src/com/google/example/dependent/LibraryView.java");
    VirtualFile resourceView = new MockVirtualFile("src/com/google/example/ResourceView.java");

    ImmutableMap<String, PsiClass> classes =
        ImmutableMap.of(
            "com.google.example.independent.LibraryView",
            new MockPsiClass(psiManager, independentLibraryView),
            "com.google.example.independent.LibraryView2",
            new MockPsiClass(psiManager, independentLibraryView2),
            "com.google.example.independent.Library2View",
            new MockPsiClass(psiManager, independentLibrary2View),
            "com.google.example.dependent.LibraryView",
            new MockPsiClass(psiManager, dependentLibraryView),
            "com.google.example.ResourceView",
            new MockPsiClass(psiManager, resourceView));

    ImmutableMap<File, TargetKey> sourceToTarget =
        ImmutableMap.of(
            VfsUtilCore.virtualToIoFile(independentLibraryView),
            TargetKey.forPlainTarget(new Label("//com/google/example/independent:library")),
            VfsUtilCore.virtualToIoFile(independentLibraryView2),
            TargetKey.forPlainTarget(new Label("//com/google/example/independent:library")),
            VfsUtilCore.virtualToIoFile(independentLibrary2View),
            TargetKey.forPlainTarget(new Label("//com/google/example/independent:library2")),
            VfsUtilCore.virtualToIoFile(dependentLibraryView),
            TargetKey.forPlainTarget(new Label("//com/google/example/dependent:library")),
            VfsUtilCore.virtualToIoFile(resourceView),
            TargetKey.forPlainTarget(new Label("//com/google/example:resources")));

    projectServices.register(
        JavaPsiFacade.class, new MockJavaPsiFacade(project, psiManager, classes));
    projectServices.register(SourceToTargetMap.class, new MockSourceToTargetMap(sourceToTarget));
  }

  private static class MockBlazeProjectDataManager implements BlazeProjectDataManager {
    private BlazeProjectData blazeProjectData;

    public void setTargetMap(TargetMap targetMap) {
      ArtifactLocationDecoder decoder =
          (location) -> new File("/src", location.getExecutionRootRelativePath());
      this.blazeProjectData =
          MockBlazeProjectDataBuilder.builder(workspaceRoot)
              .setTargetMap(targetMap)
              .setArtifactLocationDecoder(decoder)
              .build();
    }

    @Nullable
    @Override
    public BlazeProjectData getBlazeProjectData() {
      return blazeProjectData;
    }
  }

  private static class MockBuildReferenceManager extends BuildReferenceManager {
    public MockBuildReferenceManager(Project project) {
      super(project);
    }

    @Nullable
    @Override
    public PsiElement resolveLabel(Label label) {
      return null;
    }
  }

  private static class MockPsiClass extends NullPsiClass {
    private PsiFile psiFile;

    public MockPsiClass(PsiManager psiManager, VirtualFile virtualFile) {
      psiFile =
          new MockPsiFile(psiManager) {
            @Override
            public VirtualFile getVirtualFile() {
              return virtualFile;
            }
          };
    }

    @Override
    public PsiFile getContainingFile() {
      return psiFile;
    }
  }

  private static class MockJavaPsiFacade extends JavaPsiFacadeImpl {
    private ImmutableMap<String, PsiClass> classes;

    public MockJavaPsiFacade(
        Project project, PsiManager psiManager, ImmutableMap<String, PsiClass> classes) {
      super(project, psiManager, null, null);
      this.classes = classes;
    }

    @Override
    public PsiClass findClass(String qualifiedName, GlobalSearchScope scope) {
      return classes.get(qualifiedName);
    }
  }

  private static class MockSourceToTargetMap implements SourceToTargetMap {
    private ImmutableMap<File, TargetKey> sourceToTarget;

    public MockSourceToTargetMap(ImmutableMap<File, TargetKey> sourceToTarget) {
      this.sourceToTarget = sourceToTarget;
    }

    @Override
    public ImmutableCollection<Label> getTargetsToBuildForSourceFile(File file) {
      return ImmutableList.of();
    }

    @Override
    public ImmutableCollection<TargetKey> getRulesForSourceFile(File file) {
      return ImmutableList.of(sourceToTarget.get(file));
    }
  }
}
