/*
* 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.psi.impl;
import com.goide.GoCodeInsightFixtureTestCase;
import com.goide.psi.*;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
public class GoPsiImplUtilTest extends GoCodeInsightFixtureTestCase {
public void testGetLocalPackageNameDash() {
assertEquals("test_directory", GoPsiImplUtil.getLocalPackageName("test-directory"));
}
public void testGetLocalPackageNameDigitAtBeginning() {
assertEquals("_23abc", GoPsiImplUtil.getLocalPackageName("123abc"));
}
public void testGetLocalPackageNameUnderscore() {
assertEquals("_", GoPsiImplUtil.getLocalPackageName("_"));
}
public void testGetLocalPackageNameForPath() {
assertEquals("test_directory", GoPsiImplUtil.getLocalPackageName("path/test-directory"));
}
public void testAddVarSpec() {
myFixture.configureByText("a.go", "package main\n\nvar (\n" +
" fo<caret>o int\n" +
")");
GoVarDeclaration declaration = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDeclaration.class);
assertNotNull(declaration);
declaration.addSpec("bar", "string", "`1`", null);
myFixture.checkResult("package main\n\nvar (\n foo int\nbar string = `1`\n)");
}
public void testAddVarSpecWithoutParens() {
myFixture.configureByText("a.go", "package main\n\nvar fo<caret>o int\n");
GoVarDeclaration declaration = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDeclaration.class);
assertNotNull(declaration);
declaration.addSpec("bar", "string", "`1`", null);
myFixture.checkResult("package main\n\nvar (foo int\nbar string = `1`\n)\n");
}
public void testAddVarSpecNoNewLines() {
myFixture.configureByText("a.go", "package main\n\nvar (fo<caret>o int\n)");
GoVarDeclaration declaration = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDeclaration.class);
assertNotNull(declaration);
declaration.addSpec("bar", "string", "`1`", null);
myFixture.checkResult("package main\n\nvar (foo int\nbar string = `1`\n)");
}
public void testAddVarSpecWithAnchor() {
myFixture.configureByText("a.go", "package main\n\nvar (\n" +
" fo<caret>o int\n" +
")");
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
GoVarDeclaration declaration = (GoVarDeclaration)spec.getParent();
declaration.addSpec("bar", "string", "`1`", spec);
myFixture.checkResult("package main\n\nvar (\n bar string = `1`\nfoo int\n)");
}
public void testAddVarSpecWithoutParensWithAnchor() {
myFixture.configureByText("a.go", "package main\n\nvar fo<caret>o int\n");
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
GoVarDeclaration declaration = (GoVarDeclaration)spec.getParent();
declaration.addSpec("bar", "string", "`1`", spec);
myFixture.checkResult("package main\n\nvar (\nbar string = `1`\nfoo int)\n");
}
public void testAddVarSpecNoNewLinesWithAnchor() {
myFixture.configureByText("a.go", "package main\n\nvar (fo<caret>o int\n)");
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
GoVarDeclaration declaration = (GoVarDeclaration)spec.getParent();
declaration.addSpec("bar", "string", "`1`", spec);
myFixture.checkResult("package main\n\nvar (\nbar string = `1`\nfoo int\n)");
}
public void testAddConstSpec() {
myFixture.configureByText("a.go", "package main\n\nconst (\n" +
" fo<caret>o int\n" +
")");
GoConstDeclaration declaration = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDeclaration.class);
assertNotNull(declaration);
declaration.addSpec("bar", "string", "`1`", null);
myFixture.checkResult("package main\n\nconst (\n foo int\nbar string = `1`\n)");
}
public void testAddConstSpecWithoutParens() {
myFixture.configureByText("a.go", "package main\n\nconst fo<caret>o int\n");
GoConstDeclaration declaration = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDeclaration.class);
assertNotNull(declaration);
declaration.addSpec("bar", "string", "`1`", null);
myFixture.checkResult("package main\n\nconst (foo int\nbar string = `1`\n)\n");
}
public void testAddConstSpecNoNewLines() {
myFixture.configureByText("a.go", "package main\n\nconst (fo<caret>o int\n)");
GoConstDeclaration declaration = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDeclaration.class);
assertNotNull(declaration);
declaration.addSpec("bar", "string", "`1`", null);
myFixture.checkResult("package main\n\nconst (foo int\nbar string = `1`\n)");
}
public void testAddConstSpecWithAnchor() {
myFixture.configureByText("a.go", "package main\n\nconst (\n" +
" fo<caret>o int\n" +
")");
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
GoConstDeclaration declaration = (GoConstDeclaration)spec.getParent();
declaration.addSpec("bar", "string", "`1`", spec);
myFixture.checkResult("package main\n\nconst (\n bar string = `1`\nfoo int\n)");
}
public void testAddConstSpecWithoutParensWithAnchor() {
myFixture.configureByText("a.go", "package main\n\nconst fo<caret>o int\n");
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
GoConstDeclaration declaration = (GoConstDeclaration)spec.getParent();
declaration.addSpec("bar", "string", "`1`", spec);
myFixture.checkResult("package main\n\nconst (\nbar string = `1`\nfoo int)\n");
}
public void testAddConstSpecNoNewLinesWithAnchor() {
myFixture.configureByText("a.go", "package main\n\nconst (fo<caret>o int\n)");
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
GoConstDeclaration declaration = (GoConstDeclaration)spec.getParent();
declaration.addSpec("bar", "string", "`1`", spec);
myFixture.checkResult("package main\n\nconst (\nbar string = `1`\nfoo int\n)");
}
public void testGetTypeOfSingleVarDefinition() {
myFixture.configureByText("a.go", "package main\n\n var f<caret>oo int");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoType type = definition.findSiblingType();
assertNotNull(type);
assertEquals("int", type.getText());
}
public void testGetTypeOfMultipleVarDefinition() {
myFixture.configureByText("a.go", "package main\n\n var fo<caret>o, bar int");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoType type = definition.findSiblingType();
assertNotNull(type);
assertEquals("int", type.getText());
}
public void testGetTypeOfSingleConstDefinition() {
myFixture.configureByText("a.go", "package main\n\n const fo<caret>o int = 1");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoType type = definition.findSiblingType();
assertNotNull(type);
assertEquals("int", type.getText());
}
public void testGetTypeOfMultipleConstDefinition() {
myFixture.configureByText("a.go", "package main\n\n const fo<caret>o, bar int = 1, 2");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoType type = definition.findSiblingType();
assertNotNull(type);
assertEquals("int", type.getText());
}
public void testGetValueOfVarDefinitionInSwitch() {
myFixture.configureByText("a.go", "package main\n\n func _() { bar := nil; switch fo<caret>o := bar.(type){}}");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("bar", value.getText());
}
public void testGetValueOfSingleVarDefinition() {
myFixture.configureByText("a.go", "package main\n\n var fo<caret>o int = 1");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("1", value.getText());
}
public void testGetValueOfMultipleVarDefinition_1() {
myFixture.configureByText("a.go", "package main\n\n var fo<caret>o, bar int = 1, 2");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("1", value.getText());
}
public void testGetValueOfMultipleVarDefinition_2() {
myFixture.configureByText("a.go", "package main\n\n var foo, b<caret>ar int = 1, 2");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("2", value.getText());
}
public void testGetValueOfMultipleVarDefinitionWithoutValues() {
myFixture.configureByText("a.go", "package main\n\n var f<caret>oo, bar int");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
assertNull(definition.getValue());
}
public void testGetValueOfMultipleInvalidVarDefinition() {
myFixture.configureByText("a.go", "package main\n\n var foo, b<caret>ar int = 1");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
assertNull(definition.getValue());
}
public void testGetValueOfSingleConstDefinition() {
myFixture.configureByText("a.go", "package main\n\n const fo<caret>o int = 1");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("1", value.getText());
}
public void testGetValueOfMultipleConstDefinition_1() {
myFixture.configureByText("a.go", "package main\n\n const fo<caret>o, bar int = 1, 2");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("1", value.getText());
}
public void testGetValueOfMultipleConstDefinition_2() {
myFixture.configureByText("a.go", "package main\n\n const foo, b<caret>ar int = 1, 2");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoExpression value = definition.getValue();
assertNotNull(value);
assertEquals("2", value.getText());
}
public void testDeleteSingleVarDefinition() {
myFixture.configureByText("a.go", "package main\n\n var b<caret>ar int = 1, 2");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n ");
}
public void testDeleteFirstMultipleVarDefinitionWithValue() {
myFixture.configureByText("a.go", "package main\n\n var fo<caret>o, bar int = 1, 2");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n var bar int = 2");
}
public void testDeleteMiddleMultipleVarDefinitionWithValue() {
myFixture.configureByText("a.go", "package main\n\n var buzz, fo<caret>o, bar int = 1, 2, 3");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n var buzz , bar int = 1 , 3");
}
public void testDeleteLastMultipleVarDefinitionWithValue() {
myFixture.configureByText("a.go", "package main\n\n var foo, b<caret>ar int = 1, 2");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n var foo int = 1 ");
}
public void testDeleteLastMultipleVarDefinitionWithoutValue() {
myFixture.configureByText("a.go", "package main\n\n var foo, b<caret>ar int = 1");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n var foo int = 1");
}
public void testDeleteFirstMultipleVarDefinitionWithoutValue() {
myFixture.configureByText("a.go", "package main\n\n var f<caret>oo, bar int = 1");
GoVarDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarDefinition.class);
assertNotNull(definition);
GoVarSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoVarSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n var bar int ");
}
public void testDeleteSingleConstDefinition() {
myFixture.configureByText("a.go", "package main\n\n const b<caret>ar int = 1, 2");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n ");
}
public void testDeleteFirstMultipleConstDefinitionWithValue() {
myFixture.configureByText("a.go", "package main\n\n const fo<caret>o, bar int = 1, 2");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n const bar int = 2");
}
public void testDeleteMiddleMultipleConstDefinitionWithValue() {
myFixture.configureByText("a.go", "package main\n\n const buzz, fo<caret>o, bar int = 1, 2, 3");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n const buzz , bar int = 1 , 3");
}
public void testDeleteLastMultipleConstDefinitionWithValue() {
myFixture.configureByText("a.go", "package main\n\n const foo, b<caret>ar int = 1, 2");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n const foo int = 1 ");
}
public void testDeleteLastMultipleConstDefinitionWithoutValue() {
myFixture.configureByText("a.go", "package main\n\n const foo, b<caret>ar int = 1");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n const foo int = 1");
}
public void testDeleteFirstMultipleConstDefinitionWithoutValue() {
myFixture.configureByText("a.go", "package main\n\n const f<caret>oo, bar int = 1");
GoConstDefinition definition = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstDefinition.class);
assertNotNull(definition);
GoConstSpec spec = PsiTreeUtil.getNonStrictParentOfType(myFixture.getElementAtCaret(), GoConstSpec.class);
assertNotNull(spec);
spec.deleteDefinition(definition);
myFixture.checkResult("package main\n\n const bar int ");
}
public void testGoIndexOrSliceExprGetIndices() {
PsiFile file = myFixture.configureByText("a.go", "package main\n var a []int\n var b = a<caret>[1]");
GoIndexOrSliceExpr index = PsiTreeUtil.getParentOfType(file.findElementAt(myFixture.getCaretOffset()), GoIndexOrSliceExpr.class);
assertNotNull(index);
assertEquals("1", index.getIndices().first.getText());
}
@Override
protected boolean isWriteActionRequired() {
return true;
}
}