1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package test.net.sourceforge.pmd.cpd;
5
6 import junit.framework.TestCase;
7 import net.sourceforge.pmd.PMD;
8 import net.sourceforge.pmd.cpd.Match;
9 import net.sourceforge.pmd.cpd.Renderer;
10 import net.sourceforge.pmd.cpd.TokenEntry;
11 import net.sourceforge.pmd.cpd.XMLRenderer;
12 import org.w3c.dom.Document;
13 import org.w3c.dom.Node;
14 import org.w3c.dom.NodeList;
15
16 import javax.xml.parsers.DocumentBuilderFactory;
17 import java.io.ByteArrayInputStream;
18 import java.util.ArrayList;
19 import java.util.List;
20
21 /***
22 * @author Philippe T'Seyen
23 */
24 public class XMLRendererTest extends TestCase {
25 public void test_no_dupes() {
26 Renderer renderer = new XMLRenderer();
27 List list = new ArrayList();
28 String report = renderer.render(list.iterator());
29 try {
30 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(report.getBytes()));
31 NodeList nodes = doc.getChildNodes();
32 Node n = nodes.item(0);
33 assertEquals("pmd-cpd", n.getNodeName());
34 assertEquals(0, doc.getElementsByTagName("duplication").getLength());
35 } catch (Exception e) {
36 e.printStackTrace();
37 fail(e.getMessage());
38 }
39 }
40
41 public void test_one_dupe() {
42 Renderer renderer = new XMLRenderer();
43 List list = new ArrayList();
44 Match match = new Match(75, new TokenEntry("public", "/var/Foo.java", 48), new TokenEntry("stuff", "/var/Foo.java", 73));
45 match.setLineCount(6);
46 match.setSourceCodeSlice("code fragment");
47 list.add(match);
48 String report = renderer.render(list.iterator());
49 try {
50 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(report.getBytes()));
51 NodeList dupes = doc.getElementsByTagName("duplication");
52 assertEquals(1, dupes.getLength());
53 Node file = dupes.item(0).getFirstChild();
54 while (file != null && file.getNodeType() != Node.ELEMENT_NODE) {
55 file = file.getNextSibling();
56 }
57 assertEquals("48", file.getAttributes().getNamedItem("line").getNodeValue());
58 assertEquals("/var/Foo.java", file.getAttributes().getNamedItem("path").getNodeValue());
59
60 file = file.getNextSibling();
61 while (file != null && file.getNodeType() != Node.ELEMENT_NODE) {
62 file = file.getNextSibling();
63 }
64 assertEquals("73", file.getAttributes().getNamedItem("line").getNodeValue());
65
66 assertEquals(1, doc.getElementsByTagName("codefragment").getLength());
67 Node actualCode = doc.getElementsByTagName("codefragment").item(0).getFirstChild().getNextSibling();
68 assertEquals(PMD.EOL + "code fragment" + PMD.EOL, actualCode.getNodeValue());
69 } catch (Exception e) {
70 e.printStackTrace();
71 fail(e.getMessage());
72 }
73 }
74
75 public void testRender_MultipleMatch() {
76 Renderer renderer = new XMLRenderer();
77 List list = new ArrayList();
78 Match match1 = new Match(75, new TokenEntry("public", "/var/Foo.java", 48), new TokenEntry("void", "/var/Foo.java", 73));
79 match1.setLineCount(6);
80 match1.setSourceCodeSlice("code fragment");
81 Match match2 = new Match(76, new TokenEntry("void", "/var/Foo2.java", 49), new TokenEntry("stuff", "/var/Foo2.java", 74));
82 match2.setLineCount(7);
83 match2.setSourceCodeSlice("code fragment 2");
84 list.add(match1);
85 list.add(match2);
86 String report = renderer.render(list.iterator());
87 try {
88 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(report.getBytes()));
89 assertEquals(2, doc.getElementsByTagName("duplication").getLength());
90 assertEquals(4, doc.getElementsByTagName("file").getLength());
91 } catch (Exception e) {
92 e.printStackTrace();
93 fail(e.getMessage());
94 }
95 }
96 }
97