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