package org.marketcetera.util.file; import java.io.ByteArrayOutputStream; import java.io.FileNotFoundException; import java.io.PrintStream; import java.io.Writer; import org.apache.commons.lang.ArrayUtils; import org.junit.Test; import org.marketcetera.util.unicode.Signature; import org.marketcetera.util.unicode.SignatureCharset; import static org.junit.Assert.*; import static org.marketcetera.util.test.UnicodeData.*; /** * @author tlerios@marketcetera.com * @since 0.5.0 * @version $Id: WriterWrapperTest.java 16154 2012-07-14 16:34:05Z colin $ */ /* $License$ */ public class WriterWrapperTest extends WrapperTestBase { private static final class CloseCounterWriter extends Writer { private int mClosures=0; private int mFlushes=0; int getClosures() { return mClosures; } int getFlushes() { return mFlushes; } @Override public void write (char[] cbuf, int off, int len) {} @Override public void flush() { mFlushes++; } @Override public void close() { mClosures++; } } @Test public void basics() throws Exception { CloseCounterWriter counter=new CloseCounterWriter(); WriterWrapper out=new WriterWrapper(counter); assertEquals(0,counter.getClosures()); assertEquals(0,counter.getFlushes()); assertFalse(out.getSkipClose()); assertNotNull(out.getWriter()); out.close(); assertEquals(1,counter.getClosures()); assertEquals(1,counter.getFlushes()); out.close(); assertEquals(1,counter.getClosures()); assertEquals(1,counter.getFlushes()); counter=new CloseCounterWriter(); out=new WriterWrapper(counter,true); assertEquals(0,counter.getClosures()); assertEquals(0,counter.getFlushes()); assertTrue(out.getSkipClose()); assertNotNull(out.getWriter()); out.close(); assertEquals(0,counter.getClosures()); assertEquals(1,counter.getFlushes()); out.close(); assertEquals(0,counter.getClosures()); assertEquals(2,counter.getFlushes()); } @Test(expected=FileNotFoundException.class) public void nonexistent() throws Exception { new WriterWrapper(TEST_NONEXISTENT_FILE); } private static void testStandardStream (String name, ByteArrayOutputStream out) throws Exception { CloseableRegistry r=new CloseableRegistry(); try { WriterWrapper wrapper=new WriterWrapper(name); r.register(wrapper); assertTrue(wrapper.getSkipClose()); assertNotNull(wrapper.getWriter()); wrapper.getWriter().write(VALUE); } finally { r.close(); } assertArrayEquals(VALUE_BYTES,out.toByteArray()); } @Override protected void testStandardOutputStream (ByteArrayOutputStream out) throws Exception { testStandardStream(SpecialNames.STANDARD_OUTPUT,out); } @Override protected void testStandardErrorStream (ByteArrayOutputStream err) throws Exception { testStandardStream(SpecialNames.STANDARD_ERROR,err); } private void testStandardOutputStreamUnicode() throws Exception { PrintStream stdOutSave=System.out; CloseableRegistry r=new CloseableRegistry(); ByteArrayOutputStream stdOutByteArray=new ByteArrayOutputStream(); try { r.register(stdOutByteArray); PrintStream stdOut=new PrintStream(stdOutByteArray); r.register(stdOut); System.setOut(stdOut); WriterWrapper wrapper=new WriterWrapper (SpecialNames.STANDARD_OUTPUT,SignatureCharset.UTF8_UTF8); r.register(wrapper); assertTrue(wrapper.getSkipClose()); assertNotNull(wrapper.getWriter()); wrapper.getWriter().write(COMBO); } finally { System.setOut(stdOutSave); r.close(); } assertArrayEquals (ArrayUtils.addAll(Signature.UTF8.getMark(),COMBO_UTF8), stdOutByteArray.toByteArray()); } private void testStandardErrorStreamUnicode() throws Exception { PrintStream stdErrSave=System.err; CloseableRegistry r=new CloseableRegistry(); ByteArrayOutputStream stdErrByteArray=new ByteArrayOutputStream(); try { r.register(stdErrByteArray); PrintStream stdErr=new PrintStream(stdErrByteArray); r.register(stdErr); System.setErr(stdErr); WriterWrapper wrapper=new WriterWrapper (SpecialNames.STANDARD_ERROR,SignatureCharset.UTF8_UTF8); r.register(wrapper); assertTrue(wrapper.getSkipClose()); assertNotNull(wrapper.getWriter()); wrapper.getWriter().write(COMBO); } finally { System.setErr(stdErrSave); r.close(); } assertArrayEquals (ArrayUtils.addAll(Signature.UTF8.getMark(),COMBO_UTF8), stdErrByteArray.toByteArray()); } @Test public void wrappers() throws Exception { testStandardOutputStream(); testStandardOutputStreamUnicode(); testStandardErrorStream(); testStandardErrorStreamUnicode(); } }