// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.jerry; import jodd.io.FileUtil; import jodd.util.StringUtil; import org.junit.Before; import org.junit.Test; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; import static jodd.jerry.Jerry.jerry; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class JerryTest { protected String testDataRoot; @Before public void setUp() throws Exception { if (testDataRoot != null) { return; } URL data = JerryTest.class.getResource("test"); testDataRoot = data.getFile(); } @Test public void testText1() { String html = readFile("text1.html"); String text = jerry(html).$("div.demo-container").text(); text = StringUtil.remove(text, "\r\n").trim(); text = StringUtil.compressChars(text, ' '); assertEquals("Demonstration Box list item 1 list item 2", text); } @Test public void testHtml1() { String html = readFile("html1.html"); String text = jerry(html).$("div.demo-container").html(); assertEquals("<div class=\"demo-box\">Demonstration Box</div>", text.trim()); } @Test public void testHtml2() { String html = readFile("html2.html"); String htmlOK = readFile("html2-ok.html"); Jerry doc = jerry(html); Jerry p = doc.$("p:first"); String htmlContent = p.html(); p.text(htmlContent); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testHtml3() { String html = readFile("html3.html"); String htmlOK = readFile("html3-ok.html"); Jerry doc = jerry(html); doc.$("div.demo-container").html("<p>All new content. <em>You bet!</em></p>"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testHtml4() { String html = readFile("html4.html"); String htmlOK = readFile("html4-ok.html"); Jerry doc = jerry(html); doc.$("div").html("<span class='red'>Hello <b>Again</b></span>"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testHtml5() { String html = readFile("html5.html"); String htmlOK = readFile("html5-ok.html"); Jerry doc = jerry(html); doc.$("div").html("<b>Wow!</b> Such excitement..."); doc.$("div b").append("!!!").css("color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testAdd() { String html = readFile("add.html"); String htmlOK = readFile("add-ok.html"); Jerry $ = jerry(html).$("div").css("border", "2px solid red") .add("p") .css("background", "yellow"); assertEquals(htmlOK, actualHtml($)); } @Test public void testEnd() { String html = readFile("end.html"); String htmlOK = readFile("end-ok.html"); Jerry $ = jerry(html).$("p").find("span").end().css("border", "2px red solid"); assertEquals(htmlOK, actualHtml($)); } @Test public void testNot() { String html = readFile("not.html"); String htmlOK = readFile("not-ok.html"); Jerry $ = jerry(html).$("div").not(".green, #blueone").css("border-color", "red"); assertEquals(htmlOK, actualHtml($)); } @Test public void testFirst() { String html = readFile("first.html"); String htmlOK = readFile("first-ok.html"); Jerry $ = jerry(html).$("p span").first().addClass("highlight"); assertEquals(htmlOK, actualHtml($)); } @Test public void testLast() { String html = readFile("last.html"); String htmlOK = readFile("last-ok.html"); Jerry $ = jerry(html).$("p span").last().addClass("highlight"); assertEquals(htmlOK, actualHtml($)); } @Test public void testAddClass() { String html = readFile("addClass.html"); String htmlOK = readFile("addClass-ok.html"); Jerry $ = jerry(html).$("p:last").addClass("selected"); assertEquals(htmlOK, actualHtml($)); } @Test public void testPseudoLast() { String html = readFile("pseudoLast.html"); String htmlOK = readFile("pseudoLast-ok.html"); Jerry $ = jerry(html).$("tr:last").css("background-color", "yellow", "font-weight", "bolder"); assertEquals(htmlOK, actualHtml($)); } @Test public void testPseudoFirst() { String html = readFile("pseudoFirst.html"); String htmlOK = readFile("pseudoFirst-ok.html"); Jerry $ = jerry(html).$("tr:first").css("font-style", "italic"); assertEquals(htmlOK, actualHtml($)); } @Test public void testPseudoButton() { String html = readFile("pseudoButton.html"); String htmlOK = readFile("pseudoButton-ok.html"); Jerry doc = jerry(html); Jerry input = doc.$(":button").css("background", "yellow", "border", "3px red solid"); doc.$("div").text("For this type jQuery found " + input.length() + ".").css("color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoCheckbox() { String html = readFile("pseudoCheckbox.html"); String htmlOK = readFile("pseudoCheckbox-ok.html"); Jerry doc = jerry(html); Jerry input = doc.$("form input:checkbox").wrap("<span></span>").parent().css("background", "yellow", "border", "3px red solid"); doc.$("div").text("For this type jQuery found " + input.length() + ".").css("color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoFile() { String html = readFile("pseudoFile.html"); String htmlOK = readFile("pseudoFile-ok.html"); Jerry doc = jerry(html); Jerry input = doc.$("form input:file").css("background", "yellow", "border", "3px red solid"); doc.$("div").text("For this type jQuery found " + input.length() + ".").css("color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoInput() { String html = readFile("pseudoInput.html"); String htmlOK = readFile("pseudoInput-ok.html"); Jerry doc = jerry(html); Jerry allInputs = doc.$(":input"); Jerry formChildren = doc.$("form > *"); doc.$("#messages").text("Found " + allInputs.length() + " inputs and the form has " + formChildren.length() + " children."); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoHeader() { String html = readFile("pseudoHeader.html"); String htmlOK = readFile("pseudoHeader-ok.html"); Jerry doc = jerry(html); doc.$(":header").css("background", "#ccc", "color", "blue"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoParent() { String html = readFile("pseudoParent.html"); String htmlOK = readFile("pseudoParent-ok.html"); Jerry doc = jerry(html); doc.$("td:parent").css("background", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoSelected() { String html = readFile("pseudoSelected.html"); String htmlOK = readFile("pseudoSelected-ok.html"); Jerry doc = jerry(html); final StringBuilder str = new StringBuilder(); doc.$("select option:selected").each(($this, index) -> { str.append($this.text()).append(' '); return true; }); doc.$("div").text(str.toString()); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoEq() { String html = readFile("pseudoEq.html"); String htmlOK = readFile("pseudoEq-ok.html"); Jerry doc = jerry(html); doc.$("td:eq(2)").css("color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoEq2() { String html = readFile("pseudoEq2.html"); String htmlOK = readFile("pseudoEq2-ok.html"); Jerry doc = jerry(html); doc.$("ul.nav li:eq(1)").css("backgroundColor", "#ff0"); doc.$("ul.nav").each(($this, index) -> { $this.find("li:eq(1)").css("fontStyle", "italic"); return true; }); doc.$("ul.nav li:nth-child(2)").css("color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoHas() { String html = readFile("pseudoHas.html"); String htmlOK = readFile("pseudoHas-ok.html"); Jerry doc = jerry(html); doc.$("div:has(p)").addClass("test"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoNot() { String html = readFile("pseudoNot.html"); String htmlOK = readFile("pseudoNot-ok.html"); Jerry doc = jerry(html); doc.$("input:not(\':checked\') + span").css("background-color", "yellow"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoEven() { String html = readFile("pseudoEven.html"); String htmlOK = readFile("pseudoEven-ok.html"); Jerry doc = jerry(html); doc.$("tr:even").css("background-color", "#bbbbff"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoGt() { String html = readFile("pseudoGt.html"); String htmlOK = readFile("pseudoGt-ok.html"); Jerry doc = jerry(html); doc.$("td:gt(4)").css("text-decoration", "line-through"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoContains() { String html = readFile("pseudoContains.html"); String htmlOK = readFile("pseudoContains-ok.html"); Jerry doc = jerry(html); doc.$("div:contains('John')").css("text-decoration", "underline"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPseudoContains2() { String html = readFile("pseudoContains.html"); String htmlOK = readFile("pseudoContains-ok.html"); Jerry doc = jerry(html); doc.$("div:contains(John)").css("text-decoration", "underline"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testNext() { String html = readFile("next.html"); String htmlOK = readFile("next-ok.html"); Jerry doc = jerry(html); doc.$("button[disabled]").next().text("this button is disabled"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testPrevNextAll() { String html = readFile("prevNextAll.html"); String htmlOK = readFile("prevNextAll-ok.html"); Jerry doc = jerry(html); doc.$(".prev :last-child").prevAll().remove(); doc.$(".next :first-child").nextAll().remove(); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testEq() { String html = readFile("eq.html"); String htmlOK = readFile("eq-ok.html"); Jerry doc = jerry(html); doc.$("li").eq(1).css("background-color", "red"); doc.$("li").eq(-1).css("background-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testHas() { String html = readFile("has.html"); String htmlOK = readFile("has-ok.html"); Jerry doc = jerry(html); doc.$("li").has("ul").css("background-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testHas2() { String html = readFile("has2.html"); String htmlOK = readFile("has2-ok.html"); Jerry doc = jerry(html); doc.$("li").has("ul").css("background-color", "red"); doc.$( "ul" ).append( "<li>" + ( doc.$( "ul" ).has( "li" ).length() > 0 ? "Yes" : "No" ) + "</li>" ); doc.$( "ul" ).has( "li" ).addClass( "full" ); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testChildrenVsContents() { String html = readFile("contents.html"); String htmlOK = readFile("contents-ok.html"); Jerry doc = jerry(html); doc.$("span.contents").contents().remove(); doc.$("span.children").children().remove(); int count = doc.$(".count").contents().length(); doc.$(".count").text(Integer.toString(count)); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testSibling() { String html = readFile("sibling.html"); String htmlOK = readFile("sibling-ok.html"); Jerry doc = jerry(html); doc.$("li.third-item").siblings().css("background-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testSibling2() { String html = readFile("sibling2.html"); String htmlOK = readFile("sibling2-ok.html"); Jerry doc = jerry(html); int len = doc.$(".hilite").siblings().css("color", "red").length(); doc.$("b").text(String.valueOf(len)); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testRemove() { String html = readFile("remove.html"); String htmlOK = readFile("remove-ok.html"); Jerry doc = jerry(html); doc.$("p").remove(); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testEmpty() { String html = readFile("empty.html"); String htmlOK = readFile("empty-ok.html"); Jerry doc = jerry(html); doc.$("p").empty(); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testAppendPrepend() { String html = readFile("appendPrepend.html"); String htmlOK = readFile("appendPrepend-ok.html"); Jerry doc = jerry(html); doc.$(".append p").append("<span>C</span>"); doc.$(".prepend p").prepend("<span>C</span>"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testBefore() { String html = readFile("before.html"); String htmlOK = readFile("before-ok.html"); Jerry doc = jerry(html); doc.$("p").before("<b>Hello</b>"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testAfter() { String html = readFile("after.html"); String htmlOK = readFile("after-ok.html"); Jerry doc = jerry(html); doc.$("p").after("<b>what is the question?</b>"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testReplaceWith() { String html = readFile("replaceWith.html"); String htmlOK = readFile("replaceWith-ok.html"); Jerry doc = jerry(html); doc.$("div.second").replaceWith("<h2>New heading</h2>"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testUnwrap() { String html = readFile("unwrap.html"); String htmlOK = readFile("unwrap-ok.html"); Jerry doc = jerry(html); doc.$("p").unwrap(); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testIs() { String html = readFile("is.html"); String htmlOK = readFile("is-ok.html"); Jerry doc = jerry(html); doc.$("div").each(($this, index) -> { if ($this.is(":first-child")) { $this.text("Its the first div."); } else if ($this.is(".blue,.red")) { $this.text("Its a blue or red div."); } else if ($this.is(":contains(Peter)")) { $this.text("Its Peter!"); } else { $this.html("Its nothing <em>special</em>."); } return true; }); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testIs2() { String html = readFile("is2.html"); String htmlOK = readFile("is2-ok.html"); Jerry doc = jerry(html); boolean isFormParent = doc.$("input[type='checkbox']").parent().is("form"); doc.$("div").text("isFormParent = " + isFormParent); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testIs3() { String html = readFile("is3.html"); String htmlOK = readFile("is3-ok.html"); Jerry doc = jerry(html); boolean isFormParent = doc.$("input[type='checkbox']").parent().is("form"); doc.$("div").text("isFormParent = " + isFormParent); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testFilter() { String html = readFile("filter.html"); String htmlOK = readFile("filter-ok.html"); Jerry doc = jerry(html); doc.$("li").filter(":even").css("background-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testFilter2() { String html = readFile("filter2.html"); String htmlOK = readFile("filter2-ok.html"); Jerry doc = jerry(html); doc.$("li").filter(($this, index) -> Jerry.$("strong", $this).length() == 1).css("background-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testFilter2_2() { String html = readFile("filter2.html"); String htmlOK = readFile("filter2-ok2.html"); Jerry doc = jerry(html); doc.$("li").filter(($this, index) -> index % 3 == 2).css("background-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testFilter3() { String html = readFile("filter3.html"); String htmlOK = readFile("filter3-ok.html"); Jerry doc = jerry(html); doc.$("div").css("background", "#c8ebcc") .filter(".middle") .css("border-color", "red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testFilter4() { String html = readFile("filter4.html"); String htmlOK = readFile("filter4-ok.html"); Jerry doc = jerry(html); doc.$("div").css("background", "#b4b0da") .filter(($this, index) -> index == 1 || $this.attr("id").equals("fourth")) .css("border", "3px double red"); assertEquals(htmlOK, actualHtml(doc)); } @Test public void testForm() { String html = readFile("form.html"); Jerry doc = jerry(html); final Map<String, String[]> params = new HashMap<>(); doc.form("#myform", (form, parameters) -> params.putAll(parameters)); assertEquals(6, params.size()); assertEquals("text!", params.get("n_text")[0]); assertEquals("password!", params.get("n_password")[0]); assertEquals("on", params.get("n_checkbox1")[0]); assertEquals("check1!", params.get("n_checkbox2")[0]); assertEquals("check2!", params.get("n_checkbox2")[1]); assertEquals("sel2!", params.get("n_select")[0]); assertEquals("sel3!", params.get("n_select")[1]); assertEquals("textarea!", params.get("n_textarea")[0]); } @Test public void testHtmlAll() { Jerry j = Jerry.jerry("<div><span>1</span></div><div><span>2</span></div>"); assertEquals(j.htmlAll(true), j.htmlAll(false)); j = j.$("div"); assertEquals("<span>1</span>", j.html()); assertEquals("<span>1</span><span>2</span>", j.htmlAll(false)); assertEquals("<div><span>1</span></div><div><span>2</span></div>", j.htmlAll(true)); Jerry j2 = j.find("span"); assertEquals(2, j2.length()); assertEquals("12", j2.text()); assertEquals("1", j2.html()); assertEquals("12", j2.htmlAll(false)); assertEquals("<span>1</span><span>2</span>", j2.htmlAll(true)); } @Test public void testCamelCaseClassesIssue() { Jerry j = Jerry.jerry("<div id='d'></div>"); j.$("#d").css("background-color", "red"); assertEquals("<div id=\"d\" style=\"background-color:red;\"></div>", j.html()); j.$("#d").css("background-color", ""); assertEquals("<div id=\"d\" style=\"\"></div>", j.html()); j.$("#d").addClass("fooBar"); assertEquals("<div id=\"d\" style=\"\" class=\"fooBar\"></div>", j.html()); assertTrue(j.$("#d").hasClass("fooBar")); assertFalse(j.$("#d").hasClass("foo-bar")); j.$("#d").addClass("foo-bar"); assertEquals("<div id=\"d\" style=\"\" class=\"fooBar foo-bar\"></div>", j.html()); j.$("#d").toggleClass("foo-bar", "fooBar"); assertEquals("<div id=\"d\" style=\"\" class=\"\"></div>", j.html()); } // ---------------------------------------------------------------- tools private String actualHtml(Jerry $) { return $.root().get(0).getHtml(); } private String readFile(String fileName) { try { return FileUtil.readString(new File(testDataRoot, fileName)); } catch (IOException ignore) { return null; } } }