/*
 * 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.base.lang.buildfile.editor;

import com.google.common.base.Joiner;
import com.google.idea.blaze.base.lang.buildfile.BuildFileIntegrationTestCase;
import com.intellij.openapi.actionSystem.IdeActions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

/** Tests that indents are inserted correctly when enter is pressed. */
@RunWith(JUnit4.class)
public class BuildIndentOnEnterTest extends BuildFileIntegrationTestCase {

  private void setInput(String... fileContents) {
    testFixture.configureByText("BUILD", Joiner.on("\n").join(fileContents));
  }

  private void pressEnterAndAssertResult(String... resultingFileContents) {
    pressButton(IdeActions.ACTION_EDITOR_ENTER);
    testFixture.getFile().getText();
    testFixture.checkResult(Joiner.on("\n").join(resultingFileContents));
  }

  @Test
  public void testSimpleIndent() {
    setInput("a=1<caret>");
    pressEnterAndAssertResult("a=1", "<caret>");
  }

  @Test
  public void testAlignInListMiddle() {
    setInput("target = [a,<caret>", "          c]");
    pressEnterAndAssertResult("target = [a,", "          <caret>", "          c]");
  }

  @Test
  public void testNoAlignAfterList() {
    setInput("target = [", "    arg", "]<caret>");
    pressEnterAndAssertResult("target = [", "    arg", "]", "<caret>");
  }

  @Test
  public void testAlignInDict() {
    setInput("some_call({'aaa': 'v1',<caret>})");
    pressEnterAndAssertResult("some_call({'aaa': 'v1',", "           <caret>})");
  }

  @Test
  public void testAlignInDictInParams() { // PY-1947
    setInput("foobar({<caret>})");
    pressEnterAndAssertResult("foobar({", "    <caret>", "})");
  }

  @Test
  public void testAlignInEmptyList() {
    setInput("target = [<caret>]");
    pressEnterAndAssertResult("target = [", "    <caret>", "]");
  }

  @Test
  public void testAlignInEmptyParens() {
    setInput("foo(<caret>)");
    pressEnterAndAssertResult("foo(", "    <caret>", ")");
  }

  @Test
  public void testAlignInEmptyDict() {
    setInput("{<caret>}");
    pressEnterAndAssertResult("{", "    <caret>", "}");
  }

  @Test
  public void testAlignInEmptyTuple() {
    setInput("(<caret>)");
    pressEnterAndAssertResult("(", "    <caret>", ")");
  }

  @Test
  public void testEnterInNonEmptyArgList() {
    setInput("func(<caret>params=1)");
    pressEnterAndAssertResult("func(", "    <caret>params=1)");
  }

  @Test
  public void testNoIndentAfterTuple() {
    setInput("()<caret>");
    pressEnterAndAssertResult("()", "<caret>");
  }

  @Test
  public void testNoIndentAfterList() {
    setInput("target = [1, 2]<caret>");
    pressEnterAndAssertResult("target = [1, 2]", "<caret>");
  }

  @Test
  public void testNoIndentAfterDict() {
    setInput("target = {}<caret>");
    pressEnterAndAssertResult("target = {}", "<caret>");
  }

  @Test
  public void testEmptyFuncallStart() {
    setInput("func(<caret>", ")");
    pressEnterAndAssertResult("func(", "    <caret>", ")");
  }

  @Test
  public void testEmptyFuncallAfterNewlineNoIndent() {
    setInput("func(", "<caret>)");
    pressEnterAndAssertResult("func(", "", "<caret>)");
  }

  @Test
  public void testEmptyFuncallAfterNewlineWithIndent() {
    setInput("func(", "    <caret>", ")");
    pressEnterAndAssertResult("func(", "    ", "    <caret>", ")");
  }

  @Test
  public void testFuncallAfterFirstArg() {
    setInput("func(", "    arg1,<caret>", ")");
    pressEnterAndAssertResult("func(", "    arg1,", "    <caret>", ")");
  }

  @Test
  public void testFuncallFirstArgOnSameLine() {
    setInput("func(arg1, arg2,<caret>");
    pressEnterAndAssertResult("func(arg1, arg2,", "     <caret>");
  }

  @Test
  public void testFuncallFirstArgOnSameLineWithClosingBrace() {
    setInput("func(arg1, arg2,<caret>)");
    pressEnterAndAssertResult("func(arg1, arg2,", "     <caret>)");
  }

  @Test
  public void testNonEmptyDict() {
    setInput("{key1 : value1,<caret>}");
    pressEnterAndAssertResult("{key1 : value1,", " <caret>}");
  }

  @Test
  public void testNonEmptyDictFirstArgIndented() {
    setInput("{", "    key1 : value1,<caret>" + "}");
    pressEnterAndAssertResult("{", "    key1 : value1,", "    <caret>" + "}");
  }

  @Test
  public void testEmptyDictAlreadyIndented() {
    setInput("{", "    <caret>" + "}");
    pressEnterAndAssertResult("{", "    ", "    <caret>" + "}");
  }

  @Test
  public void testEmptyParamIndent() {
    setInput("def fn(<caret>)");
    pressEnterAndAssertResult("def fn(", "    <caret>", ")");
  }

