/**
* 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.squalecommon.enterpriselayer.facade.rule;
import java.io.InputStream;
import java.util.Collection;
import org.squale.jraf.spi.persistence.ISession;
import org.squale.squalecommon.SqualeTestCase;
import org.squale.squalecommon.daolayer.component.AbstractComponentDAOImpl;
import org.squale.squalecommon.daolayer.result.MarkDAOImpl;
import org.squale.squalecommon.daolayer.result.MeasureDAOImpl;
import org.squale.squalecommon.daolayer.result.QualityResultDAOImpl;
import org.squale.squalecommon.daolayer.rule.QualityGridDAOImpl;
import org.squale.squalecommon.datatransfertobject.rule.QualityGridDTO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ApplicationBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.AuditBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ClassBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.MethodBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.PackageBO;
import org.squale.squalecommon.enterpriselayer.businessobject.component.ProjectBO;
import org.squale.squalecommon.enterpriselayer.businessobject.config.ProjectProfileBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.FactorResultBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.MarkBO;
import org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAClassMetricsBO;
import org.squale.squalecommon.enterpriselayer.businessobject.rule.QualityGridBO;
/**
* Test de calcul d'audit
*/
public class AuditComputingTest
extends SqualeTestCase
{
/**
* Test de calcul d'audit Un audit est cr�� artificiellement avec une grille qualit� de base, les m�triques sont
* elles aussi cr��es en dur dans le test. Une phase d'audit est ensuite r�alis�e avec une v�rification des
* r�sultats obtenus.
*/
public void testComputeAuditResult()
{
ISession session;
try
{
session = getSession();
// Chargement de la grille
InputStream stream = getClass().getClassLoader().getResourceAsStream( "data/grid/grid_compute.xml" );
StringBuffer errors = new StringBuffer();
Collection grids;
grids = QualityGridImport.createGrid( stream, errors );
QualityGridBO grid =
(QualityGridBO) QualityGridDAOImpl.getInstance().load(
session,
new Long(
( (QualityGridDTO) grids.iterator().next() ).getId() ) );
// Cr�ation de l'application
ApplicationBO application = getComponentFactory().createApplication( session );
// Cr�ation du projet
ProjectBO project = getComponentFactory().createProject( session, application, grid );
ProjectProfileBO profile= getComponentFactory().createProjectProfile( session );
project.setProfile( profile );
// Cr�ation de l'audit
AuditBO audit = getComponentFactory().createAudit( session, project );
// Cr�ation du package
PackageBO pkg = getComponentFactory().createPackage( session, project );
pkg.addAudit( audit );
AbstractComponentDAOImpl.getInstance().save( session, pkg );
// Cr�ation de la classe
ClassBO cls = getComponentFactory().createClass( session, pkg );
cls.addAudit( audit );
AbstractComponentDAOImpl.getInstance().save( session, cls );
// Cr�ation de la classe2
ClassBO cls2 = getComponentFactory().createClass( session, pkg );
cls2.addAudit( audit );
AbstractComponentDAOImpl.getInstance().save( session, cls2 );
// Cr�ation de la m�thode
MethodBO method = getComponentFactory().createMethod( session, cls );
method.addAudit( audit );
AbstractComponentDAOImpl.getInstance().save( session, cls );
/*
* McCabe : - cls : Maxvg = 2; Sumvg = 2; wmc = 8; - method : nsloc = 2; Checkstyle : - project : totalError =
* 20;
*/
getComponentFactory().createMeasures( session, audit, project, cls, method );
// Nouvelle mesure pour la classe 2
McCabeQAClassMetricsBO classMetrics = new McCabeQAClassMetricsBO();
classMetrics.setAudit( audit );
classMetrics.setComponent( cls2 );
// On veut une note � 2 pour le composant
classMetrics.setMaxvg( new Integer( 350 ) );
classMetrics.setSumvg( new Integer( 1000 ) );
classMetrics.setWmc( new Integer( 8 ) );
MeasureDAOImpl.getInstance().create( getSession(), classMetrics );
// Calcul de l'audit
AuditComputing.computeAuditResult( session, project, audit );
// V�rification des calculs
/*
* D'apr�s la grille "grid_compute.xml" on doit avoir : practice 1 class1 = 0 car 2(mccabe.maxvg) >=
* 0.5*2(mccabe.sumvg) et 8(mccabe.wmc) >= 8 (classe) practice 1 class2 = 2 car 350(mccabe.maxvg) >=
* 0.3*1000(mccabe.sumvg) et 8(mccabe.wmc) >= 8 (classe) --> practice 1 = 1.0 car f(x)=x est la fonction de
* pond�ration donc f^-1(1/2*(0+2)=1 practice 2 = 3*(2.0/3.0)**(100.0*20/1000) = 1.33334 (projet) practice 3 =
* 3 car aucune condition n'est remplie (mccabe.nsloc = 2 < 40) (methode)
*/
// Note sur la classe
final float expectedClassMark = 0f;
Collection classMarks =
MarkDAOImpl.getInstance().findWhere( session, new Long( cls.getId() ), new Long( audit.getId() ) );
assertEquals( 1, classMarks.size() );
assertEquals( new Float( expectedClassMark ),
new Float( ( (MarkBO) classMarks.iterator().next() ).getValue() ) );
// Note sur la classe2
final float expectedClassMark2 = 2f;
Collection classMarks2 =
MarkDAOImpl.getInstance().findWhere( session, new Long( cls2.getId() ), new Long( audit.getId() ) );
assertEquals( 1, classMarks2.size() );
assertEquals( new Float( expectedClassMark2 ),
new Float( ( (MarkBO) classMarks2.iterator().next() ).getValue() ) );
// R�sultat pour practice1
float expectedPractice1Mark = 1f;
// Note sur la m�thode
final float expectedMethodMark = 3f;
Collection methodMarks =
MarkDAOImpl.getInstance().findWhere( session, new Long( method.getId() ), new Long( audit.getId() ) );
assertEquals( 1, methodMarks.size() );
assertEquals( new Float( expectedMethodMark ),
new Float( ( (MarkBO) methodMarks.iterator().next() ).getValue() ) );
// Note sur le projet
final float expectedProjectMark =
new Float( 3 * Math.pow( ( 2.0 / 3.0 ), 100.0 * 20 / 1000 ) ).floatValue();
Collection factorResults =
QualityResultDAOImpl.getInstance().findWhere( session, new Long( project.getId() ),
new Long( audit.getId() ) );
assertEquals( 2, factorResults.size() );
}
catch ( Exception e )
{
e.printStackTrace();
fail( "unexpected exception" );
}
}
}