package org.nate.internal.dom4j.cssselectors;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import org.dom4j.Branch;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.junit.Assert;
import org.junit.Test;
/**
* Simple port of Christer Sandberg's CSS selectors to Dom4j (https://github.com/chrsan/css-selectors)
*/
public class DOMNodeSelectorTest {
private static final Map<String, Integer> testDataMap = new LinkedHashMap<String, Integer>();
static {
testDataMap.put("*", 251);
testDataMap.put(":empty", 2);
testDataMap.put("div:first-child", 51);
testDataMap.put("div:nth-child(even)", 106);
testDataMap.put("div:nth-child(2n)", 106);
testDataMap.put("div:nth-child(odd)", 137);
testDataMap.put("div:nth-child(2n+1)", 137);
testDataMap.put("div:nth-child(n)", 243);
testDataMap.put("script:first-of-type", 1);
testDataMap.put("div:last-child", 53);
testDataMap.put("script:last-of-type", 1);
testDataMap.put("script:nth-last-child(odd)", 1);
testDataMap.put("script:nth-last-child(even)", 1);
testDataMap.put("script:nth-last-child(5)", 0);
testDataMap.put("script:nth-of-type(2)", 1);
testDataMap.put("script:nth-last-of-type(n)", 2);
testDataMap.put("div:only-child", 22);
testDataMap.put("meta:only-of-type", 1);
testDataMap.put("div > div", 242);
testDataMap.put("div + div", 190);
testDataMap.put("div ~ div", 190);
testDataMap.put("body", 1);
testDataMap.put("body div", 243);
testDataMap.put("div", 243);
testDataMap.put("div div", 242);
testDataMap.put("div div div", 241);
testDataMap.put("div, div, div", 243);
testDataMap.put("div, a, span", 243);
testDataMap.put(".dialog", 51);
testDataMap.put("div.dialog", 51);
testDataMap.put("div .dialog", 51);
testDataMap.put("div.character, div.dialog", 99);
testDataMap.put("#speech5", 1);
testDataMap.put("div#speech5", 1);
testDataMap.put("div #speech5", 1);
testDataMap.put("div.scene div.dialog", 49);
testDataMap.put("div#scene1 div.dialog div", 142);
testDataMap.put("#scene1 #speech1", 1);
testDataMap.put("div[class]", 103);
testDataMap.put("div[class=dialog]", 50);
testDataMap.put("div[class^=dia]", 51);
testDataMap.put("div[class$=log]", 50);
testDataMap.put("div[class*=sce]", 1);
testDataMap.put("div[class|=dialog]", 50);
testDataMap.put("div[class~=dialog]", 51);
testDataMap.put("head > :not(meta)", 2);
testDataMap.put("head > :not(:last-child)", 2);
testDataMap.put("div:not(div.dialog)", 192);
}
private final Dom4jNodeSelector nodeSelector;
public DOMNodeSelectorTest() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read("src/test/resources/test.html");
nodeSelector = new Dom4jNodeSelector(document);
}
@Test
public void checkSelectors() throws Exception {
for (Map.Entry<String, Integer> entry : testDataMap.entrySet()) {
// System.out.printf("selector: %s, expected: %d%n", entry.getKey(), entry.getValue());
Set<Branch> result = nodeSelector.querySelectorAll(entry.getKey());
Assert.assertEquals(entry.getKey(), (int) entry.getValue(), (int) result.size());
}
}
}