From 77adae4e07c2044660a255d49e585bb5be9da3b3 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 17 Jan 2020 10:10:35 +0100
Subject: [PATCH] OO-4474: better handle negative values in FIB

---
 .../xml/interactions/FIBAssessmentItemBuilder.java |  7 ++++++-
 .../ui/editor/interactions/FIBScoreController.java | 14 ++++++++------
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java
index 461ce4e571e..1bfa7136caa 100644
--- a/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java
+++ b/src/main/java/org/olat/ims/qti21/model/xml/interactions/FIBAssessmentItemBuilder.java
@@ -499,6 +499,11 @@ public class FIBAssessmentItemBuilder extends AssessmentItemBuilder {
 		this.scoreEvaluation = scoreEvaluation;
 	}
 	
+	/**
+	 * This method only applies to score per answer.
+	 * 
+	 * @return true if some variant hasn't the same score as the main response.
+	 */
 	public boolean alternativesWithSpecificScore() {
 		for(Map.Entry<String, AbstractEntry> entry:responseIdentifierToTextEntry.entrySet()) {
 			AbstractEntry e = entry.getValue();
@@ -508,7 +513,7 @@ public class FIBAssessmentItemBuilder extends AssessmentItemBuilder {
 				if(textEntry.getAlternatives() != null && !textEntry.getAlternatives().isEmpty()) {
 					for(TextEntryAlternative alternative:textEntry.getAlternatives()) {
 						double altScore = alternative.getScore();
-						if(altScore >= 0.0d && score != null && score.doubleValue() != altScore) {
+						if(score != null && score.doubleValue() != altScore) {
 							return true;
 						}
 					}
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java
index 48d06b47d9c..e7497eeedc0 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/FIBScoreController.java
@@ -285,7 +285,7 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem
 	
 	private FIBAlternativeWrapper createAlternativeWrapper(TextEntryAlternative alternative) {
 		String altPointElId = "points_" + counter++;
-		String altScoreStr = alternative.getScore() == -1.0d ? "" : Double.toString(alternative.getScore());
+		String altScoreStr = Double.toString(alternative.getScore());
 		TextElement altPointEl = uifactory.addTextElement(altPointElId, null, 5, altScoreStr, scoreCont);
 		altPointEl.setDisplaySize(5);
 		altPointEl.setEnabled(!restrictedEdit && !readOnly);
@@ -321,23 +321,25 @@ public class FIBScoreController extends AssessmentItemRefEditorController implem
 	}
 	
 	private void updateScoresUI() {
-		boolean perAnswer = assessmentModeEl.isSelected(1) || assessmentModeEl.isSelected(2);
-		scoreCont.setVisible(perAnswer);
-		scoreCont.contextPut("withAlternatives", Boolean.valueOf(assessmentModeEl.isSelected(2)));
-		if(perAnswer) {
+		boolean perAnswer = assessmentModeEl.isSelected(1);
+		boolean perAnswerAndVariants = assessmentModeEl.isSelected(2);
+		scoreCont.setVisible(perAnswer || perAnswerAndVariants);
+		scoreCont.contextPut("withAlternatives", Boolean.valueOf(perAnswerAndVariants));
+		if(perAnswer || perAnswerAndVariants) {
 			for(FIBEntryWrapper wrapper:wrappers) {
 				AbstractEntry entry = wrapper.getEntry();
 				Double points = entry.getScore();
 				if(points != null && points.doubleValue() == -1.0d) {//replace the all answers score
 					wrapper.getEntry().setScore(1.0d);
 					wrapper.getPointsEl().setValue("1.0");
+					points = Double.valueOf(1.0d);
 				}
 				
 				if(entry instanceof TextEntry && wrapper.getAlternatives() != null && !wrapper.getAlternatives().isEmpty()) {
 					for(FIBAlternativeWrapper alternativeWrapper:wrapper.getAlternatives()) {
 						TextEntryAlternative alternative = alternativeWrapper.getAlternative();
 						if(StringHelper.containsNonWhitespace(alternativeWrapper.getPointsEl().getValue())) {
-							if(points != null && points.doubleValue() >= 0.0d && alternative.getScore() == 1.0d) {
+							if(points != null && (alternative.getScore() == 1.0d || alternative.getScore() == -1.0d)) {
 								alternative.setScore(points.doubleValue());
 								alternativeWrapper.getPointsEl().setValue(points.toString());
 							}
-- 
GitLab