/* * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.codeInsight; import com.intellij.psi.PsiFile; import com.intellij.psi.xml.XmlAttribute; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.testFramework.LightCodeInsightTestCase; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.XmlNSDescriptor; import com.intellij.xml.impl.schema.XmlElementDescriptorImpl; import com.intellij.xml.impl.schema.XmlNSDescriptorImpl; import com.intellij.xml.util.XmlUtil; import org.jetbrains.annotations.NonNls; /** * @author Mike */ public class XmlSchemaTest extends LightCodeInsightTestCase { private XmlTag SHIP_TO; private XmlTag UNKNOWN_TAG; @Override protected void setUp() throws Exception { super.setUp(); SHIP_TO = XmlTestUtil.tag("shipTo", getProject()); UNKNOWN_TAG = XmlTestUtil.tag("xxx", getProject()); } public void testDocumentDescriptor1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:element name=\"comment\" type=\"xsd:string\"/>" + "</xsd:schema>"); assertNotNull(NSDescriptor); assertNotNull(NSDescriptor.getElementDescriptor(XmlTestUtil.tag("purchaseOrder", getProject()))); assertNotNull(NSDescriptor.getElementDescriptor(XmlTestUtil.tag("comment", getProject()))); assertNull(NSDescriptor.getElementDescriptor(UNKNOWN_TAG)); } public void testElementDescriptor1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:element name=\"comment\" type=\"xsd:string\"/>" + "</xsd:schema>"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(XmlTestUtil.tag("purchaseOrder", getProject())); assertEquals("purchaseOrder", elementDescriptor.getName()); elementDescriptor = NSDescriptor.getElementDescriptor(XmlTestUtil.tag("comment", getProject())); assertEquals("comment", elementDescriptor.getName()); } public void testElementDescriptor2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"comment\" type=\"xsd:string\"/>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("comment", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(0, elements.length); XmlAttributeDescriptor[] descriptors = elementDescriptor.getAttributesDescriptors(tag); assertEquals(0, descriptors.length); assertEquals(elementDescriptor.getContentType(), XmlElementDescriptor.CONTENT_TYPE_MIXED); } public void testElementDescriptor3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element name=\"shipTo\" type=\"USAddress\"/>" + " <xsd:element name=\"billTo\" type=\"USAddress\"/>" + " <xsd:element name=\"items\" type=\"Items\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(3, elements.length); assertEquals("shipTo", elements[0].getName()); assertEquals("billTo", elements[1].getName()); assertEquals("items", elements[2].getName()); assertEquals("shipTo", elementDescriptor.getElementDescriptor(SHIP_TO, null).getName()); assertNull(elementDescriptor.getElementDescriptor(UNKNOWN_TAG, null)); } public void testElementDescriptor4() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\"/>" + " <xsd:attribute name=\"name\" type=\"xsd:string\"/>" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(2, attributes.length); assertEquals("orderDate", attributes[0].getName()); assertEquals("name", attributes[1].getName()); assertEquals("name", elementDescriptor.getAttributeDescriptor("name", tag).getName()); assertNull(elementDescriptor.getAttributeDescriptor("xxx", tag)); } public void testElementDescriptor5() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element name=\"shipTo\" type=\"USAddress\"/>" + " <xsd:element name=\"billTo\" type=\"USAddress\"/>" + " <xsd:element name=\"items\" type=\"Items\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "<xsd:complexType name=\"USAddress\">" + " <xsd:sequence>" + " <xsd:element name=\"name\" type=\"xsd:string\"/>" + " <xsd:element name=\"street\" type=\"xsd:string\"/>" + " <xsd:element name=\"city\" type=\"xsd:string\"/>" + " <xsd:element name=\"state\" type=\"xsd:string\"/>" + " <xsd:element name=\"zip\" type=\"xsd:decimal\"/>" + " </xsd:sequence>" + " <xsd:attribute name=\"country\" type=\"xsd:NMTOKEN\" fixed=\"US\"/>" + "</xsd:complexType>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag).getElementDescriptor(SHIP_TO, null); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(5, elements.length); assertEquals("name", elements[0].getName()); assertEquals("street", elements[1].getName()); assertEquals("city", elements[2].getName()); assertEquals("state", elements[3].getName()); assertEquals("zip", elements[4].getName()); final XmlTag context = tag.findFirstSubTag(elements[2].getName()); assertEquals(0, elements[2].getElementsDescriptors(context).length); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(context); assertEquals(1, attributes.length); assertEquals("country", attributes[0].getName()); } public void testElementDescriptor6() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element name=\"shipTo\">" + " <xsd:complexType name=\"USAddress\">" + " <xsd:sequence>" + " <xsd:element name=\"name\" type=\"xsd:string\"/>" + " <xsd:element name=\"street\" type=\"xsd:string\"/>" + " <xsd:element name=\"city\" type=\"xsd:string\"/>" + " <xsd:element name=\"state\" type=\"xsd:string\"/>" + " <xsd:element name=\"zip\" type=\"xsd:decimal\"/>" + " </xsd:sequence>" + " <xsd:attribute name=\"country\" type=\"xsd:NMTOKEN\" fixed=\"US\"/>" + " </xsd:complexType>" + " </xsd:element>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag).getElementDescriptor(SHIP_TO, null); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(5, elements.length); assertEquals("name", elements[0].getName()); assertEquals("street", elements[1].getName()); assertEquals("city", elements[2].getName()); assertEquals("state", elements[3].getName()); assertEquals("zip", elements[4].getName()); final XmlTag context = tag.findFirstSubTag(elements[2].getName()); assertEquals(0, elements[2].getElementsDescriptors(context).length); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(context); assertEquals(1, attributes.length); assertEquals("country", attributes[0].getName()); } public void testElementDescriptor7() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\">" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element name=\"shipTo\">" + " <xsd:complexType name=\"USAddress\">" + " <xsd:sequence>" + " <xsd:element name=\"name\" type=\"xsd:string\"/>" + " <xsd:element name=\"street\" type=\"xsd:string\"/>" + " <xsd:element name=\"city\" type=\"xsd:string\"/>" + " <xsd:element name=\"state\" type=\"xsd:string\"/>" + " <xsd:element name=\"zip\" type=\"xsd:decimal\"/>" + " </xsd:sequence>" + " <xsd:attribute name=\"country\" type=\"xsd:NMTOKEN\" fixed=\"US\"/>" + " </xsd:complexType>" + " </xsd:element>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:element>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(0, attributes.length); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(1, elements.length); assertEquals("shipTo", elements[0].getName()); } public void testElementDescriptor8() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element ref=\"items\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "<xsd:element name=\"items\" type=\"xsd:string\"/>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(1, elements.length); assertEquals("items", elements[0].getName()); assertEquals("items", elementDescriptor.getElementDescriptor(XmlTestUtil.tag("items", getProject()), null).getName()); assertNull(elementDescriptor.getElementDescriptor(UNKNOWN_TAG, null)); } public void testElementDescriptor9() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:group ref=\"ddd:mainBookElements\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "<xsd:group name=\"mainBookElements\">" + " <xsd:sequence>" + " <xsd:element name=\"title\" type=\"nameType\"/>" + " <xsd:element name=\"author\" type=\"nameType\"/>" + " </xsd:sequence>" + "</xsd:group>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(2, elements.length); assertEquals("title", elements[0].getName()); assertEquals("author", elements[1].getName()); assertEquals("title", elementDescriptor.getElementDescriptor(XmlTestUtil.tag("title", getProject()), null).getName()); assertNull(elementDescriptor.getElementDescriptor(UNKNOWN_TAG, null)); } public void testElementDescriptor10() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attributeGroup ref=\"ddd:bookAttributes\"/>" + "</xsd:complexType>" + "<xsd:attributeGroup name=\"bookAttributes\">" + " <xsd:attribute name=\"isbn\" type=\"xs:string\" use=\"required\"/>" + " <xsd:attribute name=\"available\" type=\"xs:string\"/>" + "</xsd:attributeGroup>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(2, attributes.length); assertEquals("isbn", attributes[0].getName()); assertEquals("available", attributes[1].getName()); assertEquals("isbn", elementDescriptor.getAttributeDescriptor("isbn", tag).getName()); assertNull(elementDescriptor.getAttributeDescriptor("xxx", tag)); } public void testElementDescriptor11() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:complexContent>" + " <xsd:restriction base=\"PurchaseOrderType2\">" + " <xsd:element name=\"shipTo2\" type=\"USAddress\"/>" + " <xsd:element name=\"items\" type=\"Items\"/>" + " </xsd:restriction>" + " </xsd:complexContent>" + "</xsd:complexType>" + "<xsd:complexType name=\"PurchaseOrderType2\">" + " <xsd:sequence>" + " <xsd:element name=\"shipTo\" type=\"USAddress\"/>" + " <xsd:element name=\"billTo\" type=\"USAddress\"/>" + " <xsd:element name=\"items\" type=\"Items\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(4, elements.length); assertEquals("shipTo", elements[0].getName()); assertEquals("billTo", elements[1].getName()); assertEquals("shipTo2", elements[2].getName()); assertEquals("items", elements[3].getName()); } public void testElementDescriptor15() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:complexContent>" + " <xsd:extension base=\"PurchaseOrderType2\">" + " <xsd:element name=\"shipTo2\" type=\"USAddress\"/>" + " </xsd:extension>" + " </xsd:complexContent>" + "</xsd:complexType>" + "<xsd:complexType name=\"PurchaseOrderType2\">" + " <xsd:sequence>" + " <xsd:element name=\"shipTo\" type=\"USAddress\"/>" + " <xsd:element name=\"billTo\" type=\"USAddress\"/>" + " <xsd:element name=\"items\" type=\"Items\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(4, elements.length); assertEquals("shipTo", elements[0].getName()); assertEquals("billTo", elements[1].getName()); assertEquals("items", elements[2].getName()); assertEquals("shipTo2", elements[3].getName()); } public void testElementDescriptor12() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:complexContent>" + " <xsd:restriction base=\"PurchaseOrderType2\">" + " <xsd:attribute name=\"orderDate2\" type=\"xsd:date\"/>" + " <xsd:attribute name=\"name\" type=\"xsd:date\"/>" + " </xsd:restriction>" + " </xsd:complexContent>" + "</xsd:complexType>" + "<xsd:complexType name=\"PurchaseOrderType2\">" + " <xsd:sequence>" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\"/>" + " <xsd:attribute name=\"name\" type=\"xsd:string\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(3, attributes.length); assertEquals("orderDate", attributes[0].getName()); assertEquals("orderDate2", attributes[1].getName()); assertEquals("name", attributes[2].getName()); } public void testElementDescriptor13() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\">" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element ref=\"shipTo\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:element>" + "<xsd:element name=\"shipTo\" abstract=\"true\">" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); final XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(0, elements.length); } public void testElementDescriptor14() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema targetNamespace=\"http://www.deansoft.com/AddressBook\" xmlns:ab=\"http://www.deansoft.com/AddressBook\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\">" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element ref=\"shipTo\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:element>" + "<xsd:element name=\"shipTo\" abstract=\"true\">" + " <xsd:complexType name=\"USAddress\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\"/>" + " <xsd:element name=\"items\" type=\"Items\"/>" + " </xsd:complexType>" + "</xsd:element>" + "<xsd:element name=\"name\" substitutionGroup=\"ab:shipTo\"/>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", "http://www.deansoft.com/AddressBook", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); final XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(1, elements.length); assertEquals("name", elements[0].getName()); XmlAttributeDescriptor[] attrs = elements[0].getAttributesDescriptors(tag); assertEquals(1, attrs.length); assertEquals("orderDate", attrs[0].getName()); XmlElementDescriptor[] element0Descriptors = elements[0].getElementsDescriptors(tag.findFirstSubTag(elements[0].getName())); assertEquals(1, element0Descriptors.length); assertEquals("items", element0Descriptors[0].getName()); } public void testAttributeDescriptor1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\"/>" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attribute = elementDescriptor.getAttributeDescriptor("orderDate", tag); assertTrue(!attribute.isEnumerated()); assertTrue(!attribute.isFixed()); assertTrue(!attribute.isRequired()); assertNull(attribute.getDefaultValue()); } public void testAttributeDescriptorProhibited() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\" use=\"prohibited\" />" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(0, attributes.length); } public void testAttributeDescriptorProhibited2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:complexContent>" + " <xsd:restriction base=\"PurchaseOrderType2\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\" use=\"prohibited\"/>" + " </xsd:restriction>" + " </xsd:complexContent>" + "</xsd:complexType>" + "<xsd:complexType name=\"PurchaseOrderType2\">" + " <xsd:sequence>" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\"/>" + " <xsd:attribute name=\"name\" type=\"xsd:string\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(1, attributes.length); assertEquals("name", attributes[0].getName()); } public void testAttributeDescriptor2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\" use=\"required\" default=\" 2002 \"/>" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attribute = elementDescriptor.getAttributeDescriptor("orderDate", tag); assertTrue(!attribute.isEnumerated()); assertTrue(!attribute.isFixed()); assertTrue(attribute.isRequired()); assertEquals(" 2002 ", attribute.getDefaultValue()); } public void testAttributeDescriptor3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\" fixed=\"1 01 2001\"/>" + "</xsd:complexType>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attribute = elementDescriptor.getAttributeDescriptor("orderDate", tag); assertTrue(!attribute.isEnumerated()); assertTrue(attribute.isFixed()); assertTrue(!attribute.isRequired()); assertEquals("1 01 2001", attribute.getDefaultValue()); } public void testAttributeDescriptor4() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:attribute ref=\"orderDate\" use=\"required\"/>" + "</xsd:complexType>" + " <xsd:attribute name=\"orderDate\" type=\"xsd:date\" fixed=\"1 01 2001\"/>" + "</xsd:schema>"); final XmlTag tag = XmlTestUtil.tag("purchaseOrder", getProject()); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attribute = elementDescriptor.getAttributeDescriptor("orderDate", tag); assertNotNull(attribute); assertTrue(!attribute.isEnumerated()); assertTrue(attribute.isFixed()); assertTrue(attribute.isRequired()); assertEquals("1 01 2001", attribute.getDefaultValue()); } public void testNamespace1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" + "<xs:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xs:element name=\"comment\" type=\"xs:string\"/>" + "</xs:schema>"); assertNotNull(NSDescriptor); assertNotNull(NSDescriptor.getElementDescriptor(XmlTestUtil.tag("purchaseOrder", getProject()))); assertNotNull(NSDescriptor.getElementDescriptor(XmlTestUtil.tag("comment", getProject()))); assertNull(NSDescriptor.getElementDescriptor(UNKNOWN_TAG)); } public void testNamespace2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema targetNamespace=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >" + "<xsd:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<xsd:complexType name=\"PurchaseOrderType\">" + " <xsd:sequence>" + " <xsd:element ref=\"xsd:items\"/>" + " </xsd:sequence>" + "</xsd:complexType>" + "<xsd:element name=\"items\" type=\"xsd:string\"/>" + "</xsd:schema>"); XmlTag tag = XmlTestUtil.tag("purchaseOrder", "http://www.w3.org/2001/XMLSchema", getProject()); XmlElementDescriptorImpl elementDescriptor = (XmlElementDescriptorImpl)NSDescriptor.getElementDescriptor(tag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(tag); assertEquals(1, elements.length); assertEquals("items", elements[0].getName()); assertEquals("items", elementDescriptor.getElementDescriptor("items").getName()); assertNull(elementDescriptor.getElementDescriptor("xxx")); } public void testNamespace3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xs:schema xmlns=\"http://www.w3.org/2001/XMLSchema\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" + "<xs:element name=\"purchaseOrder\" type=\"PurchaseOrderType\"/>" + "<element name=\"comment\" type=\"xs:string\"/>" + "</xs:schema>"); assertNotNull(NSDescriptor); assertNotNull(NSDescriptor.getElementDescriptor(XmlTestUtil.tag("purchaseOrder", "http://www.w3.org/2001/XMLSchema", getProject()))); assertNotNull(NSDescriptor.getElementDescriptor(XmlTestUtil.tag("comment", "http://www.w3.org/2001/XMLSchema", getProject()))); assertNull(NSDescriptor.getElementDescriptor(UNKNOWN_TAG)); } //public void testAny1() throws Exception { // XmlDocumentDescriptor documentDescriptor = createDescriptorImpl( // "<xsd:schema targetNamespace=\"http://foo\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >" + // " <xsd:element name=\"root\">" + // " <xsd:complexType>" + // " <xsd:sequence minOccurs=\"1\" maxOccurs=\"1\">" + // " <xsd:any namespace=\"##other\" minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"skip\"/>" + // " </xsd:sequence>" + // " </xsd:complexType>" + // " </xsd:element>" + // "</xsd:schema>" // ); // // XmlFile xmlFile = (XmlFile)createFile("file.xml", // "<root xmlns=\"http://foo\">" + // " <a:a xmlns:a=\"http://bar\" />" + // "</root>" // ); // // XmlElementDescriptor rootDescriptor = documentDescriptor.getElementDescriptor(xmlFile.saveToString().getRootTag()); // assertNotNull(rootDescriptor); // // XmlTag aTag = xmlFile.saveToString().getRootTag().findSubTag("a:a"); // assertNotNull(aTag); // XmlElementDescriptor aDescriptor = documentDescriptor.getElementDescriptor(aTag); // assertNotNull(aDescriptor); //} public void testAny2() throws Exception { PsiFile dtdFile = createFile("test.xml", "<xsd:schema targetNamespace=\"http://foo\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >" + " <xsd:element name=\"root\">" + " <xsd:complexType>" + " <xsd:sequence minOccurs=\"1\" maxOccurs=\"1\">" + " <xsd:any namespace=\"##other\" minOccurs=\"0\" maxOccurs=\"unbounded\" processContents=\"skip\"/>" + " </xsd:sequence>" + " </xsd:complexType>" + " </xsd:element>" + "</xsd:schema>"); XmlNSDescriptor NSDescriptor = new XmlNSDescriptorImpl((XmlFile)dtdFile); XmlFile xmlFile = (XmlFile)createFile("file.xml", "<foo:root xmlns:foo=\"http://foo\">" + " <foo:a xmlns:a=\"http://bar\" />" + "</foo:root>" ); XmlElementDescriptor rootDescriptor = NSDescriptor.getElementDescriptor(xmlFile.getDocument().getRootTag()); assertNotNull(rootDescriptor); XmlTag aTag = xmlFile.getDocument().getRootTag().findFirstSubTag("foo:a"); assertNotNull(aTag); //XmlElementDescriptor aDescriptor = NSDescriptor.getElementDescriptor(aTag); //assertNull(aDescriptor); } public void testAny3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema targetNamespace=\"http://foo\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >" + " <xsd:element name=\"root\">" + " <xsd:complexType>" + " <xsd:anyAttribute namespace=\"##other\" processContents=\"skip\"/>" + " </xsd:complexType>" + " </xsd:element>" + "</xsd:schema>" ); XmlFile xmlFile = (XmlFile)createFile("file.xml", "<root xmlns=\"http://foo\" y:a=\"1\">" + "</root>" ); final XmlTag rootTag = xmlFile.getDocument().getRootTag(); XmlElementDescriptor rootDescriptor = NSDescriptor.getElementDescriptor(rootTag); assertNotNull(rootDescriptor); XmlAttribute attribute = rootTag.getAttribute("y:a", XmlUtil.EMPTY_URI); assertNotNull(attribute); XmlAttributeDescriptor aDescriptor = rootDescriptor.getAttributeDescriptor("y:a", rootTag); assertNotNull(aDescriptor); } public void testAny4() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<xsd:schema targetNamespace=\"http://foo\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" >" + " <xsd:element name=\"root\">" + " <xsd:complexType>" + " <xsd:anyAttribute namespace=\"##other\" processContents=\"skip\"/>" + " </xsd:complexType>" + " </xsd:element>" + "</xsd:schema>" ); XmlFile xmlFile = (XmlFile)createFile("file.xml", "<root xmlns=\"http://foo\" a=\"1\">" + "</root>" ); final XmlTag rootTag = xmlFile.getDocument().getRootTag(); XmlElementDescriptor rootDescriptor = NSDescriptor.getElementDescriptor(rootTag); assertNotNull(rootDescriptor); XmlAttribute attribute = rootTag.getAttribute("a", XmlUtil.EMPTY_URI); assertNotNull(attribute); XmlAttributeDescriptor aDescriptor = rootDescriptor.getAttributeDescriptor("a", rootTag); assertNull(aDescriptor); attribute = rootTag.getAttribute("a", "http://foo"); assertNull(attribute); attribute = rootTag.getAttribute("a", XmlUtil.ANT_URI); assertNull(attribute); } private static XmlNSDescriptor createDescriptor(@NonNls String dtdText) { PsiFile dtdFile = createFile("test.xml", dtdText); return new XmlNSDescriptorImpl((XmlFile)dtdFile); } }