package html; import junit.framework.TestCase; import org.mockito.ArgumentMatcher; import org.mockito.InOrder; import org.mockito.Mockito; import fm.pause.stringparty.html.HtmlParser; import fm.pause.stringparty.html.block.HtmlBlock; import fm.pause.stringparty.parser.Block; import fm.pause.stringparty.parser.ParseListener; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.verify; public class HtmlParserTest extends TestCase { private HtmlParser parser; private ParseListener listener; @Override public void setUp() throws Exception { super.setUp(); parser = new HtmlParser(); listener = Mockito.mock(ParseListener.class); parser.register(listener); } public void testReturnsCorrectText() throws Exception { parser.parse("hello world"); verify(listener).characters("hello world"); } public void testDispatchesCorrectBlocks() throws Exception { parser.parse("<p>abc</p>"); verify(listener).start(isHtmlBlock("p")); verify(listener).characters("abc"); verify(listener).end(isHtmlBlock("p")); } public void testDispatchesCorrectlyNestedBlocks() throws Exception { parser.parse("<p><b>abc</b></p>"); InOrder inOrder = inOrder(listener); inOrder.verify(listener).start(isHtmlBlock("p")); inOrder.verify(listener).start(isHtmlBlock("b")); inOrder.verify(listener).characters("abc"); inOrder.verify(listener).end(isHtmlBlock("b")); inOrder.verify(listener).end(isHtmlBlock("p")); } public void testCharactersSentInChunks() throws Exception { String input = "imaverylongbutverylongstringthatmightbesentinchunks" + "imaverylongbutverylongstringthatmightbesentinchunks" + "imaverylongbutverylongstringthatmightbesentinchunks" + "imaverylongbutverylongstringthatmightbesentinchunks" + "imaverylongbutverylongstringthatmightbesentinchunks" + "imaverylongbutverylongstringthatmightbesentinchunks" + "imaverylongbutverylongstringthatmightbesentinchunks"; final StringBuilder result = new StringBuilder(); parser.register(new ParseListener() { @Override public void characters(String string) { result.append(string); } @Override public void start(Block block) {} @Override public void end(Block block) {} }); parser.parse(input); assertEquals(input, result.toString()); } public void testWhiteSpaceIsSpace() throws Exception { parser.parse("Hello great\nworld\tadieu"); verify(listener).characters("Hello great world adieu"); } private HtmlBlock isHtmlBlock(String name) { return argThat(new IsHtmlBlock(name)); } private static class IsHtmlBlock extends ArgumentMatcher<HtmlBlock> { private String name; private IsHtmlBlock(String name) { this.name = name; } @Override public boolean matches(Object block) { return ((HtmlBlock) block).getName().equals(name); } } }