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 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 testCompositeTagWithAnotherTagChild() throws ParserException {
    String childtag = "<Another/>";
    createParser("<Custom>" + childtag + "</Custom>");
    parser.setNodeFactory(
        new PrototypicalNodeFactory(
            new Tag[] {
              new CustomTag(), new AnotherTag(true),
            }));
    parseAndAssertNodeCount(1);
    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("custom tag starting loc", 0, customTag.getStartPosition());
    assertEquals("custom tag ending loc", 27, customTag.getEndTag().getEndPosition());

    Node child = customTag.childAt(0);
    assertType("child", AnotherTag.class, child);
    AnotherTag tag = (AnotherTag) child;
    assertEquals("another tag start pos", 8, tag.getStartPosition());
    assertEquals("another tag ending pos", 18, tag.getEndPosition());

    assertEquals("custom end tag start pos", 18, customTag.getEndTag().getStartPosition());
    assertStringEquals("child html", childtag, child.toHtml());
  }
 public void testXmlTypeCompositeTags() throws ParserException {
   createParser(
       "<Custom>" + "<Another name=\"subtag\"/>" + "<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];
   Node node = customTag.childAt(0);
   assertType("first child", AnotherTag.class, node);
   node = customTag.childAt(1);
   assertType("second child", CustomTag.class, node);
 }
 public void testTwoConsecutiveErroneousCompositeTags() throws ParserException {
   String tag1 = "<custom>something";
   String tag2 = "<custom></endtag>";
   createParser(tag1 + tag2);
   parser.setNodeFactory(new PrototypicalNodeFactory(new CustomTag(false)));
   parseAndAssertNodeCount(2);
   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("ending loc of custom tag", 17, customTag.getEndTag().getEndPosition());
   assertEquals("starting line position", 0, customTag.getStartingLineNumber());
   assertEquals("ending line position", 0, customTag.getEndTag().getEndingLineNumber());
   assertStringEquals("1st custom tag", tag1 + "</custom>", customTag.toHtml());
   customTag = (CustomTag) node[1];
   assertStringEquals("2nd custom tag", tag2 + "</custom>", customTag.toHtml());
 }
 public void testEmptyCompositeTagAnotherStyle() throws ParserException {
   String html = "<Custom></Custom>";
   createParser(html);
   CustomTag customTag = parseCustomTag(1);
   assertEquals("child count", 0, 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());
   assertEquals("html", html, customTag.toHtml());
 }
 public void testErroneousCompositeTagWithChildrenAndLineBreak() throws ParserException {
   String html = "<custom>" + "<firstChild>" + "\n" + "<secondChild>";
   createParser(html);
   CustomTag customTag = parseCustomTag(1);
   assertEquals("child count", 3, 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", 1, customTag.getEndTag().getEndingLineNumber());
   assertStringEquals("html", html + "</custom>", customTag.toHtml());
 }
 public void testCompositeTagWithOneTextChild() throws ParserException {
   String html = "<Custom>" + "Hello" + "</Custom>";
   createParser(html);
   CustomTag customTag = parseCustomTag(1);
   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());
   Node child = customTag.childAt(0);
   assertType("child", Text.class, child);
   assertStringEquals("child text", "Hello", child.toPlainTextString());
 }
 public void testComplexNesting() throws ParserException {
   createParser(
       "<custom>"
           + "<custom>"
           + "<another>"
           + "</custom>"
           + "<custom>"
           + "<another>"
           + "</custom>"
           + "</custom>");
   parser.setNodeFactory(
       new PrototypicalNodeFactory(
           new Tag[] {
             new CustomTag(), new AnotherTag(false),
           }));
   parseAndAssertNodeCount(1);
   assertType("root node", CustomTag.class, node[0]);
   CustomTag root = (CustomTag) node[0];
   assertNodeCount("child count", 2, root.getChildrenAsNodeArray());
   Node child = root.childAt(0);
   assertType("child", CustomTag.class, child);
   CustomTag customChild = (CustomTag) child;
   assertNodeCount("grand child count", 1, customChild.getChildrenAsNodeArray());
   Node grandchild = customChild.childAt(0);
   assertType("grandchild", AnotherTag.class, grandchild);
 }
  public void testParentConnections() throws ParserException {
    String tag1 = "<custom>";
    String tag2 = "<custom>something</custom>";
    String tag3 = "</custom>";
    createParser(tag1 + tag2 + tag3);
    parser.setNodeFactory(
        new PrototypicalNodeFactory(
            new Tag[] {
              new CustomTag(false), new AnotherTag(false),
            }));
    parseAndAssertNodeCount(3);

    CustomTag customTag = (CustomTag) node[0];

    assertStringEquals("first custom tag html", tag1 + "</custom>", customTag.toHtml());
    assertNull("first custom tag should have no parent", customTag.getParent());

    customTag = (CustomTag) node[1];
    assertStringEquals("second custom tag html", tag2, customTag.toHtml());
    assertNull("second custom tag should have no parent", customTag.getParent());

    Node firstChild = customTag.childAt(0);
    assertType("firstChild", Text.class, firstChild);
    Node parent = firstChild.getParent();
    assertNotNull("first child parent should not be null", parent);
    assertSame("parent and custom tag should be the same", customTag, parent);

    Tag endTag = (Tag) node[2];
    assertStringEquals("third custom tag html", tag3, endTag.toHtml());
    assertNull("end tag should have no parent", endTag.getParent());
  }
  public void testCompositeTagWithSelfChildren() throws ParserException {
    String tag1 = "<custom>";
    String tag2 = "<custom>something</custom>";
    String tag3 = "</custom>";
    createParser(tag1 + tag2 + tag3);
    parser.setNodeFactory(
        new PrototypicalNodeFactory(
            new Tag[] {
              new CustomTag(false), new AnotherTag(false),
            }));
    parseAndAssertNodeCount(3);

    CustomTag customTag = (CustomTag) node[0];
    assertEquals("child count", 0, customTag.getChildCount());
    assertFalse("custom tag should not be xml end tag", customTag.isEmptyXmlTag());

    assertStringEquals("first custom tag html", tag1 + "</custom>", customTag.toHtml());
    customTag = (CustomTag) node[1];
    assertStringEquals("second custom tag html", tag2, customTag.toHtml());
    Tag endTag = (Tag) node[2];
    assertStringEquals("third custom tag html", tag3, endTag.toHtml());
  }
  public void testCompositeTagWithTagChild() throws ParserException {
    String childtag = "<Hello>";
    createParser("<Custom>" + childtag + "</Custom>");
    CustomTag customTag = parseCustomTag(1);
    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("custom tag starting loc", 0, customTag.getStartPosition());
    assertEquals("custom tag ending loc", 24, customTag.getEndTag().getEndPosition());

    Node child = customTag.childAt(0);
    assertType("child", Tag.class, child);
    assertStringEquals("child html", childtag, child.toHtml());
  }
 public void testCompositeTagWithErroneousAnotherTag() throws ParserException {
   createParser("<custom>" + "<another>" + "</custom>");
   parser.setNodeFactory(
       new PrototypicalNodeFactory(
           new Tag[] {
             new CustomTag(), new AnotherTag(true),
           }));
   parseAndAssertNodeCount(1);
   assertType("node", CustomTag.class, node[0]);
   CustomTag customTag = (CustomTag) node[0];
   assertEquals("child count", 1, customTag.getChildCount());
   assertFalse("custom tag should be xml end tag", customTag.isEmptyXmlTag());
   assertEquals("starting loc", 0, customTag.getStartPosition());
   assertEquals("ending loc", 8, customTag.getEndPosition());
   AnotherTag anotherTag = (AnotherTag) customTag.childAt(0);
   assertEquals("another tag ending loc", 17, anotherTag.getEndPosition());
   assertEquals("starting line position", 0, customTag.getStartingLineNumber());
   assertEquals("ending line position", 0, customTag.getEndingLineNumber());
   assertStringEquals("html", "<custom><another></another></custom>", customTag.toHtml());
 }
 public void testCompositeTagCorrectionWithSplitLines() throws ParserException {
   createParser("<custom>" + "<another><abcdefg>\n" + "</custom>");
   parser.setNodeFactory(
       new PrototypicalNodeFactory(
           new Tag[] {
             new CustomTag(), new AnotherTag(true),
           }));
   parseAndAssertNodeCount(1);
   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());
   AnotherTag anotherTag = (AnotherTag) customTag.childAt(0);
   assertEquals("anotherTag child count", 2, anotherTag.getChildCount());
   assertEquals("anotherTag end loc", 27, anotherTag.getEndTag().getEndPosition());
   assertEquals("custom end tag begin loc", 27, customTag.getEndTag().getStartPosition());
   assertEquals("custom end tag end loc", 36, customTag.getEndTag().getEndPosition());
 }
  public void testCompositeTagWithErroneousAnotherTagAndLineBreak() throws ParserException {
    String another = "<another>";
    String custom = "<custom>\n</custom>";
    createParser(another + custom);
    parser.setNodeFactory(
        new PrototypicalNodeFactory(
            new Tag[] {
              new CustomTag(), new AnotherTag(false),
            }));
    parseAndAssertNodeCount(2);
    AnotherTag anotherTag = (AnotherTag) node[0];
    assertEquals("another tag child count", 0, anotherTag.getChildCount());

    CustomTag customTag = (CustomTag) node[1];
    assertEquals("child count", 1, customTag.getChildCount());
    assertFalse("custom tag should not be xml end tag", customTag.isEmptyXmlTag());
    assertEquals("starting loc", 9, customTag.getStartPosition());
    assertEquals("ending loc", 17, customTag.getEndPosition());
    assertEquals("starting line position", 0, customTag.getStartingLineNumber());
    assertEquals("ending line position", 1, customTag.getEndTag().getEndingLineNumber());
    assertStringEquals("another tag html", another + "</another>", anotherTag.toHtml());
    assertStringEquals("custom tag html", custom, customTag.toHtml());
  }