/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.cpd; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilderFactory; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author Philippe T'Seyen * @author Romain Pelisse <belaran@gmail.com> * */ public class XMLRendererTest { private static final String ENCODING = (String) System.getProperties().get("file.encoding"); @Test public void testWithNoDuplication() { Renderer renderer = new XMLRenderer(); List<Match> list = new ArrayList<>(); String report = renderer.render(list.iterator()); try { Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse(new ByteArrayInputStream(report.getBytes(ENCODING))); NodeList nodes = doc.getChildNodes(); Node n = nodes.item(0); assertEquals("pmd-cpd", n.getNodeName()); assertEquals(0, doc.getElementsByTagName("duplication").getLength()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } @Test public void testWithOneDuplication() { Renderer renderer = new XMLRenderer(); List<Match> list = new ArrayList<>(); int lineCount = 6; String codeFragment = "code\nfragment"; Mark mark1 = createMark("public", "/var/Foo.java", 1, lineCount, codeFragment); Mark mark2 = createMark("stuff", "/var/Foo.java", 73, lineCount, codeFragment); Match match = new Match(75, mark1, mark2); list.add(match); String report = renderer.render(list.iterator()); try { Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse(new ByteArrayInputStream(report.getBytes(ENCODING))); NodeList dupes = doc.getElementsByTagName("duplication"); assertEquals(1, dupes.getLength()); Node file = dupes.item(0).getFirstChild(); while (file != null && file.getNodeType() != Node.ELEMENT_NODE) { file = file.getNextSibling(); } if (file != null) { assertEquals("1", file.getAttributes().getNamedItem("line").getNodeValue()); assertEquals("/var/Foo.java", file.getAttributes().getNamedItem("path").getNodeValue()); file = file.getNextSibling(); while (file != null && file.getNodeType() != Node.ELEMENT_NODE) { file = file.getNextSibling(); } } if (file != null) { assertEquals("73", file.getAttributes().getNamedItem("line").getNodeValue()); } assertEquals(1, doc.getElementsByTagName("codefragment").getLength()); assertEquals(codeFragment, doc.getElementsByTagName("codefragment").item(0).getTextContent()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } @Test public void testRenderWithMultipleMatch() { Renderer renderer = new XMLRenderer(); List<Match> list = new ArrayList<>(); int lineCount1 = 6; String codeFragment1 = "code fragment"; Mark mark1 = createMark("public", "/var/Foo.java", 48, lineCount1, codeFragment1); Mark mark2 = createMark("void", "/var/Foo.java", 73, lineCount1, codeFragment1); Match match1 = new Match(75, mark1, mark2); int lineCount2 = 7; String codeFragment2 = "code fragment 2"; Mark mark3 = createMark("void", "/var/Foo2.java", 49, lineCount2, codeFragment2); Mark mark4 = createMark("stuff", "/var/Foo2.java", 74, lineCount2, codeFragment2); Match match2 = new Match(76, mark3, mark4); list.add(match1); list.add(match2); String report = renderer.render(list.iterator()); try { Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder() .parse(new ByteArrayInputStream(report.getBytes(ENCODING))); assertEquals(2, doc.getElementsByTagName("duplication").getLength()); assertEquals(4, doc.getElementsByTagName("file").getLength()); } catch (Exception e) { e.printStackTrace(); fail(e.getMessage()); } } @Test public void testRendererEncodedPath() { Renderer renderer = new XMLRenderer(); List<Match> list = new ArrayList<>(); final String espaceChar = "<"; Mark mark1 = createMark("public", "/var/F" + '<' + "oo.java", 48, 6, "code fragment"); Mark mark2 = createMark("void", "/var/F<oo.java", 73, 6, "code fragment"); Match match1 = new Match(75, mark1, mark2); list.add(match1); String report = renderer.render(list.iterator()); assertTrue(report.contains(espaceChar)); } private Mark createMark(String image, String tokenSrcID, int beginLine, int lineCount, String code) { Mark result = new Mark(new TokenEntry(image, tokenSrcID, beginLine)); result.setLineCount(lineCount); result.setSourceCode(new SourceCode(new SourceCode.StringCodeLoader(code))); return result; } public static junit.framework.Test suite() { return new junit.framework.JUnit4TestAdapter(XMLRendererTest.class); } }