blob: 6a951c938d33e0ffedc611a44b6d4d9e164dd088 [file] [log] [blame]
/*
* Copyright 2000-2013 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 com.jetbrains.python;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.fixtures.LightMarkedTestCase;
import com.jetbrains.python.psi.PyAssignmentStatement;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PySubscriptionExpression;
import com.jetbrains.python.psi.PyTargetExpression;
import junit.framework.Assert;
import java.util.List;
import java.util.Map;
/**
* Tests assignment mapping.
* User: dcheryasov
* Date: Dec 11, 2009 2:13:51 AM
*/
public class PyAssignmentMappingTest extends LightMarkedTestCase {
@Override
public String getTestDataPath() {
return PythonTestUtil.getTestDataPath() + "/psi/assignment/";
}
public void testSimple() throws Exception {
Map<String, PsiElement> marks = loadTest();
Assert.assertEquals(2, marks.size());
PsiElement src = marks.get("<src>").getParent(); // const -> expr;
PsiElement dst = marks.get("<dst>").getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PyTargetExpression);
PyAssignmentStatement stmt = (PyAssignmentStatement)dst.getParent();
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(1, mapping.size());
Pair<PyExpression, PyExpression> pair = mapping.get(0);
Assert.assertEquals(dst, pair.getFirst());
Assert.assertEquals(src, pair.getSecond());
}
public void testSubscribedSource() throws Exception {
Map<String, PsiElement> marks = loadTest();
Assert.assertEquals(2, marks.size());
PsiElement src = marks.get("<src>").getParent().getParent(); // const -> ref foo -> subscr expr;
PsiElement dst = marks.get("<dst>").getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PyTargetExpression);
PyAssignmentStatement stmt = (PyAssignmentStatement)dst.getParent();
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(1, mapping.size());
Pair<PyExpression, PyExpression> pair = mapping.get(0);
Assert.assertEquals(dst, pair.getFirst());
Assert.assertEquals(src, pair.getSecond());
}
public void testSubscribedTarget() throws Exception {
Map<String, PsiElement> marks = loadTest();
Assert.assertEquals(2, marks.size());
PsiElement src = marks.get("<src>").getParent(); // const -> expr;
PsiElement dst = marks.get("<dst>").getParent().getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PySubscriptionExpression);
PyAssignmentStatement stmt = (PyAssignmentStatement)src.getParent();
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(1, mapping.size());
Pair<PyExpression, PyExpression> pair = mapping.get(0);
Assert.assertEquals(dst, pair.getFirst());
Assert.assertEquals(src, pair.getSecond());
}
public void testMultiple() throws Exception {
Map<String, PsiElement> marks = loadTest();
final int TARGET_NUM = 3;
Assert.assertEquals(TARGET_NUM + 1, marks.size());
PsiElement src = marks.get("<src>").getParent(); // const -> expr;
PsiElement[] dsts = new PsiElement[TARGET_NUM];
for (int i=0; i<TARGET_NUM; i+=1) {
PsiElement dst = marks.get("<dst" + String.valueOf(i+1) +">").getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PyTargetExpression);
dsts[i] = dst;
}
PyAssignmentStatement stmt = (PyAssignmentStatement)src.getParent();
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(TARGET_NUM, mapping.size());
for (int i=0; i<TARGET_NUM; i+=1) {
Pair<PyExpression, PyExpression> pair = mapping.get(i);
Assert.assertEquals(dsts[i], pair.getFirst());
Assert.assertEquals(src, pair.getSecond());
}
}
public void testTupleMapped() throws Exception {
Map<String, PsiElement> marks = loadTest();
final int PAIR_NUM = 2;
Assert.assertEquals(PAIR_NUM * 2, marks.size());
PsiElement[] srcs = new PsiElement[PAIR_NUM];
PsiElement[] dsts = new PsiElement[PAIR_NUM];
for (int i=0; i<PAIR_NUM; i+=1) {
PsiElement dst = marks.get("<dst" + String.valueOf(i+1) +">").getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PyTargetExpression);
dsts[i] = dst;
PsiElement src = marks.get("<src" + String.valueOf(i+1) +">").getParent(); // ident -> target expr
Assert.assertTrue(src instanceof PyExpression);
srcs[i] = src;
}
PyAssignmentStatement stmt = (PyAssignmentStatement)srcs[0].getParent().getParent(); // tuple expr -> assignment
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(PAIR_NUM, mapping.size());
for (int i=0; i<PAIR_NUM; i+=1) {
Pair<PyExpression, PyExpression> pair = mapping.get(i);
Assert.assertEquals(dsts[i], pair.getFirst());
Assert.assertEquals(srcs[i], pair.getSecond());
}
}
public void testParenthesizedTuple() throws Exception { //PY-2648
Map<String, PsiElement> marks = loadTest();
final int PAIR_NUM = 2;
Assert.assertEquals(PAIR_NUM * 2, marks.size());
PsiElement[] srcs = new PsiElement[PAIR_NUM];
PsiElement[] dsts = new PsiElement[PAIR_NUM];
for (int i=0; i<PAIR_NUM; i+=1) {
PsiElement dst = marks.get("<dst" + String.valueOf(i + 1) + ">").getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PyTargetExpression);
dsts[i] = dst;
PsiElement src = marks.get("<src" + String.valueOf(i + 1) + ">").getParent(); // ident -> target expr
Assert.assertTrue(src instanceof PyExpression);
srcs[i] = src;
}
PyAssignmentStatement stmt = (PyAssignmentStatement)srcs[0].getParent().getParent().getParent(); // tuple expr -> assignment
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(PAIR_NUM, mapping.size());
for (int i=0; i<PAIR_NUM; i+=1) {
Pair<PyExpression, PyExpression> pair = mapping.get(i);
Assert.assertEquals(dsts[i], pair.getFirst());
Assert.assertEquals(srcs[i], pair.getSecond());
}
}
public void testTuplePack() throws Exception {
Map<String, PsiElement> marks = loadTest();
final int SRC_NUM = 2;
Assert.assertEquals(SRC_NUM + 1, marks.size());
PsiElement[] srcs = new PsiElement[SRC_NUM];
for (int i=0; i<SRC_NUM; i+=1) {
PsiElement src = marks.get("<src" + String.valueOf(i+1) +">").getParent(); // ident -> target expr
Assert.assertTrue(src instanceof PyExpression);
srcs[i] = src;
}
PsiElement dst = marks.get("<dst>").getParent(); // ident -> target expr
PyAssignmentStatement stmt = (PyAssignmentStatement)dst.getParent();
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(1, mapping.size());
Pair<PyExpression, PyExpression> pair = mapping.get(0);
Assert.assertEquals(dst, pair.getFirst());
for (PsiElement src : srcs) {
Assert.assertEquals(src.getParent(), pair.getSecond()); // numeric expr -> tuple
}
}
public void testTupleUnpack() throws Exception {
Map<String, PsiElement> marks = loadTest();
final int DST_NUM = 2;
Assert.assertEquals(DST_NUM + 3, marks.size());
PsiElement[] dsts = new PsiElement[DST_NUM];
for (int i=0; i<DST_NUM; i+=1) {
PsiElement dst = marks.get("<dst" + String.valueOf(i+1) +">").getParent(); // ident -> target expr
Assert.assertTrue(dst instanceof PyTargetExpression);
dsts[i] = dst;
}
PsiElement[] srcs = new PsiElement[DST_NUM];
for (int i=0; i<DST_NUM; i+=1) {
PsiElement src = marks.get("<src" + String.valueOf(i+1) +">").getParent().getParent().getParent(); // ident -> target expr
Assert.assertTrue(src instanceof PyExpression);
srcs[i] = src;
}
PsiElement src = marks.get("<src>").getParent(); // ident -> target expr
PyAssignmentStatement stmt = (PyAssignmentStatement)src.getParent().getParent();
List<Pair<PyExpression, PyExpression>> mapping = stmt.getTargetsToValuesMapping();
Assert.assertEquals(DST_NUM, mapping.size());
for (int i=0; i<DST_NUM; i+=1) {
Pair<PyExpression, PyExpression> pair = mapping.get(i);
Assert.assertEquals(dsts[i], pair.getFirst());
Assert.assertEquals(srcs[i].getText(), pair.getSecond().getText());
}
}
}