blob: 0a38838ff75b7cb75fb7e79f0a13da004df9da92 [file] [log] [blame]
/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.engine.html.parser;
import com.google.dart.engine.EngineTestCase;
import com.google.dart.engine.error.GatheringErrorListener;
import com.google.dart.engine.html.ast.HtmlUnit;
import com.google.dart.engine.html.ast.XmlTagNode;
import com.google.dart.engine.html.parser.XmlValidator.Attributes;
import com.google.dart.engine.html.parser.XmlValidator.Tag;
import com.google.dart.engine.html.scanner.AbstractScanner;
import com.google.dart.engine.html.scanner.StringScanner;
import com.google.dart.engine.html.scanner.Token;
import com.google.dart.engine.source.TestSource;
import com.google.dart.engine.utilities.source.LineInfo;
import static com.google.dart.engine.utilities.io.FileUtilities2.createFile;
public class HtmlParserTest extends EngineTestCase {
/**
* The name of the 'script' tag in an HTML file.
*/
private static final String TAG_SCRIPT = "script";
public void fail_parse_scriptWithComment() throws Exception {
String scriptBody = createSource(//
" /**",
" * <editable-label bind-value=\"dartAsignableValue\">",
" * </editable-label>",
" */",
" class Foo {}");
HtmlUnit htmlUnit = parse(createSource(//
" <html>",
" <body>",
" <script type=\"application/dart\">",
scriptBody,
" </script>",
" </body>",
" </html>"));
validate(
htmlUnit,
t("html", t("body", t("script", a("type", "\"application/dart\""), scriptBody))));
}
public void test_parse_attribute() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
validate(htmlUnit, t("html", t("body", a("foo", "\"sdfsdf\""), "")));
XmlTagNode htmlNode = htmlUnit.getTagNodes().get(0);
XmlTagNode bodyNode = htmlNode.getTagNodes().get(0);
assertEquals("sdfsdf", bodyNode.getAttributes().get(0).getText());
}
public void test_parse_attribute_EOF() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"");
validate(htmlUnit, t("html", t("body", a("foo", "\"sdfsdf\""), "")));
}
public void test_parse_attribute_EOF_missing_quote() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsd");
validate(htmlUnit, t("html", t("body", a("foo", "\"sdfsd"), "")));
XmlTagNode htmlNode = htmlUnit.getTagNodes().get(0);
XmlTagNode bodyNode = htmlNode.getTagNodes().get(0);
assertEquals("sdfsd", bodyNode.getAttributes().get(0).getText());
}
public void test_parse_attribute_extra_quote() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"\"></body></html>");
validate(htmlUnit, t("html", t("body", a("foo", "\"sdfsdf\""), "")));
}
public void test_parse_attribute_single_quote() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo='sdfsdf'></body></html>");
validate(htmlUnit, t("html", t("body", a("foo", "'sdfsdf'"), "")));
XmlTagNode htmlNode = htmlUnit.getTagNodes().get(0);
XmlTagNode bodyNode = htmlNode.getTagNodes().get(0);
assertEquals("sdfsdf", bodyNode.getAttributes().get(0).getText());
}
public void test_parse_comment_embedded() throws Exception {
HtmlUnit htmlUnit = parse("<html <!-- comment -->></html>");
validate(htmlUnit, t("html", ""));
}
public void test_parse_comment_first() throws Exception {
HtmlUnit htmlUnit = parse("<!-- comment --><html></html>");
validate(htmlUnit, t("html", ""));
}
public void test_parse_comment_in_content() throws Exception {
HtmlUnit htmlUnit = parse("<html><!-- comment --></html>");
validate(htmlUnit, t("html", "<!-- comment -->"));
}
public void test_parse_content() throws Exception {
HtmlUnit htmlUnit = parse("<html>\n<p a=\"b\">blat \n </p>\n</html>");
// XmlTagNode.getContent() does not include whitespace between '<' and '>' at this time
validate(htmlUnit, t("html", "\n<pa=\"b\">blat \n </p>\n", t("p", a("a", "\"b\""), "blat \n ")));
}
public void test_parse_content_none() throws Exception {
HtmlUnit htmlUnit = parse("<html><p/>blat<p/></html>");
validate(htmlUnit, t("html", "<p/>blat<p/>", t("p", ""), t("p", "")));
}
public void test_parse_declaration() throws Exception {
HtmlUnit htmlUnit = parse("<!DOCTYPE html>\n\n<html><p></p></html>");
validate(htmlUnit, t("html", t("p", "")));
}
public void test_parse_directive() throws Exception {
HtmlUnit htmlUnit = parse("<?xml ?>\n\n<html><p></p></html>");
validate(htmlUnit, t("html", t("p", "")));
}
public void test_parse_getAttribute() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
XmlTagNode htmlNode = htmlUnit.getTagNodes().get(0);
XmlTagNode bodyNode = htmlNode.getTagNodes().get(0);
assertEquals("sdfsdf", bodyNode.getAttribute("foo").getText());
assertEquals(null, bodyNode.getAttribute("bar"));
assertEquals(null, bodyNode.getAttribute(null));
}
public void test_parse_getAttributeText() throws Exception {
HtmlUnit htmlUnit = parse("<html><body foo=\"sdfsdf\"></body></html>");
XmlTagNode htmlNode = htmlUnit.getTagNodes().get(0);
XmlTagNode bodyNode = htmlNode.getTagNodes().get(0);
assertEquals("sdfsdf", bodyNode.getAttributeText("foo"));
assertEquals(null, bodyNode.getAttributeText("bar"));
assertEquals(null, bodyNode.getAttributeText(null));
}
public void test_parse_headers() throws Exception {
String code = createSource(//
"<html>",
" <body>",
" <h2>000</h2>",
" <div>",
" 111",
" </div>",
" </body>",
"</html>");
HtmlUnit htmlUnit = parse(code);
validate(htmlUnit, t("html", t("body", t("h2", "000"), t("div"))));
}
public void test_parse_script() throws Exception {
HtmlUnit htmlUnit = parse("<html><script >here is <p> some</script></html>");
validate(htmlUnit, t("html", t("script", "here is <p> some")));
}
public void test_parse_self_closing() throws Exception {
HtmlUnit htmlUnit = parse("<html>foo<br>bar</html>");
validate(htmlUnit, t("html", "foo<br>bar", t("br", "")));
}
public void test_parse_self_closing_declaration() throws Exception {
HtmlUnit htmlUnit = parse("<!DOCTYPE html><html>foo</html>");
validate(htmlUnit, t("html", "foo"));
}
protected HtmlUnit parse(String contents) throws Exception {
TestSource source = new TestSource(createFile("/test.dart"), contents);
AbstractScanner scanner = new StringScanner(source, contents);
scanner.setPassThroughElements(new String[] {TAG_SCRIPT});
Token token = scanner.tokenize();
LineInfo lineInfo = new LineInfo(scanner.getLineStarts());
GatheringErrorListener errorListener = new GatheringErrorListener();
HtmlUnit unit = new HtmlParser(source, errorListener).parse(token, lineInfo);
errorListener.assertNoErrors();
return unit;
}
Attributes a(String... keyValuePairs) {
return new Attributes(keyValuePairs);
}
Tag t(String tag, Attributes attributes, String content, Tag... children) {
return new Tag(tag, attributes, content, children);
}
Tag t(String tag, Attributes attributes, Tag... children) {
return new Tag(tag, attributes, null, children);
}
Tag t(String tag, String content, Tag... children) {
return new Tag(tag, new Attributes(), content, children);
}
Tag t(String tag, Tag... children) {
return new Tag(tag, new Attributes(), null, children);
}
private void validate(HtmlUnit htmlUnit, Tag... expectedTags) {
XmlValidator validator = new XmlValidator();
validator.expectTags(expectedTags);
htmlUnit.accept(validator);
validator.assertValid();
}
}