package org.jsoup.select;
import org.jsoup.Jsoup;
import org.jsoup.TextUtil;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.FormElement;
import org.jsoup.nodes.Node;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.*;
/**
Tests for ElementList.
@author Jonathan Hedley, jonathan@hedley.net */
public class ElementsTest {
@Test public void filter() {
String h = "<p>Excl</p><div class=headline><p>Hello</p><p>There</p></div><div class=headline><h1>Headline</h1></div>";
Document doc = Jsoup.parse(h);
Elements els = doc.select(".headline").select("p");
assertEquals(2, els.size());
assertEquals("Hello", els.get(0).text());
assertEquals("There", els.get(1).text());
}
@Test public void attributes() {
String h = "<p title=foo><p title=bar><p class=foo><p class=bar>";
Document doc = Jsoup.parse(h);
Elements withTitle = doc.select("p[title]");
assertEquals(2, withTitle.size());
assertTrue(withTitle.hasAttr("title"));
assertFalse(withTitle.hasAttr("class"));
assertEquals("foo", withTitle.attr("title"));
withTitle.removeAttr("title");
assertEquals(2, withTitle.size()); // existing Elements are not reevaluated
assertEquals(0, doc.select("p[title]").size());
Elements ps = doc.select("p").attr("style", "classy");
assertEquals(4, ps.size());
assertEquals("classy", ps.last().attr("style"));
assertEquals("bar", ps.last().attr("class"));
}
@Test public void hasAttr() {
Document doc = Jsoup.parse("<p title=foo><p title=bar><p class=foo><p class=bar>");
Elements ps = doc.select("p");
assertTrue(ps.hasAttr("class"));
assertFalse(ps.hasAttr("style"));
}
@Test public void hasAbsAttr() {
Document doc = Jsoup.parse("<a id=1 href='/foo'>One</a> <a id=2 href='http://jsoup.org'>Two</a>");
Elements one = doc.select("#1");
Elements two = doc.select("#2");
Elements both = doc.select("a");
assertFalse(one.hasAttr("abs:href"));
assertTrue(two.hasAttr("abs:href"));
assertTrue(both.hasAttr("abs:href")); // hits on #2
}
@Test public void attr() {
Document doc = Jsoup.parse("<p title=foo><p title=bar><p class=foo><p class=bar>");
String classVal = doc.select("p").attr("class");
assertEquals("foo", classVal);
}
@Test public void absAttr() {
Document doc = Jsoup.parse("<a id=1 href='/foo'>One</a> <a id=2 href='http://jsoup.org'>Two</a>");
Elements one = doc.select("#1");
Elements two = doc.select("#2");
Elements both = doc.select("a");
assertEquals("", one.attr("abs:href"));
assertEquals("http://jsoup.org", two.attr("abs:href"));
assertEquals("http://jsoup.org", both.attr("abs:href"));
}
@Test public void classes() {
Document doc = Jsoup.parse("<div><p class='mellow yellow'></p><p class='red green'></p>");
Elements els = doc.select("p");
assertTrue(els.hasClass("red"));
assertFalse(els.hasClass("blue"));
els.addClass("blue");
els.removeClass("yellow");
els.toggleClass("mellow");
assertEquals("blue", els.get(0).className());
assertEquals("red green blue mellow", els.get(1).className());
}
@Test public void text() {
String h = "<div><p>Hello<p>there<p>world</div>";
Document doc = Jsoup.parse(h);
assertEquals("Hello there world", doc.select("div > *").text());
}
@Test public void hasText() {
Document doc = Jsoup.parse("<div><p>Hello</p></div><div><p></p></div>");
Elements divs = doc.select("div");
assertTrue(divs.hasText());
assertFalse(doc.select("div + div").hasText());
}
@Test public void html() {
Document doc = Jsoup.parse("<div><p>Hello</p></div><div><p>There</p></div>");
Elements divs = doc.select("div");
assertEquals("<p>Hello</p>\n<p>There</p>", divs.html());
}
@Test public void outerHtml() {
Document doc = Jsoup.parse("<div><p>Hello</p></div><div><p>There</p></div>");
Elements divs = doc.select("div");
assertEquals("<div><p>Hello</p></div><div><p>There</p></div>", TextUtil.stripNewlines(divs.outerHtml()));
}
@Test public void setHtml() {
Document doc = Jsoup.parse("<p>One</p><p>Two</p><p>Three</p>");
Elements ps = doc.select("p");
ps.prepend("<b>Bold</b>").append("<i>Ital</i>");
assertEquals("<p><b>Bold</b>Two<i>Ital</i></p>", TextUtil.stripNewlines(ps.get(1).outerHtml()));
ps.html("<span>Gone</span>");
assertEquals("<p><span>Gone</span></p>", TextUtil.stripNewlines(ps.get(1).outerHtml()));
}
@Test public void val() {
Document doc = Jsoup.parse("<input value='one' /><textarea>two</textarea>");
Elements els = doc.select("input, textarea");
assertEquals(2, els.size());
assertEquals("one", els.val());
assertEquals("two", els.last().val());
els.val("three");
assertEquals("three", els.first().val());
assertEquals("three", els.last().val());
assertEquals("<textarea>three</textarea>", els.last().outerHtml());
}
@Test public void before() {
Document doc = Jsoup.parse("<p>This <a>is</a> <a>jsoup</a>.</p>");
doc.select("a").before("<span>foo</span>");
assertEquals("<p>This <span>foo</span><a>is</a> <span>foo</span><a>jsoup</a>.</p>", TextUtil.stripNewlines(doc.body().html()));
}
@Test public void after() {
Document doc = Jsoup.parse("<p>This <a>is</a> <a>jsoup</a>.</p>");
doc.select("a").after("<span>foo</span>");
assertEquals("<p>This <a>is</a><span>foo</span> <a>jsoup</a><span>foo</span>.</p>", TextUtil.stripNewlines(doc.body().html()));
}
@Test public void wrap() {
String h = "<p><b>This</b> is <b>jsoup</b></p>";
Document doc = Jsoup.parse(h);
doc.select("b").wrap("<i></i>");
assertEquals("<p><i><b>This</b></i> is <i><b>jsoup</b></i></p>", doc.body().html());
}
@Test public void wrapDiv() {
String h = "<p><b>This</b> is <b>jsoup</b>.</p> <p>How do you like it?</p>";
Document doc = Jsoup.parse(h);
doc.select("p").wrap("<div></div>");
assertEquals("<div><p><b>This</b> is <b>jsoup</b>.</p></div> <div><p>How do you like it?</p></div>",
TextUtil.stripNewlines(doc.body().html()));
}
@Test public void unwrap() {
String h = "<div><font>One</font> <font><a href=\"/\">Two</a></font></div";
Document doc = Jsoup.parse(h);
doc.select("font").unwrap();
assertEquals("<div>One <a href=\"/\">Two</a></div>", TextUtil.stripNewlines(doc.body().html()));
}
@Test public void unwrapP() {
String h = "<p><a>One</a> Two</p> Three <i>Four</i> <p>Fix <i>Six</i></p>";
Document doc = Jsoup.parse(h);
doc.select("p").unwrap();
assertEquals("<a>One</a> Two Three <i>Four</i> Fix <i>Six</i>", TextUtil.stripNewlines(doc.body().html()));
}
@Test public void empty() {
Document doc = Jsoup.parse("<div><p>Hello <b>there</b></p> <p>now!</p></div>");
doc.outputSettings().prettyPrint(false);
doc.select("p").empty();
assertEquals("<div><p></p> <p></p></div>", doc.body().html());
}
@Test public void remove() {
Document doc = Jsoup.parse("<div><p>Hello <b>there</b></p> jsoup <p>now!</p></div>");
doc.outputSettings().prettyPrint(false);
doc.select("p").remove();
assertEquals("<div> jsoup </div>", doc.body().html());
}
@Test public void eq() {
String h = "<p>Hello<p>there<p>world";
Document doc = Jsoup.parse(h);
assertEquals("there", doc.select("p").eq(1).text());
assertEquals("there", doc.select("p").get(1).text());
}
@Test public void is() {
String h = "<p>Hello<p title=foo>there<p>world";
Document doc = Jsoup.parse(h);
Elements ps = doc.select("p");
assertTrue(ps.is("[title=foo]"));
assertFalse(ps.is("[title=bar]"));
}
@Test public void parents() {
Document doc = Jsoup.parse("<div><p>Hello</p></div><p>There</p>");
Elements parents = doc.select("p").parents();
assertEquals(3, parents.size());
assertEquals("div", parents.get(0).tagName());
assertEquals("body", parents.get(1).tagName());
assertEquals("html", parents.get(2).tagName());
}
@Test public void not() {
Document doc = Jsoup.parse("<div id=1><p>One</p></div> <div id=2><p><span>Two</span></p></div>");
Elements div1 = doc.select("div").not(":has(p > span)");
assertEquals(1, div1.size());
assertEquals("1", div1.first().id());
Elements div2 = doc.select("div").not("#1");
assertEquals(1, div2.size());
assertEquals("2", div2.first().id());
}
@Test public void tagNameSet() {
Document doc = Jsoup.parse("<p>Hello <i>there</i> <i>now</i></p>");
doc.select("i").tagName("em");
assertEquals("<p>Hello <em>there</em> <em>now</em></p>", doc.body().html());
}
@Test public void traverse() {
Document doc = Jsoup.parse("<div><p>Hello</p></div><div>There</div>");
final StringBuilder accum = new StringBuilder();
doc.select("div").traverse(new NodeVisitor() {
public void head(Node node, int depth) {
accum.append("<" + node.nodeName() + ">");
}
public void tail(Node node, int depth) {
accum.append("</" + node.nodeName() + ">");
}
});
assertEquals("<div><p><#text></#text></p></div><div><#text></#text></div>", accum.toString());
}
@Test public void forms() {
Document doc = Jsoup.parse("<form id=1><input name=q></form><div /><form id=2><input name=f></form>");
Elements els = doc.select("*");
assertEquals(9, els.size());
List<FormElement> forms = els.forms();
assertEquals(2, forms.size());
assertTrue(forms.get(0) != null);
assertTrue(forms.get(1) != null);
assertEquals("1", forms.get(0).id());
assertEquals("2", forms.get(1).id());
}
}