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