blob: 724cf404094af25d297c00005c77b0f47fc75656 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* 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 org.jetbrains.plugins.groovy.completion
import com.intellij.codeInsight.CodeInsightSettings
import com.intellij.codeInsight.completion.CompletionAutoPopupTestCase
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.testFramework.LightProjectDescriptor
import org.jetbrains.annotations.NotNull
import org.jetbrains.plugins.groovy.GroovyLightProjectDescriptor
/**
* @author peter
*/
class GroovyAutoPopupTest extends CompletionAutoPopupTestCase {
@NotNull
@Override protected LightProjectDescriptor getProjectDescriptor() {
return GroovyLightProjectDescriptor.GROOVY_2_1
}
@Override
protected void setUp() {
super.setUp()
CodeInsightSettings.instance.SELECT_AUTOPOPUP_SUGGESTIONS_BY_CHARS = true
}
@Override
protected void tearDown() {
CodeInsightSettings.instance.AUTOPOPUP_FOCUS_POLICY = CodeInsightSettings.SMART
CodeInsightSettings.instance.SELECT_AUTOPOPUP_SUGGESTIONS_BY_CHARS = false
CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.FIRST_LETTER
super.tearDown()
}
public void testGenerallyFocusLookup() {
myFixture.configureByText("a.groovy", """
String foo(String xxxxxx) {
return xx<caret>
}
""")
edt { myFixture.doHighlighting() }
type 'x'
assert lookup.focused
}
public void testTopLevelFocus() {
myFixture.configureByText 'a.groovy', '<caret>'
type 'p'
assert lookup.focused
}
public void testNoLookupFocusInVariable() {
myFixture.configureByText("a.groovy", """StringBuffer st<caret>""")
type 'r'
assert !lookup.focused
}
public void testNoLookupFocusOnUnresolvedQualifier() {
myFixture.configureByText("a.groovy", """xxx.<caret>""")
type 'h' //hashCode
assert !lookup
}
public void testNoLookupFocusOnUntypedQualifier() {
myFixture.configureByText("a.groovy", """
def foo(xxx) {
xxx.<caret>
}""")
type 'h'
assert !lookup
}
public void testPossibleClosureParameter() {
myFixture.configureByText("a.groovy", "{ <caret> }")
type 'h'
assert !lookup.focused
}
public void testPossibleClosureParameter2() {
CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
myFixture.configureByText("a.groovy", "{ a, <caret> }")
type 'h'
assert !lookup.focused
}
public void testImpossibleClosureParameter() {
myFixture.configureByText("a.groovy", "String a; { a.<caret> }")
type 'h'
assert lookup.focused
}
public void testFieldTypeLowercase() {
CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
myFixture.configureByText "a.groovy", "class Foo { <caret> }"
type 'aioobe'
assert myFixture.lookupElementStrings == [ArrayIndexOutOfBoundsException.simpleName]
}
public void testNoWordCompletionAutoPopup() {
myFixture.configureByText "a.groovy", 'def foo = "f<caret>"'
type 'o'
assert !lookup
}
public void testClassesAndPackagesInUnqualifiedImports() {
myFixture.addClass("package Xxxxx; public class Xxxxxxxxx {}")
myFixture.configureByText 'a.groovy', 'package foo; import <caret>'
type 'Xxx'
assert myFixture.lookupElementStrings == ['Xxxxxxxxx', 'Xxxxx']
}
private def setFocusLookup() {
CodeInsightSettings.instance.AUTOPOPUP_FOCUS_POLICY = CodeInsightSettings.ALWAYS
}
public void testPopupAfterDotAfterPackage() {
setFocusLookup()
myFixture.configureByText 'a.groovy', '<caret>'
type 'import jav'
assert lookup
type '.'
assert lookup
}
public void testTypingFirstVarargDot() {
myFixture.addClass("class Foo { static class Bar {} }")
myFixture.configureByText "a.groovy", "void foo(Foo<caret>[] a) { }"
type '.'
assert lookup
type '.'
myFixture.checkResult('void foo(Foo..<caret>[] a) { }')
}
public void testTypingFirstVarargDot2() {
myFixture.addClass("class Foo { static class Bar {} }")
myFixture.configureByText "a.groovy", "void foo(Foo<caret>) { }"
type '.'
assert lookup
type '.'
myFixture.checkResult('void foo(Foo..<caret>) { }')
}
public void testDotDot() {
myFixture.configureByText "a.groovy", '2<caret>'
type '.'
assert lookup
assert lookup.focused
type '.'
assert !lookup
myFixture.checkResult '2..<caret>'
}
public void testInsideBuilderMethod() {
myFixture.configureByText 'a.groovy', 'html { body {}; <caret> }'
type 'h'
assert lookup
assert !lookup.focused
}
public void testInsideClosure() {
myFixture.configureByText 'a.groovy', 'def cl = { foo(); <caret> }'
type 'h'
assert lookup
assert lookup.focused
}
public void testForVariableNoFocus() {
myFixture.configureByText 'a.groovy', 'def fl, cl = []; for(<caret>)'
type 'f'
assert !lookup.focused
type 'inal '
assert !lookup
type 'c'
assert !lookup.focused
assert 'char' in myFixture.lookupElementStrings
assert myFixture.editor.document.text.contains('for(final c)')
type ' in c'
assert lookup.focused
}
public void testForVariableNoFocus2() {
myFixture.configureByText 'a.groovy', 'for (<caret>args) {}'
type 'a'
assert !lookup.focused
}
public void testNonImportedClass() {
myFixture.addClass("package foo; public class Abcdefg {}")
myFixture.configureByText 'a.groovy', '<caret>'
type 'Abcde '
myFixture.checkResult 'import foo.Abcdefg\n\nAbcdefg <caret>'
}
public void "test two non-imported classes when space does not select first autopopup item"() {
CodeInsightSettings.instance.SELECT_AUTOPOPUP_SUGGESTIONS_BY_CHARS = false
myFixture.addClass("package foo; public class Abcdefg {}")
myFixture.addClass("package bar; public class Abcdefg {}")
myFixture.configureByText 'a.groovy', 'class Foo extends <caret>'
type 'Abcde'
assert lookup.items.size() == 2
edt { myFixture.performEditorAction(IdeActions.ACTION_EDITOR_MOVE_CARET_DOWN) }
type ' '
myFixture.checkResult '''import foo.Abcdefg
class Foo extends Abcdefg <caret>'''
}
public void testTwoNonImportedClasses() {
myFixture.addClass("package foo; public class Abcdefg {}")
myFixture.addClass("package bar; public class Abcdefg {}")
myFixture.configureByText 'a.groovy', '<caret>'
type 'Abcde '
myFixture.checkResult '''import bar.Abcdefg
Abcdefg <caret>'''
}
public void testPrivate() {
CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
myFixture.configureByText 'a.groovy', 'class Foo { <caret> }'
type 'pri'
assert myFixture.lookupElementStrings[0] == 'private'
}
public void testFieldTypeNonImported() {
myFixture.addClass("package foo; public class PrimaBalerina {}")
myFixture.configureByText 'a.groovy', 'class Foo { <caret> }'
type 'PrimaB'
assert myFixture.lookupElementStrings == ['PrimaBalerina']
}
public void testEnteringLabel() {
myFixture.configureByText 'a.groovy', '<caret>'
type 'FIS:'
assert myFixture.file.text == 'FIS:'
}
public void testEnteringNamedArg() {
myFixture.configureByText 'a.groovy', 'foo(<caret>)'
type 'has:'
myFixture.checkResult 'foo(has:<caret>)'
}
public void testEnteringMapKey() {
myFixture.configureByText 'a.groovy', '[<caret>]'
type 'has:'
myFixture.checkResult '[has:<caret>]'
}
public void testPreferRightCasedVariant() {
CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
myFixture.configureByText 'a.groovy', '<caret>'
type 'boo'
myFixture.assertPreferredCompletionItems 0, 'boolean'
type '\b\b\bBoo'
myFixture.assertPreferredCompletionItems 0, 'Boolean'
}
public void testPackageQualifier() {
CodeInsightSettings.instance.SELECT_AUTOPOPUP_SUGGESTIONS_BY_CHARS = false
myFixture.addClass("package com.too; public class Util {}")
myFixture.configureByText 'a.groovy', 'void foo(Object command) { <caret> }'
type 'com.t'
assert myFixture.lookupElementStrings.containsAll(['too', 'command.toString'])
}
public void testVarargParenthesis() {
myFixture.configureByText 'a.groovy', '''
void foo(File... files) { }
foo(new <caret>)
'''
type 'File'
myFixture.assertPreferredCompletionItems 0, 'File', 'File', 'FileInputStream'
type '('
assert myFixture.editor.document.text.contains('new File()')
}
public void testSecondClosureParameterName() {
myFixture.configureByText("a.groovy", "{ String a, Object <caret> }")
type 'o'
assert !lookup.focused
}
public void testSecondClosureParameterName2() {
myFixture.configureByText("a.groovy", "{ String a, Object <caret>String beanName -> println 'hi' }")
type 'o'
assert !lookup.focused
}
public void testNoAutopopupAfterDef() {
CodeInsightSettings.instance.COMPLETION_CASE_SENSITIVE = CodeInsightSettings.NONE
myFixture.configureByText 'a.groovy', 'def <caret>'
type 'a'
assert !lookup
}
}