fold as closures anonymous classes with a single implemented method, as long they...
[idea/community.git] / java / java-tests / testSrc / com / intellij / codeInsight / folding / JavaFolding8Test.groovy
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.codeInsight.folding
17
18 import com.intellij.codeInsight.folding.impl.CodeFoldingManagerImpl
19 import com.intellij.codeInsight.folding.impl.JavaCodeFoldingSettingsImpl
20 import com.intellij.codeInsight.folding.impl.JavaFoldingBuilder
21 import com.intellij.openapi.editor.ex.FoldingModelEx
22 import com.intellij.openapi.editor.impl.FoldingModelImpl
23 import com.intellij.testFramework.LightProjectDescriptor
24 import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
25 import org.jetbrains.annotations.NotNull
26
27 /**
28  * @author peter
29  */
30 class JavaFolding8Test extends LightCodeInsightFixtureTestCase {
31
32   JavaCodeFoldingSettingsImpl myFoldingSettings
33   JavaCodeFoldingSettingsImpl myFoldingStateToRestore
34
35   @NotNull
36   @Override
37   protected LightProjectDescriptor getProjectDescriptor() {
38     return JAVA_8
39   }
40
41   @Override
42   void setUp() {
43     super.setUp()
44     myFoldingSettings = JavaCodeFoldingSettings.instance as JavaCodeFoldingSettingsImpl
45     myFoldingStateToRestore = new JavaCodeFoldingSettingsImpl()
46     myFoldingStateToRestore.loadState(myFoldingSettings)
47   }
48
49   @Override
50   protected void tearDown() {
51     myFoldingSettings.loadState(myFoldingStateToRestore)
52     super.tearDown()
53   }
54
55   void "test no plain lambda folding where anonymous class can be real lambda but fold otherwise"() {
56     myFixture.addClass('interface Runnable2 { void run(); }')
57     myFixture.addClass('abstract class MyAction { public void run(); public void update() {} }')
58     def text = """\
59 class Test {
60   void test() {
61     Runnable r = new Runnable2() {
62       public void run() {
63         System.out.println();
64       }
65     };
66     MyAction action = new MyAction() {
67       public void run() {
68         System.out.println();
69       }
70     }
71   }
72 }
73 """
74     configure text
75     def foldingModel = myFixture.editor.foldingModel as FoldingModelImpl
76
77     assert foldingModel.getCollapsedRegionAtOffset(text.indexOf("MyAction(")).placeholderText == 'run() ' + JavaFoldingBuilder.rightArrow + ' { '
78     assert !foldingModel.getCollapsedRegionAtOffset(text.indexOf("Runnable2("))
79   }
80
81   void "test closure folding when implementing a single abstract method in a class"() {
82     myFixture.addClass('abstract class MyAction { public abstract void run(); }')
83     def text = """\
84 class Test {
85   void test() {
86     MyAction action = new MyAction() {
87       public void run() {
88         System.out.println();
89       }
90     }
91   }
92 }
93 """
94     configure text
95     def foldingModel = myFixture.editor.foldingModel as FoldingModelImpl
96
97     assert foldingModel.getCollapsedRegionAtOffset(text.indexOf("MyAction("))?.placeholderText == '() ' + JavaFoldingBuilder.rightArrow + ' { '
98   }
99
100   private def configure(String text) {
101     myFixture.configureByText("a.java", text)
102     CodeFoldingManagerImpl.getInstance(getProject()).buildInitialFoldings(myFixture.editor)
103     def foldingModel = myFixture.editor.foldingModel as FoldingModelEx
104     foldingModel.rebuild()
105     myFixture.doHighlighting()
106   }
107
108 }