/* * Cobertura - http://cobertura.sourceforge.net/ * * Copyright (C) 2005 Grzegorz Lukasik * Copyright (C) 2006 Jiri Mares * * Cobertura is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, * or (at your option) any later version. * * Cobertura is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Cobertura; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ package net.sourceforge.cobertura.merge; import junit.framework.TestCase; import net.sourceforge.cobertura.coveragedata.*; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /** * Tests merge feature by calling directly ProjectData.merge method. */ public class MergeTest extends TestCase { private ClassData firstClass = new ClassData("test.First"); private ClassData secondClass = new ClassData("test.Second"); private ClassData thirdClass = new ClassData("test.Third"); private ClassData firstClassB = new ClassData("test.First"); private ClassData fourthClass = new ClassData("test.me.Fourth"); private ClassData fifthClass = new ClassData("beautiful.Fourth"); private ClassData sixthClass = new ClassData("Fourth"); private ClassData seventhClass = new ClassData("Seventh"); private ProjectData greenProject = new ProjectData(); private ProjectData redProject = new ProjectData(); public void testMergePackages() { greenProject.addClassData(firstClass); greenProject.addClassData(fourthClass); redProject.addClassData(fifthClass); redProject.addClassData(sixthClass); redProject.addClassData(seventhClass); //merge with null - should not change the greenProject greenProject.merge(null); greenProject.merge(redProject); Iterator subpackages = greenProject.getSubPackages("").iterator(); assertEquals("", ((PackageData) subpackages.next()).getName()); assertEquals("beautiful", ((PackageData) subpackages.next()).getName()); assertEquals("test", ((PackageData) subpackages.next()).getName()); assertEquals("test.me", ((PackageData) subpackages.next()).getName()); assertFalse(subpackages.hasNext()); assertEquals(5, greenProject.getClasses().size()); assertEquals(3, redProject.getClasses().size()); assertNotNull(greenProject.getClassData("test.First")); assertNotNull(greenProject.getClassData("test.me.Fourth")); assertNotNull(greenProject.getClassData("beautiful.Fourth")); assertNotNull(greenProject.getClassData("Fourth")); assertNotNull(greenProject.getClassData("Seventh")); assertNull(redProject.getClassData("test.First")); Iterator packages = greenProject.getPackages().iterator(); PackageData first = (PackageData) packages.next(); assertEquals("", first.getName()); assertEquals(2, first.getNumberOfChildren()); assertNotNull(first.getChild("Fourth")); assertNotNull(first.getChild("Seventh")); PackageData beautiful = (PackageData) packages.next(); assertEquals("beautiful", beautiful.getName()); assertEquals(1, beautiful.getNumberOfChildren()); assertNotNull(beautiful.getChild("Fourth")); PackageData test = (PackageData) packages.next(); assertEquals("test", test.getName()); assertEquals(1, test.getNumberOfChildren()); assertNotNull(test.getChild("First")); assertNull(test.getChild("test/me/First.java")); assertNull(test.getChild("Fourth.java")); PackageData testMe = (PackageData) packages.next(); assertEquals("test.me", testMe.getName()); assertEquals(1, testMe.getNumberOfChildren()); assertNull(testMe.getChild("test/First.java")); assertNotNull(testMe.getChild("Fourth")); assertNull(testMe.getChild("Fourth.java")); assertFalse(packages.hasNext()); } public void testMergeDifferentClassData() { greenProject.addClassData(firstClass); redProject.addClassData(secondClass); redProject.addClassData(thirdClass); greenProject.merge(redProject); assertEquals(1, greenProject.getNumberOfChildren()); assertEquals(3, greenProject.getClasses().size()); assertNotNull(greenProject.getClassData("test.First")); assertNotNull(greenProject.getClassData("test.Second")); assertNotNull(greenProject.getClassData("test.Third")); assertNull(redProject.getClassData("test.First")); assertNotNull(redProject.getClassData("test.Second")); assertNotNull(redProject.getClassData("test.Third")); } public void testMergeSimillarClassData() { greenProject.addClassData(secondClass); greenProject.addClassData(thirdClass); redProject.addClassData(firstClass); redProject.addClassData(thirdClass); greenProject.merge(redProject); assertEquals(1, greenProject.getNumberOfChildren()); assertEquals(3, greenProject.getClasses().size()); assertNotNull(greenProject.getClassData("test.First")); assertNotNull(greenProject.getClassData("test.Second")); assertNotNull(greenProject.getClassData("test.Third")); assertNotNull(redProject.getClassData("test.First")); assertNull(redProject.getClassData("test.Second")); assertNotNull(redProject.getClassData("test.Third")); } public void testMergeDifferentLineNumbers() { firstClass.addLine(2, "helloWorld", "()V"); firstClass.addLine(3, "helloWorld", "()V"); greenProject.addClassData(firstClass); firstClassB.addLine(1, "helloWorld", "()V"); firstClassB.addLine(5, "helloWorld", "()V"); redProject.addClassData(firstClassB); greenProject.merge(redProject); ClassData cd = greenProject.getClassData("test.First"); assertNotNull(cd); assertEquals(4, cd.getNumberOfValidLines()); assertEquals(2, redProject.getClassData("test.First") .getNumberOfValidLines()); Iterator lines = cd.getLines().iterator(); LineData line1 = (LineData) lines.next(); assertEquals(1, line1.getLineNumber()); LineData line2 = (LineData) lines.next(); assertEquals(2, line2.getLineNumber()); LineData line3 = (LineData) lines.next(); assertEquals(3, line3.getLineNumber()); LineData line5 = (LineData) lines.next(); assertEquals(5, line5.getLineNumber()); assertFalse(lines.hasNext()); } public void testMergeSimillarLineNumbers() { firstClass.addLine(2, "helloWorld", "()V"); firstClass.touch(2, 1); firstClass.touch(2, 1); firstClass.addLine(3, "helloWorld", "()V"); greenProject.addClassData(firstClass); firstClassB.addLine(2, "helloWorld", "()V"); firstClassB.touch(2, 1); firstClassB.touch(2, 1); firstClassB.touch(2, 1); firstClassB.addLine(3, "helloWorld", "()V"); firstClassB.touch(3, 1); firstClassB.addLine(7, "helloWorld", "()V"); redProject.addClassData(firstClassB); greenProject.merge(redProject); ClassData cd = greenProject.getClassData("test.First"); assertNotNull(cd); assertEquals(3, cd.getNumberOfValidLines()); assertEquals(3, redProject.getClassData("test.First") .getNumberOfValidLines()); Iterator lines = cd.getLines().iterator(); LineData line2 = (LineData) lines.next(); assertEquals(2, line2.getLineNumber()); assertEquals(5, line2.getHits()); LineData line3 = (LineData) lines.next(); assertEquals(3, line3.getLineNumber()); assertEquals(1, line3.getHits()); LineData line7 = (LineData) lines.next(); assertEquals(7, line7.getLineNumber()); assertEquals(0, line7.getHits()); assertFalse(lines.hasNext()); } public void testMergeBranches() { firstClass.addLine(1, "helloWorld", "()V"); firstClass.addLineJump(1, 0); firstClass.addLine(2, "helloWorld", "()V"); firstClass.addLineJump(2, 0); firstClass.addLineJump(2, 1); firstClass.addLine(3, "helloWorld", "()V"); firstClass.addLine(4, "helloWorld", "()V"); firstClass.addLineSwitch(4, 0, 0, 2, Integer.MAX_VALUE); firstClass.addLine(5, "helloWorld", "()V"); firstClass.addLine(8, "helloWorld", "()V"); greenProject.addClassData(firstClass); firstClassB.addLine(1, "helloWorld", "()V"); firstClassB.addLineJump(1, 0); firstClassB.addLine(2, "helloWorld", "()V"); firstClassB.addLine(3, "helloWorld", "()V"); firstClassB.addLineSwitch(3, 0, 2, 4, Integer.MAX_VALUE); firstClassB.addLine(6, "helloWorld", "()V"); firstClassB.addLineJump(6, 0); firstClassB.addLine(7, "helloWorld", "()V"); firstClassB.addLine(8, "helloWorld", "()V"); redProject.addClassData(firstClassB); greenProject.merge(redProject); ClassData cd = greenProject.getClassData("test.First"); Iterator lines = cd.getLines().iterator(); LineData line1 = (LineData) lines.next(); assertTrue(line1.hasBranch()); LineData line2 = (LineData) lines.next(); assertTrue(line2.hasBranch()); LineData line3 = (LineData) lines.next(); assertTrue(line3.hasBranch()); LineData line4 = (LineData) lines.next(); assertTrue(line4.hasBranch()); LineData line5 = (LineData) lines.next(); assertFalse(line5.hasBranch()); LineData line6 = (LineData) lines.next(); assertTrue(line6.hasBranch()); LineData line7 = (LineData) lines.next(); assertFalse(line7.hasBranch()); LineData line8 = (LineData) lines.next(); assertFalse(line8.hasBranch()); assertFalse(lines.hasNext()); } public void testMergeSourceFiles() { greenProject.addClassData(secondClass); greenProject.addClassData(fourthClass); redProject.addClassData(firstClass); redProject.addClassData(fifthClass); redProject.addClassData(seventhClass); greenProject.merge(redProject); Collection sources = greenProject.getSourceFiles(); assertEquals(5, sources.size()); Set sourceNames = new HashSet(); Iterator it = sources.iterator(); while (it.hasNext()) sourceNames.add(((SourceFileData) it.next()).getName()); assertTrue(sourceNames.contains("test/First.java")); assertTrue(sourceNames.contains("test/Second.java")); assertTrue(sourceNames.contains("test/me/Fourth.java")); assertTrue(sourceNames.contains("beautiful/Fourth.java")); assertTrue(sourceNames.contains("Seventh.java")); } }