package com.intellij.flex.codeInsight; import com.intellij.flex.util.FlexTestUtils; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.javascript.flex.css.FlexStylesIndexableSetContributor; import com.intellij.javascript.flex.mxml.schema.FlexSchemaHandler; import com.intellij.lang.javascript.JSAbstractStructureViewTest; import com.intellij.lang.javascript.JSTestOption; import com.intellij.lang.javascript.JSTestOptions; import com.intellij.lang.javascript.StructureViewTestUtil; import com.intellij.lang.javascript.flex.FlexModuleType; import com.intellij.lang.javascript.psi.JSFunction; import com.intellij.lang.javascript.psi.ecmal4.JSAttributeList; import com.intellij.lang.javascript.psi.ecmal4.JSClass; import com.intellij.lang.javascript.structureView.JSStructureViewModel; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess; import com.intellij.psi.PsiElement; import com.intellij.ui.LayeredIcon; import com.intellij.ui.RowIcon; import javax.swing.*; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import static com.intellij.lang.javascript.StructureViewTestUtil.getIcon; import static com.intellij.openapi.vfs.VfsUtilCore.convertFromUrl; import static com.intellij.openapi.vfs.VfsUtilCore.urlToPath; public class FlexStructureViewTest extends JSAbstractStructureViewTest { private static final String BASE_PATH = "/as_fileStructure/"; private static final int OBJECT_METHODS_COUNT = 11; @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(); } @Override protected ModuleType getModuleType() { return FlexModuleType.getInstance(); } @Override protected void setUpJdk() { FlexTestUtils.setupFlexSdk(myModule, getTestName(false), getClass()); } @Override protected String getBasePath() { return BASE_PATH; } @Override protected String getTestDataPath() { return FlexTestUtils.getTestDataPath(""); } public void testECMAL4Structure() throws Exception { configureByFile(BASE_PATH + "15.js2"); final Object[] items = getTopLevelItems(); assertEquals(3, items.length); assertEquals("ZZZ", getText(items[1])); assertEquals("ZZZ2", getText(items[2])); assertEquals("A15", getText(items[0])); List<? extends AbstractTreeNode> treeNodes = getChildren(items[1]); assertEquals(4 + OBJECT_METHODS_COUNT, treeNodes.size()); assertEquals("EE", getText(treeNodes.get(0))); assertEquals("aaa", getText(treeNodes.get(OBJECT_METHODS_COUNT + 1))); assertEquals("c2", getText(treeNodes.get(OBJECT_METHODS_COUNT + 2))); assertEquals("ttt", getText(treeNodes.get(OBJECT_METHODS_COUNT + 3))); treeNodes = getChildren(items[0]); assertEquals(7 + OBJECT_METHODS_COUNT, treeNodes.size()); assertEquals("automation():Object", getText(treeNodes.get(0))); assertEquals("initialized():Boolean", getText(treeNodes.get(3))); assertEquals("register(c:Object):void", getText(treeNodes.get(8))); assertEquals("_automation:Object", getText(treeNodes.get(OBJECT_METHODS_COUNT + 3))); assertEquals("aaa", getText(treeNodes.get(OBJECT_METHODS_COUNT + 4))); assertEquals("c2", getText(treeNodes.get(OBJECT_METHODS_COUNT + 5))); assertEquals("delegate:Object", getText(treeNodes.get(OBJECT_METHODS_COUNT + 6))); } public void testGroupByClass2() throws Exception { configureByFile(BASE_PATH + "15.js2"); final Object[] items = getTopLevelItems(); assertEquals(3, items.length); assertEquals("ZZZ", getText(items[1])); assertEquals("ZZZ2", getText(items[2])); assertEquals("A15", getText(items[0])); List<? extends AbstractTreeNode> treeNodes = getChildren(items[0]); assertEquals(7, treeNodes.size()); final Iterator<? extends AbstractTreeNode> iterator = treeNodes.iterator(); final AbstractTreeNode node = iterator.next(); assertEquals("mypackage.ZZZ", getText(node)); Collection<? extends AbstractTreeNode> treeNodes2 = getChildren(node); assertEquals(2, treeNodes2.size()); final Iterator<? extends AbstractTreeNode> iterator2 = treeNodes2.iterator(); assertEquals("aaa", getText(iterator2.next())); assertEquals("c2", getText(iterator2.next())); assertEquals("Object", getText(iterator.next())); assertEquals("automation():Object", getText(iterator.next())); assertEquals("initialized():Boolean", getText(iterator.next())); assertEquals("register(c:Object):void", getText(iterator.next())); assertEquals("_automation:Object", getText(iterator.next())); assertEquals("delegate:Object", getText(iterator.next())); final PsiElement element = checkIfCurrentEditorElementIsValid((AbstractTreeNode)items[1], JSClass.class); assertTrue(JSStructureViewModel.shouldEnterElementStatic(element)); } public void testGroupByClass3() throws Exception { configureByFiles(null, BASE_PATH + "15_2.js2", BASE_PATH + "15_3.js2"); final Object[] items = getTopLevelItems(); assertEquals(1, items.length); assertEquals("A15", getText(items[0])); List<? extends AbstractTreeNode> treeNodes = getChildren(items[0]); assertEquals(3, treeNodes.size()); assertEquals("mypackage.ZZZ", getText(treeNodes.get(0))); assertEquals("Object", getText(treeNodes.get(1))); List<? extends AbstractTreeNode> treeNodes2 = getChildren(treeNodes.get(0)); assertEquals(2, treeNodes2.size()); assertEquals("aaa", getText(treeNodes2.get(0))); assertEquals("c2", getText(treeNodes2.get(1))); checkIfCurrentEditorElementIsValid(treeNodes.get(2), JSFunction.class); } public void testBug3() throws Exception { configureByFiles(null, BASE_PATH + "22.js2", BASE_PATH + "22_2.js2"); final Object[] items = getTopLevelItems(); assertEquals(2, items.length); assertEquals("XXX", getText(items[0])); assertEquals("YYY", getText(items[1])); List<? extends AbstractTreeNode> treeNodes = getChildren(items[0]); assertEquals(3 + OBJECT_METHODS_COUNT, treeNodes.size()); assertEquals("constructor():*", getText(treeNodes.get(0))); assertEquals("aaa", getText(treeNodes.get(OBJECT_METHODS_COUNT + 1))); assertEquals("bbb", getText(treeNodes.get(OBJECT_METHODS_COUNT + 2))); AbstractTreeNode node = treeNodes.get(OBJECT_METHODS_COUNT - 5); assertEquals("staticFun()", getText(node)); Icon icon = getIcon(node); assertTrue(icon instanceof RowIcon); // static mark blended in assertTrue(((RowIcon)icon).getIcon(0) instanceof LayeredIcon); treeNodes = getChildren(items[1]); assertEquals(2 + OBJECT_METHODS_COUNT, treeNodes.size()); assertEquals("aaa", getText(treeNodes.get(OBJECT_METHODS_COUNT))); assertEquals("bbb", getText(treeNodes.get(OBJECT_METHODS_COUNT + 1))); } public void testPrivateIconsForClassMembers() throws Exception { configureByFile(BASE_PATH + "15.js2"); final Object[] items = getTopLevelItems(); assertEquals(3, items.length); ArrayList<? extends AbstractTreeNode> treeNodes = (ArrayList<? extends AbstractTreeNode>)getChildren(items[0]); assertEquals(JSAttributeList.AccessType.PUBLIC, getAccessType(treeNodes.get(1), false)); // automation():Object treeNodes = (ArrayList<? extends AbstractTreeNode>)getChildren(items[1]); assertEquals(JSAttributeList.AccessType.PRIVATE, getAccessType(treeNodes.get(3 + OBJECT_METHODS_COUNT))); // ttt assertEquals(JSAttributeList.AccessType.PRIVATE, getAccessType(treeNodes.get(0))); // EE } public void testIncludedMembers() throws Exception { configureByFiles(null, BASE_PATH + "IncludedMembers.js2", BASE_PATH + "IncludedMembers_2.js2"); final Object[] items = getTopLevelItems(); assertEquals(1, items.length); assertEquals("C", getText(items[0])); List<? extends AbstractTreeNode> treeNodes = getChildren(items[0]); assertEquals(2 + OBJECT_METHODS_COUNT, treeNodes.size()); assertEquals("__aaa__()", getText(treeNodes.get(0))); } public void testInherited1() throws Exception { configureByFile(BASE_PATH + "Inherited1.as"); StructureViewTestUtil.checkStructureView(myEditor); } public void testInherited2() throws Exception { configureByFiles(null, BASE_PATH + "Inherited2.as", BASE_PATH + "Inherited2_2.as"); StructureViewTestUtil.checkStructureView(myEditor); } public void testInherited3() throws Exception { configureByFiles(null, BASE_PATH + "Inherited3.as", BASE_PATH + "Inherited3_1.as", BASE_PATH + "Inherited3_2.as", BASE_PATH + "Inherited3_3.as", BASE_PATH + "Inherited3_4.as"); StructureViewTestUtil.checkStructureView(myEditor); } public void testWithNameAttribute() throws Exception { configureByFile(BASE_PATH + getTestName(false) + ".mxml"); StructureViewTestUtil.checkStructureView(myEditor); } @JSTestOptions({JSTestOption.WithJsSupportLoader}) public void testWithIncludedFiles1() throws Exception { configureByFiles(null, BASE_PATH + getTestName(false) + ".mxml", BASE_PATH + getTestName(false) + "_1.css", BASE_PATH + getTestName(false) + "_2.as", BASE_PATH + getTestName(false) + "_3.as", BASE_PATH + getTestName(false) + "_4.as"); StructureViewTestUtil.checkStructureView(myEditor); } @JSTestOptions({JSTestOption.WithJsSupportLoader}) public void testSuperClasses() throws Exception { String s = BASE_PATH + getTestName(false); configureByFiles(null, s + ".as", s + "_2.as", s + "_3.as", s + "_4.as"); StructureViewTestUtil.checkStructureView(myEditor); } @JSTestOptions({JSTestOption.WithFlexSdk}) public void testLocalVarDerived3() throws Exception { trivialOneFileTest("js2"); } public void testNsDeclShouldBeOneTime() throws Exception { trivialOneFileTest("js2"); } public void testExtraTopMembers() throws Exception { trivialOneFileTest("js2"); } @JSTestOptions({JSTestOption.WithFlexSdk}) public void testObjectFields() throws Exception { String s = BASE_PATH + getTestName(false); configureByFiles(null, s + ".js2"); StructureViewTestUtil.checkStructureView(myEditor, false); } }