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