public void testCompositeTagWithDeadlock() throws ParserException {
    createParser(
        "<custom>"
            + "<another>something"
            + "</custom>"
            + "<custom>"
            + "<another>else</another>"
            + "</custom>");
    parser.setNodeFactory(
        new PrototypicalNodeFactory(
            new Tag[] {
              new CustomTag(), new AnotherTag(true),
            }));
    parseAndAssertNodeCount(2);
    assertType("node", CustomTag.class, node[0]);
    CustomTag customTag = (CustomTag) node[0];

    assertEquals("child count", 1, customTag.getChildCount());
    assertFalse("custom tag should not be xml end tag", customTag.isEmptyXmlTag());
    assertEquals("starting loc", 0, customTag.getStartPosition());
    assertEquals("ending loc", 8, customTag.getEndPosition());
    assertEquals("starting line position", 0, customTag.getStartingLineNumber());
    assertEquals("ending line position", 0, customTag.getEndingLineNumber());
    AnotherTag anotherTag = (AnotherTag) customTag.childAt(0);
    assertEquals("anotherTag child count", 1, anotherTag.getChildCount());
    Text stringNode = (Text) anotherTag.childAt(0);
    assertStringEquals("anotherTag child text", "something", stringNode.toPlainTextString());
    assertStringEquals(
        "first custom tag html",
        "<custom><another>something</another></custom>",
        customTag.toHtml());
    customTag = (CustomTag) node[1];
    assertStringEquals(
        "second custom tag html", "<custom><another>else</another></custom>", customTag.toHtml());
  }
 public void testCompositeTagWithTwoNestedTags() throws ParserException {
   createParser(
       "<Custom>"
           + "<Another>"
           + "Hello"
           + "</Another>"
           + "<unknown>"
           + "World"
           + "</unknown>"
           + "<Custom/>"
           + "</Custom>"
           + "<Custom/>");
   parser.setNodeFactory(
       new PrototypicalNodeFactory(
           new Tag[] {
             new CustomTag(), new AnotherTag(false),
           }));
   parseAndAssertNodeCount(2);
   assertType("first node", CustomTag.class, node[0]);
   assertType("second node", CustomTag.class, node[1]);
   CustomTag customTag = (CustomTag) node[0];
   assertEquals("first custom tag children count", 5, customTag.getChildCount());
   Node node = customTag.childAt(0);
   assertType("first child", AnotherTag.class, node);
   AnotherTag anotherTag = (AnotherTag) node;
   assertEquals("another tag children count", 1, anotherTag.getChildCount());
   node = anotherTag.childAt(0);
   assertType("nested child", Text.class, node);
   Text text = (Text) node;
   assertEquals("text", "Hello", text.toPlainTextString());
 }
 public String toPlainTextString() {
   return delegate.toPlainTextString();
 }