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