// Copyright 2019 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.devtools.build.lib.query2.cquery;

import static com.google.common.truth.Truth.assertThat;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
import static com.google.devtools.build.lib.packages.BuildType.OUTPUT;

import com.google.common.eventbus.EventBus;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.util.MockRule;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.Reporter;
import com.google.devtools.build.lib.query2.PostAnalysisQueryEnvironment;
import com.google.devtools.build.lib.query2.engine.ConfiguredTargetQueryHelper;
import com.google.devtools.build.lib.query2.engine.ConfiguredTargetQueryTest;
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.Setting;
import com.google.devtools.build.lib.query2.engine.QueryExpression;
import com.google.devtools.build.lib.query2.engine.QueryParser;
import com.google.devtools.build.lib.query2.query.aspectresolvers.AspectResolver.Mode;
import com.google.devtools.build.lib.util.FileTypeSet;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;

/** Tests cquery's BUILD output format. */
public class BuildOutputFormatterCallbackTest extends ConfiguredTargetQueryTest {

  private CqueryOptions options;
  private Reporter reporter;
  private final List<Event> events = new ArrayList<>();

  private static MockRule.State simpleRule() {
    return MockRule.define(
        "my_rule",
        (builder, env) ->
            builder
                .add(attr("deps", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE))
                .add(attr("out", OUTPUT)));
  }

  @Before
  public final void setUpCqueryOptions() throws Exception {
    this.options = new CqueryOptions();
    options.aspectDeps = Mode.OFF;
    this.reporter = new Reporter(new EventBus(), events::add);
    helper.useRuleClassProvider(
        setRuleClassProviders(BuildOutputFormatterCallbackTest::simpleRule).build());
  }

  private List<String> getOutput(String queryExpression) throws Exception {
    QueryExpression expression = QueryParser.parse(queryExpression, getDefaultFunctions());
    Set<String> targetPatternSet = new LinkedHashSet<>();
    expression.collectTargetPatterns(targetPatternSet);
    helper.setQuerySettings(Setting.NO_IMPLICIT_DEPS);
    PostAnalysisQueryEnvironment<ConfiguredTarget> env =
        ((ConfiguredTargetQueryHelper) helper).getPostAnalysisQueryEnvironment(targetPatternSet);

    ByteArrayOutputStream output = new ByteArrayOutputStream();
    BuildOutputFormatterCallback callback =
        new BuildOutputFormatterCallback(
            reporter,
            options,
            new PrintStream(output),
            getHelper().getSkyframeExecutor(),
            env.getAccessor());
    env.evaluateQuery(expression, callback);
    return Arrays.asList(output.toString().split(System.lineSeparator()));
  }

  @Test
  public void selectInAttribute() throws Exception {
    writeFile(
        "test/BUILD",
        "my_rule(",
        "  name = 'my_rule',",
        "  deps = select({",
        "    ':garfield': ['lasagna.java', 'naps.java'],",
        "    '//conditions:default': ['mondays.java']",
        "  })",
        ")",
        "config_setting(",
        "  name = 'garfield',",
        "  values = {'test_arg': 'cat'}",
        ")");

    getHelper().useConfiguration("--test_arg=cat");
    assertThat(getOutput("//test:my_rule"))
        .containsExactly(
            "# /workspace/test/BUILD:1:1",
            "my_rule(",
            "  name = \"my_rule\",",
            "  deps = [\"//test:lasagna.java\", \"//test:naps.java\"],",
            ")")
        .inOrder();

    getHelper().useConfiguration("--test_arg=hound");
    assertThat(getOutput("//test:my_rule"))
        .containsExactly(
            "# /workspace/test/BUILD:1:1",
            "my_rule(",
            "  name = \"my_rule\",",
            "  deps = [\"//test:mondays.java\"],",
            ")")
        .inOrder();
  }

