package org.zwobble.mammoth.tests.html; import org.junit.Test; import org.zwobble.mammoth.internal.html.Html; import static org.hamcrest.MatcherAssert.assertThat; import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals; import static org.zwobble.mammoth.internal.util.Lists.list; import static org.zwobble.mammoth.internal.util.Maps.map; public class HtmlCollapseTests { @Test public void collapsingDoesNothingToSingleTextNode() { assertThat( Html.collapse(list(Html.text("Bluebells"))), deepEquals(list(Html.text("Bluebells")))); } @Test public void consecutiveFreshElementsAreNotCollapsed() { assertThat( Html.collapse(list(Html.element("p"), Html.element("p"))), deepEquals(list(Html.element("p"), Html.element("p")))); } @Test public void consecutiveCollapsibleElementsAreCollapsedIfTheyHaveTheSameTagAndAttributes() { assertThat( Html.collapse(list( Html.collapsibleElement("p", list(Html.text("One"))), Html.collapsibleElement("p", list(Html.text("Two"))))), deepEquals(list(Html.collapsibleElement("p", list(Html.text("One"), Html.text("Two")))))); } @Test public void elementsWithDifferentTagNamesAreNotCollapsed() { assertThat( Html.collapse(list( Html.collapsibleElement("p", list(Html.text("One"))), Html.collapsibleElement("div", list(Html.text("Two"))))), deepEquals(list( Html.collapsibleElement("p", list(Html.text("One"))), Html.collapsibleElement("div", list(Html.text("Two")))))); } @Test public void elementsWithDifferentAttributesAreNotCollapsed() { // TODO: should there be some spacing when block-level elements are collapsed? assertThat( Html.collapse(list( Html.collapsibleElement("p", map("id", "a"), list(Html.text("One"))), Html.collapsibleElement("p", list(Html.text("Two"))))), deepEquals(list( Html.collapsibleElement("p", map("id", "a"), list(Html.text("One"))), Html.collapsibleElement("p", list(Html.text("Two")))))); } @Test public void childrenOfCollapsedElementCanCollapseWithChildrenOfPreviousElement() { assertThat( Html.collapse(list( Html.collapsibleElement("blockquote", list( Html.collapsibleElement("p", list(Html.text("One"))))), Html.collapsibleElement("blockquote", list( Html.collapsibleElement("p", list(Html.text("Two"))))))), deepEquals(list( Html.collapsibleElement("blockquote", list( Html.collapsibleElement("p", list(Html.text("One"), Html.text("Two")))))))); } @Test public void collapsibleElementCanCollapseIntoPreviousFreshElement() { assertThat( Html.collapse(list(Html.element("p"), Html.collapsibleElement("p"))), deepEquals(list(Html.element("p")))); } @Test public void elementWithChoiceOfTagNamesCanCollapseIntoPreviousElementIfItHasOneOfThoseTagNamesAsItsMainTagName() { assertThat( Html.collapse(list( Html.collapsibleElement("ol"), Html.collapsibleElement(list("ul", "ol")))), deepEquals(list(Html.collapsibleElement("ol")))); assertThat( Html.collapse(list( Html.collapsibleElement(list("ul", "ol")), Html.collapsibleElement("ol"))), deepEquals(list( Html.collapsibleElement(list("ul", "ol")), Html.collapsibleElement("ol")))); } }