/** * Copyright (C) 2013-2014 Olaf Lessenich * Copyright (C) 2014-2015 University of Passau, Germany * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA * * Contributors: * Olaf Lessenich <lessenic@fim.uni-passau.de> * Georg Seibt <seibt@fim.uni-passau.de> */ package de.fosd.jdime.stats; import java.util.Arrays; import de.fosd.jdime.JDimeTest; import de.fosd.jdime.Main; import de.fosd.jdime.artifact.ArtifactList; import de.fosd.jdime.artifact.file.FileArtifact; import de.fosd.jdime.config.merge.MergeContext; import de.fosd.jdime.config.merge.MergeScenario; import de.fosd.jdime.config.merge.MergeType; import de.fosd.jdime.config.merge.Revision; import de.fosd.jdime.strategy.MergeStrategy; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * Tests for <code>Statistics</code>. */ public class StatisticsTest extends JDimeTest { private MergeContext context; @Before public void setUp() throws Exception { context = new MergeContext(); context.collectStatistics(true); context.setQuiet(true); context.setPretend(true); } @Test public void collectStatistics() throws Exception { ArtifactList<FileArtifact> inputArtifacts = new ArtifactList<>(); String filePath = "SimpleTests/Bag/Bag.java"; inputArtifacts.add(new FileArtifact(MergeScenario.LEFT, file(leftDir, filePath))); inputArtifacts.add(new FileArtifact(MergeScenario.BASE, file(baseDir, filePath))); inputArtifacts.add(new FileArtifact(MergeScenario.RIGHT, file(rightDir, filePath))); context.setMergeStrategy(MergeStrategy.parse("structured")); context.setInputFiles(inputArtifacts); Main.merge(context); Statistics statistics = context.getStatistics(); MergeScenarioStatistics fileMergeStats = null; for (MergeScenarioStatistics s : statistics.getScenarioStatistics()) { MergeScenario<?> scenario = s.getMergeScenario(); if (scenario.getMergeType() != MergeType.THREEWAY) { continue; } if (scenario.asList().stream().allMatch(o -> o instanceof FileArtifact)) { fileMergeStats = s; break; } } assertNotNull("Could not find the MergeScenarioStatistics containing the FileArtifact merge statistics.", fileMergeStats); for (Revision rev : Arrays.asList(MergeScenario.LEFT, MergeScenario.BASE, MergeScenario.RIGHT)) { assertTrue(fileMergeStats.getMergeScenario().getArtifacts().keySet().stream().anyMatch(r -> r.equals(rev))); } // Level Statistics { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.LEFT, KeyEnums.Level.METHOD); assertEquals(30, elStats.getTotal()); assertEquals(13, elStats.getNumAdded()); assertEquals(17, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.LEFT, KeyEnums.Level.CLASS); assertEquals(12, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(12, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.LEFT, KeyEnums.Level.TOP); assertEquals(5, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(5, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.RIGHT, KeyEnums.Level.METHOD); assertEquals(31, elStats.getTotal()); assertEquals(14, elStats.getNumAdded()); assertEquals(17, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.RIGHT, KeyEnums.Level.CLASS); assertEquals(12, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(12, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.RIGHT, KeyEnums.Level.TOP); assertEquals(5, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(5, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.TARGET, KeyEnums.Level.METHOD); assertEquals(44, elStats.getTotal()); assertEquals(27, elStats.getNumAdded()); assertEquals(0, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.TARGET, KeyEnums.Level.CLASS); assertEquals(12, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(0, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getLevelStatistics(MergeScenario.TARGET, KeyEnums.Level.TOP); assertEquals(5, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(0, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } // Type Statistics { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.LEFT, KeyEnums.Type.CLASS); assertEquals(1, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(1, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.LEFT, KeyEnums.Type.METHOD); assertEquals(2, elStats.getTotal()); assertEquals(1, elStats.getNumAdded()); assertEquals(1, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.LEFT, KeyEnums.Type.NODE); assertEquals(44, elStats.getTotal()); assertEquals(12, elStats.getNumAdded()); assertEquals(32, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.RIGHT, KeyEnums.Type.CLASS); assertEquals(1, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(1, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.RIGHT, KeyEnums.Type.METHOD); assertEquals(2, elStats.getTotal()); assertEquals(1, elStats.getNumAdded()); assertEquals(1, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.RIGHT, KeyEnums.Type.NODE); assertEquals(45, elStats.getTotal()); assertEquals(13, elStats.getNumAdded()); assertEquals(32, elStats.getNumMerged()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.TARGET, KeyEnums.Type.CLASS); assertEquals(1, elStats.getTotal()); assertEquals(0, elStats.getNumAdded()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.TARGET, KeyEnums.Type.METHOD); assertEquals(3, elStats.getTotal()); assertEquals(2, elStats.getNumAdded()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } { ElementStatistics elStats = fileMergeStats.getTypeStatistics(MergeScenario.TARGET, KeyEnums.Type.NODE); assertEquals(57, elStats.getTotal()); assertEquals(25, elStats.getNumAdded()); assertEquals(0, elStats.getNumDeleted()); assertEquals(0, elStats.getNumOccurInConflict()); } // Merge Statistics { MergeStatistics mStats = fileMergeStats.getMergeStatistics(MergeScenario.LEFT); assertEquals(1, mStats.getNumChunks()); assertEquals(13.0, mStats.getAvgChunkSize(), 0.0001); assertEquals(13, mStats.getMaxASTDepth()); assertEquals(5, mStats.getMaxNumChildren()); } { MergeStatistics mStats = fileMergeStats.getMergeStatistics(MergeScenario.RIGHT); assertEquals(1, mStats.getNumChunks()); assertEquals(14.0, mStats.getAvgChunkSize(), 0.0001); assertEquals(14, mStats.getMaxASTDepth()); assertEquals(5, mStats.getMaxNumChildren()); } { MergeStatistics mStats = fileMergeStats.getMergeStatistics(MergeScenario.TARGET); assertEquals(1, mStats.getNumChunks()); assertEquals(27.0, mStats.getAvgChunkSize(), 0.0001); assertEquals(14, mStats.getMaxASTDepth()); assertEquals(5, mStats.getMaxNumChildren()); } // Line Statistics { ElementStatistics lineStats = fileMergeStats.getLineStatistics(); assertEquals(12, lineStats.getTotal()); assertEquals(0, lineStats.getNumAdded()); assertEquals(0, lineStats.getNumMerged()); assertEquals(0, lineStats.getNumDeleted()); assertEquals(0, lineStats.getNumOccurInConflict()); } // File Statistics { ElementStatistics fileStats = fileMergeStats.getFileStatistics(); assertEquals(0, fileStats.getTotal()); // TODO file total is not counted currently, figure out where assertEquals(0, fileStats.getNumAdded()); assertEquals(1, fileStats.getNumMerged()); assertEquals(0, fileStats.getNumDeleted()); assertEquals(0, fileStats.getNumOccurInConflict()); } // Directory Statistics { ElementStatistics dirStats = fileMergeStats.getDirectoryStatistics(); assertEquals(0, dirStats.getTotal()); assertEquals(0, dirStats.getNumAdded()); assertEquals(0, dirStats.getNumMerged()); assertEquals(0, dirStats.getNumDeleted()); assertEquals(0, dirStats.getNumOccurInConflict()); } } }