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