/* * 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 java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import junit.framework.TestCase; import net.sourceforge.cobertura.coveragedata.ClassData; import net.sourceforge.cobertura.coveragedata.LineData; import net.sourceforge.cobertura.coveragedata.PackageData; import net.sourceforge.cobertura.coveragedata.ProjectData; import net.sourceforge.cobertura.coveragedata.SourceFileData; /** * 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); 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); 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")); } }