package com.intellij.flex.resolver; import com.intellij.codeInsight.CodeInsightTestCase; import com.intellij.codeInsight.TargetElementUtil; import com.intellij.flex.util.FlexTestUtils; import com.intellij.javascript.flex.css.FlexStylesIndexableSetContributor; import com.intellij.javascript.flex.mxml.schema.FlexSchemaHandler; import com.intellij.lang.javascript.JSTestOption; import com.intellij.lang.javascript.JSTestOptions; import com.intellij.lang.javascript.JSTestUtils; import com.intellij.lang.javascript.flex.FlexModuleType; import com.intellij.lang.javascript.psi.ecmal4.JSAttributeNameValuePair; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReference; import com.intellij.psi.css.CssClass; import com.intellij.psi.css.CssSelectorSuffix; import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilCore; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collection; import static com.intellij.openapi.vfs.VfsUtilCore.convertFromUrl; import static com.intellij.openapi.vfs.VfsUtilCore.urlToPath; public class FlexCssNavigationTest extends CodeInsightTestCase { private static final @NonNls String BASE_PATH = "/flex_css_navigation/"; @NotNull private PsiElement[] findTargetElements(@NotNull String... filenames) throws Exception { String[] fileNamesWithBasePath = new String[filenames.length]; for (int i = 0, filenamesLength = filenames.length; i < filenamesLength; i++) { fileNamesWithBasePath[i] = BASE_PATH + filenames[i]; } configureByFiles(null, fileNamesWithBasePath); Collection<PsiElement> targets; PsiReference reference = TargetElementUtil.findReference(myEditor); if (reference == null) { reference = JSTestUtils.findReferenceFromInjected(myEditor, myFile); } assertNotNull(reference); if (reference instanceof PsiMultiReference) { targets = new ArrayList<>(); for (PsiReference ref : ((PsiMultiReference)reference).getReferences()) { targets.addAll(TargetElementUtil.getInstance().getTargetCandidates(ref)); } } else { targets = TargetElementUtil.getInstance().getTargetCandidates(reference); } assertTrue("Target elements not found", targets.size() > 0); return PsiUtilCore.toPsiElementArray(targets); } @Override protected String getTestDataPath() { return FlexTestUtils.getTestDataPath(""); } @Override protected void setUp() throws Exception { VfsRootAccess.allowRootAccess(getTestRootDisposable(), urlToPath(convertFromUrl(FlexSchemaHandler.class.getResource("z.xsd"))), urlToPath(convertFromUrl(FlexStylesIndexableSetContributor.class.getResource("FlexStyles.as")))); super.setUp(); JSTestUtils.initJSIndexes(getProject()); } @Override protected ModuleType getModuleType() { return FlexModuleType.getInstance(); } @Override protected void setUpJdk() { FlexTestUtils.setupFlexSdk(myModule, getTestName(false), getClass()); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testCssStyleReference1() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssSelectorSuffix.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testCssStyleReference2() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".css"); boolean flag = false; for (PsiElement element : elements) { if (element instanceof CssSelectorSuffix) { flag = true; } } assertTrue(flag); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testCssStyleReference3() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssSelectorSuffix.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testCssPropertyReference() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], JSAttributeNameValuePair.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testCssClassPropertyValue() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".css"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssSelectorSuffix.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet, JSTestOption.WithGumboSdk}) public void testCssTypeReference() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".css"); assertEquals(1, elements.length); assertInstanceOf(elements[0], JSClass.class); assertEquals(((JSClass)elements[0]).getQualifiedName(), "spark.components.Button"); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet, JSTestOption.WithGumboSdk}) public void testCssTypeReference1() throws Exception { PsiElement[] elements = findTargetElements(getTestName(false) + ".css"); assertEquals(1, elements.length); assertInstanceOf(elements[0], JSAttributeNameValuePair.class); final JSClass jsClass = PsiTreeUtil.getParentOfType(elements[0], JSClass.class); assertNotNull(jsClass); assertEquals(jsClass.getQualifiedName(), "spark.components.Button"); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testStyleName1() throws Exception { final PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssClass.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testStyleName2() throws Exception { final PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssClass.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testStyleName3() throws Exception { final PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssClass.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testStyleName4() throws Exception { final PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssClass.class); } @JSTestOptions({JSTestOption.WithCssSupportLoader, JSTestOption.WithFlexFacet}) public void testStyleName5() throws Exception { final PsiElement[] elements = findTargetElements(getTestName(false) + ".mxml"); assertEquals(1, elements.length); assertInstanceOf(elements[0], CssClass.class); } }