// Bug 210976 - StringIndexOutOfBoundsException: String index out of range: 399
  public void testIssue210976() throws ParseException {
    String code = "<a href=\"@&msc=@@@&klub=@@@\"></a>";
    //             01234567 8901234567890123456 7890123
    //             0          1         2          3

    HtmlParseResult result = parse(code);
    Node root = result.root();
    assertNotNull(root);

    //        ElementUtils.dumpTree(root);

    OpenTag a = ElementUtils.query(root, "html/body/a");
    assertNotNull(a);
    assertEquals(0, a.from());
    assertEquals(29, a.to());

    Attribute attr = a.getAttribute("href");
    assertNotNull(attr);

    assertNotNull(attr.value());
    assertNotNull(attr.unquotedValue());

    assertEquals("\"@&msc=@@@&klub=@@@\"", attr.value());
    assertEquals("@&msc=@@@&klub=@@@", attr.unquotedValue());
  }
  //    public void testProblemsReporting() throws ParseException {
  //        HtmlParseResult result = parse("<!DOCTYPE html></section>");
  //        //                              012345678901234567890123456789
  //        //                              0         1         2
  //        Collection<ProblemDescription> problems = result.getProblems();
  //
  //        assertEquals(1, problems.size());
  //        ProblemDescription p = problems.iterator().next();
  //
  //        assertEquals(ProblemDescription.ERROR, p.getType());
  //        assertEquals("nokey", p.getKey()); //XXX fix that
  //        assertEquals("Stray end tag “section”.", p.getText());
  //        assertEquals(15, p.getFrom());
  //        assertEquals(25, p.getTo());
  //
  //    }
  public void testStyle() throws ParseException {
    String code =
        "<!DOCTYPE html>\n<style type=\"text/css\">\n@import \"resources2/ezcompik/newcss2moje.css\";\n</style>\n";
    //             0123456789012345 67890123456 7890123456 789 012345678 90123456789012345678
    // 90123456789012 345678901 23456789
    //             0         1          2          3           4          5         6          7
    //      8           9

    //        NodeTreeBuilder.DEBUG = true;
    //        NodeTreeBuilder.DEBUG_STATES = true;
    HtmlParseResult result = parse(code);
    Node root = result.root();
    assertNotNull(root);
    //        NodeUtils.dumpTree(result.root());

    OpenTag head = ElementUtils.query(root, "html/head");
    assertNotNull(head);
    assertEquals(2, head.children().size());

    Iterator<Element> itr = head.children().iterator();

    OpenTag styleOpenTag = (OpenTag) itr.next();
    assertNotNull(styleOpenTag);
    assertEquals(16, styleOpenTag.from());
    assertEquals(39, styleOpenTag.to());

    Element styleEndTag = itr.next();
    assertNotNull(styleEndTag);
    assertEquals(87, styleEndTag.from());
    assertEquals(95, styleEndTag.to());

    assertSame(styleEndTag, styleOpenTag.matchingCloseTag());
  }
  public void testSelfCloseTagEndOffset() throws ParseException {
    //        ParseTreeBuilder.setLoggerLevel(Level.ALL);

    String code = "<div/>text";
    //             0123456
    HtmlParseResult result = parse(code);
    Node root = result.root();

    OpenTag div = ElementUtils.query(root, "html/body/div");
    assertNotNull(div);

    assertEquals(0, div.from());
    assertEquals(6, div.to());
  }
  // Bug 213332 - IllegalStateException: A bug #212445 just happended for source text "
  // scrollbar-arrow-color:"black"; } </STYLE> <TITLE>Cyprus :: Larnaca</TITLE></HEAD> <BOD". Please
  // report a new bug or r
  // http://netbeans.org/bugzilla/show_bug.cgi?id=213332
  public void testIssue213332() throws ParseException {
    ParseTreeBuilder.setLoggerLevel(Level.ALL);

    String code = "<html><head><style type=text/css></style></head></html>";
    //             012345678901234567890123456789012345678901234567890123456789
    //             0         1         2         3         4         5
    Node root = parse(code).root();

    //        ElementUtils.dumpTree(root);

    OpenTag styleOpen = ElementUtils.query(root, "html/head/style");
    assertNotNull(styleOpen);

    CloseTag styleClose = styleOpen.matchingCloseTag();
    assertNotNull(styleClose);

    assertEquals(33, styleClose.from());
    assertEquals(41, styleClose.to());

    assertEquals(12, styleOpen.from());
    assertEquals(33, styleOpen.to());
  }
  public void testSimpleDocument() throws ParseException {
    String code =
        "<!doctype html><html><head><title>x</title></head><body><div onclick=\"alert();\"/></body></html>";
    //             012345678901234567890123456789012345678901234567890123456789012345678 901234567
    // 8901234567890123456789
    //             0         1         2         3         4         5         6          7
    // 8         9

    //        NodeTreeBuilder.DEBUG_STATES = true;
    HtmlParseResult result = parse(code);
    Node root = result.root();
    assertNotNull(root);
    //        NodeUtils.dumpTree(result.root());

    OpenTag html = ElementUtils.query(root, "html");
    assertEquals("html", html.name());
    assertEquals(15, html.from());
    assertEquals(21, html.to());
    assertEquals(15, html.from());
    assertEquals(95, html.semanticEnd());

    OpenTag body = ElementUtils.query(root, "html/body");
    assertEquals("body", body.name());
    assertEquals(50, body.from());
    assertEquals(56, body.to());
    assertEquals(50, body.from());
    assertEquals(88, body.semanticEnd());

    CloseTag bodyEndTag = body.matchingCloseTag();
    assertNotNull(bodyEndTag);
    assertSame(body, bodyEndTag.matchingOpenTag());
    assertSame(bodyEndTag, body.matchingCloseTag());

    OpenTag title = ElementUtils.query(root, "html/head/title");
    assertEquals("title", title.name());
    assertEquals(27, title.from());
    assertEquals(34, title.to());
    assertEquals(27, title.from());
    assertEquals(43, title.semanticEnd());

    CloseTag titleEndTag = title.matchingCloseTag();
    assertNotNull(titleEndTag);
    assertSame(title, titleEndTag.matchingOpenTag());
    assertSame(titleEndTag, title.matchingCloseTag());
  }