package org.jsoup.parser;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Test suite for character reader.
*
* @author Jonathan Hedley, jonathan@hedley.net
*/
public class CharacterReaderTest {
@Test public void consume() {
CharacterReader r = new CharacterReader("one");
assertEquals(0, r.pos());
assertEquals('o', r.current());
assertEquals('o', r.consume());
assertEquals(1, r.pos());
assertEquals('n', r.current());
assertEquals(1, r.pos());
assertEquals('n', r.consume());
assertEquals('e', r.consume());
assertTrue(r.isEmpty());
assertEquals(CharacterReader.EOF, r.consume());
assertTrue(r.isEmpty());
assertEquals(CharacterReader.EOF, r.consume());
}
@Test public void unconsume() {
CharacterReader r = new CharacterReader("one");
assertEquals('o', r.consume());
assertEquals('n', r.current());
r.unconsume();
assertEquals('o', r.current());
assertEquals('o', r.consume());
assertEquals('n', r.consume());
assertEquals('e', r.consume());
assertTrue(r.isEmpty());
r.unconsume();
assertFalse(r.isEmpty());
assertEquals('e', r.current());
assertEquals('e', r.consume());
assertTrue(r.isEmpty());
assertEquals(CharacterReader.EOF, r.consume());
r.unconsume();
assertTrue(r.isEmpty());
assertEquals(CharacterReader.EOF, r.current());
}
@Test public void mark() {
CharacterReader r = new CharacterReader("one");
r.consume();
r.mark();
assertEquals('n', r.consume());
assertEquals('e', r.consume());
assertTrue(r.isEmpty());
r.rewindToMark();
assertEquals('n', r.consume());
}
@Test public void consumeToEnd() {
String in = "one two three";
CharacterReader r = new CharacterReader(in);
String toEnd = r.consumeToEnd();
assertEquals(in, toEnd);
assertTrue(r.isEmpty());
}
@Test public void nextIndexOfChar() {
String in = "blah blah";
CharacterReader r = new CharacterReader(in);
assertEquals(-1, r.nextIndexOf('x'));
assertEquals(3, r.nextIndexOf('h'));
String pull = r.consumeTo('h');
assertEquals("bla", pull);
r.consume();
assertEquals(2, r.nextIndexOf('l'));
assertEquals(" blah", r.consumeToEnd());
assertEquals(-1, r.nextIndexOf('x'));
}
@Test public void nextIndexOfString() {
String in = "One Two something Two Three Four";
CharacterReader r = new CharacterReader(in);
assertEquals(-1, r.nextIndexOf("Foo"));
assertEquals(4, r.nextIndexOf("Two"));
assertEquals("One Two ", r.consumeTo("something"));
assertEquals(10, r.nextIndexOf("Two"));
assertEquals("something Two Three Four", r.consumeToEnd());
assertEquals(-1, r.nextIndexOf("Two"));
}
@Test public void nextIndexOfUnmatched() {
CharacterReader r = new CharacterReader("<[[one]]");
assertEquals(-1, r.nextIndexOf("]]>"));
}
@Test public void consumeToChar() {
CharacterReader r = new CharacterReader("One Two Three");
assertEquals("One ", r.consumeTo('T'));
assertEquals("", r.consumeTo('T')); // on Two
assertEquals('T', r.consume());
assertEquals("wo ", r.consumeTo('T'));
assertEquals('T', r.consume());
assertEquals("hree", r.consumeTo('T')); // consume to end
}
@Test public void consumeToString() {
CharacterReader r = new CharacterReader("One Two Two Four");
assertEquals("One ", r.consumeTo("Two"));
assertEquals('T', r.consume());
assertEquals("wo ", r.consumeTo("Two"));
assertEquals('T', r.consume());
assertEquals("wo Four", r.consumeTo("Qux"));
}
@Test public void advance() {
CharacterReader r = new CharacterReader("One Two Three");
assertEquals('O', r.consume());
r.advance();
assertEquals('e', r.consume());
}
@Test public void consumeToAny() {
CharacterReader r = new CharacterReader("One &bar; qux");
assertEquals("One ", r.consumeToAny('&', ';'));
assertTrue(r.matches('&'));
assertTrue(r.matches("&bar;"));
assertEquals('&', r.consume());
assertEquals("bar", r.consumeToAny('&', ';'));
assertEquals(';', r.consume());
assertEquals(" qux", r.consumeToAny('&', ';'));
}
@Test public void consumeLetterSequence() {
CharacterReader r = new CharacterReader("One &bar; qux");
assertEquals("One", r.consumeLetterSequence());
assertEquals(" &", r.consumeTo("bar;"));
assertEquals("bar", r.consumeLetterSequence());
assertEquals("; qux", r.consumeToEnd());
}
@Test public void consumeLetterThenDigitSequence() {
CharacterReader r = new CharacterReader("One12 Two &bar; qux");
assertEquals("One12", r.consumeLetterThenDigitSequence());
assertEquals(' ', r.consume());
assertEquals("Two", r.consumeLetterThenDigitSequence());
assertEquals(" &bar; qux", r.consumeToEnd());
}
@Test public void matches() {
CharacterReader r = new CharacterReader("One Two Three");
assertTrue(r.matches('O'));
assertTrue(r.matches("One Two Three"));
assertTrue(r.matches("One"));
assertFalse(r.matches("one"));
assertEquals('O', r.consume());
assertFalse(r.matches("One"));
assertTrue(r.matches("ne Two Three"));
assertFalse(r.matches("ne Two Three Four"));
assertEquals("ne Two Three", r.consumeToEnd());
assertFalse(r.matches("ne"));
}
@Test
public void matchesIgnoreCase() {
CharacterReader r = new CharacterReader("One Two Three");
assertTrue(r.matchesIgnoreCase("O"));
assertTrue(r.matchesIgnoreCase("o"));
assertTrue(r.matches('O'));
assertFalse(r.matches('o'));
assertTrue(r.matchesIgnoreCase("One Two Three"));
assertTrue(r.matchesIgnoreCase("ONE two THREE"));
assertTrue(r.matchesIgnoreCase("One"));
assertTrue(r.matchesIgnoreCase("one"));
assertEquals('O', r.consume());
assertFalse(r.matchesIgnoreCase("One"));
assertTrue(r.matchesIgnoreCase("NE Two Three"));
assertFalse(r.matchesIgnoreCase("ne Two Three Four"));
assertEquals("ne Two Three", r.consumeToEnd());
assertFalse(r.matchesIgnoreCase("ne"));
}
@Test public void containsIgnoreCase() {
CharacterReader r = new CharacterReader("One TWO three");
assertTrue(r.containsIgnoreCase("two"));
assertTrue(r.containsIgnoreCase("three"));
// weird one: does not find one, because it scans for consistent case only
assertFalse(r.containsIgnoreCase("one"));
}
@Test public void matchesAny() {
char[] scan = {' ', '\n', '\t'};
CharacterReader r = new CharacterReader("One\nTwo\tThree");
assertFalse(r.matchesAny(scan));
assertEquals("One", r.consumeToAny(scan));
assertTrue(r.matchesAny(scan));
assertEquals('\n', r.consume());
assertFalse(r.matchesAny(scan));
}
@Test public void cachesStrings() {
CharacterReader r = new CharacterReader("Check\tCheck\tCheck\tCHOKE\tA string that is longer than 16 chars");
String one = r.consumeTo('\t');
r.consume();
String two = r.consumeTo('\t');
r.consume();
String three = r.consumeTo('\t');
r.consume();
String four = r.consumeTo('\t');
r.consume();
String five = r.consumeTo('\t');
assertEquals("Check", one);
assertEquals("Check", two);
assertEquals("Check", three);
assertEquals("CHOKE", four);
assertTrue(one == two);
assertTrue(two == three);
assertTrue(three != four);
assertTrue(four != five);
assertEquals(five, "A string that is longer than 16 chars");
}
@Test
public void rangeEquals() {
CharacterReader r = new CharacterReader("Check\tCheck\tCheck\tCHOKE");
assertTrue(r.rangeEquals(0, 5, "Check"));
assertFalse(r.rangeEquals(0, 5, "CHOKE"));
assertFalse(r.rangeEquals(0, 5, "Chec"));
assertTrue(r.rangeEquals(6, 5, "Check"));
assertFalse(r.rangeEquals(6, 5, "Chuck"));
assertTrue(r.rangeEquals(12, 5, "Check"));
assertFalse(r.rangeEquals(12, 5, "Cheeky"));
assertTrue(r.rangeEquals(18, 5, "CHOKE"));
assertFalse(r.rangeEquals(18, 5, "CHIKE"));
}
}