/*
* 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.inspections;
import com.goide.SdkAware;
import com.goide.quickfix.GoDeleteImportQuickFix;
import com.goide.quickfix.GoQuickFixTestBase;
import com.goide.sdk.GoSdkService;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.psi.PsiFile;
import com.intellij.util.containers.ContainerUtil;
import java.util.Collection;
@SdkAware
public class GoInvalidPackageImportInspectionTest extends GoQuickFixTestBase {
@Override
public void setUp() throws Exception {
super.setUp();
myFixture.enableInspections(GoInvalidPackageImportInspection.class);
}
public void testImportBuiltinPackage() {
myFixture.addFileToProject("builtin/hello.go", "package builtin");
myFixture.configureByText("a.go", "package pack; import <error descr=\"Cannot import 'builtin' package\">`builtin`</error>");
myFixture.checkHighlighting();
}
public void testImportBuiltinSubPackage() {
myFixture.addFileToProject("builtin/hello.go", "package builtin");
myFixture.addFileToProject("builtin/sub/hello.go", "package builtin");
myFixture.configureByText("a.go", "package pack; import `builtin/sub`");
myFixture.checkHighlighting();
}
public void testImportVendoredBuiltin() {
myFixture.addFileToProject("vendor/builtin/hello.go", "package builtin");
myFixture.configureByText("a.go", "package pack; import `builtin`");
myFixture.checkHighlighting();
}
public void testImportUnreachableVendoredPackage() {
myFixture.addFileToProject("pack/vendor/foo/a.go", "package foo");
myFixture.configureByText("a.go", "package bar\n" +
"import _ `pack/vendor/unresolved`\n" +
"import <error descr=\"Use of vendored package is not allowed\">_ `pack/ve<caret>ndor/foo`</error>");
myFixture.checkHighlighting();
assertContainsElements(getIntentionNames(), "Disable vendoring experiment support in module 'light_idea_test_case'", "Delete import");
assertDoesntContain(getIntentionNames(), "Replace with `foo`");
}
public void testReplaceImportWithVendoredPath() {
myFixture.addFileToProject("vendor/foo/a.go", "package foo");
myFixture.configureByText("a.go", "package pack\n" +
"import _ `pack/vendor/unresolved`\n" +
"import <error descr=\"Must be imported as 'foo'\">_ `vend<caret>or/foo`</error>");
myFixture.checkHighlighting();
assertContainsElements(getIntentionNames(), "Disable vendoring experiment support in module 'light_idea_test_case'", "Delete import");
myFixture.launchAction(myFixture.findSingleIntention("Replace with 'foo'"));
myFixture.checkResult("package pack\n" +
"import _ `pack/vendor/unresolved`\n" +
"import _ `foo`");
}
public void testDoNoSuggestDisablingVendoringOnGo1_7() {
GoSdkService.setTestingSdkVersion("1.7", getTestRootDisposable());
myFixture.addFileToProject("vendor/foo/a.go", "package foo");
myFixture.configureByText("a.go", "package pack\n" +
"import _ `pack/vendor/unresolved`\n" +
"import <error descr=\"Must be imported as 'foo'\">_ `vend<caret>or/foo`</error>");
myFixture.checkHighlighting();
assertDoesntContain(getIntentionNames(), "Disable vendoring experiment support in module 'light_idea_test_case'");
}
public void testWithDisabledVendoring() {
disableVendoring();
myFixture.addFileToProject("pack/vendor/foo/a.go", "package foo");
myFixture.addFileToProject("vendor/foo/a.go", "package foo");
myFixture.configureByText("a.go", "package pack\n" +
"import _ `pack/vendor/unresolved`\n" +
"import _ `pack/vendor/foo/a`\n" +
"import _ `vendor/foo/a`");
myFixture.checkHighlighting();
}
public void testVendorInsideVendorShouldBeUnreachable() {
myFixture.addFileToProject("vendor/foo/a.go", "package foo");
myFixture.addFileToProject("vendor/foo/vendor/bar/a.go", "package bar");
myFixture.configureByText("a.go", "package bar\n" +
"import _ `foo`\n" +
"import <error descr=\"Use of vendored package is not allowed\">_ `foo/vendor/bar`</error>");
myFixture.checkHighlighting();
}
public void testImportMainPackage() {
myFixture.addFileToProject("foo/main/main.go", "package main");
myFixture.addFileToProject("bar/main/main_test.go", "package main_test");
myFixture.addFileToProject("buzz/main/other_main_test.go", "package main");
myFixture.addFileToProject("not_program/main/other_main.go", "package main_test");
myFixture.addFileToProject("foo/not_main/main.go", "package main");
myFixture.addFileToProject("bar/not_main/main_test.go", "package main_test");
myFixture.addFileToProject("buzz/not_main/other_main_test.go", "package main");
myFixture.addFileToProject("not_program/not_main/other_main.go", "package main_test");
myFixture.configureByText("a.go", "package a\n" +
"import <error descr=\"'foo/main' is a program, not an importable package\">`foo/main`</error>\n" +
"import <error descr=\"'bar/main' is a program, not an importable package\">`bar/main`</error>\n" +
"import <error descr=\"'buzz/main' is a program, not an importable package\">`buzz/main`</error>\n" +
"import `not_program/main`\n" +
"import <error descr=\"'foo/not_main' is a program, not an importable package\">`foo/not_main`</error>\n" +
"import <error descr=\"'bar/not_main' is a program, not an importable package\">`bar/not_main`</error>\n" +
"import <error descr=\"'buzz/not_main' is a program, not an importable package\">`buzz/not_main`</error>\n" +
"import `not_program/not_main`");
myFixture.checkHighlighting();
}
public void testImportMainPackageInTest() {
myFixture.addFileToProject("foo/main/main.go", "package main");
myFixture.configureByText("a_test.go", "package a\nimport `foo/main`");
myFixture.checkHighlighting();
}
public void testInternalPackageOn1_2_SDK() {
myFixture.addFileToProject("internal/internal.go", "package internalPackage; func InternalFunction() {}");
myFixture.addFileToProject("sub/internal/internal.go", "package subInternalPackage; func InternalFunction() {}");
myFixture.configureByText("a.go", "package src\n" +
"import (\n" +
" `internal`\n" +
" `sub/internal`\n" +
" `net/internal`\n" +
")");
myFixture.checkHighlighting();
}
public void testInternalPackageOn1_4_SDK() {
GoSdkService.setTestingSdkVersion("1.4", getTestRootDisposable());
myFixture.addFileToProject("internal/internal.go", "package internalPackage; func InternalFunction() {}");
myFixture.addFileToProject("sub/internal/internal.go", "package subInternalPackage; func InternalFunction() {}");
myFixture.configureByText("a.go", "package src\n" +
"import (\n" +
" `internal`\n" +
" `sub/internal`\n" +
" <error descr=\"Use of internal package is not allowed\">`net/internal`</error>\n" +
")");
myFixture.checkHighlighting();
}
public void testInternalPackageOn1_5_SDK() {
GoSdkService.setTestingSdkVersion("1.5", getTestRootDisposable());
myFixture.addFileToProject("internal/internal.go", "package internalPackage; func InternalFunction() {}");
myFixture.addFileToProject("sub/internal/internal.go", "package subInternalPackage; func InternalFunction() {}");
myFixture.configureByText("a.go", "package src\n" +
"import (\n" +
" `internal`\n" +
" <error descr=\"Use of internal package is not allowed\">`sub/internal`</error>\n" +
" <error descr=\"Use of internal package is not allowed\">`net/internal`</error>\n" +
")");
myFixture.checkHighlighting();
}
public void testImportPackageWithoutBuildableSource() {
PsiFile file = myFixture.addFileToProject("withSources/a.go", "package withSources");
myFixture.addFileToProject("withIgnoredFiles/a.go", "package documentation");
myFixture.addFileToProject("withIgnoredFiles/.b.go", "package withIgnoredFiles");
myFixture.addFileToProject("withIgnoredFiles/_b.go", "package withIgnoredFiles");
WriteCommandAction.runWriteCommandAction(myFixture.getProject(), () -> {
//noinspection ConstantConditions
file.getParent().getParent().createSubdirectory("withoutSources");
});
myFixture.configureByText("a.go", "package pack\n" +
"import `withSources`\n" +
"import <error descr=\"'/src/withIgnoredFiles' has no buildable Go source files\">`withIgnoredFiles`</error>\n" +
"import <error descr=\"'/src/withoutSources' has no buildable Go source files\">`withoutSources`</error>\n" +
"import <error descr=\"'/src/withoutSources' has no buildable Go source files\">_ `without<caret>Sources`</error>\n" +
"import `unresolved`\n");
myFixture.checkHighlighting();
applySingleQuickFix(GoDeleteImportQuickFix.QUICK_FIX_NAME);
myFixture.checkResult("package pack\n" +
"import `withSources`\n" +
"import `withIgnoredFiles`\n" +
"import `withoutSources`\n" +
"import `unresolved`\n");
}
public void testImportAbsolutePath() {
myFixture.configureByText("a.go", "package a; import <error descr=\"Cannot import absolute path\">`/f<caret>mt`</error>");
myFixture.checkHighlighting();
assertEmpty(myFixture.filterAvailableIntentions("go get"));
applySingleQuickFix(GoDeleteImportQuickFix.QUICK_FIX_NAME);
myFixture.checkResult("package a; ");
}
public void testImportTestDataDirectory() {
myFixture.addFileToProject("pack/testdata/pack/foo.go", "package test");
myFixture.configureByText("a.go", "package a\n" +
"import `pack/testdata/pack`\n" +
"import <error descr=\"Use of testdata package from SDK is not allowed\">`doc/te<caret>stdata`</error>");
myFixture.checkHighlighting();
applySingleQuickFix(GoDeleteImportQuickFix.QUICK_FIX_NAME);
myFixture.checkResult("package a\nimport `pack/testdata/pack`\n");
}
public void testImportCWithAlias() {
myFixture.configureByText("a.go",
"package t; import `C`; import <error descr=\"Cannot import 'builtin' package\">alias `<caret>C`</error>;");
myFixture.checkHighlighting();
applySingleQuickFix(GoInvalidPackageImportInspection.DELETE_ALIAS_QUICK_FIX_NAME);
myFixture.checkResult("package t; import `C`; import `C`;");
}
public void testImportCWithDot() {
myFixture.configureByText("a.go", "package t; import `C`; import <error descr=\"Cannot rename import `C`\">. `<caret>C`</error>;");
myFixture.checkHighlighting();
applySingleQuickFix(GoInvalidPackageImportInspection.DELETE_ALIAS_QUICK_FIX_NAME);
myFixture.checkResult("package t; import `C`; import `C`;");
}
private Collection<String> getIntentionNames() {
return ContainerUtil.map(myFixture.getAvailableIntentions(), IntentionAction::getText);
}
}