/**
* Copyright (C) 2008-2010, Squale Project - http://www.squale.org
*
* This file is part of Squale.
*
* Squale 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 3 of the
* License, or any later version.
*
* Squale 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 Lesser General Public License
* along with Squale. If not, see <http://www.gnu.org/licenses/>.
*/
package org.squale.squalix.tools.cpd;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import junit.framework.TestCase;
import org.squale.squalecommon.SqualeTestCase;
import org.squale.squalecommon.daolayer.component.ProjectDAOImpl;
import org.squale.squalecommon.daolayer.component.ProjectParameterDAOImpl;
import org.squale.squalecommon.daolayer.result.MeasureDAOImpl;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ListParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.MapParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.ParametersConstants;
import org.squale.squalecommon.enterpriselayer.businessobject.component.parameters.StringParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.config.TaskParameterBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.rulechecking.CpdTransgressionBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.QualityGridBO;
import org.squale.squalix.core.AbstractTask;
import org.squale.squalix.core.TaskData;
/**
* Test de la t�che Cpd UNIT_KO : assert trop fonctionnel (voir si on peut g�n�r� les duplications avec cpd) puis
* comparer les nombres avec ceux trouver dans le test
*/
public class CpdTaskTest
extends SqualeTestCase
{
/** Nombre de lignes dupliqu�es en C++ */
private static final int CPP_DUPLICATE_LINES = 42;
/** Nombre de lignes dupliqu�es en JSP */
private static final int JSP_DUPLICATE_LINES = 150;
/** Nombre de lignes dupliqu�es en JAVA */
private static final int JAVA_DUPLICATE_LINES = 464;
/** r�pertoire des .java */
public static final String SOURCES_DIR = "data/Project4CpdTest";
/**
* Pseudo-chemin vers une vue.
*/
private static final String VIEW_PATH = ".";
/** l'application */
private ApplicationBO mAppli = new ApplicationBO();
/** le projet � auditer */
private ProjectBO mProject = new ProjectBO();
/** l'audit */
private AuditBO mAudit = new AuditBO();
/** les t�ches temporaires */
private TaskData mData = new TaskData();
/**
* @see TestCase#setUp()
*/
protected void setUp()
throws Exception
{
super.setUp();
getSession().beginTransaction();
mAppli = getComponentFactory().createApplication( getSession() );
QualityGridBO grid = getComponentFactory().createGrid( getSession() );
mProject = getComponentFactory().createProject( getSession(), mAppli, grid );
// Enregistrement du ProjectBO dans la base
ProjectDAOImpl projectDAO = ProjectDAOImpl.getInstance();
// Les param�tres doivent contenir le chemin du fichier de configuration
MapParameterBO params = new MapParameterBO();
ListParameterBO listParam = new ListParameterBO();
// Traitement des sources C++ et Java
List list = new ArrayList();
StringParameterBO stringParam = new StringParameterBO();
stringParam.setValue( SOURCES_DIR );
list.add( stringParam );
listParam.setParameters( list );
params.getParameters().put( ParametersConstants.SOURCES, listParam );
// Traitement des sources JSP
listParam = new ListParameterBO();
list = new ArrayList();
stringParam = new StringParameterBO();
stringParam.setValue( SOURCES_DIR );
list.add( stringParam );
listParam.setParameters( list );
params.getParameters().put( ParametersConstants.JSP, listParam );
// Pas de r�pertoire exclu
ProjectParameterDAOImpl.getInstance().create( getSession(), params );
mProject.setParameters( params );
ProjectDAOImpl.getInstance().save( getSession(), mProject );
mAudit = getComponentFactory().createAudit( this.getSession(), mProject );
// On fait le commit pour permettre l'acc�s aux donn�es dans une autre session
getSession().commitTransactionWithoutClose();
File viewFile = new File( VIEW_PATH );
mData.putData( TaskData.VIEW_PATH, viewFile.getCanonicalPath() );
}
/**
* Cr�ation de la t�che
*
* @param pLanguages langages utilis�s
* @return t�che correspondante
*/
private CpdTask createTask( String[] pLanguages )
{
CpdTask task = new CpdTask();
task.setData( mData );
ArrayList taskParameters = new ArrayList();
for ( int i = 0; i < pLanguages.length; i++ )
{
TaskParameterBO param = new TaskParameterBO();
param.setName( "language" );
param.setValue( pLanguages[i] );
taskParameters.add( param );
}
task.setTaskParameters( taskParameters );
task.setAuditId( new Long( mAudit.getId() ) );
task.setProjectId( new Long( mProject.getId() ) );
task.setApplicationId( new Long( mAppli.getId() ) );
task.setStatus( AbstractTask.NOT_ATTEMPTED );
return task;
}
/**
* Test d'ex�cution en Java
*/
public void testJavaExecute()
{
try
{
CpdTask task = createTask( new String[] { "java" } );
task.run();
assertEquals( AbstractTask.TERMINATED, task.getStatus() );
// On v�rifie les r�sultats
MeasureDAOImpl dao = MeasureDAOImpl.getInstance();
assertEquals( 1, dao.count( getSession() ).intValue() );
// On r�cup�re la mesure de trasngression
CpdTransgressionBO measure =
(CpdTransgressionBO) dao.load( getSession(), new Long( mProject.getId() ), new Long( mAudit.getId() ),
CpdTransgressionBO.class );
// 1 metric pour les details, 1 pour le langage et 1 pour le total
final int metricsCount = 3;
assertEquals( metricsCount, measure.getMetrics().size() );
assertEquals( measure.getDuplicateLinesForLanguage( "java" ), measure.getDuplicateLinesNumber() );
Collection details = measure.getDetails();
// Le fichier java est cl�n� et modifi� de fa�on � contenir 7 morceaux de code identiques
final int cpCount = 7;
assertEquals( "Check values with external CPD tool", cpCount, details.size() );
// On r�cup�re la mesure du nombre de lignes dupliqu�es
final int dupLinesNb = JAVA_DUPLICATE_LINES; // Nombre de lignes dupliqu�es au total
assertEquals( "Check values with external CPD tool", dupLinesNb,
measure.getDuplicateLinesNumber().intValue() );
}
catch ( Exception e )
{
e.printStackTrace();
fail( "unexpected exception" );
}
}
/**
* Test d'ex�cution en Java
*/
public void testJavaWithexclusionExecute()
{
try
{
// On cr�e les exclusion
getSession().beginTransaction();
MapParameterBO params = mProject.getParameters();
// Les patterns � exclure
ListParameterBO excludedList = new ListParameterBO();
ArrayList eList = new ArrayList();
StringParameterBO stringExclude = new StringParameterBO();
stringExclude.setValue( "**/*Clone*/**" );
eList.add( stringExclude );
excludedList.setParameters( eList );
params.getParameters().put( ParametersConstants.EXCLUDED_PATTERNS, excludedList );
ProjectParameterDAOImpl.getInstance().create( getSession(), params );
mProject.setParameters( params );
ProjectDAOImpl.getInstance().save( getSession(), mProject );
getSession().commitTransactionWithoutClose();
CpdTask task = createTask( new String[] { "java" } );
task.run();
assertEquals( AbstractTask.TERMINATED, task.getStatus() );
// On v�rifie les r�sultats
MeasureDAOImpl dao = MeasureDAOImpl.getInstance();
assertEquals( 1, dao.count( getSession() ).intValue() );
// On r�cup�re la mesure de transgression
CpdTransgressionBO measure =
(CpdTransgressionBO) dao.load( getSession(), new Long( mProject.getId() ), new Long( mAudit.getId() ),
CpdTransgressionBO.class );
// 1 metric pour les details, 1 pour le langage et 1 pour le total
final int metricsCount = 3;
assertEquals( metricsCount, measure.getMetrics().size() );
assertEquals( measure.getDuplicateLinesForLanguage( "java" ), measure.getDuplicateLinesNumber() );
Collection details = measure.getDetails();
// Un seul fichier r�cup�rer donc pas de duplication
final int cpCount = 0;
assertEquals( "Check values with external CPD tool", cpCount, details.size() );
// On r�cup�re la mesure du nombre de lignes dupliqu�es
final int dupLinesNb = 0; // Nombre de lignes dupliqu�es au total
assertEquals( "Check values with external CPD tool", dupLinesNb,
measure.getDuplicateLinesNumber().intValue() );
}
catch ( Exception e )
{
e.printStackTrace();
fail( "unexpected exception" );
}
}
/**
* Test d'ex�cution en jsp
*/
public void testJspExecute()
{
try
{
CpdTask task = createTask( new String[] { "jsp" } );
task.run();
assertEquals( AbstractTask.TERMINATED, task.getStatus() );
// On v�rifie les r�sultats
MeasureDAOImpl dao = MeasureDAOImpl.getInstance();
assertEquals( 1, dao.count( getSession() ).intValue() );
List coll = dao.findAll( getSession() );
// On r�cup�re la mesure de trasngression
CpdTransgressionBO measure =
(CpdTransgressionBO) dao.load( getSession(), new Long( mProject.getId() ), new Long( mAudit.getId() ),
CpdTransgressionBO.class );
// 1 metric pour les details, 1 pour le langage et 1 pour le total
final int metricsCount = 3;
assertEquals( metricsCount, measure.getMetrics().size() );
assertEquals( measure.getDuplicateLinesForLanguage( "jsp" ), measure.getDuplicateLinesNumber() );
Collection details = measure.getDetails();
// Le fichier jsp est cl�n� et modifi� de fa�on � contenir 2 morceaux de code identiques
final int cpCount = 2;
assertEquals( "Check values with external CPD tool", cpCount, details.size() );
// On r�cup�re la mesure du nombre de lignes dupliqu�es
final int dupLinesNb = JSP_DUPLICATE_LINES; // Nombre de lignes dupliqu�es au total
assertEquals( "Check values with external CPD tool", dupLinesNb,
measure.getDuplicateLinesNumber().intValue() );
}
catch ( Exception e )
{
e.printStackTrace();
fail( "unexpected exception" );
}
}
/**
* Test d'ex�cution en j2ee (java et jsp)
*/
public void testJ2eeExecute()
{
try
{
CpdTask task = createTask( new String[] { "java", "jsp" } );
task.run();
assertEquals( AbstractTask.TERMINATED, task.getStatus() );
// On v�rifie les r�sultats
MeasureDAOImpl dao = MeasureDAOImpl.getInstance();
assertEquals( 1, dao.count( getSession() ).intValue() );
List coll = dao.findAll( getSession() );
// On r�cup�re la mesure de transgression
CpdTransgressionBO measure =
(CpdTransgressionBO) dao.load( getSession(), new Long( mProject.getId() ), new Long( mAudit.getId() ),
CpdTransgressionBO.class );
// 2 metric pour les details, 2 pour le langage et 1 pour le total
final int metricsCount = 5;
assertEquals( metricsCount, measure.getMetrics().size() );
assertEquals( JSP_DUPLICATE_LINES, measure.getDuplicateLinesForLanguage( "jsp" ).intValue() );
assertEquals( JAVA_DUPLICATE_LINES, measure.getDuplicateLinesForLanguage( "java" ).intValue() );
Collection details = measure.getDetails();
// Le fichier jsp est cl�n� et modifi� de fa�on � contenir 9 morceaux de code identiques
final int cpCount = 9;
assertEquals( "Check values with external CPD tool", cpCount, details.size() );
// On r�cup�re la mesure du nombre de lignes dupliqu�es
final int dupLinesNb = JAVA_DUPLICATE_LINES + JSP_DUPLICATE_LINES; // Nombre de lignes dupliqu�es au total
assertEquals( "Check values with external CPD tool", dupLinesNb,
measure.getDuplicateLinesNumber().intValue() );
}
catch ( Exception e )
{
e.printStackTrace();
fail( "unexpected exception" );
}
}
/**
* Test d'ex�cution en c++
*/
public void testCppExecute()
{
try
{
CpdTask task = createTask( new String[] { "cpp" } );
task.run();
assertEquals( AbstractTask.TERMINATED, task.getStatus() );
// On v�rifie les r�sultats
MeasureDAOImpl dao = MeasureDAOImpl.getInstance();
assertEquals( 1, dao.count( getSession() ).intValue() );
List coll = dao.findAll( getSession() );
// On r�cup�re la mesure de trasngression
CpdTransgressionBO measure =
(CpdTransgressionBO) dao.load( getSession(), new Long( mProject.getId() ), new Long( mAudit.getId() ),
CpdTransgressionBO.class );
assertEquals( measure.getDuplicateLinesForLanguage( "cpp" ), measure.getDuplicateLinesNumber() );
// 1 metric pour les details, 1 pour le langage et 1 pour le total
final int metricsCount = 3;
assertEquals( metricsCount, measure.getMetrics().size() );
Collection details = measure.getDetails();
// Le fichier jsp est cl�n� et modifi� de fa�on � contenir 1 morceau de code identique
final int cpCount = 1;
assertEquals( "Check values with external CPD tool", cpCount, details.size() );
// On r�cup�re la mesure du nombre de lignes dupliqu�es
final int dupLinesNb = CPP_DUPLICATE_LINES; // Nombre de lignes dupliqu�es au total
assertEquals( "Check values with external CPD tool", dupLinesNb,
measure.getDuplicateLinesNumber().intValue() );
}
catch ( Exception e )
{
e.printStackTrace();
fail( "unexpected exception" );
}
}
}