package com.berryworks.edireader.util.sax;
import com.berryworks.edireader.EDIAttributes;
import org.junit.Test;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
public class QueuedContentHandlerTest {
private QueuedContentHandler handler;
private SimpleHandler wrappedHandler;
private EDIAttributes attributes;
@Test
public void canConstruct() {
wrappedHandler = new SimpleHandler();
handler = new QueuedContentHandler(wrappedHandler, 10, null);
assertSame(wrappedHandler, handler.getWrappedContentHandler());
}
@Test
public void passesThroughAllItems() throws SAXException {
wrappedHandler = new SimpleHandler();
handler = new QueuedContentHandler(wrappedHandler, 10, null);
attributes = new EDIAttributes();
attributes.addCDATA("a", "a");
handler.startElement("", "A", "A", attributes);
handler.characters("data");
handler.characters("+more".toCharArray(), 0, 5);
handler.endElement("", "A", "A");
handler.drainQueue();
assertEquals(1, wrappedHandler.getElementCount());
assertEquals("(A.a = a:data+more)", wrappedHandler.getImage());
}
@Test
public void canGetFirstAttributes() throws SAXException {
wrappedHandler = new SimpleHandler();
handler = new QueuedContentHandler(wrappedHandler, 10, null);
attributes = new EDIAttributes();
attributes.addCDATA("a", "a");
handler.startElement("", "A", "A", attributes);
handler.characters("data");
handler.endElement("", "A", "A");
handler.startElement("", "B", "B", null);
handler.characters("more");
handler.endElement("", "B", "B");
assertEquals("a = a", handler.getFirstAttributes().toString());
}
@Test
public void enforcesQueueSizeLimit() throws SAXException {
wrappedHandler = new SimpleHandler();
handler = new QueuedContentHandler(wrappedHandler, 2, null);
attributes = new EDIAttributes();
attributes.addCDATA("a", "a");
handler.startElement("", "A", "A", null);
handler.characters("data");
handler.endElement("", "A", "A");
handler.startElement("", "B", "B", null);
handler.endElement("", "B", "B");
handler.startElement("", "C", "C", null);
handler.endElement("", "C", "C");
// Note that we have not drained the queue.
assertEquals(2, wrappedHandler.getElementCount());
assertEquals("(A.empty:data)(B.empty)", wrappedHandler.getImage());
}
private class SimpleHandler extends DefaultHandler {
private int elementCount;
private StringBuilder image = new StringBuilder();
private boolean hasData;
public int getElementCount() {
return elementCount;
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
elementCount++;
image.append("(" + localName);
hasData = false;
if (attributes != null) {
image.append("." + attributes);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
image.append(")");
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (!hasData) {
image.append(":");
hasData = false;
}
image.append(String.valueOf(ch, start, length));
}
public String getImage() {
return image.toString();
}
}
}