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