diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java index 440333c442a63eb4c1c2338532a4a9233ac1ed2f..d77d68fc5868ffcccc6e948e73fc72b250dd4723 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/FileElementImpl.java @@ -182,7 +182,7 @@ public class FileElementImpl extends FormItemImpl previewEl.setCropSelectionEnabled(cropSelectionEnabled); previewEl.setMaxWithAndHeightToFitWithin(300, 200); previewEl.setVisible(true); - } else { + } else if(previewEl != null) { previewEl.setVisible(false); } // Mark associated component dirty, that it gets rerendered diff --git a/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java b/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java index d9373778750c9e7884a1474bfdb7888422170c3b..5019fd743161c7b18452832e9448ceb969defb24 100644 --- a/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java +++ b/src/test/java/org/olat/selenium/ImsQTI21EditorTest.java @@ -140,7 +140,7 @@ public class ImsQTI21EditorTest extends Deployments { .saveAnswer() .answerMultipleChoice("Deutschland", "Brasilien", "S\u00FCdafrika") .saveAnswer() - .answerSingleChoice("Italien") + .answerSingleChoiceWithParagraph("Italien") .saveAnswer() .answerCorrectKPrim("Deutschland", "Uruguay") .answerIncorrectKPrim("Frankreich", "Spanien") @@ -355,17 +355,17 @@ public class ImsQTI21EditorTest extends Deployments { .getQTI12Page(ryomouBrowser); ryomouQtiPage .assertOnAssessmentItem() - .answerSingleChoice("Falsch") + .answerSingleChoiceWithParagraph("Falsch") .saveAnswer() .assertFeedback("Incorrect") .assertCorrectSolution("Correct solution") .hint() .assertFeedback("Hint") - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .assertFeedback("Correct feedback") .nextAnswer() - .answerSingleChoice("Almost") + .answerSingleChoiceWithParagraph("Almost") .saveAnswer() .assertCorrectSolution("Correct solution") .assertFeedback("Incorrect") @@ -431,14 +431,14 @@ public class ImsQTI21EditorTest extends Deployments { qtiPage .clickToolbarBack() .assertOnAssessmentItem() - .answerSingleChoice("Falsch") + .answerSingleChoiceWithParagraph("Falsch") .saveAnswer() .assertFeedback("Incorrect") - .answerSingleChoice("Faux") + .answerSingleChoiceWithParagraph("Faux") .saveAnswer() .assertFeedback("Incorrect") .assertFeedback("Attempts") - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .assertNoFeedback() .endTest(); @@ -3176,7 +3176,7 @@ public class ImsQTI21EditorTest extends Deployments { ryomouQtiPage .assertOnAssessmentItem() .assertHiddenSection() - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .answerMultipleChoice("OkToo") .answerMultipleChoice("Correct") @@ -3327,7 +3327,7 @@ public class ImsQTI21EditorTest extends Deployments { ryomouQtiPage .assertOnAssessmentItem() .assertHiddenSection() - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .answerMultipleChoice("Ok") .answerMultipleChoice("Correct") @@ -3360,7 +3360,7 @@ public class ImsQTI21EditorTest extends Deployments { asukaQtiPage .assertOnAssessmentItem() .assertHiddenSection() - .answerSingleChoice("Wrong") + .answerSingleChoiceWithParagraph("Wrong") .saveAnswer() .answerMultipleChoice("Falsch") .answerMultipleChoice("Faux") @@ -3392,7 +3392,7 @@ public class ImsQTI21EditorTest extends Deployments { reiQtiPage .assertOnAssessmentItem() .assertHiddenSection() - .answerSingleChoice("Faux") + .answerSingleChoiceWithParagraph("Faux") .saveAnswer() .answerMultipleChoice("Ok") .answerMultipleChoice("Correct") diff --git a/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java b/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java index 781d4edff6a3977fce2d058b0575f425856f8a86..74fec822329f5277f79a6a3b9c3a550e85c75140 100644 --- a/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java +++ b/src/test/java/org/olat/selenium/ImsQTI21InteractionsTest.java @@ -343,18 +343,18 @@ public class ImsQTI21InteractionsTest extends Deployments { .assertOnAssessmentItem() .hint() .assertFeedbackText("Tony lives in the United Kingdom") - .answerSingleChoice("Tony") + .answerSingleChoiceWithParagraph("Tony") .saveAnswer() .assertFeedbackText("No, the correct answer is Vicente Fox") .assertFeedbackInline("No, he is the Prime Minister of England.") .assertNoFeedbackText("Tony lives in the United Kingdom") - .answerSingleChoice("George") + .answerSingleChoiceWithParagraph("George") .saveAnswer() .assertFeedbackText("No, the correct answer is Vicente Fox") .assertFeedbackInline("No, he is the President of the USA.") .assertNoFeedbackText("Tony lives in the United Kingdom") .assertNoFeedbackInline("No, he is the Prime Minister of England.") - .answerSingleChoice("Vicente") + .answerSingleChoiceWithParagraph("Vicente") .saveAnswer() .assertFeedbackText("Yes, that is correct") .assertNoFeedbackText("Tony lives in the United Kingdom") @@ -683,5 +683,58 @@ public class ImsQTI21InteractionsTest extends Deployments { .assertOnAssessmentResults() .assertOnAssessmentItemScore("Richard III", 3); } + + /** + * This is an assessment item with severals + * different interactions. + * + * @param authorLoginPage + * @throws IOException + * @throws URISyntaxException + */ + @Test + @RunAsClient + public void qti21MultipleInput(@InitialPage LoginPage authorLoginPage) + throws IOException, URISyntaxException { + UserVO author = new UserRestClient(deploymentUrl).createAuthor(); + authorLoginPage.loginAs(author.getLogin(), author.getPassword()); + + //upload a test + String qtiTestTitle = "Gap match QTI 2.1 " + UUID.randomUUID(); + URL qtiTestUrl = JunitTestHelper.class.getResource("file_resources/qti21/simple_QTI_21_multi-input.zip"); + File qtiTestFile = new File(qtiTestUrl.toURI()); + navBar + .openAuthoringEnvironment() + .uploadResource(qtiTestTitle, qtiTestFile) + .clickToolbarRootCrumb(); + + QTI21Page qtiPage = QTI21Page + .getQTI12Page(browser); + qtiPage + .options() + .showResults(Boolean.TRUE, QTI21AssessmentResultsOptions.allOptions()) + .save(); + // to the test and spot it + qtiPage + .clickToolbarBack() + .assertOnAssessmentItem() + // the single choice + .answerSingleChoice("Some people are afraid of a woman") + // the inline choice + .answerInlineChoice("A2") + // the text entry + .answerGapText("wicked king", "RESPONSE3") + // the gap match + .answerGapMatch(1, "family", true) + .answerGapMatch(2, "castle", true) + .answerGapMatch(3, "horse", true) + .saveAnswer() + .endTest() + .closeTest(); + //check the results + qtiPage + .assertOnAssessmentResults() + .assertOnAssessmentItemScore("Legend", 4); + } } diff --git a/src/test/java/org/olat/selenium/ImsQTI21Test.java b/src/test/java/org/olat/selenium/ImsQTI21Test.java index 62cfbc4a287c5ae3fcee7be7f71c4bc6262559d3..a19b0bfb46cbff500674aa1e637110d8792501dc 100644 --- a/src/test/java/org/olat/selenium/ImsQTI21Test.java +++ b/src/test/java/org/olat/selenium/ImsQTI21Test.java @@ -98,12 +98,12 @@ public class ImsQTI21Test extends Deployments { .getQTI12Page(browser); qtiPage .assertOnAssessmentItem() - .answerSingleChoice("Incorrect response") + .answerSingleChoiceWithParagraph("Incorrect response") .saveAnswer() .assertOnAssessmentItem("Second question") .selectItem("First question") .assertOnAssessmentItem("First question") - .answerSingleChoice("Correct response") + .answerSingleChoiceWithParagraph("Correct response") .saveAnswer() .answerMultipleChoice("Correct response") .saveAnswer() @@ -140,10 +140,10 @@ public class ImsQTI21Test extends Deployments { .getQTI12Page(browser); qtiPage .assertOnAssessmentItem() - .answerSingleChoice("Wrong answer") + .answerSingleChoiceWithParagraph("Wrong answer") .saveAnswer() .assertFeedback("Oooops") - .answerSingleChoice("Correct answer") + .answerSingleChoiceWithParagraph("Correct answer") .saveAnswer() .assertFeedback("Well done") .nextAnswer() @@ -196,7 +196,7 @@ public class ImsQTI21Test extends Deployments { qtiPage .clickToolbarBack() .assertOnAssessmentItem() - .answerSingleChoice("Wrong answer") + .answerSingleChoiceWithParagraph("Wrong answer") .saveAnswer() .assertFeedback("Oooops") .nextAnswer() @@ -250,7 +250,7 @@ public class ImsQTI21Test extends Deployments { .startTestPart() .selectItem("First question") .assertOnAssessmentItem("First question") - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .assertOnAssessmentItem("Second question") .answerMultipleChoice("True") @@ -300,7 +300,7 @@ public class ImsQTI21Test extends Deployments { .startTestPart() .selectItem("First question") .assertOnAssessmentItem("First question") - .answerSingleChoice("Correct answer") + .answerSingleChoiceWithParagraph("Correct answer") .saveAnswer() .assertOnAssessmentItem("Second question") .answerMultipleChoice("Valid answer") @@ -308,9 +308,9 @@ public class ImsQTI21Test extends Deployments { .endTestPart() .selectItem("Third question") .assertOnAssessmentItem("Third question") - .answerSingleChoice("Right") + .answerSingleChoiceWithParagraph("Right") .saveAnswer() - .answerSingleChoice("Good") + .answerSingleChoiceWithParagraph("Good") .saveAnswer() .endTestPart() .assertOnAssessmentTestFeedback("Well done") @@ -347,10 +347,10 @@ public class ImsQTI21Test extends Deployments { //check simple time limit qtiPage .assertOnAssessmentItem("Single choice") - .answerSingleChoice("Correct answer") + .answerSingleChoiceWithParagraph("Correct answer") .saveAnswer() .assertOnAssessmentItem("Last choice") - .answerSingleChoice("True") + .answerSingleChoiceWithParagraph("True") .saveAnswer() .assertOnAssessmentTestTerminated(15); } @@ -390,10 +390,10 @@ public class ImsQTI21Test extends Deployments { qtiPage .clickToolbarBack() .assertOnAssessmentItem("Single choice") - .answerSingleChoice("Correct answer") + .answerSingleChoiceWithParagraph("Correct answer") .saveAnswer() .assertOnAssessmentItem("Last choice") - .answerSingleChoice("True") + .answerSingleChoiceWithParagraph("True") .saveAnswer() .assertOnAssessmentResults(15) .assertOnAssessmentTestPassed() @@ -478,7 +478,7 @@ public class ImsQTI21Test extends Deployments { .getQTI12Page(ryomouBrowser); userQtiPage .assertOnAssessmentItem("Single choice") - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .answerMultipleChoice("Correct") .saveAnswer() @@ -579,7 +579,7 @@ public class ImsQTI21Test extends Deployments { .getQTI12Page(browser); qtiPage .start() - .answerSingleChoice("Right") + .answerSingleChoiceWithParagraph("Right") .saveAnswer() .endTest() .assertOnCourseAttempts(1) @@ -665,7 +665,7 @@ public class ImsQTI21Test extends Deployments { .getQTI12Page(browser); qtiPage .start() - .answerSingleChoice("Right") + .answerSingleChoiceWithParagraph("Right") .saveAnswer() .endTest() .assertOnAssessmentResults() @@ -760,7 +760,7 @@ public class ImsQTI21Test extends Deployments { .getQTI12Page(browser); qtiPage .start() - .answerSingleChoice("Correct") + .answerSingleChoiceWithParagraph("Correct") .saveAnswer() .answerMultipleChoice("Correct") .saveAnswer() diff --git a/src/test/java/org/olat/selenium/page/qti/QTI21Page.java b/src/test/java/org/olat/selenium/page/qti/QTI21Page.java index 08e92e1e004c8bb8100484677097b23f2084086a..61c5523253f760a7a751f38ff00c56273a194918 100644 --- a/src/test/java/org/olat/selenium/page/qti/QTI21Page.java +++ b/src/test/java/org/olat/selenium/page/qti/QTI21Page.java @@ -105,7 +105,23 @@ public class QTI21Page { return this; } + /** + * Check the answer of a single choice. + * @param answer The answer + * @return Itself + */ public QTI21Page answerSingleChoice(String answer) { + By choiceBy = By.xpath("//tr[contains(@class,'choiceinteraction')][td[contains(@class,'choiceInteraction')][label[text()[contains(normalize-space(.),'" + answer + "')]]]]/td[contains(@class,'control')]/input[@type='radio']"); + browser.findElement(choiceBy).click(); + return this; + } + + /** + * Check the answer of a single choice. The answer is wrapped in a P tag. + * @param answer The answer + * @return Itself + */ + public QTI21Page answerSingleChoiceWithParagraph(String answer) { By choiceBy = By.xpath("//tr[contains(@class,'choiceinteraction')][td[contains(@class,'choiceInteraction')][label/p[contains(normalize-space(text()),'" + answer + "')]]]/td[contains(@class,'control')]/input[@type='radio']"); browser.findElement(choiceBy).click(); return this; diff --git a/src/test/java/org/olat/test/file_resources/qti21/simple_QTI_21_multi-input.zip b/src/test/java/org/olat/test/file_resources/qti21/simple_QTI_21_multi-input.zip new file mode 100644 index 0000000000000000000000000000000000000000..dd7ca2fff099938a1b4fd1a4b711f67045002fad Binary files /dev/null and b/src/test/java/org/olat/test/file_resources/qti21/simple_QTI_21_multi-input.zip differ