package org.exist.dom.memtree;
import org.easymock.EasyMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.verify;
import static org.easymock.EasyMock.replay;
import org.exist.util.hashtable.NamePool;
import org.exist.xquery.XQueryContext;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
/**
*
* @author aretter
*/
public class DocumentBuilderReceiverTest {
private static String ATOM_NS = "http://www.w3.org/2005/Atom";
// private static String ATOM_PREFIX = "atom";
@Test
public void when_prefix_is_known_in_context_dont_use_if_namespace_equals_default_namespace() throws SAXException {
final String entry_name = "entry";
final String id_name = "id";
XQueryContext mockContext = EasyMock.createMock(XQueryContext.class);
expect(mockContext.getDatabase()).andReturn(null);
expect(mockContext.getSharedNamePool()).andReturn(new NamePool());
//expect(mockContext.getPrefixForURI(ATOM_NS)).andReturn(ATOM_PREFIX).times(2);
replay(mockContext);
MemTreeBuilder builder = new MemTreeBuilder(mockContext);
DocumentBuilderReceiver receiver = new DocumentBuilderReceiver(builder, true);
builder.startDocument();
receiver.startPrefixMapping("", ATOM_NS);
receiver.startElement(ATOM_NS, entry_name, entry_name, null);
receiver.startElement(ATOM_NS, id_name, id_name, null);
receiver.endElement(ATOM_NS, id_name, id_name);
receiver.endElement(ATOM_NS, entry_name, entry_name);
builder.endDocument();
verify(mockContext);
Document doc = builder.getDocument();
Node entryNode = doc.getFirstChild();
assertEquals(entry_name, entryNode.getNodeName());
Node idNode = entryNode.getFirstChild();
assertEquals(id_name, idNode.getNodeName());
}
@Test
public void use_given_namespace_prefix() throws SAXException {
// if an explicit namespace prefix is present, it should be used
// unless a different mapping was defined in context
final String title = "title";
final String titleQName = "atom:title";
XQueryContext mockContext = EasyMock.createMock(XQueryContext.class);
expect(mockContext.getDatabase()).andReturn(null);
expect(mockContext.getSharedNamePool()).andReturn(new NamePool());
// no namespace mapping in context
expect(mockContext.getPrefixForURI(ATOM_NS)).andReturn(null);
replay(mockContext);
MemTreeBuilder builder = new MemTreeBuilder(mockContext);
DocumentBuilderReceiver receiver = new DocumentBuilderReceiver(builder, true);
builder.startDocument();
receiver.startElement(ATOM_NS, title, titleQName, null);
receiver.endElement(ATOM_NS, title, titleQName);
builder.endDocument();
verify(mockContext);
Document doc = builder.getDocument();
Node entryNode = doc.getFirstChild();
assertEquals("Explicit namespace prefix should be preserved", titleQName, entryNode.getNodeName());
}
@Test
public void use_namespace_prefix_from_context() throws SAXException {
// if a namespace is mapped in the current context, use its prefix and overwrite
// local prefix
final String title = "title";
final String titleQName = "atom:title";
XQueryContext mockContext = EasyMock.createMock(XQueryContext.class);
expect(mockContext.getDatabase()).andReturn(null);
expect(mockContext.getSharedNamePool()).andReturn(new NamePool());
// namespace mapping in context
expect(mockContext.getPrefixForURI(ATOM_NS)).andReturn("a");
replay(mockContext);
MemTreeBuilder builder = new MemTreeBuilder(mockContext);
DocumentBuilderReceiver receiver = new DocumentBuilderReceiver(builder, true);
builder.startDocument();
receiver.startElement(ATOM_NS, title, titleQName, null);
receiver.endElement(ATOM_NS, title, titleQName);
builder.endDocument();
verify(mockContext);
Document doc = builder.getDocument();
Node entryNode = doc.getFirstChild();
assertEquals("Explicit namespace prefix should be preserved", "a:title", entryNode.getNodeName());
}
}