package de.plushnikov.intellij.plugin.processor.modifier;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiModifierList;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
/**
* @author Alexej Kubarev
*/
public class FieldDefaultsModifierTest extends LightCodeInsightFixtureTestCase {
@Override
protected String getTestDataPath() {
return "testData/augment/modifier";
}
@Override
public void setUp() throws Exception {
super.setUp();
myFixture.addClass("package lombok;\npublic enum AccessLevel { PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE, NONE; }");
myFixture.addClass("package lombok.experimental;\npublic @interface PackagePrivate { }");
myFixture.addClass("package lombok.experimental;\npublic @interface NonFinal { }");
myFixture.addClass("package lombok.experimental;\n" +
"public @interface FieldDefaults {\n" +
"AccessLevel level() default AccessLevel.NONE;\n" +
"boolean makeFinal() default false;\n" +
"}");
}
//<editor-fold desc="Handling of makeFinal and @NonFinal">
public void testFieldDefaultsFinal() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertTrue("@FieldDefaults(makeFinal = true) should make all @NonFinal fields final", modifierList.hasModifierProperty(PsiModifier.FINAL));
assertTrue("@FieldDefaults(makeFinal = true) should keep fields package local", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
}
public void testFieldDefaultsFinalFalse() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults(makeFinal = false) should make all @NonFinal fields final", modifierList.hasModifierProperty(PsiModifier.FINAL));
assertTrue("@FieldDefaults(makeFinal = false) should keep fields package local", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
}
public void testFieldDefaultsWithNonFinal() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults(makeFinal = true) should not make @NonFinal fields final", modifierList.hasModifierProperty(PsiModifier.FINAL));
}
//</editor-fold>
//<editor-fold desc="Handling of visibility modifiers">
public void testFieldDefaultsNone() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults should not make fields public", modifierList.hasModifierProperty(PsiModifier.PUBLIC));
assertFalse("@FieldDefaults should not make fields protected", modifierList.hasModifierProperty(PsiModifier.PROTECTED));
assertFalse("@FieldDefaults should not make fields private", modifierList.hasModifierProperty(PsiModifier.PRIVATE));
assertTrue("@FieldDefaults should keep fields as package-private", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
}
public void testFieldDefaultsPublic() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertTrue("@FieldDefaults(level = AccessLevel.PUBLIC) should make non-@PackagePrivate fields public", modifierList.hasModifierProperty(PsiModifier.PUBLIC));
assertFalse("@FieldDefaults(level = AccessLevel.PUBLIC) should not make fields package-private", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
assertFalse("@FieldDefaults(level = AccessLevel.PUBLIC) should not make fields protected", modifierList.hasModifierProperty(PsiModifier.PROTECTED));
assertFalse("@FieldDefaults(level = AccessLevel.PUBLIC) should not make fields private", modifierList.hasModifierProperty(PsiModifier.PRIVATE));
}
public void testFieldDefaultsProtected() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults(level = AccessLevel.PROTECTED) should not make fields public", modifierList.hasModifierProperty(PsiModifier.PUBLIC));
assertFalse("@FieldDefaults(level = AccessLevel.PROTECTED) should not make fields package-private", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
assertTrue("@FieldDefaults(level = AccessLevel.PROTECTED) should non-@PackagePrivate make fields protected", modifierList.hasModifierProperty(PsiModifier.PROTECTED));
assertFalse("@FieldDefaults(level = AccessLevel.PROTECTED) should not make fields private", modifierList.hasModifierProperty(PsiModifier.PRIVATE));
}
public void testFieldDefaultsPrivate() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults(level = AccessLevel.PRIVATE) should not make fields public", modifierList.hasModifierProperty(PsiModifier.PUBLIC));
assertFalse("@FieldDefaults(level = AccessLevel.PRIVATE) should not make fields protected", modifierList.hasModifierProperty(PsiModifier.PROTECTED));
assertFalse("@FieldDefaults(level = AccessLevel.PRIVATE) should not make fields package-private", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
assertTrue("@FieldDefaults(level = AccessLevel.PRIVATE) should make non-@PackagePrivate fields private", modifierList.hasModifierProperty(PsiModifier.PRIVATE));
}
public void testFieldDefaultsPublicWithPackagePrivate() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults(level = AccessLevel.PUBLIC) should not make @PackagePrivate fields public", modifierList.hasModifierProperty(PsiModifier.PUBLIC));
assertTrue("@FieldDefaults should keep @PackagePrivate fields package-private", modifierList.hasModifierProperty(PsiModifier.PACKAGE_LOCAL));
}
public void testFieldDefaultsWithExplicitModifier() {
PsiModifierList modifierList = getFieldModifierListAtCaret();
assertFalse("@FieldDefaults should not touch fields with explicit modifier", modifierList.hasModifierProperty(PsiModifier.PUBLIC));
assertTrue("@FieldDefaults should keep explicit modifier intact", modifierList.hasModifierProperty(PsiModifier.PROTECTED));
}
//</editor-fold>
//<editor-fold desc="Internal support methods">
@NotNull
private PsiModifierList getFieldModifierListAtCaret() {
PsiFile file = myFixture.configureByFile(getTestName(false) + ".java");
PsiField field = PsiTreeUtil.getParentOfType(file.findElementAt(myFixture.getCaretOffset()), PsiField.class);
assertNotNull(field);
PsiModifierList modifierList = field.getModifierList();
assertNotNull(modifierList);
return modifierList;
}
//</editor-fold>
}