1
2
3
4 package net.sourceforge.pmd.cpd;
5
6 import static org.junit.Assert.assertEquals;
7 import static org.junit.Assert.assertTrue;
8 import static org.junit.Assert.fail;
9
10 import java.io.ByteArrayInputStream;
11 import java.util.ArrayList;
12 import java.util.List;
13
14 import javax.xml.parsers.DocumentBuilderFactory;
15
16 import org.junit.Test;
17 import org.w3c.dom.Document;
18 import org.w3c.dom.Node;
19 import org.w3c.dom.NodeList;
20
21
22
23
24
25
26 public class XMLRendererTest {
27
28 private final static String ENCODING = (String) System.getProperties().get("file.encoding");
29
30 @Test
31 public void testWithNoDuplication() {
32
33 Renderer renderer = new XMLRenderer();
34 List<Match> list = new ArrayList<Match>();
35 String report = renderer.render(list.iterator());
36 try {
37 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(report.getBytes(ENCODING)));
38 NodeList nodes = doc.getChildNodes();
39 Node n = nodes.item(0);
40 assertEquals("pmd-cpd", n.getNodeName());
41 assertEquals(0, doc.getElementsByTagName("duplication").getLength());
42 } catch (Exception e) {
43 e.printStackTrace();
44 fail(e.getMessage());
45 }
46 }
47
48 @Test
49 public void testWithOneDuplication() {
50 Renderer renderer = new XMLRenderer();
51 List<Match> list = new ArrayList<Match>();
52 int lineCount = 6;
53 String codeFragment = "code\nfragment";
54 Mark mark1 = createMark("public", "/var/Foo.java", 48, lineCount, codeFragment);
55 Mark mark2 = createMark("stuff", "/var/Foo.java", 73, lineCount, codeFragment);
56 Match match = new Match(75, mark1, mark2);
57
58 list.add(match);
59 String report = renderer.render(list.iterator());
60 try {
61 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(report.getBytes(ENCODING)));
62 NodeList dupes = doc.getElementsByTagName("duplication");
63 assertEquals(1, dupes.getLength());
64 Node file = dupes.item(0).getFirstChild();
65 while (file != null && file.getNodeType() != Node.ELEMENT_NODE) {
66 file = file.getNextSibling();
67 }
68 if (file != null) {
69 assertEquals("48", file.getAttributes().getNamedItem("line").getNodeValue());
70 assertEquals("/var/Foo.java", file.getAttributes().getNamedItem("path").getNodeValue());
71 file = file.getNextSibling();
72 while (file != null && file.getNodeType() != Node.ELEMENT_NODE) {
73 file = file.getNextSibling();
74 }
75 }
76 if (file != null) assertEquals("73", file.getAttributes().getNamedItem("line").getNodeValue());
77 assertEquals(1, doc.getElementsByTagName("codefragment").getLength());
78 assertEquals(codeFragment, doc.getElementsByTagName("codefragment").item(0).getTextContent());
79 } catch (Exception e) {
80 e.printStackTrace();
81 fail(e.getMessage());
82 }
83 }
84
85 @Test
86 public void testRenderWithMultipleMatch() {
87 Renderer renderer = new XMLRenderer();
88 List<Match> list = new ArrayList<Match>();
89 int lineCount1 = 6;
90 String codeFragment1 = "code fragment";
91 Mark mark1 = createMark("public", "/var/Foo.java", 48, lineCount1, codeFragment1);
92 Mark mark2 = createMark("void", "/var/Foo.java", 73, lineCount1, codeFragment1);
93 Match match1 = new Match(75, mark1, mark2);
94
95 int lineCount2 = 7;
96 String codeFragment2 = "code fragment 2";
97 Mark mark3 = createMark("void", "/var/Foo2.java", 49, lineCount2, codeFragment2);
98 Mark mark4 = createMark("stuff", "/var/Foo2.java", 74, lineCount2, codeFragment2);
99 Match match2 = new Match(76, mark3, mark4);
100
101 list.add(match1);
102 list.add(match2);
103 String report = renderer.render(list.iterator());
104 try {
105 Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(report.getBytes(ENCODING)));
106 assertEquals(2, doc.getElementsByTagName("duplication").getLength());
107 assertEquals(4, doc.getElementsByTagName("file").getLength());
108 } catch (Exception e) {
109 e.printStackTrace();
110 fail(e.getMessage());
111 }
112 }
113
114 @Test
115 public void testRendererEncodedPath() {
116 Renderer renderer = new XMLRenderer();
117 List<Match> list = new ArrayList<Match>();
118 final String espaceChar = "<";
119 Mark mark1 = createMark("public", "/var/F" + '<' + "oo.java", 48, 6, "code fragment");
120 Mark mark2 = createMark("void", "/var/F<oo.java", 73, 6, "code fragment");
121 Match match1 = new Match(75, mark1, mark2);
122 list.add(match1);
123 String report = renderer.render(list.iterator());
124 assertTrue(report.contains(espaceChar));
125 }
126
127 private Mark createMark(String image, String tokenSrcID, int beginLine, int lineCount, String code) {
128 Mark result = new Mark(new TokenEntry(image, tokenSrcID, beginLine));
129
130 result.setLineCount(lineCount);
131 result.setSoureCodeSlice(code);
132 return result;
133 }
134
135 public static junit.framework.Test suite() {
136 return new junit.framework.JUnit4TestAdapter(XMLRendererTest.class);
137 }
138 }
139