/* * 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.openapi.fileTypes.StdFileTypes; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.testFramework.LightPlatformTestCase; import com.intellij.xml.XmlAttributeDescriptor; import com.intellij.xml.XmlElementDescriptor; import com.intellij.xml.XmlNSDescriptor; import com.intellij.xml.impl.dtd.XmlElementDescriptorImpl; import com.intellij.xml.impl.dtd.XmlNSDescriptorImpl; /** * @author Mike */ public class XmlDtdTest extends LightPlatformTestCase { public void testDocumentDescriptor1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor("<!ELEMENT principals (#PCDATA)><!ELEMENT data-sources (#PCDATA)>"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag("principals")); assertNotNull(elementDescriptor); elementDescriptor = NSDescriptor.getElementDescriptor(tag("data-sources")); assertNotNull(elementDescriptor); elementDescriptor = NSDescriptor.getElementDescriptor(tag("xxx")); assertNull(elementDescriptor); } public void testElementDescriptor1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor("<!ELEMENT principals (#PCDATA)><!ELEMENT data-sources (#PCDATA)>"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag("principals")); assertEquals("principals", elementDescriptor.getName()); elementDescriptor = NSDescriptor.getElementDescriptor(tag("data-sources")); assertEquals("data-sources", elementDescriptor.getName()); } public void testElementDescriptor2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT principals (#PCDATA)><!ELEMENT data-sources ANY>" + "<!ELEMENT read-access (namespace-resource)><!ELEMENT group EMPTY>"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag("principals")); assertEquals(elementDescriptor.getContentType(), XmlElementDescriptor.CONTENT_TYPE_MIXED); elementDescriptor = NSDescriptor.getElementDescriptor(tag("data-sources")); assertEquals(elementDescriptor.getContentType(), XmlElementDescriptor.CONTENT_TYPE_ANY); elementDescriptor = NSDescriptor.getElementDescriptor(tag("read-access")); assertEquals(elementDescriptor.getContentType(), XmlElementDescriptor.CONTENT_TYPE_CHILDREN); elementDescriptor = NSDescriptor.getElementDescriptor(tag("group")); assertEquals(elementDescriptor.getContentType(), XmlElementDescriptor.CONTENT_TYPE_EMPTY); } public void testElementDescriptor3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT principals ANY><!ATTLIST principals path CDATA #IMPLIED smtp-host CDATA #REQUIRED>" + "<!ATTLIST principals address CDATA #IMPLIED>"); final XmlTag tag = tag("principals"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("path", tag); assertNotNull(attributeDescriptor); attributeDescriptor = elementDescriptor.getAttributeDescriptor("xxx", tag); assertNull(attributeDescriptor); attributeDescriptor = elementDescriptor.getAttributeDescriptor("smtp-host", tag); assertNotNull(attributeDescriptor); attributeDescriptor = elementDescriptor.getAttributeDescriptor("address", tag); assertNotNull(attributeDescriptor); XmlAttributeDescriptor[] descriptors = elementDescriptor.getAttributesDescriptors(tag); assertEquals("path", descriptors[0].getName()); assertEquals("smtp-host", descriptors[1].getName()); assertEquals("address", descriptors[2].getName()); assertEquals(3, descriptors.length); } public void testElementDescriptor4() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT orion-application (ejb-module*, persistence?, namespace-access)>" + "<!ELEMENT ejb-module ANY>" + "<!ELEMENT persistence ANY>" + "<!ELEMENT namespace-access ANY>"); XmlTag documentTag = tag("orion-application"); XmlElementDescriptorImpl elementDescriptor = (XmlElementDescriptorImpl)NSDescriptor.getElementDescriptor(documentTag); XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(documentTag); assertEquals(3, elements.length); assertEquals("ejb-module", elements[0].getName()); assertEquals("persistence", elements[1].getName()); assertEquals("namespace-access", elements[2].getName()); elements = elements[0].getElementsDescriptors(documentTag); assertEquals(4, elements.length); assertEquals("orion-application", elements[0].getName()); assertEquals("ejb-module", elements[1].getName()); assertEquals("persistence", elements[2].getName()); assertEquals("namespace-access", elements[3].getName()); } public void testAttributeDescriptor1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT principals ANY><!ATTLIST principals path CDATA #IMPLIED>"); final XmlTag tag = tag("principals"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("path", tag); assertEquals("path", attributeDescriptor.getName()); assertTrue(!attributeDescriptor.isRequired()); assertTrue(!attributeDescriptor.isFixed()); assertTrue(!attributeDescriptor.isEnumerated()); assertNull(attributeDescriptor.getDefaultValue()); } public void testAttributeDescriptor2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT principals ANY><!ATTLIST principals path CDATA #IMPLIED>"); final XmlTag tag = tag("principals"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("path", tag); assertTrue(!attributeDescriptor.isRequired()); assertTrue(!attributeDescriptor.isFixed()); assertTrue(!attributeDescriptor.isEnumerated()); assertNull(attributeDescriptor.getDefaultValue()); } public void testAttributeDescriptor3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT toc ANY> <!ATTLIST toc version CDATA #FIXED \"1.0\">"); final XmlTag tag = tag("toc"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("version", tag); assertTrue(!attributeDescriptor.isRequired()); assertTrue(attributeDescriptor.isFixed()); assertTrue(!attributeDescriptor.isEnumerated()); assertEquals("1.0", attributeDescriptor.getDefaultValue()); } public void testAttributeDescriptor4() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT toc ANY> <!ATTLIST toc remote (true|false) \"false\">"); final XmlTag tag = tag("toc"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("remote", tag); assertTrue(!attributeDescriptor.isRequired()); assertTrue(!attributeDescriptor.isFixed()); assertTrue(attributeDescriptor.isEnumerated()); assertEquals("false", attributeDescriptor.getDefaultValue()); String[] values = attributeDescriptor.getEnumeratedValues(); assertEquals(2, values.length); assertEquals("true", values[0]); assertEquals("false", values[1]); } public void testAttributeDescriptor5() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ELEMENT toc ANY> <!ATTLIST toc remote (0|1|2) #REQUIRED>"); final XmlTag tag = tag("toc"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("remote", tag); assertTrue(attributeDescriptor.isRequired()); assertTrue(!attributeDescriptor.isFixed()); assertTrue(attributeDescriptor.isEnumerated()); assertNull(attributeDescriptor.getDefaultValue()); String[] values = attributeDescriptor.getEnumeratedValues(); assertEquals(3, values.length); assertEquals("0", values[0]); assertEquals("1", values[1]); assertEquals("2", values[2]); } public void testEntityDeclElement1() throws Exception { final XmlNSDescriptor NSDescriptor = createDescriptor( "<!ENTITY % types \"fileset | patternset \"> <!ELEMENT project (target | taskdef | %types; | property )*> " + "<!ELEMENT target><!ELEMENT taskdef><!ELEMENT fileset><!ELEMENT patternset><!ELEMENT property>"); XmlTag projectTag = tag("project"); final XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(projectTag); final XmlElementDescriptor[] elements = elementDescriptor.getElementsDescriptors(projectTag); assertEquals(5, elements.length); } public void testEntityDecl1() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ENTITY % boolean \"(true|false|on|off|yes|no)\"> <!ELEMENT toc ANY> <!ATTLIST toc remote %boolean; \"false\""); final XmlTag tag = tag("toc"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("remote", tag); assertTrue(!attributeDescriptor.isRequired()); assertTrue(!attributeDescriptor.isFixed()); assertTrue(attributeDescriptor.isEnumerated()); assertEquals("false", (attributeDescriptor.getDefaultValue())); String[] values = attributeDescriptor.getEnumeratedValues(); assertEquals(6, values.length); assertEquals("true", values[0]); assertEquals("false", values[1]); assertEquals("on", values[2]); assertEquals("off", values[3]); assertEquals("yes", values[4]); assertEquals("no", values[5]); } public void testEntityDecl2() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ENTITY % coreattrs \"id D #IMPLIED\"> <!ELEMENT a ANY> <!ATTLIST a %coreattrs; version CDATA #FIXED \"1.0\""); final XmlTag tag = tag("a"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); final XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(2, attributes.length); assertEquals("id", attributes[0].getName()); assertEquals("version", attributes[1].getName()); } public void testEntityDecl3() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ENTITY % att1 \"id1 D #IMPLIED\"> <!ENTITY % att2 \"id2 D #IMPLIED\"> <!ELEMENT a ANY> <!ATTLIST a %att1; %att2; "); final XmlTag tag = tag("a"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); final XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(2, attributes.length); assertEquals("id1", attributes[0].getName()); assertEquals("id2", attributes[1].getName()); } public void testEntityDecl4() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ENTITY % boolean \'(true|false|on|off|yes|no)\'> <!ENTITY % bool \"%boolean;\"> <!ELEMENT toc ANY> <!ATTLIST toc remote %bool; \"false\""); final XmlTag tag = tag("toc"); XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); XmlAttributeDescriptor attributeDescriptor = elementDescriptor.getAttributeDescriptor("remote", tag); assertTrue(!attributeDescriptor.isRequired()); assertTrue(!attributeDescriptor.isFixed()); assertTrue(attributeDescriptor.isEnumerated()); assertEquals("false", attributeDescriptor.getDefaultValue()); String[] values = attributeDescriptor.getEnumeratedValues(); assertEquals(6, values.length); assertEquals("true", values[0]); assertEquals("false", values[1]); assertEquals("on", values[2]); assertEquals("off", values[3]); assertEquals("yes", values[4]); assertEquals("no", values[5]); } public void testEntityDecl5() throws Exception { XmlNSDescriptor NSDescriptor = createDescriptor( "<!ENTITY % boolean \"true | false\" > <!ELEMENT foo EMPTY> <!ATTLIST foo someBoolean (%boolean;) \"true\" someString CDATA #IMPLIED >"); final XmlTag tag = tag("foo"); final XmlElementDescriptor elementDescriptor = NSDescriptor.getElementDescriptor(tag); final XmlAttributeDescriptor[] attributes = elementDescriptor.getAttributesDescriptors(tag); assertEquals(2, attributes.length); assertEquals("someBoolean", attributes[0].getName()); assertEquals("someString", attributes[1].getName()); assertTrue(attributes[0].isEnumerated()); assertEquals(2, attributes[0].getEnumeratedValues().length); assertEquals("true", attributes[0].getEnumeratedValues()[0]); assertEquals("false", attributes[0].getEnumeratedValues()[1]); } public void testEmbeddedDtd1() throws Exception { XmlFile xmlFile = (XmlFile)createFile("test.xml", "<!DOCTYPE tv [ <!ELEMENT tv (date)*> <!ELEMENT date (#PCDATA)> ]> <tv></tv>"); final XmlTag tag = xmlFile.getDocument().getRootTag(); assertNotNull(tag); final XmlElementDescriptor desc = xmlFile.getDocument().getRootTagNSDescriptor().getElementDescriptor(tag); assertNotNull(desc); final XmlElementDescriptor[] elements = desc.getElementsDescriptors(tag); assertEquals(1, elements.length); assertEquals("date", elements[0].getName()); } private static XmlNSDescriptor createDescriptor(String dtdText) { PsiFile dtdFile = createLightFile("test.dtd", dtdText); XmlNSDescriptorImpl descriptor = new XmlNSDescriptorImpl(); descriptor.init(dtdFile); return descriptor; } private static XmlTag tag(String tagName) { XmlFile file = (XmlFile)PsiFileFactory.getInstance(getProject()).createFileFromText("tag.xml", StdFileTypes.XML, "<" + tagName + "/>"); return file.getDocument().getRootTag(); } }