blob: 49aaa0d62798f2ec475c6ff2ec69071127896969 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2011 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xml.core.tests.dom;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import junit.framework.TestCase;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IProject;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.util.URIResolver;
import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMAttributeDeclarationImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMDataTypeImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMElementDeclarationImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.basic.CMNamedNodeMapImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl;
import org.eclipse.wst.xml.core.internal.contentmodel.util.CMDocumentCache;
import org.eclipse.wst.xml.core.internal.provisional.contenttype.ContentTypeIdForXML;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.eclipse.wst.xml.core.internal.ssemodelquery.ModelQueryAdapter;
import org.w3c.dom.Attr;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class ElementImplTests extends TestCase {
private static final String contents = "<elementPrefix:localName attrPrefix:local='lorem' xmlns:elementPrefix='urn:prefix' xmlns:attributePrefix='urn:attribute:prefix' />"; //$NON-NLS-1$
private static final String decl = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; //$NON-NLS-1$
public ElementImplTests() {
}
public ElementImplTests(String name) {
super(name);
}
public void testElementImplPrefix() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(contents);
Element documentElement = model.getDocument().getDocumentElement();
assertNotNull("no document element found", documentElement);
assertEquals("attribute prefix was not as expected", "elementPrefix", documentElement.getPrefix());
}
public void testElementImplLocalName() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(contents);
Element documentElement = model.getDocument().getDocumentElement();
assertNotNull("no document element found", documentElement);
assertEquals("attribute local name was not as expected", "localName", documentElement.getLocalName());
}
public void testAttrBasedElementNamespace() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(contents);
Element documentElement = model.getDocument().getDocumentElement();
assertNotNull("no document element found", documentElement);
assertNotNull("Namespace was not found.", documentElement.getNamespaceURI());
String namespace = documentElement.getNamespaceURI();
assertEquals("attribute local name was not as expected", "urn:prefix", namespace);
}
public void testNamespaceURIOnCreation() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(contents);
Element element = model.getDocument().createElement("simple");
assertNull("namespace was found", element.getNamespaceURI());
Element element2 = model.getDocument().createElementNS("http://lorem.ipsum", "complex");
assertEquals("attribute namespace URI was not as expected", "http://lorem.ipsum", element2.getNamespaceURI());
Element element3 = model.getDocument().createElementNS(null, "complex");
assertEquals("attribute namespace URI was not as expected", null, element3.getNamespaceURI());
}
public void testGetElementsByTagNameNoChildren() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("root");
document.appendChild(root);
NodeList children = root.getElementsByTagName("*");
assertEquals(0, children.getLength());
}
public void testGetElementsByTagNameChildren() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("root");
document.appendChild(root);
root.appendChild(document.createElement("child"));
root.appendChild(document.createElement("child"));
NodeList children = root.getElementsByTagName("*");
assertEquals(2, children.getLength());
}
public void testGetElementsByTagNameChildrenBySameName() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("child");
document.appendChild(root);
root.appendChild(document.createElement("child"));
root.appendChild(document.createElement("child"));
NodeList children = root.getElementsByTagName("child");
assertEquals(2, children.getLength());
}
public void testGetElementsByTagNameNS() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("test:root");
root.setAttribute("xmlns:test", "http://test");
document.appendChild(root);
root.appendChild(document.createElement("test:child"));
root.appendChild(document.createElement("test:child"));
NodeList children = root.getElementsByTagNameNS("http://test", "*");
assertEquals(2, children.getLength());
}
public void testGetElementsByTagNameNSTestNS() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("test:root");
root.setAttribute("xmlns:test", "http://test");
root.setAttribute("xmlns:test2", "http://test2");
document.appendChild(root);
root.appendChild(document.createElement("test:child"));
root.appendChild(document.createElement("test:child"));
root.appendChild(document.createElement("test2:child"));
NodeList children = root.getElementsByTagNameNS("http://test", "*");
assertEquals(2, children.getLength());
}
public void testGetElementsByTagNameNSAnyNS() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("test:root");
root.setAttribute("xmlns:test", "http://test");
root.setAttribute("xmlns:test2", "http://test2");
document.appendChild(root);
root.appendChild(document.createElement("test:child"));
root.appendChild(document.createElement("test:child"));
root.appendChild(document.createElement("test2:child"));
NodeList children = root.getElementsByTagNameNS("*", "*");
assertEquals(3, children.getLength());
}
public void testRemoveNonexistantAttrByName() {
IDOMModel model = (IDOMModel) StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForXML.ContentTypeID_XML);
model.getStructuredDocument().set(decl);
Document document = model.getDocument();
Element root = document.createElement("test:root");
root.setAttribute("xmlns:test", "http://test");
root.setAttribute("xmlns:test2", "http://test2");
document.appendChild(root);
boolean success = false;
try {
root.removeAttribute(getName());
success = true;
}
catch (DOMException ex) {
assertTrue("threw_NOT_FOUND_ERR", ex.code != DOMException.NOT_FOUND_ERR);
}
assertTrue("threw exception", success);
}
public void testSetAttrWithImpliedDefault() {
IDOMModel model = null;
try {
model = (IDOMModel) getModelForRead("testfiles/time.xml");
if (model != null) {
IDOMDocument document = model.getDocument();
Element element = document.getDocumentElement();
assertNotNull(element);
assertEquals("0", element.getAttribute("hour")); // Default value should be 0
element.setAttribute("hour", "12");
assertEquals("12", element.getAttribute("hour"));
}
}
finally {
if (model != null) {
model.releaseFromRead();
}
}
}
public void testRemoveAttrWithImpliedDefault() {
IDOMModel model = null;
try {
model = (IDOMModel) getModelForRead("testfiles/time.xml");
if (model != null) {
IDOMDocument document = model.getDocument();
Element element = document.getDocumentElement();
assertNotNull(element);
assertEquals("0", element.getAttribute("hour")); // Default value should be 0
element.setAttribute("hour", "12");
assertEquals("12", element.getAttribute("hour"));
element.removeAttribute("hour"); // value should be reset to default/0
assertEquals("0", element.getAttribute("hour"));
}
}
finally {
if (model != null) {
model.releaseFromRead();
}
}
}
public void testOwnerElementWithImpliedDefaultAttribute() {
IDOMModel model = null;
try {
model = (IDOMModel) getModelForRead("testfiles/time.xml");
if (model != null) {
IDOMDocument document = model.getDocument();
Element element = document.getDocumentElement();
assertNotNull(element);
Attr attr = element.getAttributeNode("hour");
assertNull(attr);
}
}
finally {
if (model != null) {
model.releaseFromRead();
}
}
}
public void testCMAttrWithNullImpliedValue() {
IDOMModel model = null;
try {
model = (IDOMModel) getModelForRead("testfiles/time.xml");
if (model != null) {
IDOMDocument document = model.getDocument();
final String ATTR_NAME = "second";
// Setup a ModelQueryAdapter whose sole purpose it to provide a attribute declaration with a null implied value
document.addAdapter(new ModelQueryAdapter() {
public boolean isAdapterForType(Object type) {
return type.equals(ModelQueryAdapter.class);
}
public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue, Object newValue, int pos) {
}
public CMDocumentCache getCMDocumentCache() {
return null;
}
public org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver getIdResolver() {
return null;
}
public ModelQuery getModelQuery() {
return new ModelQueryImpl(null) {
/* (non-Javadoc)
* @see org.eclipse.wst.xml.core.internal.contentmodel.modelqueryimpl.ModelQueryImpl#getCMElementDeclaration(org.w3c.dom.Element)
*/
public CMElementDeclaration getCMElementDeclaration(Element element) {
final CMElementDeclaration decl = new CMElementDeclarationImpl(null, null);
CMNamedNodeMapImpl map = (CMNamedNodeMapImpl) decl.getAttributes();
map.put(new CMAttributeDeclarationImpl(ATTR_NAME, CMAttributeDeclaration.OPTIONAL, new CMDataTypeImpl(ATTR_NAME, (String) null)));
return decl;
}
};
}
public void release() {
}
public void setIdResolver(org.eclipse.wst.common.uriresolver.internal.provisional.URIResolver newIdResolver) {
}
});
Element element = document.getDocumentElement();
assertNotNull(element);
assertEquals("", element.getAttribute(ATTR_NAME)); // Default value should be 0
}
}
finally {
if (model != null) {
model.releaseFromRead();
}
}
}
public IStructuredModel getModelForRead(String path) {
IStructuredModel model = null;
try {
IModelManager modelManager = StructuredModelManager.getModelManager();
InputStream inStream = getClass().getResourceAsStream(path);
if (inStream == null)
throw new FileNotFoundException("Can't file resource stream " + path);
final String baseFile = getClass().getResource(path).toString();
model = modelManager.getModelForRead(baseFile, inStream, new URIResolver() {
String fBase = baseFile;
public String getFileBaseLocation() {
return fBase;
}
public String getLocationByURI(String uri) {
return getLocationByURI(uri, fBase);
}
public String getLocationByURI(String uri, boolean resolveCrossProjectLinks) {
return getLocationByURI(uri);
}
public String getLocationByURI(String uri, String baseReference) {
int lastSlash = baseReference.lastIndexOf("/");
if (lastSlash > 0)
return baseReference.substring(0, lastSlash + 1) + uri;
return baseReference;
}
public String getLocationByURI(String uri, String baseReference, boolean resolveCrossProjectLinks) {
return getLocationByURI(uri, baseReference);
}
public IProject getProject() {
return null;
}
public IContainer getRootLocation() {
return null;
}
public InputStream getURIStream(String uri) {
return getClass().getResourceAsStream(getLocationByURI(uri));
}
public void setFileBaseLocation(String newLocation) {
this.fBase = newLocation;
}
public void setProject(IProject newProject) {
}
});
}
catch (IOException ex) {
ex.printStackTrace();
}
return model;
}
}