View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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   * @author Philippe T'Seyen
23   * @author Romain Pelisse <belaran@gmail.com>
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 = "&lt;";
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