package net.htmlparser.jericho; import org.junit.Test; import static org.junit.Assert.*; import java.io.*; import java.nio.*; public class StreamedTextTest { private static final String text="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; @Test public void testFixedBuffer() { Reader reader=new StringReader(text); char[] buffer=new char[10]; StreamedText streamedText=new StreamedText(reader,buffer); try { streamedText.length(); fail("Should throw IllegalStateException"); } catch (IllegalStateException ex) { assertEquals("Length of streamed text cannot be determined until end of file has been reached",ex.getMessage()); } assertEquals("",streamedText.getCurrentBufferContent()); assertEquals('C',streamedText.charAt(2)); assertEquals("ABCDEFGHIJ",streamedText.getCurrentBufferContent()); assertEquals('B',streamedText.charAt(1)); assertEquals('A',streamedText.charAt(0)); assertEquals('J',streamedText.charAt(9)); try { streamedText.charAt(10); fail("Should throw BufferOverflowException"); } catch (BufferOverflowException ex) {} streamedText.setMinRequiredBufferBegin(8); streamedText.setMinRequiredBufferBegin(5); // allowed to do this because position 5 is still in the buffer assertEquals('A',streamedText.charAt(0)); // only really gets discarded when we need to read more text into the buffer assertEquals('J',streamedText.charAt(9)); assertEquals("ABCDEFGHIJ",streamedText.getCurrentBufferContent()); assertEquals('K',streamedText.charAt(10)); assertEquals("FGHIJKLMNO",streamedText.getCurrentBufferContent()); assertEquals('F',streamedText.charAt(5)); try { streamedText.charAt(4); fail("Should throw IllegalStateException"); } catch (IllegalStateException ex) { assertEquals("StreamedText position 4 has been discarded",ex.getMessage()); } assertEquals('O',streamedText.charAt(14)); try { streamedText.charAt(15); fail("Should throw BufferOverflowException"); } catch (BufferOverflowException ex) {} assertEquals("IJKL",streamedText.subSequence(8,12).toString()); CharBuffer charBuffer=streamedText.getCharBuffer(8,12); char[] charBufferArray=charBuffer.array(); assertEquals("IJKL",new String(charBufferArray,charBuffer.position(),charBuffer.length())); assertEquals("FGHIJKLMNO",streamedText.substring(5,15)); try { streamedText.setMinRequiredBufferBegin(3); fail("Should throw IllegalArgumentException"); } catch (IllegalArgumentException ex) { assertEquals("Cannot set minimum required buffer begin to already discarded position 3",ex.getMessage()); } streamedText.setMinRequiredBufferBegin(20); assertEquals("FGHIJKLMNO",streamedText.getCurrentBufferContent()); assertEquals('O',streamedText.charAt(14)); try { streamedText.charAt(16); // causes reader to skip to MinRequiredBufferBegin and empty buffer fail("Should throw IllegalStateException"); } catch (IllegalStateException ex) { assertEquals("StreamedText position 16 has been discarded",ex.getMessage()); } assertEquals("",streamedText.getCurrentBufferContent()); assertEquals('U',streamedText.charAt(20)); assertEquals("UVWXYZ0123",streamedText.getCurrentBufferContent()); streamedText.setMinRequiredBufferBegin(30); try { streamedText.length(); fail("Should throw IllegalStateException"); } catch (IllegalStateException ex) {} assertEquals('4',streamedText.charAt(30)); assertEquals("456789",streamedText.getCurrentBufferContent()); assertEquals('9',streamedText.charAt(35)); try { streamedText.length(); fail("Should throw IllegalStateException"); // although we are at the end of the stream, the StreamedText object doesn't know that yet because the Reader class doesn't have a method to check for EOF. } catch (IllegalStateException ex) {} try { streamedText.charAt(36); fail("Should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException ex) {} assertEquals(36,streamedText.length()); } @Test public void testExpandableBuffer() { Reader reader=new StringReader(text); int originalInitialExpandableBufferSize=StreamedText.INITIAL_EXPANDABLE_BUFFER_SIZE; StreamedText.INITIAL_EXPANDABLE_BUFFER_SIZE=2; StreamedText streamedText=new StreamedText(reader); StreamedText.INITIAL_EXPANDABLE_BUFFER_SIZE=originalInitialExpandableBufferSize; assertEquals(2,streamedText.getBuffer().length); assertEquals('B',streamedText.charAt(1)); assertEquals(2,streamedText.getBuffer().length); assertEquals("AB",streamedText.getCurrentBufferContent()); assertEquals('E',streamedText.charAt(4)); assertEquals(5,streamedText.getBuffer().length); assertEquals("ABCDE",streamedText.getCurrentBufferContent()); assertEquals('B',streamedText.charAt(1)); assertEquals('A',streamedText.charAt(0)); assertEquals('F',streamedText.charAt(5)); assertEquals(10,streamedText.getBuffer().length); assertEquals("ABCDEFGHIJ",streamedText.getCurrentBufferContent()); streamedText.setMinRequiredBufferBegin(8); assertEquals('A',streamedText.charAt(0)); // only really gets discarded when we need to read more text into the buffer assertEquals('M',streamedText.charAt(12)); assertEquals("IJKLMNOPQR",streamedText.getCurrentBufferContent()); streamedText.setMinRequiredBufferBegin(20); assertEquals(10,streamedText.getBuffer().length); assertEquals('5',streamedText.charAt(31)); assertEquals(20,streamedText.getBuffer().length); assertEquals("UVWXYZ0123456789",streamedText.getCurrentBufferContent()); assertEquals('9',streamedText.charAt(35)); try { streamedText.length(); fail("Should throw IllegalStateException"); // although we are at the end of the stream, the StreamedText object doesn't know that yet because the Reader class doesn't have a method to check for EOF. } catch (IllegalStateException ex) {} try { streamedText.charAt(36); fail("Should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException ex) {} assertEquals(36,streamedText.length()); } @Test public void testEndOfFileFountWhileSkipping() { Reader reader=new StringReader(text); char[] buffer=new char[10]; StreamedText streamedText=new StreamedText(reader,buffer); streamedText.setMinRequiredBufferBegin(40); // past end of stream try { streamedText.length(); fail("Should throw IllegalStateException"); } catch (IllegalStateException ex) {} try { streamedText.charAt(40); fail("Should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException ex) {} assertEquals(36,streamedText.length()); } @Test public void testCharBuffer() { char[] charArray=text.toCharArray(); CharBuffer charBuffer=CharBuffer.wrap(charArray,0,26); StreamedText streamedText=new StreamedText(charBuffer); assertEquals(26,streamedText.length()); assertEquals(36,streamedText.getBuffer().length); assertEquals("ABCDEFGHIJKLMNOPQRSTUVWXYZ",streamedText.getCurrentBufferContent()); assertEquals('A',streamedText.charAt(0)); assertEquals('Z',streamedText.charAt(25)); streamedText.setMinRequiredBufferBegin(20); assertEquals('A',streamedText.charAt(0)); try { streamedText.charAt(26); fail("Should throw IndexOutOfBoundsException"); } catch (IndexOutOfBoundsException ex) {} } }