/* * 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.lang.actions.generate import com.intellij.codeInsight.generation.* import com.intellij.openapi.application.Result import com.intellij.openapi.application.RunResult import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.intellij.psi.PsiClass import com.intellij.psi.PsiFile import com.intellij.psi.impl.source.PostprocessReformattingAspect import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import com.intellij.util.ui.UIUtil import org.jetbrains.annotations.Nullable import org.jetbrains.plugins.groovy.actions.generate.accessors.GroovyGenerateGetterSetterAction import org.jetbrains.plugins.groovy.actions.generate.constructors.GroovyGenerateConstructorHandler import org.jetbrains.plugins.groovy.util.TestUtils /** * @author peter */ public class GroovyGenerateMembersTest extends LightCodeInsightFixtureTestCase { public void testConstructorAtOffset() { doConstructorTest(); } public void testConstructorAtEnd() { doConstructorTest(); } public void testLonelyConstructor() { doConstructorTest(); } public void testConstructorInJavaInheritor() { myFixture.configureByText "GrBase.groovy", """ abstract class GrBase { GrBase(int i) { } } """ myFixture.configureByText "Inheritor.java", """ class Inheritor extends GrBase { } """ generateConstructor(true) myFixture.checkResult """ class Inheritor extends GrBase { public Inheritor(int i) { super(i); } } """ } public void testExplicitArgumentTypes() { myFixture.configureByText("a.groovy", """ class Super { def Super(a, int b) {} } class Foo extends Super { int c Object d final e } """) generateConstructor() myFixture.checkResult """ class Super { def Super(a, int b) {} } class Foo extends Super { int c Object d final e Foo(a, int b, int c, Object d, e) { super(a, b) this.c = c this.d = d this.e = e } } """ } void testSubstitutionInConstructor() { myFixture.configureByText("a.groovy", ''' class Super { def Super(Collection c) {} } class X {} class Foo extends Super { } ''') generateConstructor() myFixture.checkResult(''' class Super { def Super(Collection c) {} } class X {} class Foo extends Super { Foo(Collection c) { super(c) } } ''') } void testGetter1() { myFixture.configureByText 'a.groovy', ''' class Test { def foo }''' generateGetter() myFixture.checkResult ''' class Test { def foo def getFoo() { return foo } }''' } void testGetter2() { myFixture.configureByText 'a.groovy', ''' class Test { int foo }''' generateGetter() myFixture.checkResult ''' class Test { int foo int getFoo() { return foo } }''' } void testGetter3() { myFixture.configureByText 'a.groovy', ''' class Test { static foo }''' generateGetter() myFixture.checkResult ''' class Test { static foo static getFoo() { return foo } }''' } void testGetter4() { myFixture.addFileToProject('org/jetbrains/annotations/Nullable.java', 'package org.jetbrains.annotations; public @interface Nullable {}') myFixture.configureByText 'a.groovy', ''' import org.jetbrains.annotations.Nullable class Test { @Nullable def foo }''' generateGetter() myFixture.checkResult ''' import org.jetbrains.annotations.Nullable class Test { @Nullable def foo @Nullable getFoo() { return foo } }''' } void testSetter1() { myFixture.configureByText 'a.groovy', ''' class Test { def foo }''' generateSetter() myFixture.checkResult ''' class Test { def foo void setFoo(foo) { this.foo = foo } }''' } void testSetter2() { myFixture.configureByText 'a.groovy', ''' class Test { int foo }''' generateSetter() myFixture.checkResult ''' class Test { int foo void setFoo(int foo) { this.foo = foo } }''' } void testSetter3() { myFixture.configureByText 'a.groovy', ''' class Test { static foo }''' generateSetter() myFixture.checkResult ''' class Test { static foo static void setFoo(foo) { Test.foo = foo } }''' } void testSetter4() { myFixture.addFileToProject('org/jetbrains/annotations/Nullable.java', 'package org.jetbrains.annotations; public @interface Nullable {}') myFixture.configureByText 'a.groovy', ''' import org.jetbrains.annotations.Nullable class Test { @Nullable def foo }''' generateSetter() myFixture.checkResult ''' import org.jetbrains.annotations.Nullable class Test { @Nullable def foo void setFoo(@Nullable foo) { this.foo = foo } }''' } void testConstructorInTheMiddle() { doConstructorTest """\ class Foo { def foo() {} def bar() {} } """, """\ class Foo { def foo() {} Foo() { } def bar() {} } """ } void testConstructorWithOptionalParameter() { doConstructorTest('''\ class Base { Base(int x = 0){} } class Inheritor extends Base { } ''', '''\ class Base { Base(int x = 0){} } class Inheritor extends Base { Inheritor(int x) { super(x) } } ''') } void testGetterInTheEnd() { myFixture.configureByText 'a.groovy', ''' class GrImportStatementStub { private final String myAlias; private final String mySymbolName; protected GrImportStatementStub(String symbolName, String alias) { } } ''' generateGetter() myFixture.checkResult ''' class GrImportStatementStub { private final String myAlias; private final String mySymbolName; protected GrImportStatementStub(String symbolName, String alias) { } String getMyAlias() { return myAlias } String getMySymbolName() { return mySymbolName } } ''' } private void generateGetter() { //noinspection GroovyResultOfObjectAllocationIgnored new GroovyGenerateGetterSetterAction() //don't remove it!!! new WriteCommandAction(project, PsiFile.EMPTY_ARRAY) { protected void run(Result result) throws Throwable { new GenerateGetterHandler() { @Nullable protected ClassMember[] chooseMembers(ClassMember[] members, boolean allowEmptySelection, boolean copyJavadocCheckbox, Project project, Editor editor) { return members } }.invoke(project, myFixture.editor, myFixture.file); UIUtil.dispatchAllInvocationEvents() PostprocessReformattingAspect.getInstance(project).doPostponedFormatting() } }.execute() } private void generateSetter() { //noinspection GroovyResultOfObjectAllocationIgnored new GroovyGenerateGetterSetterAction() //don't remove it!!! new WriteCommandAction(project, PsiFile.EMPTY_ARRAY) { protected void run(Result result) throws Throwable { new GenerateSetterHandler() { @Nullable protected ClassMember[] chooseMembers(ClassMember[] members, boolean allowEmptySelection, boolean copyJavadocCheckbox, Project project, Editor editor) { return members } }.invoke(project, myFixture.editor, myFixture.file); PostprocessReformattingAspect.getInstance(project).doPostponedFormatting() } }.execute() } private void doConstructorTest(String before = null, String after = null) { if (before != null) { myFixture.configureByText('_a.groovy', before) } else { myFixture.configureByFile(getTestName(false) + ".groovy"); } generateConstructor(); if (after != null) { myFixture.checkResult(after) } else { myFixture.checkResultByFile(getTestName(false) + "_after.groovy"); } } private RunResult generateConstructor(boolean javaHandler = false) { GenerateMembersHandlerBase handler if (javaHandler) { handler = new GenerateConstructorHandler() { @Override protected ClassMember[] chooseMembers(ClassMember[] members, boolean allowEmptySelection, boolean copyJavadocCheckbox, Project project, Editor editor) { return members; } } } else { handler = new GroovyGenerateConstructorHandler() { @Override protected ClassMember[] chooseOriginalMembersImpl(PsiClass aClass, Project project) { List members = aClass.fields.collect { new PsiFieldMember(it) } members << new PsiMethodMember(aClass.superClass.constructors[0]) return members as ClassMember[] } } } return new WriteCommandAction(project, new PsiFile[0]) { protected void run(Result result) throws Throwable { handler.invoke(project, myFixture.editor, myFixture.file); PostprocessReformattingAspect.getInstance(project).doPostponedFormatting() } }.execute() } final String basePath = TestUtils.testDataPath + "generate" }