  @Test
  public void alias() throws Exception {
    writeFile(
        "test/BUILD",
        "my_rule(",
        "  name = 'my_rule',",
        "  deps = select({",
        "    ':garfield': ['lasagna.java', 'naps.java'],",
        "    '//conditions:default': ['mondays.java']",
        "  })",
        ")",
        "config_setting(",
        "  name = 'garfield',",
        "  values = {'test_arg': 'cat'}",
        ")",
        "alias(",
        "  name = 'my_alias',",
        "  actual = ':my_rule'",
        ")");

    assertThat(getOutput("//test:my_alias"))
        .containsExactly(
            "# /workspace/test/BUILD:12:1",
            "alias(",
            "  name = \"my_alias\",",
            "  actual = \"//test:my_rule\",",
            ")")
        .inOrder();
  }

  @Test
  public void aliasWithSelect() throws Exception {
    writeFile(
        "test/BUILD",
        "my_rule(",
        "  name = 'my_first_rule',",
        "  deps = ['penne.java'],",
        ")",
        "my_rule(",
        "  name = 'my_second_rule',",
        "  deps = ['linguini.java'],",
        ")",
        "config_setting(",
        "  name = 'garfield',",
        "  values = {'test_arg': 'cat'}",
        ")",
        "alias(",
        "  name = 'my_alias',",
        "  actual = select({",
        "    ':garfield': ':my_first_rule',",
        "    '//conditions:default': ':my_second_rule'",
        "  })",
        ")");

    getHelper().useConfiguration("--test_arg=cat");
    assertThat(getOutput("//test:my_alias"))
        .containsExactly(
            "# /workspace/test/BUILD:13:1",
            "alias(",
            "  name = \"my_alias\",",
            "  actual = \"//test:my_first_rule\",",
            ")")
        .inOrder();

    getHelper().useConfiguration("--test_arg=hound");
    assertThat(getOutput("//test:my_alias"))
        .containsExactly(
            "# /workspace/test/BUILD:13:1",
            "alias(",
            "  name = \"my_alias\",",
            "  actual = \"//test:my_second_rule\",",
            ")")
        .inOrder();
  }

  @Test
  public void sourceFile() throws Exception {
    writeFile(
        "test/BUILD",
        "my_rule(",
        "  name = 'my_rule',",
        "  deps = select({",
        "    ':garfield': ['lasagna.java', 'naps.java'],",
        "    '//conditions:default': ['mondays.java']",
        "  })",
        ")",
        "config_setting(",
        "  name = 'garfield',",
        "  values = {'test_arg': 'cat'}",
        ")");

    assertThat(getOutput("//test:lasagna.java")).containsExactly("");
  }

  @Test
  public void outputFile() throws Exception {
    writeFile(
        "test/BUILD",
        "my_rule(",
        "  name = 'my_rule',",
        "  deps = select({",
        "    ':garfield': ['lasagna.java', 'naps.java'],",
        "    '//conditions:default': ['mondays.java']",
        "  }),",
        "  out = 'output.txt'",
        ")",
        "config_setting(",
        "  name = 'garfield',",
        "  values = {'test_arg': 'cat'}",
        ")");

    getHelper().useConfiguration("--test_arg=cat");
    assertThat(getOutput("//test:output.txt"))
        .containsExactly(
            "# /workspace/test/BUILD:1:1",
            "my_rule(",
            "  name = \"my_rule\",",
            "  deps = [\"//test:lasagna.java\", \"//test:naps.java\"],",
            "  out = \"//test:output.txt\",",
            ")")
        .inOrder();

    getHelper().useConfiguration("--test_arg=hound");
    assertThat(getOutput("//test:output.txt"))
        .containsExactly(
            "# /workspace/test/BUILD:1:1",
            "my_rule(",
            "  name = \"my_rule\",",
            "  deps = [\"//test:mondays.java\"],",
            "  out = \"//test:output.txt\",",
            ")")
        .inOrder();
  }
}
