/* * Copyright 2013-2016 Sergey Ignatov, Alexander Zolotov, Florin Patan * * 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.goide.codeInsight.imports; import com.goide.GoCodeInsightFixtureTestCase; import com.goide.SdkAware; import com.goide.inspections.unresolved.GoUnresolvedReferenceInspection; import com.intellij.codeInsight.CodeInsightSettings; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzerSettings; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.openapi.command.undo.UndoManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.PsiFile; import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import java.util.List; @SdkAware public class GoReferenceImporterTest extends GoCodeInsightFixtureTestCase { private boolean defaultJavaOnTheFly; private boolean defaultJavaMemberOnTheFly; private boolean defaultGoOnTheFly; private static void updateSettings(boolean onTheFlyEnabled) { GoCodeInsightSettings.getInstance().setAddUnambiguousImportsOnTheFly(onTheFlyEnabled); } @Override protected void setUp() throws Exception { super.setUp(); myFixture.enableInspections(GoUnresolvedReferenceInspection.class); ((CodeInsightTestFixtureImpl)myFixture).canChangeDocumentDuringHighlighting(true); CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); defaultJavaOnTheFly = codeInsightSettings.ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY; defaultJavaMemberOnTheFly = codeInsightSettings.ADD_MEMBER_IMPORTS_ON_THE_FLY; defaultGoOnTheFly = GoCodeInsightSettings.getInstance().isAddUnambiguousImportsOnTheFly(); codeInsightSettings.ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = true; codeInsightSettings.ADD_MEMBER_IMPORTS_ON_THE_FLY = true; } @Override protected void tearDown() throws Exception { try { updateSettings(defaultGoOnTheFly); CodeInsightSettings codeInsightSettings = CodeInsightSettings.getInstance(); codeInsightSettings.ADD_MEMBER_IMPORTS_ON_THE_FLY = defaultJavaMemberOnTheFly; codeInsightSettings.ADD_UNAMBIGIOUS_IMPORTS_ON_THE_FLY = defaultJavaOnTheFly; } finally { //noinspection ThrowFromFinallyBlock super.tearDown(); } } private void doTestAddOnTheFly(boolean goOnTheFlyEnabled) { DaemonCodeAnalyzerSettings.getInstance().setImportHintEnabled(true); updateSettings(goOnTheFlyEnabled); String initial = "package a; func a() {\n fmt.Println() <caret> \n}"; myFixture.configureByText("a.go", initial); myFixture.doHighlighting(); myFixture.doHighlighting(); String after = "package a;\n\nimport \"fmt\"\n\nfunc a() {\n fmt.Println() \n}"; String result = goOnTheFlyEnabled ? after : initial; myFixture.checkResult(result); } public void testUndo() { DaemonCodeAnalyzerSettings.getInstance().setImportHintEnabled(true); updateSettings(true); myFixture.configureByText("a.go", "package main\n\nfunc main() { <caret> }"); myFixture.type("fmt."); myFixture.doHighlighting(); myFixture.doHighlighting(); myFixture.checkResult("package main\n\nimport \"fmt\"\n\nfunc main() { fmt. }"); FileEditor editor = FileEditorManager.getInstance(myFixture.getProject()).getSelectedEditor(myFixture.getFile().getVirtualFile()); UndoManager.getInstance(myFixture.getProject()).undo(editor); myFixture.checkResult("package main\n\nfunc main() { <caret> }"); } public void testOnTheFlyEnabled() { doTestAddOnTheFly(true); } public void testOnTheFlyDisabled() { doTestAddOnTheFly(false); } private void doTestImportOwnPath(String text, String testText, boolean shouldImport) { updateSettings(false); myFixture.addFileToProject(FileUtil.join("pack", "a.go"), text); PsiFile testFile = myFixture.addFileToProject(FileUtil.join("pack", "a_test.go"), testText); myFixture.configureFromExistingVirtualFile(testFile.getVirtualFile()); List<IntentionAction> actions = myFixture.filterAvailableIntentions("Import " + "pack" + "?"); assertTrue(shouldImport != actions.isEmpty()); } public void testOwnAddPathFromTest() { doTestImportOwnPath("package myPack; func Func() {}", "package myPack_test; func TestFunc() { my<caret>Pack.Func() }", true); } public void testDoNotImportOwnPathFromDifferentPackage() { doTestImportOwnPath("package pack1; func Func() {}", "package pack2_test; func TestFunc() { pack<caret>1.Func() }", false); } public void testCompleteDifferentPackageFromTest() { myFixture.configureByText("a.go", "package foo; func a() { fmt.Print<caret> }"); assertNotEmpty(myFixture.getLookupElementStrings()); } public void testImportVendoringPackage() { myFixture.addFileToProject("vendor/a/b/c.go", "package b"); myFixture.configureByText("a.go", "package a; func a() { b<caret>.Println() }"); myFixture.launchAction(myFixture.findSingleIntention("Import a/b?")); myFixture.checkResult("package a;\n\nimport \"a/b\"\n\nfunc a() { b<caret>.Println() }"); } public void testImportVendoringPackageWithDisabledVendoring() { disableVendoring(); myFixture.addFileToProject("vendor/a/b/c.go", "package b"); myFixture.configureByText("a.go", "package a; func a() { b<caret>.Println() }"); myFixture.launchAction(myFixture.findSingleIntention("Import vendor/a/b?")); myFixture.checkResult("package a;\n\nimport \"vendor/a/b\"\n\nfunc a() { b<caret>.Println() }"); } public void testImportBuiltinPackage() { myFixture.configureByText("a.go", "package a; func a() { built<caret>in.Println() }"); assertEmpty(myFixture.filterAvailableIntentions("Import builtin?")); } public void testImportSdkTestData() { myFixture.configureByText("a.go", "package a; func _() { println(p<caret>kg.ExportedConstant) } "); assertEmpty(myFixture.filterAvailableIntentions("Import doc/testdata?")); } public void testImportVendoredBuiltinPackage() { myFixture.addFileToProject("vendor/builtin/builtin.go", "package builtin"); myFixture.configureByText("a.go", "package a; func a() { built<caret>in.Println() }"); myFixture.launchAction(myFixture.findSingleIntention("Import builtin?")); myFixture.checkResult("package a;\n\nimport \"builtin\"\n\nfunc a() { builtin.Println() }"); } }