Nantes Université

Skip to content
Extraits de code Groupes Projets
Valider e13cf6f1 rédigé par François-Xavier Lebastard's avatar François-Xavier Lebastard
Parcourir les fichiers

UNOTOPLYS-66 UNOTOPLYS-67 feat(variable) :ajout d'une fonction moyenneQuestions

 Elle prend directement les références des questions. À partir des références, elle ne comptabilise ques les questions ayant des réponses et que celles qui ont un score
parent 6566f4ea
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!121UNAPLLYTMA-10 - EVOL 7 : Intégration d'un bouton "Imprimer"
......@@ -84,7 +84,7 @@ public class Expression implements IExpression {
public Expression() {
this.answers = new ExpressionItemGroup(false);
variables = new ExpressionItemGroup(0D);
scores =new ExpressionItemGroup(0D);
scores = new ExpressionItemGroup(0D);
parser = new SpelExpressionParser();
context = new StandardEvaluationContext(this);
}
......@@ -151,18 +151,47 @@ public class Expression implements IExpression {
* @return une moyenne arithmétique
*/
public Double moyenne(Integer... operandes) {
if (ArrayUtils.isNotEmpty(operandes)) {
DescriptiveStatistics stats = new DescriptiveStatistics();
Stream.of(operandes).filter(Objects::nonNull).forEach(stats::addValue);
return stats.getMean();
if (ArrayUtils.isEmpty(operandes)) {
return 0D;
}
return 0D;
DescriptiveStatistics stats = new DescriptiveStatistics();
Stream.of(operandes).filter(Objects::nonNull).forEach(stats::addValue);
return stats.getMean();
}
/**
* Exclusive OR.
* @param op1
* @param op2
* Permet de réaliser une moyenne. Cette méthode peut être appelée depuis une expression avec cette syntaxe :
* {@code moyenne(scores[Q1], scores[Q2])}.
* Ne sont compatbilisées que les questions ayant une réponse dans {@link #answers} et ayant un score (même égal à zéro).
* Les autres questions ne sont pas compatbilisées dans le calcul du score.
*
* @param questionsReferences
* un tableau de références de questions
* @return une moyenne arithmétique
*/
public Double moyenneQuestions(String... questionsReferences) {
if (ArrayUtils.isEmpty(questionsReferences)) {
return 0D;
}
//@formatter:off
final List<Double> questionsScores = Stream.of(questionsReferences)
.filter(answers.keySet()::contains)
.map(this.scores::get)
.filter(Objects::nonNull)
.collect(Collectors.toList());
//@formatter:on
if (questionsScores.isEmpty()) {
return 0D;
}
final DescriptiveStatistics stats = new DescriptiveStatistics();
questionsScores.forEach(stats::addValue);
return stats.getMean();
}
/**
* Ou exclusif.
* @param op1 opérande 1
* @param op2 opérande 2
* @return
*/
public boolean xor(Boolean op1, Boolean op2) {
......@@ -256,7 +285,7 @@ public class Expression implements IExpression {
private void evaluate(VariableDTO variable) {
try {
final Double variableValue = evaluate(variable.getExpression(), Double.class);
addVariable(variable.getReference(), variableValue == null ? 0d : variableValue);
addVariable(variable.getReference(), variableValue == null ? 0D : variableValue);
} catch (ExpressionException e) {
LOGGER.error("Erreur à l'évaluation de l'expression {}", variable.getExpression(), e);
}
......
......@@ -50,6 +50,35 @@ class ExpressionTest extends AbstractTest {
assertEquals(12, expression.moyenne(10, 14));
}
@Test
void moyenQuestionAvecQuestion(){
final Expression expression = new Expression();
expression.addAnswer("Q1_R1", true);
expression.addQuestionScore("Q1_R1", 10D);
expression.addAnswer("Q2_R2", true);
expression.addQuestionScore("Q2_R2", 20D);
assertEquals(15D, expression.moyenneQuestions("Q1_R1", "Q2_R2"));
}
@Test
void moyenQuestionAvecQuestionNonRepondue() {
final Expression expression = new Expression();
expression.addAnswer("Q1_R1", true);
expression.addQuestionScore("Q1_R1", 10D);
assertEquals(10D, expression.moyenneQuestions("Q1_R1", "Q1_R2"));
}
@Test
void moyenQuestionSansQuestions() {
final Expression expression = new Expression();
assertEquals(0D, expression.moyenneQuestions());
}
@Test
void moyenQuestionAvecQuestionSansScore() {
final Expression expression = new Expression();
expression.addAnswer("Q1_R1", false);
assertEquals(0D, expression.moyenneQuestions("Q1_R1"));
}
@Test
void evaluate() {
final Expression expression = new Expression();
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Veuillez vous inscrire ou vous pour commenter