  @Test
  public void testNonEmptyParamIndent() {
    setInput("def fn(param1,<caret>)");
    pressEnterAndAssertResult("def fn(param1,", "       <caret>)");
  }

  @Test
  public void testFunctionDefAfterColon() {
    setInput("def fn():<caret>");
    pressEnterAndAssertResult("def fn():", "  <caret>");
  }

  // def fn():stmt* (THIS IS CURRENTLY BROKEN -- shouldn't indent but does)
  @Test
  public void testFunctionDefSingleStatement() {
    setInput("def fn():stmt<caret>");
    pressEnterAndAssertResult("def fn():stmt", "<caret>");
  }

  @Test
  public void testFunctionDefAfterFirstSuiteStatement() {
    setInput("def fn():", "  stmt1<caret>");
    pressEnterAndAssertResult("def fn():", "  stmt1", "  <caret>");
  }

  @Test
  public void testNoIndentAfterSuiteDedentOnEmptyLine() {
    setInput("def fn():", "  stmt1", "  stmt2", "<caret>");
    pressEnterAndAssertResult("def fn():", "  stmt1", "  stmt2", "", "<caret>");
  }

  @Test
  public void testIndentAfterIf() {
    setInput("if condition:<caret>");
    pressEnterAndAssertResult("if condition:", "  <caret>");
  }

  @Test
  public void testNoIndentAfterIfPlusStatement() {
    setInput("if condition:stmt<caret>");
    pressEnterAndAssertResult("if condition:stmt", "<caret>");
  }

  @Test
  public void testIndentAfterElseIf() {
    setInput("if condition:", "  stmt", "elif:<caret>");
    pressEnterAndAssertResult("if condition:", "  stmt", "elif:", "  <caret>");
  }

  @Test
  public void testNoIndentAfterElseIfPlusStatement() {
    setInput("if condition:", "  stmt", "elif:stmt<caret>");
    pressEnterAndAssertResult("if condition:", "  stmt", "elif:stmt", "<caret>");
  }

  @Test
  public void testIndentAfterElse() {
    setInput("if condition:", "  stmt", "else:<caret>");
    pressEnterAndAssertResult("if condition:", "  stmt", "else:", "  <caret>");
  }

  @Test
  public void testNoIndentAfterElsePlusStatement() {
    setInput("if condition:", "  stmt", "else:stmt<caret>");
    pressEnterAndAssertResult("if condition:", "  stmt", "else:stmt", "<caret>");
  }

  @Test
  public void testIndentAfterForColon() {
    setInput("for x in list:<caret>");
    pressEnterAndAssertResult("for x in list:", "  <caret>");
  }

  @Test
  public void testNoIndentAfterForPlusStatement() {
    setInput("for x in list:do_action<caret>");
    pressEnterAndAssertResult("for x in list:do_action", "<caret>");
  }

  @Test
  public void testCommonRuleCase1() {
    setInput("java_library(", "    name = 'lib'", "    srcs = [<caret>]");
    pressEnterAndAssertResult(
        "java_library(", "    name = 'lib'", "    srcs = [", "        <caret>", "    ]");
  }

  @Test
  public void testCommonRuleCase2() {
    setInput(
        "java_library(", "    name = 'lib'", "    srcs = [", "        'source',<caret>", "    ]");
    pressEnterAndAssertResult(
        "java_library(",
        "    name = 'lib'",
        "    srcs = [",
        "        'source',",
        "        <caret>",
        "    ]");
  }

  @Test
  public void testCommonRuleCase3() {
    setInput("java_library(", "    name = 'lib'", "    srcs = ['first',<caret>]");
    pressEnterAndAssertResult(
        "java_library(", "    name = 'lib'", "    srcs = ['first',", "            <caret>]");
  }

  @Test
  public void testDedentAfterReturn() {
    setInput("def fn():", "  return None<caret>");
    pressEnterAndAssertResult("def fn():", "  return None", "<caret>");
  }

  @Test
  public void testDedentAfterEmptyReturn() {
    setInput("def fn():", "  return<caret>");
    pressEnterAndAssertResult("def fn():", "  return", "<caret>");
  }

  @Test
  public void testDedentAfterReturnWithTrailingWhitespace() {
    setInput("def fn():", "  return<caret>   ");
    pressEnterAndAssertResult("def fn():", "  return", "<caret>");
  }

  @Test
  public void testDedentAfterComplexReturn() {
    setInput("def fn():", "  return a == b<caret>");
    pressEnterAndAssertResult("def fn():", "  return a == b", "<caret>");
  }

  @Test
  public void testDedentAfterPass() {
    setInput("def fn():", "  pass<caret>");
    pressEnterAndAssertResult("def fn():", "  pass", "<caret>");
  }

  @Test
  public void testDedentAfterPassInLoop() {
    setInput("def fn():", "  for a in (1,2,3):", "    pass<caret>");
    pressEnterAndAssertResult("def fn():", "  for a in (1,2,3):", "    pass", "  <caret>");
  }

  // regression test for b/29564041
  @Test
  public void testNoExceptionPressingEnterAtStartOfFile() {
    setInput("#<caret>");
    pressEnterAndAssertResult("#", "<caret>");
  }
}
