/** * 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 org.squale.squalecommon.SqualeTestCase; import org.squale.squalecommon.enterpriselayer.businessobject.result.MeasureBO; import org.squale.squalecommon.enterpriselayer.businessobject.result.mccabe.McCabeQAClassMetricsBO; import org.squale.squalecommon.enterpriselayer.businessobject.rule.ConditionFormulaBO; import org.squale.squalecommon.enterpriselayer.businessobject.rule.SimpleFormulaBO; import org.squale.squalecommon.util.initialisor.JRafConfigurator; /** * Test de l'interpr�teur de formule L'interpr�teur de formule est test� pour la v�rification de syntaxe ainsi que pour * la v�rification de l'�valuation des formules */ public class FormulaInterpreterTest extends SqualeTestCase { /** * Constructor for FormulaInterpreterTest. * * @param arg0 nom */ public FormulaInterpreterTest( String arg0 ) { super( arg0 ); JRafConfigurator.initialize(); } /** * Test de v�rification de la syntaxe */ public void testCheckSyntax() { ConditionFormulaBO formula = new ConditionFormulaBO(); formula.setId( 1 ); formula.addMarkCondition( "mccabe.sumvg == 3" ); formula.addMarkCondition( "mccabe.sumvg == 30" ); formula.addMarkCondition( "mccabe.sumvg == 32" ); formula.setTriggerCondition( "mccabe.sumvg == 12" ); formula.setComponentLevel( "class" ); formula.addMeasureKind( "mccabe" ); formula.addMeasureKind( "ckjm" ); FormulaInterpreter inter = new FormulaInterpreter(); try { inter.checkSyntax( formula ); assertTrue( "Formule correcte", true ); } catch ( FormulaException e ) { e.printStackTrace(); fail( "Unexpected exception" ); } formula.setTriggerCondition( "trigger.0" ); try { inter.checkSyntax( formula ); fail( "Expected exception" ); } catch ( FormulaException e ) { assertTrue( "Formule incorrecte", true ); } formula.setTriggerCondition( "mccabe.unknown == 12" ); try { inter.checkSyntax( formula ); fail( "Expected exception" ); } catch ( FormulaException e ) { assertTrue( "Formule incorrecte", true ); } } /** * Test d'�valuation d'expression */ public void testEvaluateCondition() { ConditionFormulaBO formula = new ConditionFormulaBO(); formula.setTriggerCondition( "mccabe.wmc >= 8" ); formula.addMarkCondition( "mccabe.maxvg >= 0.5 * mccabe.sumvg" ); formula.addMarkCondition( "mccabe.maxvg >= 0.4 * mccabe.sumvg" ); formula.addMarkCondition( "mccabe.maxvg >= 0.3 * mccabe.sumvg" ); formula.addMeasureKind( "mccabe" ); formula.setId( 1 ); McCabeQAClassMetricsBO measure = new McCabeQAClassMetricsBO(); MeasureBO[] measures = new MeasureBO[1]; measures[0] = measure; measure.setMaxvg( new Integer( 9 ) ); measure.setSumvg( new Integer( 31 ) ); measure.setWmc( new Integer( 10 ) ); FormulaInterpreter inter = new FormulaInterpreter(); Number val; try { // Test des valeurs dans l'intervalle 0..3 val = inter.evaluate( formula, measures ); assertEquals( 3, val.intValue() ); measure.setMaxvg( new Integer( 10 ) ); val = inter.evaluate( formula, measures ); assertEquals( 2, val.intValue() ); measure.setMaxvg( new Integer( 13 ) ); val = inter.evaluate( formula, measures ); assertEquals( 1, val.intValue() ); measure.setMaxvg( new Integer( 16 ) ); val = inter.evaluate( formula, measures ); assertEquals( 0, val.intValue() ); // Test avec trigger non v�rifi� measure.setWmc( new Integer( 7 ) ); val = inter.evaluate( formula, measures ); assertNull( val ); } catch ( FormulaException e ) { e.printStackTrace(); fail( "Exception inattendue" ); } } /** * Test d'�valuation d'expression simple */ public void testEvaluateSimple() { SimpleFormulaBO formula = new SimpleFormulaBO(); formula.setTriggerCondition( "mccabe.wmc >= 8" ); formula.setFormula( "mccabe.sumvg / mccabe.maxvg" ); formula.addMeasureKind( "mccabe" ); formula.setId( 1 ); McCabeQAClassMetricsBO measure = new McCabeQAClassMetricsBO(); MeasureBO[] measures = new MeasureBO[1]; measures[0] = measure; measure.setMaxvg( new Integer( 9 ) ); measure.setSumvg( new Integer( 31 ) ); measure.setWmc( new Integer( 10 ) ); FormulaInterpreter inter = new FormulaInterpreter(); Number val; try { // Test des valeurs dans l'intervalle 0..3 val = inter.evaluate( formula, measures ); assertEquals( 3, val.intValue() ); measure.setMaxvg( new Integer( 11 ) ); val = inter.evaluate( formula, measures ); assertEquals( 2, val.intValue() ); measure.setMaxvg( new Integer( 16 ) ); val = inter.evaluate( formula, measures ); assertEquals( 1, val.intValue() ); measure.setMaxvg( new Integer( 32 ) ); val = inter.evaluate( formula, measures ); assertEquals( 0, val.intValue() ); // Test de valeur > 3, la note est ramen�e � 3 measure.setMaxvg( new Integer( 5 ) ); val = inter.evaluate( formula, measures ); assertEquals( 3, val.intValue() ); // Test de valeur < 0, la note est ramen�e � 0 measure.setMaxvg( new Integer( -5 ) ); val = inter.evaluate( formula, measures ); assertEquals( 0, val.intValue() ); // Test avec trigger non v�rifi� measure.setWmc( new Integer( 7 ) ); val = inter.evaluate( formula, measures ); assertNull( val ); } catch ( FormulaException e ) { e.printStackTrace(); fail( "Exception inattendue" ); } } }