blob: 3e5e508901d79eff34a052ed4b6464684ab9948c [file] [log] [blame]
package com.jetbrains.python.refactoring.classes.pullUp;
import com.google.common.collect.Iterables;
import com.intellij.refactoring.classMembers.MemberInfoModel;
import com.jetbrains.NotNullPredicate;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyElement;
import com.jetbrains.python.refactoring.classes.PyMemberInfoStorage;
import com.jetbrains.python.refactoring.classes.membersManager.PyMemberInfo;
import org.easymock.internal.MocksControl;
import org.hamcrest.Matchers;
import org.jetbrains.annotations.NotNull;
import org.junit.Assert;
import java.util.ArrayList;
import java.util.List;
/**
* Tests dependencies management for PyPullUp refactoring
*
* @author Ilya.Kazakevich
*/
public class PyPullUpInfoModelTest extends PyTestCase {
private PyPullUpInfoModel mySut;
private List<PyMemberInfo<PyElement>> myMemberInfos;
@Override
public void setUp() throws Exception {
super.setUp();
myFixture.configureByFile("/refactoring/pullup/pyPullUpInfoModel.py");
final PyClass childClass = getClassByName("ChildWithDependencies");
final PyClass parentClass = getClassByName("SomeParent");
mySut = new PyPullUpInfoModel(childClass, new MocksControl(MocksControl.MockType.NICE).createMock(PyPullUpView.class));
mySut.setSuperClass(parentClass);
myMemberInfos = new PyMemberInfoStorage(childClass).getClassMemberInfos(childClass);
}
/**
* Checks class field depends on class field
*/
public void testClassMemberDependencies() throws Exception {
checkMembers("CLASS_FIELD_DEPENDS_ON_CLASS_FIELD_FOO");
Assert.assertThat("Class member dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("CLASS_FIELD_FOO"));
}
/**
* Checks instance field depends on class field
*/
public void testInstanceMemberDependencies() throws Exception {
checkMembers("self.depends_on_class_field_foo");
Assert.assertThat("Instance member dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("CLASS_FIELD_FOO"));
}
/**
* Checks method depends on another class field
*/
public void testMethodMemberDependencies() throws Exception {
checkMembers("method_depends_on_normal_method(self)");
Assert.assertThat("Method dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("normal_method(self)"));
}
/**
* Checks method depends on method
*/
public void testMethodOnInstanceMemberDependencies() throws Exception {
checkMembers("method_depends_on_instance_field_bar(self)");
Assert.assertThat("Instance on member dependencies failed", getErrorMemberNames(), Matchers.containsInAnyOrder("self.instance_field_bar"));
}
/**
* Check dependnecies for properties, declared in old-style
*
*/
public void testOldProperty() throws Exception {
checkMembers("method_depends_on_old_property(self)");
Assert.assertThat("Method on old property dependency failed", getErrorMemberNames(), Matchers.containsInAnyOrder(
"old_property",
"old_property_2",
"old_property_3"));
}
/**
*
* Check dependnecies for properties, declared in new-style
*/
public void testNewProperty() throws Exception {
checkMembers("method_depends_on_new_property(self)");
Assert.assertThat("Method on new property dependency failed", getErrorMemberNames(), Matchers.containsInAnyOrder("new_property", "new_property_2"));
}
/**
* All dependencies are met: new (destination) class has all of them
*/
public void testParentDependenciesOk() throws Exception {
checkMembers("CLASS_FIELD_DEPENDS_ON_PARENT_FIELD",
"method_depends_on_parent_method(self)",
"method_depends_on_parent_field(self)");
Assert.assertThat("Dependence check false positive: parent has all required members", getErrorMemberNames(), Matchers.empty());
}
/**
* New (destination) class has no members, required by member under refactoring.
* Error should be displayed.
*/
public void testNoParentDependenciesOk() throws Exception {
mySut.setSuperClass(getClassByName("EmptyParent"));
checkMembers("CLASS_FIELD_DEPENDS_ON_PARENT_FIELD",
"method_depends_on_parent_method(self)",
"method_depends_on_parent_field(self)");
Assert.assertThat("Dependence check false positive: parent has all required members", getErrorMemberNames(), Matchers.contains("extends SomeParent"));
}
/**
* @return names of error members (displayed with red)
*/
@NotNull
private List<String> getErrorMemberNames() {
final List<String> result = new ArrayList<String>();
for (final PyMemberInfo<PyElement> info : myMemberInfos) {
if (mySut.checkForProblems(info) != MemberInfoModel.OK) {
result.add(info.getDisplayName());
}
}
return result;
}
/**
* Marks members to be moved (sets checkbox on them)
* @param memberNames names of members to check
*/
private void checkMembers(@NotNull final String... memberNames) {
for (final String memberName : memberNames) {
Iterables.find(myMemberInfos, new NamePredicate(memberName)).setChecked(true);
}
mySut.memberInfoChanged(myMemberInfos);
}
private static class NamePredicate extends NotNullPredicate<PyMemberInfo<?>> {
@NotNull
private final String myNameToSearch;
private NamePredicate(@NotNull final String nameToSearch) {
myNameToSearch = nameToSearch;
}
@Override
protected boolean applyNotNull(@NotNull final PyMemberInfo<?> input) {
return input.getDisplayName().equals(myNameToSearch);
}
}
}