package com.opensymphony.module.sitemesh.chaining;
import java.io.CharArrayWriter;
import java.util.Arrays;
import java.util.TreeMap;
import com.opensymphony.module.sitemesh.DefaultSitemeshBuffer;
import com.opensymphony.module.sitemesh.SitemeshBuffer;
import com.opensymphony.module.sitemesh.SitemeshBufferFragment;
import com.opensymphony.module.sitemesh.SitemeshBufferWriter;
import junit.framework.TestCase;
/**
*/
public class ChainingBufferTest extends TestCase {
public void testSimpleChain() throws Exception {
SitemeshBuffer buffer = newSitemeshBuffer("1234", 2, newBufferFragment("ab"));
assertEquals("12ab34", getContent(buffer));
assertCorrectLength(buffer);
}
public void testBefore() throws Exception {
SitemeshBuffer buffer = newSitemeshBuffer("1234", 2, newBufferFragment("ab"));
assertEquals("1", getContent(buffer, 0, 1));
assertEquals("12ab", getContent(buffer, 0, 2));
}
public void testAfter() throws Exception {
SitemeshBuffer buffer = newSitemeshBuffer("1234", 2, newBufferFragment("ab"));
assertEquals("ab34", getContent(buffer, 2, 2));
assertEquals("4", getContent(buffer, 3, 1));
}
public void testFragment() throws Exception {
SitemeshBuffer buffer = newSitemeshBuffer("1234", 2, newBufferFragment("abcd", 1, 2));
assertEquals("12bc34", getContent(buffer));
assertCorrectLength(buffer);
}
public void testDeepFragments() throws Exception {
SitemeshBuffer buffer = newSitemeshBuffer("123456789",
3, newBufferFragment("abcdefg",
4, newBufferFragment("hijklm", 1, 1),
5, newBufferFragment("nopqr", 1, 4)),
8, newBufferFragment("tuzwx", 0, 2));
assertEquals("123abcdieopqrfg45678tu9", getContent(buffer));
assertCorrectLength(buffer);
}
public void testWriter() throws Exception {
SitemeshBuffer buffer = newSitemeshBuffer("123456");
SitemeshBufferWriter writer = new SitemeshBufferWriter();
writer.write("abc");
writer.writeSitemeshBufferFragment(new SitemeshBufferFragment(buffer, 1, 4));
writer.write("def");
assertEquals("abcdef", writer.toString());
assertEquals("abc2345def", getContent(writer.getSitemeshBuffer()));
}
private String getContent(SitemeshBuffer buffer) throws Exception {
CharArrayWriter writer = new CharArrayWriter();
buffer.writeTo(writer, 0, buffer.getBufferLength());
return writer.toString();
}
private String getContent(SitemeshBuffer buffer, int start, int length) throws Exception {
CharArrayWriter writer = new CharArrayWriter();
buffer.writeTo(writer, start, length);
return writer.toString();
}
private void assertCorrectLength(SitemeshBuffer buffer) throws Exception {
assertEquals(getContent(buffer).length(), buffer.getTotalLength());
}
private SitemeshBuffer newSitemeshBuffer(String content) {
return new DefaultSitemeshBuffer(content.toCharArray(), content.length());
}
private SitemeshBuffer newSitemeshBuffer(String content, int pos1, SitemeshBufferFragment frag1) {
TreeMap<Integer, SitemeshBufferFragment> fragments = new TreeMap<Integer, SitemeshBufferFragment>();
fragments.put(pos1, frag1);
return new DefaultSitemeshBuffer(content.toCharArray(), content.length(), fragments);
}
private SitemeshBuffer newSitemeshBuffer(String content, int pos1, SitemeshBufferFragment frag1, int pos2, SitemeshBufferFragment frag2) {
TreeMap<Integer, SitemeshBufferFragment> fragments = new TreeMap<Integer, SitemeshBufferFragment>();
fragments.put(pos1, frag1);
fragments.put(pos2, frag2);
return new DefaultSitemeshBuffer(content.toCharArray(), content.length(), fragments);
}
private SitemeshBufferFragment newBufferFragment(String content) {
return new SitemeshBufferFragment(newSitemeshBuffer(content), 0, content.length());
}
private SitemeshBufferFragment newBufferFragment(String content, int start, int length) {
return new SitemeshBufferFragment(newSitemeshBuffer(content), start, length);
}
private SitemeshBufferFragment newBufferFragment(String content, int pos1, SitemeshBufferFragment frag1) {
return new SitemeshBufferFragment(newSitemeshBuffer(content, pos1, frag1), 0, content.length());
}
private SitemeshBufferFragment newBufferFragment(String content, int pos1, SitemeshBufferFragment frag1, int pos2, SitemeshBufferFragment frag2) {
return new SitemeshBufferFragment(newSitemeshBuffer(content, pos1, frag1, pos2, frag2), 0, content.length());
}
}