com.google.idea.blaze.base.lang.buildfile.editor.BuildIndentOnEnterTest.java Source code

Java tutorial

Introduction

Here is the source code for com.google.idea.blaze.base.lang.buildfile.editor.BuildIndentOnEnterTest.java

Source

/*
 * 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) {
        editorTest.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>");
    }
}