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