/*
* 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;
import com.goide.GoCodeInsightFixtureTestCase;
import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import org.jetbrains.annotations.NotNull;
import static com.intellij.codeInsight.highlighting.ReadWriteAccessDetector.Access.*;
public class GoReadWriteAccessTest extends GoCodeInsightFixtureTestCase {
public void testAssignment() {
doTest("fo<caret>o = 1", Write);
}
public void testSimpleStatement() {
doTest("fo<caret>o", Read);
}
public void testIncDec() {
doTest("fo<caret>o++", Write);
}
public void testPlusAssign() {
doTest("fo<caret>o += 1", ReadWrite);
}
public void testParenthesisExpression() {
doTest("(fo<caret>o) = 2", Write);
}
public void testPointer() {
doTest("(*fo<caret>o) = 2", Write);
}
public void testLeftPartOfSelectorExpressionInAssignment() {
doTest("foo.b<caret>ar.baz = 1", Read);
}
public void testLeftPartOfSelectorExpressionInAssignment_1() {
doTest("f<caret>oo.bar.baz = 1", Read);
}
public void testRightPartOfSelectorExpressionInAssignment() {
doTest("foo.bar.ba<caret>z = 1", Write);
}
public void testRangeLeftExpression() {
doTest("for fo<caret>o = range bar {\n}", Write);
}
public void testRangeLeftExpression_1() {
doTest("for (*fo<caret>o) = range bar {\n}", Write);
}
public void testRangeRightExpression() {
doTest("for foo = range ba<caret>r {\n}", Read);
}
public void testRangeRightExpression_1() {
doTest("for foo := range ba<caret>r {\n}", Read);
}
public void testRangeRightExpression_2() {
doTest("for foo = range (*ba<caret>r) {\n}", Read);
}
public void testSendRead() {
doTest("a := <- cha<caret>nnel", Read);
}
public void testSendWrite() {
doTest("chan<caret>nel <- a", Write);
}
public void testCallExpression() {
doTest("fmt.Print<caret>ln(a)", Read);
}
public void testRecvStatementWrite() {
doTest("select {\n\tcase fo<caret>o = bar:\n}", Write);
}
public void testRecvStatementRead() {
doTest("select {\n\tcase foo = b<caret>ar:\n}", Read);
}
public void testSendStatementInCaseWrite() {
doTest("select {\n\tcase (*fo<caret>o) <- bar:\n}", ReadWrite);
}
public void testSendStatementInCaseRead() {
doTest("select {\n\tcase foo <- (*b<caret>ar):\n}", Read);
}
public void testFieldInInitializer() {
myFixture.configureByText("a.go", "package main\n" +
"type aStruct struct {\n" +
"\taField string\n" +
"}\n" +
"func newStruct() aStruct {\n" +
"\treturn aStruct{\n" +
"\t\taFie<caret>ld: \"a value\",\n" +
"\t}\n" +
"}");
PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
GoFieldName goFieldName = PsiTreeUtil.getNonStrictParentOfType(element, GoFieldName.class);
assertNotNull(goFieldName);
//noinspection ConstantConditions
assertEquals(Write, ReadWriteAccessDetector.findDetector(goFieldName.getReference().resolve()).getExpressionAccess(goFieldName));
}
private void doTest(@NotNull String expressionText, @NotNull ReadWriteAccessDetector.Access expectedAccess) {
myFixture.configureByText("a.go", "package main; func _() {\n" + expressionText + "\n}");
PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
GoReferenceExpression expression = PsiTreeUtil.getNonStrictParentOfType(element, GoReferenceExpression.class);
assertNotNull(expression);
assertEquals(expectedAccess, expression.getReadWriteAccess());
}
}