package model.html;
import org.javatuples.Pair;
import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;
public class HtmlParserTest {
String idiomaticHtml = "
Hello, world!
";
String brokenHtml = "<>";
@Test
void testIdiomaticHtml() {
ArrayList expected = new ArrayList<>();
ArrayList expectedChildren = new ArrayList<>();
ArrayList expectedGrandChildren = new ArrayList<>();
ArrayList expectedGreatGrandChildren = new ArrayList<>();
expected.add(new ElementNode("html", new ArrayList<>(), expectedChildren));
expectedChildren.add(new ElementNode("head"));
expectedChildren.add(new ElementNode("body", new ArrayList<>(), expectedGrandChildren));
expectedGrandChildren.add(new ElementNode("p", new ArrayList<>(), expectedGreatGrandChildren));
expectedGreatGrandChildren.add(new TextNode("Hello, world!"));
HtmlParser parser = new HtmlParser();
assertEqualsHtml(parser.parseHtml(idiomaticHtml), expected);
// displayHtmlTree(parser.parseHtml(idiomaticHtml));
}
@Test
void testBrokenHtml() {
ArrayList expected = new ArrayList<>();
ArrayList expectedChildren = new ArrayList<>();
ArrayList expectedGrandChildren = new ArrayList<>();
expected.add(new ElementNode("html", new ArrayList<>(), expectedChildren));
expectedChildren.add(new ElementNode("foo", new ArrayList<>(), expectedGrandChildren));
expectedGrandChildren.add(new ElementNode("bar", new ArrayList<>()));
expectedGrandChildren.add(new TextNode("<>"));
HtmlParser parser = new HtmlParser();
assertEqualsHtml(parser.parseHtml(brokenHtml), expected);
// displayHtmlTree(parser.parseHtml(brokenHtml));
}
@Test
void testTrailingTextHtml() {
ArrayList expected = new ArrayList<>();
ArrayList expectedChildren = new ArrayList<>();
ArrayList expectedGrandChildren = new ArrayList<>();
expected.add(new TextNode("bot"));
expected.add(new ElementNode("html", new ArrayList<>(), expectedChildren));
expected.add(new TextNode("ba"));
expectedChildren.add(new ElementNode("foo", new ArrayList<>(), expectedGrandChildren));
expectedGrandChildren.add(new ElementNode("bar", new ArrayList<>()));
HtmlParser parser = new HtmlParser();
assertEqualsHtml(parser.parseHtml(trailingTextHtml), expected);
// displayHtmlTree(parser.parseHtml(trailingTextHtml));
}
@Test
void testAttributesHtml() {
ArrayList expected = new ArrayList<>();
ArrayList expectedChildren = new ArrayList<>();
ArrayList> expectedAttributes = new ArrayList<>();
expected.add(new ElementNode("html", new ArrayList<>(), expectedChildren));
expectedChildren.add(new ElementNode("attr", expectedAttributes));
expectedAttributes.add(new Pair<>("hello", "world"));
expectedAttributes.add(new Pair<>("foo", "bar"));
expectedAttributes.add(new Pair<>("strange", "cha\"rm"));
expectedAttributes.add(new Pair<>("up", "do'wn"));
HtmlParser parser = new HtmlParser();
ArrayList parsed = parser.parseHtml(attributesHtml);
displayHtmlTree(parsed);
assertEqualsHtml(parsed, expected);
}
/**
* Complicated helper function for tests.
*/
private static void assertEqualsHtml(ArrayList html, ArrayList expected) {
for (int i = 0; i < html.size(); i++) {
assertEquals(html.get(i).getData(), expected.get(i).getData());
// System.out.println(html.get(i).getData() + " " + expected.get(i).getData());
if (html.get(i) instanceof ElementNode) {
assertEqualsHtml(((ElementNode) html.get(i)).getChildren(), ((ElementNode) expected.get(i)).getChildren());
}
}
}
/**
* Simple helper function for debugging.
* EFFECTS: prints a representation of the tree to the console for debugging purposes
*/
private void displayHtmlTree(ArrayList tree) {
for (Node node : tree) {
if (node instanceof ElementNode) {
System.out.print(((ElementNode) node).getTag() + ": ");
for (Node n : ((ElementNode) node).getChildren()) {
System.out.print(n.getData() + " ");
}
System.out.println();
displayHtmlTree(((ElementNode) node).getChildren());
} else {
System.out.println("Text: " + node.getData());
}
}
}
}