package fr.adrienbrault.idea.symfony2plugin.tests.form.util;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.php.lang.PhpFileType;
import com.jetbrains.php.lang.psi.PhpPsiElementFactory;
import com.jetbrains.php.lang.psi.elements.StringLiteralExpression;
import fr.adrienbrault.idea.symfony2plugin.form.dict.FormClass;
import fr.adrienbrault.idea.symfony2plugin.form.dict.FormClassEnum;
import fr.adrienbrault.idea.symfony2plugin.form.dict.FormOptionEnum;
import fr.adrienbrault.idea.symfony2plugin.form.util.FormOptionsUtil;
import fr.adrienbrault.idea.symfony2plugin.form.visitor.FormOptionVisitor;
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*
* @see fr.adrienbrault.idea.symfony2plugin.form.util.FormOptionsUtil
*/
public class FormOptionsUtilTest extends SymfonyLightCodeInsightFixtureTestCase {
public void setUp() throws Exception {
super.setUp();
myFixture.configureByText(PhpFileType.INSTANCE, "<?php\n" +
"namespace Symfony\\Component\\Form\n" +
"{\n" +
" interface FormTypeExtensionInterface\n" +
" {\n" +
" public function getExtendedType();\n" +
" }\n" +
"\n" +
" interface FormTypeInterface\n" +
" {\n" +
" public function getName();\n" +
" }\n" +
"}"
);
myFixture.copyFileToProject("FormOptionsUtil.php");
myFixture.copyFileToProject("FormOptionsUtilKeys.php");
}
protected String getTestDataPath() {
return new File(this.getClass().getResource("fixtures").getFile()).getAbsolutePath();
}
/**
* @see FormOptionsUtil#getExtendedTypeClasses
*/
public void testGetExtendedTypeClassesAsStringValue() {
FormClass foo = ContainerUtil.getFirstItem(FormOptionsUtil.getExtendedTypeClasses(getProject(), "foo_bar_my_type"));
assertNotNull(foo);
assertEquals(FormClassEnum.EXTENSION, foo.getType());
assertEquals("\\Foo\\Bar\\MyType", foo.getPhpClass().getFQN());
}
/**
* @see FormOptionsUtil#getExtendedTypeClasses
*/
public void testGetExtendedTypeClassesAsClassConstant() {
for (String s : new String[]{"Foo\\Bar\\MyType", "\\Foo\\Bar\\MyType"}) {
FormClass myType = ContainerUtil.getFirstItem(FormOptionsUtil.getExtendedTypeClasses(getProject(), s));
assertNotNull(myType);
assertEquals(FormClassEnum.EXTENSION, myType.getType());
assertEquals("\\Foo\\Bar\\BarType", myType.getPhpClass().getFQN());
}
}
public void testClassOptionsVisitorWithExtensionAndParents() {
final Set<String> options = new HashSet<String>();
FormOptionsUtil.visitFormOptions(getProject(), "foo", (psiElement, option, formClass, optionEnum) ->
options.add(option)
);
assertContainsElements(options, "MyType", "BarTypeParent", "BarTypeExtension");
}
public void testClassOptionsVisitorWithExtensionAndParentsWithClassConstant() {
final Set<String> optionsClass = new HashSet<String>();
FormOptionsUtil.visitFormOptions(getProject(), "Options\\Bar\\Foobar", new FormOptionVisitor() {
@Override
public void visit(@NotNull PsiElement psiElement, @NotNull String option, @NotNull FormClass formClass, @NotNull FormOptionEnum optionEnum) {
optionsClass.add(option);
}
});
assertContainsElements(optionsClass, "BarType");
}
/**
* @see FormOptionsUtil#getFormExtensionKeys
*/
public void testGetFormExtensionsKeysTargets() {
StringLiteralExpression contents = PhpPsiElementFactory.createFromText(getProject(), StringLiteralExpression.class, "<?php 'BarType';");
Collection<PsiElement> formExtensionsKeysTargets = FormOptionsUtil.getFormExtensionsKeysTargets(contents, "Options\\Bar\\Foobar");
assertTrue(formExtensionsKeysTargets.size() > 0);
}
}