diff --git a/src/main/java/org/olat/modules/portfolio/ui/editor/AddElementsController.java b/src/main/java/org/olat/modules/portfolio/ui/editor/AddElementsController.java index 6df16b359333fa2478e4fdfac3f49863570c913c..3efaf7432f282b7533459203e07f8a5635d11a99 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/editor/AddElementsController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/editor/AddElementsController.java @@ -30,9 +30,6 @@ import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; -import org.olat.core.gui.translator.PackageTranslator; -import org.olat.core.util.Util; -import org.olat.modules.portfolio.ui.PageRunController; import org.olat.modules.portfolio.ui.editor.PageEditorController.EditorFragment; import org.olat.modules.portfolio.ui.editor.event.AddElementEvent; diff --git a/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilderTest.java b/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilderTest.java index 19d66eae0f726df614177f9d8bd235a5d2bbd3f5..77988627da67f955292ae09e3945e0a82c4344bf 100644 --- a/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilderTest.java +++ b/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemBuilderTest.java @@ -19,21 +19,51 @@ */ package org.olat.ims.qti21.model.xml; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.UUID; import org.junit.Assert; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.FileUtils; +import org.olat.core.util.WebappHelper; import org.olat.fileresource.types.ImsQTI21Resource.PathResourceLocator; +import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.EntryType; +import org.olat.ims.qti21.model.xml.interactions.HotspotAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; +import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.ExtendedTextInteraction; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.HotspotInteraction; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.TextEntryInteraction; +import uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet; +import uk.ac.ed.ph.jqtiplus.node.item.response.declaration.ResponseDeclaration; +import uk.ac.ed.ph.jqtiplus.provision.BadResourceException; import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader; import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer; +import uk.ac.ed.ph.jqtiplus.validation.ItemValidationResult; import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; /** @@ -42,17 +72,35 @@ import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ +@RunWith(Parameterized.class) public class AssessmentItemBuilderTest { - private final JqtiExtensionManager jqtiExtensionManager = new JqtiExtensionManager(); - private final QtiXmlReader qtiXmlReader = new QtiXmlReader(jqtiExtensionManager); - private final QtiSerializer qtiSerializer = new QtiSerializer(jqtiExtensionManager); + private static final OLog log = Tracing.createLoggerFor(AssessmentItemBuilderTest.class); + + @Parameters + public static Collection<Object[]> data() { + return Arrays.asList(new Object[][] { + { Boolean.TRUE }, + { Boolean.FALSE } + }); + } + + private Boolean build; + + public AssessmentItemBuilderTest(Boolean build) { + this.build = build; + } @Test public void findFeedbacks() throws URISyntaxException { URL itemUrl = AssessmentItemBuilderTest.class.getResource("assessment-item-single-choice-feedbacks.xml"); AssessmentItem assessmentItem = loadAssessmentItem(itemUrl); + + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); SingleChoiceAssessmentItemBuilder itemBuilder = new SingleChoiceAssessmentItemBuilder(assessmentItem, qtiSerializer); + if(build.booleanValue()) { + itemBuilder.build(); + } ModalFeedbackBuilder correctFeedback = itemBuilder.getCorrectFeedback(); Assert.assertNotNull(correctFeedback); @@ -61,10 +109,186 @@ public class AssessmentItemBuilderTest { ModalFeedbackBuilder incorrectFeedback = itemBuilder.getIncorrectFeedback(); Assert.assertNotNull(incorrectFeedback); Assert.assertTrue(incorrectFeedback.isIncorrectRule()); + } + + /** + * Check if a bare bone single choice created with our builder make a valid assessmentItem. + * + * @throws IOException + * @throws URISyntaxException + */ + @Test + public void buildAssessmentItem_singleChoice() throws IOException, URISyntaxException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + SingleChoiceAssessmentItemBuilder itemBuilder = new SingleChoiceAssessmentItemBuilder(qtiSerializer); + + if(build.booleanValue()) { + itemBuilder.build(); + } + AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); + + ItemValidationResult itemResult = serializeAndReload(assessmentItem); + + AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); + List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); + Assert.assertNotNull(interactions); + Assert.assertEquals(1, interactions.size()); + Assert.assertTrue(interactions.get(0) instanceof ChoiceInteraction); + } + + /** + * Check if a bare bone multiple choice created with our builder make a valid assessmentItem. + * + * @throws IOException + * @throws URISyntaxException + */ + @Test + public void buildAssessmentItem_multipleChoice() throws IOException, URISyntaxException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + MultipleChoiceAssessmentItemBuilder itemBuilder = new MultipleChoiceAssessmentItemBuilder(qtiSerializer); + if(build.booleanValue()) { + itemBuilder.build(); + } + + AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); + ItemValidationResult itemResult = serializeAndReload(assessmentItem); + + AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); + List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); + Assert.assertNotNull(interactions); + Assert.assertEquals(1, interactions.size()); + Assert.assertTrue(interactions.get(0) instanceof ChoiceInteraction); + } + + @Test + public void buildAssessmentItem_essay() throws IOException, URISyntaxException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + EssayAssessmentItemBuilder itemBuilder = new EssayAssessmentItemBuilder(qtiSerializer); + if(build.booleanValue()) { + itemBuilder.build(); + } + + AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); + ItemValidationResult itemResult = serializeAndReload(assessmentItem); + + AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); + List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); + Assert.assertNotNull(interactions); + Assert.assertEquals(1, interactions.size()); + Assert.assertTrue(interactions.get(0) instanceof ExtendedTextInteraction); + } + + @Test + public void buildAssessmentItem_gap() throws IOException, URISyntaxException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + FIBAssessmentItemBuilder itemBuilder = new FIBAssessmentItemBuilder(EntryType.text, qtiSerializer); + if(build.booleanValue()) { + itemBuilder.build(); + } + + AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); + ItemValidationResult itemResult = serializeAndReload(assessmentItem); + + AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); + List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); + Assert.assertNotNull(interactions); + Assert.assertEquals(1, interactions.size()); + Assert.assertTrue(interactions.get(0) instanceof TextEntryInteraction); + TextEntryInteraction interaction = (TextEntryInteraction)interactions.get(0); + Assert.assertNotNull(interaction.getResponseIdentifier()); + ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier()); + Assert.assertNotNull(responseDeclaration); + } + + @Test + public void buildAssessmentItem_hotspot() throws IOException, URISyntaxException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + HotspotAssessmentItemBuilder itemBuilder = new HotspotAssessmentItemBuilder(qtiSerializer); + if(build.booleanValue()) { + itemBuilder.build(); + } + + AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); + ItemValidationResult itemResult = serializeAndReload(assessmentItem); + + AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); + List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); + Assert.assertNotNull(interactions); + Assert.assertEquals(1, interactions.size()); + Assert.assertTrue(interactions.get(0) instanceof HotspotInteraction); + HotspotInteraction interaction = (HotspotInteraction)interactions.get(0); + Assert.assertNotNull(interaction.getResponseIdentifier()); + ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier()); + Assert.assertNotNull(responseDeclaration); + } + + @Test + public void buildAssessmentItem_kprim() throws IOException, URISyntaxException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + KPrimAssessmentItemBuilder itemBuilder = new KPrimAssessmentItemBuilder(qtiSerializer); + if(build.booleanValue()) { + itemBuilder.build(); + } + AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem(); + ItemValidationResult itemResult = serializeAndReload(singleChoiceItem); + + AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); + List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); + Assert.assertNotNull(interactions); + Assert.assertEquals(1, interactions.size()); + Assert.assertTrue(interactions.get(0) instanceof MatchInteraction); + MatchInteraction interaction = (MatchInteraction)interactions.get(0); + Assert.assertNotNull(interaction.getResponseIdentifier()); + ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier()); + Assert.assertNotNull(responseDeclaration); + + Assert.assertEquals(2, interaction.getSimpleMatchSets().size()); + SimpleMatchSet matchSet = interaction.getSimpleMatchSets().get(0); + Assert.assertEquals(4, matchSet.getSimpleAssociableChoices().size()); + SimpleMatchSet correctWrongSet = interaction.getSimpleMatchSets().get(1); + Assert.assertEquals(2, correctWrongSet.getSimpleAssociableChoices().size()); + } + + /** + * The method serialize as xml the assessmentItem, load it, validate it and return the itemResult. + * + * @param assessmentItem + * @return + * @throws IOException + */ + private ItemValidationResult serializeAndReload(AssessmentItem assessmentItem) throws IOException { + QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); + File tmpDir = new File(WebappHelper.getTmpDir(), "itembuilder" + UUID.randomUUID()); + tmpDir.mkdirs(); + + File outputFile = new File(tmpDir, "sc_item.xml"); + try(FileOutputStream out = new FileOutputStream(outputFile)) { + qtiSerializer.serializeJqtiObject(assessmentItem, out); + } catch(Exception e) { + log.error("", e); + } + + QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); + ResourceLocator fileResourceLocator = new PathResourceLocator(outputFile.toPath()); + AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); + ItemValidationResult itemResult = assessmentObjectXmlLoader.loadResolveAndValidateItem(outputFile.toURI()); + + BadResourceException e = itemResult.getResolvedAssessmentItem().getItemLookup().getBadResourceException(); + if(e != null) { + StringBuilder err = new StringBuilder(); + BadRessourceHelper.extractMessage(e, err); + log.error(err.toString()); + } + + FileUtils.deleteDirsAndFiles(tmpDir.toPath()); + Assert.assertFalse("Has errors", (itemResult.getModelValidationErrors().size() > 0)); + + return itemResult; } private AssessmentItem loadAssessmentItem(URL itemUrl) throws URISyntaxException { + QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); ResourceLocator fileResourceLocator = new PathResourceLocator(Paths.get(itemUrl.toURI())); AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); ResolvedAssessmentItem item = assessmentObjectXmlLoader.loadAndResolveAssessmentItem(itemUrl.toURI()); diff --git a/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemPackageTest.java b/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemPackageTest.java index 97bb0ca12f5b730e7a349f06917532703b59864e..68be1702ebe1571985241b92695d3fd0b2469526 100644 --- a/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemPackageTest.java +++ b/src/test/java/org/olat/ims/qti21/model/xml/AssessmentItemPackageTest.java @@ -19,45 +19,20 @@ */ package org.olat.ims.qti21.model.xml; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; -import java.nio.file.Files; import java.nio.file.Paths; -import java.util.List; import org.junit.Assert; import org.junit.Test; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.core.util.FileUtils; import org.olat.fileresource.types.ImsQTI21Resource.PathResourceLocator; -import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder; -import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder; -import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder.EntryType; -import org.olat.ims.qti21.model.xml.interactions.HotspotAssessmentItemBuilder; -import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder; -import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder; -import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder; import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.ExtendedTextInteraction; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.HotspotInteraction; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.MatchInteraction; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.TextEntryInteraction; -import uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleMatchSet; -import uk.ac.ed.ph.jqtiplus.node.item.response.declaration.ResponseDeclaration; -import uk.ac.ed.ph.jqtiplus.provision.BadResourceException; import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader; import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer; -import uk.ac.ed.ph.jqtiplus.validation.ItemValidationResult; import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; /** @@ -68,8 +43,6 @@ import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; */ public class AssessmentItemPackageTest { - private static final OLog log = Tracing.createLoggerFor(AssessmentItemPackageTest.class); - @Test public void loadAssessmentItem() throws URISyntaxException { QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); @@ -86,176 +59,5 @@ public class AssessmentItemPackageTest { Assert.assertNotNull(assessmentItem); qtiSerializer.serializeJqtiObject(assessmentItem, System.out); - } - - /** - * Check if a bare bone single choice created with our builder make a valid assessmentItem. - * - * @throws IOException - * @throws URISyntaxException - */ - @Test - public void buildAssessmentItem_singleChoice() throws IOException, URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - SingleChoiceAssessmentItemBuilder itemBuilder = new SingleChoiceAssessmentItemBuilder(qtiSerializer); - - itemBuilder.build(); - AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem(); - - ItemValidationResult itemResult = serializeAndReload(singleChoiceItem); - - AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); - List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); - Assert.assertNotNull(interactions); - Assert.assertEquals(1, interactions.size()); - Assert.assertTrue(interactions.get(0) instanceof ChoiceInteraction); - } - - /** - * Check if a bare bone multiple choice created with our builder make a valid assessmentItem. - * - * @throws IOException - * @throws URISyntaxException - */ - @Test - public void buildAssessmentItem_multipleChoice() throws IOException, URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - MultipleChoiceAssessmentItemBuilder itemBuilder = new MultipleChoiceAssessmentItemBuilder(qtiSerializer); - - itemBuilder.build(); - AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem(); - - ItemValidationResult itemResult = serializeAndReload(singleChoiceItem); - - AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); - List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); - Assert.assertNotNull(interactions); - Assert.assertEquals(1, interactions.size()); - Assert.assertTrue(interactions.get(0) instanceof ChoiceInteraction); - } - - @Test - public void buildAssessmentItem_essay() throws IOException, URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - EssayAssessmentItemBuilder itemBuilder = new EssayAssessmentItemBuilder(qtiSerializer); - - itemBuilder.build(); - AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem(); - - ItemValidationResult itemResult = serializeAndReload(singleChoiceItem); - - AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); - List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); - Assert.assertNotNull(interactions); - Assert.assertEquals(1, interactions.size()); - Assert.assertTrue(interactions.get(0) instanceof ExtendedTextInteraction); - } - - @Test - public void buildAssessmentItem_gap() throws IOException, URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - FIBAssessmentItemBuilder itemBuilder = new FIBAssessmentItemBuilder(EntryType.text, qtiSerializer); - - itemBuilder.build(); - AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem(); - - ItemValidationResult itemResult = serializeAndReload(singleChoiceItem); - - AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); - List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); - Assert.assertNotNull(interactions); - Assert.assertEquals(1, interactions.size()); - Assert.assertTrue(interactions.get(0) instanceof TextEntryInteraction); - TextEntryInteraction interaction = (TextEntryInteraction)interactions.get(0); - Assert.assertNotNull(interaction.getResponseIdentifier()); - ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier()); - Assert.assertNotNull(responseDeclaration); - } - - @Test - public void buildAssessmentItem_hotspot() throws IOException, URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - HotspotAssessmentItemBuilder itemBuilder = new HotspotAssessmentItemBuilder(qtiSerializer); - - itemBuilder.build(); - AssessmentItem assessmentItem = itemBuilder.getAssessmentItem(); - - ItemValidationResult itemResult = serializeAndReload(assessmentItem); - - AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); - List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); - Assert.assertNotNull(interactions); - Assert.assertEquals(1, interactions.size()); - Assert.assertTrue(interactions.get(0) instanceof HotspotInteraction); - HotspotInteraction interaction = (HotspotInteraction)interactions.get(0); - Assert.assertNotNull(interaction.getResponseIdentifier()); - ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier()); - Assert.assertNotNull(responseDeclaration); - } - - @Test - public void buildAssessmentItem_kprim() throws IOException, URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - KPrimAssessmentItemBuilder itemBuilder = new KPrimAssessmentItemBuilder(qtiSerializer); - itemBuilder.build(); - - AssessmentItem singleChoiceItem = itemBuilder.getAssessmentItem(); - ItemValidationResult itemResult = serializeAndReload(singleChoiceItem); - - AssessmentItem reloadedItem = itemResult.getResolvedAssessmentItem().getItemLookup().extractIfSuccessful(); - List<Interaction> interactions = reloadedItem.getItemBody().findInteractions(); - Assert.assertNotNull(interactions); - Assert.assertEquals(1, interactions.size()); - Assert.assertTrue(interactions.get(0) instanceof MatchInteraction); - MatchInteraction interaction = (MatchInteraction)interactions.get(0); - Assert.assertNotNull(interaction.getResponseIdentifier()); - ResponseDeclaration responseDeclaration = reloadedItem.getResponseDeclaration(interaction.getResponseIdentifier()); - Assert.assertNotNull(responseDeclaration); - - Assert.assertEquals(2, interaction.getSimpleMatchSets().size()); - SimpleMatchSet matchSet = interaction.getSimpleMatchSets().get(0); - Assert.assertEquals(4, matchSet.getSimpleAssociableChoices().size()); - SimpleMatchSet correctWrongSet = interaction.getSimpleMatchSets().get(1); - Assert.assertEquals(2, correctWrongSet.getSimpleAssociableChoices().size()); - } - - /** - * The method serialize as xml the assessmentItem, load it, validate it and return the itemResult. - * - * @param assessmentItem - * @return - * @throws IOException - */ - private ItemValidationResult serializeAndReload(AssessmentItem assessmentItem) throws IOException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - File tmpDir = Files.createTempDirectory("itembuilder").toFile(); - if(!tmpDir.exists()) { - tmpDir.mkdirs(); - } - - File outputFile = new File(tmpDir, "sc_item.xml"); - try(FileOutputStream out = new FileOutputStream(outputFile)) { - qtiSerializer.serializeJqtiObject(assessmentItem, out); - } catch(Exception e) { - log.error("", e); - } - - QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); - ResourceLocator fileResourceLocator = new PathResourceLocator(outputFile.toPath()); - AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); - ItemValidationResult itemResult = assessmentObjectXmlLoader.loadResolveAndValidateItem(outputFile.toURI()); - - BadResourceException e = itemResult.getResolvedAssessmentItem().getItemLookup().getBadResourceException(); - if(e != null) { - StringBuilder err = new StringBuilder(); - BadRessourceHelper.extractMessage(e, err); - log.error(err.toString()); - System.out.println(err); - } - - FileUtils.deleteDirsAndFiles(tmpDir.toPath()); - Assert.assertFalse("Has errors", (itemResult.getModelValidationErrors().size() > 0)); - - return itemResult; } } diff --git a/src/test/java/org/olat/ims/qti21/model/xml/AssessmentTestPackageTest.java b/src/test/java/org/olat/ims/qti21/model/xml/AssessmentTestPackageTest.java deleted file mode 100644 index 5bf058618e8c2510c30c00f9dc23bc238cee7bfa..0000000000000000000000000000000000000000 --- a/src/test/java/org/olat/ims/qti21/model/xml/AssessmentTestPackageTest.java +++ /dev/null @@ -1,202 +0,0 @@ -/** - * <a href="http://www.openolat.org"> - * OpenOLAT - Online Learning and Training</a><br> - * <p> - * Licensed under the Apache License, Version 2.0 (the "License"); <br> - * you may not use this file except in compliance with the License.<br> - * You may obtain a copy of the License at the - * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> - * <p> - * Unless required by applicable law or agreed to in writing,<br> - * software distributed under the License is distributed on an "AS IS" BASIS, <br> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> - * See the License for the specific language governing permissions and <br> - * limitations under the License. - * <p> - * Initial code contributed and copyrighted by<br> - * frentix GmbH, http://www.frentix.com - * <p> - */ -package org.olat.ims.qti21.model.xml; - -import java.io.File; -import java.io.FileOutputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Collections; -import java.util.List; -import java.util.UUID; - -import org.junit.Assert; -import org.junit.Test; -import org.olat.core.logging.OLog; -import org.olat.core.logging.Tracing; -import org.olat.fileresource.types.ImsQTI21Resource.PathResourceLocator; - -import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; -import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock; -import uk.ac.ed.ph.jqtiplus.node.expression.operator.Sum; -import uk.ac.ed.ph.jqtiplus.node.expression.outcome.TestVariables; -import uk.ac.ed.ph.jqtiplus.node.outcome.declaration.OutcomeDeclaration; -import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef; -import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection; -import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest; -import uk.ac.ed.ph.jqtiplus.node.test.ItemSessionControl; -import uk.ac.ed.ph.jqtiplus.node.test.NavigationMode; -import uk.ac.ed.ph.jqtiplus.node.test.Ordering; -import uk.ac.ed.ph.jqtiplus.node.test.SubmissionMode; -import uk.ac.ed.ph.jqtiplus.node.test.TestFeedback; -import uk.ac.ed.ph.jqtiplus.node.test.TestPart; -import uk.ac.ed.ph.jqtiplus.node.test.TimeLimits; -import uk.ac.ed.ph.jqtiplus.node.test.View; -import uk.ac.ed.ph.jqtiplus.node.test.outcome.processing.OutcomeProcessing; -import uk.ac.ed.ph.jqtiplus.node.test.outcome.processing.SetOutcomeValue; -import uk.ac.ed.ph.jqtiplus.notification.Notification; -import uk.ac.ed.ph.jqtiplus.provision.BadResourceException; -import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader; -import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader; -import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer; -import uk.ac.ed.ph.jqtiplus.types.Identifier; -import uk.ac.ed.ph.jqtiplus.validation.TestValidationResult; -import uk.ac.ed.ph.jqtiplus.value.BaseType; -import uk.ac.ed.ph.jqtiplus.value.Cardinality; -import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; - -/** - * - * Initial date: 04.06.2015<br> - * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com - * - */ -public class AssessmentTestPackageTest { - - private static final OLog log = Tracing.createLoggerFor(AssessmentTestPackageTest.class); - - - protected AssessmentTest createAssessmentTest(File itemFile) throws URISyntaxException { - - AssessmentTest assessmentTest = new AssessmentTest(); - assessmentTest.setIdentifier("id" + UUID.randomUUID()); - assessmentTest.setTitle("My test"); - assessmentTest.setToolName("OpenOLAT"); - assessmentTest.setToolVersion("11.0"); - - //outcome declarations - OutcomeDeclaration scoreOutcomeDeclaration = new OutcomeDeclaration(assessmentTest); - scoreOutcomeDeclaration.setIdentifier(Identifier.parseString("SCORE")); - scoreOutcomeDeclaration.setCardinality(Cardinality.SINGLE); - scoreOutcomeDeclaration.setBaseType(BaseType.FLOAT); - assessmentTest.getOutcomeDeclarations().add(scoreOutcomeDeclaration); - - - //time limits - TimeLimits timeLimits = new TimeLimits(assessmentTest); - timeLimits.setAllowLateSubmission(Boolean.FALSE); - timeLimits.setMinimum(0.0d); - timeLimits.setMaximum(1800.0); - assessmentTest.setTimeLimits(timeLimits); - - //test parts - TestPart part = new TestPart(assessmentTest); - part.setIdentifier(Identifier.parseString("id" + UUID.randomUUID())); - part.setNavigationMode(NavigationMode.NONLINEAR); - part.setSubmissionMode(SubmissionMode.INDIVIDUAL); - assessmentTest.getTestParts().add(part); - - //part -> item session control - ItemSessionControl itemSessionControl = new ItemSessionControl(part); - itemSessionControl.setAllowComment(Boolean.TRUE); - itemSessionControl.setAllowReview(Boolean.TRUE); - itemSessionControl.setAllowSkipping(Boolean.TRUE); - itemSessionControl.setMaxAttempts(12); - itemSessionControl.setShowFeedback(Boolean.TRUE); - itemSessionControl.setShowSolution(Boolean.TRUE); - part.setItemSessionControl(itemSessionControl); - - // section - AssessmentSection section = new AssessmentSection(part); - section.setFixed(Boolean.TRUE); - section.setVisible(Boolean.TRUE); - section.setTitle("My section"); - section.setIdentifier(Identifier.parseString("id" + UUID.randomUUID())); - part.getAssessmentSections().add(section); - - Ordering ordering = new Ordering(section); - ordering.setShuffle(false); - section.setOrdering(ordering); - - RubricBlock rubrickBlock = new RubricBlock(section); - rubrickBlock.setViews(Collections.singletonList(View.CANDIDATE)); - section.getRubricBlocks().add(rubrickBlock); - - AssessmentItemRef item = new AssessmentItemRef(section); - item.setIdentifier(Identifier.parseString("id" + UUID.randomUUID())); - item.setHref(new URI(itemFile.getName())); - section.getSectionParts().add(item); - - //outcome processing - OutcomeProcessing outcomeProcessing = new OutcomeProcessing(assessmentTest); - assessmentTest.setOutcomeProcessing(outcomeProcessing); - - SetOutcomeValue outcomeRule = new SetOutcomeValue(outcomeProcessing); - outcomeRule.setIdentifier(Identifier.parseString("SCORE")); - - Sum sum = new Sum(outcomeRule); - outcomeRule.getExpressions().add(sum); - - TestVariables testVariables = new TestVariables(sum); - testVariables.setVariableIdentifier(Identifier.parseString("SCORE")); - sum.getExpressions().add(testVariables); - - - outcomeProcessing.getOutcomeRules().add(outcomeRule); - - //feedbacks - List<TestFeedback> testFeedbacks = assessmentTest.getTestFeedbacks(); - TestFeedback testFeedback = new TestFeedback(assessmentTest); - //testFeedback. - - return assessmentTest; - } - - - @Test - public void buildAssessmentTest() throws URISyntaxException { - QtiSerializer qtiSerializer = new QtiSerializer(new JqtiExtensionManager()); - - File fullPackage = new File("/Users/srosse/Desktop/QTI/Full/"); - File itemFile = new File(fullPackage, "generated_item.xml"); - AssessmentTest assessmentTest = createAssessmentTest(itemFile); - - qtiSerializer.serializeJqtiObject(assessmentTest, System.out); - System.out.println("\n-------------"); - - File outputFile = new File("/Users/srosse/Desktop/QTI/generated_test.xml"); - if(outputFile.exists()) { - outputFile.delete(); - outputFile = new File("/Users/srosse/Desktop/QTI/generated_test.xml"); - } - try(FileOutputStream out = new FileOutputStream(outputFile)) { - qtiSerializer.serializeJqtiObject(assessmentTest, out); - } catch(Exception e) { - log.error("", e); - } - - QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); - ResourceLocator fileResourceLocator = new PathResourceLocator(outputFile.toPath()); - AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); - TestValidationResult test = assessmentObjectXmlLoader.loadResolveAndValidateTest(outputFile.toURI()); - - System.out.println("Has errors: " + (test.getModelValidationErrors().size() > 0)); - for(Notification notification: test.getModelValidationErrors()) { - System.out.println(notification.getQtiNode() + " : " + notification.getMessage()); - } - - BadResourceException e = test.getResolvedAssessmentTest().getTestLookup().getBadResourceException(); - StringBuilder out = new StringBuilder(); - BadRessourceHelper.extractMessage(e, out); - log.info(out.toString()); - - Assert.assertTrue(test.getModelValidationErrors().isEmpty()); - } -} \ No newline at end of file diff --git a/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java b/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java index a216b08aee35b3fa9e3b41d49716e164f397efb2..1dad45bbb670d037a9e0a98863f2f39cbb72a852 100644 --- a/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java +++ b/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java @@ -22,12 +22,13 @@ package org.olat.ims.qti21.model.xml; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.nio.file.Files; import java.util.List; +import java.util.UUID; import org.junit.Assert; import org.junit.Test; import org.olat.core.util.FileUtils; +import org.olat.core.util.WebappHelper; import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ContentPackageResource; import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ImsManifestException; @@ -51,10 +52,10 @@ public class ManifestPackageTest { Assert.assertNotNull(testFilename); Assert.assertNotNull(itemFilename); - File tmpDir = Files.createTempDirectory("manifests").toFile(); - if(!tmpDir.exists()) { - tmpDir.mkdirs(); - } + File tmpDir = new File(WebappHelper.getTmpDir(), "itembuilder" + UUID.randomUUID()); + tmpDir.mkdirs(); + + File manifestFile = new File(tmpDir, "imsmanifest.xml"); FileOutputStream out = new FileOutputStream(manifestFile); @@ -71,7 +72,6 @@ public class ManifestPackageTest { ManifestBuilder reloadManifest = ManifestBuilder.read(manifestFile); Assert.assertNotNull(reloadManifest); - FileUtils.deleteDirsAndFiles(tmpDir.toPath()); } } diff --git a/src/test/java/org/olat/ims/qti21/model/xml/OnyxToQtiAssessementItemsTest.java b/src/test/java/org/olat/ims/qti21/model/xml/OnyxToQtiAssessementItemsTest.java index 505e19da906a4c5654d6043d477174ef8dff02ab..d4bb9d0c63050ab20d20cfc418c94a7b3772a83e 100644 --- a/src/test/java/org/olat/ims/qti21/model/xml/OnyxToQtiAssessementItemsTest.java +++ b/src/test/java/org/olat/ims/qti21/model/xml/OnyxToQtiAssessementItemsTest.java @@ -24,10 +24,11 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.net.URISyntaxException; import java.net.URL; -import java.nio.file.Files; import java.util.Arrays; import java.util.Collection; +import java.util.UUID; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -44,6 +45,7 @@ import org.junit.runners.Parameterized.Parameters; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; +import org.olat.core.util.WebappHelper; import org.olat.fileresource.types.ImsQTI21Resource.PathResourceLocator; import org.xml.sax.SAXException; @@ -84,14 +86,12 @@ public class OnyxToQtiAssessementItemsTest { @Test public void fixItem() - throws IOException, XMLStreamException, SAXException, ParserConfigurationException { + throws IOException, XMLStreamException, SAXException, ParserConfigurationException, URISyntaxException { URL xmlUrl = OnyxToQtiAssessementItemsTest.class.getResource(xmlFilename); - File xmlFile = new File(xmlUrl.getFile()); - File tmpDir = Files.createTempDirectory("onyx").toFile(); - if(!tmpDir.exists()) { - tmpDir.mkdirs(); - } - + File xmlFile = new File(xmlUrl.toURI()); + File tmpDir = new File(WebappHelper.getTmpDir(), "onyx" + UUID.randomUUID()); + tmpDir.mkdirs(); + File outFile = new File(tmpDir, "text.xml"); OutputStream byteOut = new FileOutputStream(outFile); OutputStreamWriter out = new OutputStreamWriter(byteOut, "UTF8"); @@ -107,7 +107,6 @@ public class OnyxToQtiAssessementItemsTest { out.flush(); byteOut.flush(); - QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); ResourceLocator fileResourceLocator = new PathResourceLocator(outFile.toPath()); diff --git a/src/test/java/org/olat/ims/qti21/pool/QTI12To21ConverterTest.java b/src/test/java/org/olat/ims/qti21/pool/QTI12To21ConverterTest.java index f8887b9968f73d12e4f23f16b1134a3569e31c6d..4c2c0fb5152c163830a1bf8d21a557b46f851b16 100644 --- a/src/test/java/org/olat/ims/qti21/pool/QTI12To21ConverterTest.java +++ b/src/test/java/org/olat/ims/qti21/pool/QTI12To21ConverterTest.java @@ -20,19 +20,39 @@ package org.olat.ims.qti21.pool; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.util.Locale; +import java.util.UUID; import org.dom4j.Document; +import org.jcodec.common.Assert; import org.junit.Test; import org.olat.core.logging.OLog; import org.olat.core.logging.Tracing; +import org.olat.core.util.FileUtils; +import org.olat.core.util.WebappHelper; import org.olat.core.util.xml.XMLParser; +import org.olat.fileresource.types.ImsQTI21Resource.PathResourceLocator; import org.olat.ims.qti.editor.beecom.objects.QTIDocument; import org.olat.ims.qti.editor.beecom.parser.ParserManager; +import org.olat.ims.qti21.model.xml.BadRessourceHelper; import org.olat.ims.resources.IMSEntityResolver; +import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; +import uk.ac.ed.ph.jqtiplus.notification.Notification; +import uk.ac.ed.ph.jqtiplus.provision.BadResourceException; +import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader; +import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ImsManifestException; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.QtiContentPackageExtractor; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.QtiContentPackageSummary; +import uk.ac.ed.ph.jqtiplus.validation.ItemValidationResult; +import uk.ac.ed.ph.jqtiplus.validation.TestValidationResult; +import uk.ac.ed.ph.jqtiplus.xmlutils.XmlResourceNotFoundException; +import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; + /** * * Initial date: 19.02.2016<br> @@ -44,16 +64,75 @@ public class QTI12To21ConverterTest { private static final OLog log = Tracing.createLoggerFor(QTI12To21ConverterTest.class); @Test - public void convert() throws URISyntaxException { + public void convert() throws URISyntaxException, IOException, XmlResourceNotFoundException, ImsManifestException { QTIDocument doc = loadDocument("qti12_4questiontypes.xml"); - File exportDir = new File("/HotCoffee/QTI/today/"); + + File exportDir = new File(WebappHelper.getTmpDir(), "qti12to21" + UUID.randomUUID()); exportDir.mkdirs(); + QTI12To21Converter converter = new QTI12To21Converter(exportDir, Locale.ENGLISH); - converter.convert(doc); + int validAssessmentItems = 0; + boolean validAssessmentTest = false; + QtiContentPackageSummary readableManifest = null; + File[] generatedFiles = exportDir.listFiles(); + for(File generatedFile:generatedFiles) { + String filename = generatedFile.getName(); + if(filename.equals("imsmanifest.xml")) { + readableManifest = new QtiContentPackageExtractor(exportDir).parse(); + } else if(filename.startsWith("test")) { + validAssessmentTest = validateAssessmentTest(generatedFile); + } else if(filename.endsWith(".xml")) { + boolean validItem = validateAssessmentItem(generatedFile); + if(validItem) { + validAssessmentItems++; + } + } + } + + //delete tmp + FileUtils.deleteDirsAndFiles(exportDir.toPath()); + Assert.assertTrue(validAssessmentTest); + Assert.assertEquals(4, validAssessmentItems); + Assert.assertEquals(1, readableManifest.getTestResources().size()); + Assert.assertEquals(4, readableManifest.getItemResources().size()); + } + + private boolean validateAssessmentTest(File assessmentTestFile) { + QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); + ResourceLocator fileResourceLocator = new PathResourceLocator(assessmentTestFile.toPath()); + AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); + TestValidationResult test = assessmentObjectXmlLoader.loadResolveAndValidateTest(assessmentTestFile.toURI()); + + for(Notification notification: test.getModelValidationErrors()) { + log.error(notification.getQtiNode() + " : " + notification.getMessage()); + } + + BadResourceException e = test.getResolvedAssessmentTest().getTestLookup().getBadResourceException(); + if(e != null) { + StringBuilder err = new StringBuilder(); + BadRessourceHelper.extractMessage(e, err); + log.error(err.toString()); + } + return test.getModelValidationErrors().isEmpty(); + } + + private boolean validateAssessmentItem(File assessmentItemFile) { + QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); + ResourceLocator fileResourceLocator = new PathResourceLocator(assessmentItemFile.toPath()); + AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); + ItemValidationResult itemResult = assessmentObjectXmlLoader.loadResolveAndValidateItem(assessmentItemFile.toURI()); + + BadResourceException e = itemResult.getResolvedAssessmentItem().getItemLookup().getBadResourceException(); + if(e != null) { + StringBuilder err = new StringBuilder(); + BadRessourceHelper.extractMessage(e, err); + log.error(err.toString()); + } + return itemResult.getModelValidationErrors().isEmpty(); } private QTIDocument loadDocument(String filename) { diff --git a/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes.xml b/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes.xml index 069beab81d537a649839ba1e332e70aa7792135a..e8efb361ab517d6b3abfb21a497e905214d43905 100644 --- a/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes.xml +++ b/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes.xml @@ -21,24 +21,14 @@ <item ident="QTIEDIT:SCQ:8000138058" title="Neue Frage"> <presentation> <material> - <mattext texttype="text/html"><![CDATA[Neue Frage<br /><br /><span id="olatFlashMovieViewer549242" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:320px; height:240px;"> -<script src="/raw/fx-111111x11/movie/player.js" type="text/javascript"></script> -<script type="text/javascript" defer="defer"> -BPlayer.insertPlayer("media/demo-video.mp4","olatFlashMovieViewer549242",320,240,0,0,"video",undefined,false,false,true,undefined); -</script> -</span>]]></mattext> + <mattext texttype="text/html"><![CDATA[Neue Frage]]></mattext> </material> <response_lid ident="8000138060" rcardinality="Single" rtiming="No"> <render_choice shuffle="No" minnumber="1" maxnumber="1"> <flow_label class="List"> <response_label ident="8000138063" rshuffle="Yes"> <material> - <mattext texttype="text/html"><![CDATA[Richtige Antwort<br /><br /><span id="olatFlashMovieViewer656727" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:320px; height:240px;"> -<script src="/raw/fx-111111x11/movie/player.js" type="text/javascript"></script> -<script type="text/javascript" defer="defer"> -BPlayer.insertPlayer("media/demo-video.mp4","olatFlashMovieViewer656727",320,240,0,0,"video",undefined,false,false,true,undefined); -</script> -</span>]]></mattext> + <mattext texttype="text/html"><![CDATA[Richtige Antwort]]></mattext> </material> </response_label> </flow_label> diff --git a/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes_video.xml b/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes_video.xml new file mode 100644 index 0000000000000000000000000000000000000000..069beab81d537a649839ba1e332e70aa7792135a --- /dev/null +++ b/src/test/java/org/olat/ims/qti21/pool/qti12_4questiontypes_video.xml @@ -0,0 +1,419 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE questestinterop SYSTEM "ims_qtiasiv1p2p1.dtd"> + +<questestinterop> + <assessment ident="test8_8_84528095851561" title="E4 - Test SR"> + <qtimetadata> + <qtimetadatafield> + <fieldlabel>qmd_assessmenttype</fieldlabel> + <fieldentry>Assessment</fieldentry> + </qtimetadatafield> + </qtimetadata> + <selection_ordering> + <selection/> + <order order_type="Sequential"/> + </selection_ordering> + <section ident="test8_8_84528095851562" title="Neue Sektion"> + <selection_ordering> + <selection/> + <order order_type="Sequential"/> + </selection_ordering> + <item ident="QTIEDIT:SCQ:8000138058" title="Neue Frage"> + <presentation> + <material> + <mattext texttype="text/html"><![CDATA[Neue Frage<br /><br /><span id="olatFlashMovieViewer549242" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:320px; height:240px;"> +<script src="/raw/fx-111111x11/movie/player.js" type="text/javascript"></script> +<script type="text/javascript" defer="defer"> +BPlayer.insertPlayer("media/demo-video.mp4","olatFlashMovieViewer549242",320,240,0,0,"video",undefined,false,false,true,undefined); +</script> +</span>]]></mattext> + </material> + <response_lid ident="8000138060" rcardinality="Single" rtiming="No"> + <render_choice shuffle="No" minnumber="1" maxnumber="1"> + <flow_label class="List"> + <response_label ident="8000138063" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[Richtige Antwort<br /><br /><span id="olatFlashMovieViewer656727" class="olatFlashMovieViewer" style="display:block;border:solid 1px #000; width:320px; height:240px;"> +<script src="/raw/fx-111111x11/movie/player.js" type="text/javascript"></script> +<script type="text/javascript" defer="defer"> +BPlayer.insertPlayer("media/demo-video.mp4","olatFlashMovieViewer656727",320,240,0,0,"video",undefined,false,false,true,undefined); +</script> +</span>]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000146297" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[Falsche Antwort]]></mattext> + </material> + </response_label> + </flow_label> + </render_choice> + </response_lid> + </presentation> + <resprocessing> + <outcomes> + <decvar varname="SCORE" vartype="Decimal" defaultval="0" minvalue="0.0" maxvalue="1.0" cutvalue="1.0"/> + </outcomes> + <respcondition title="Mastery" continue="Yes"> + <conditionvar> + <varequal respident="8000138060" case="Yes">8000138063</varequal> + </conditionvar> + <setvar varname="SCORE" action="Set">1.0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Mastery"/> + </respcondition> + <respcondition title="Fail" continue="Yes"> + <conditionvar> + <or> + <varequal respident="8000138060" case="Yes">8000146297</varequal> + </or> + </conditionvar> + <setvar varname="SCORE" action="Set">0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Fail"/> + <displayfeedback feedbacktype="Solution" linkrefid="Solution"/> + <displayfeedback feedbacktype="Hint" linkrefid="Hint"/> + </respcondition> + <respcondition title="_olat_resp_feedback" continue="Yes"> + <conditionvar> + <varequal respident="8000138060" case="Yes">8000138063</varequal> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="8000138063"/> + </respcondition> + <respcondition title="_olat_resp_feedback" continue="Yes"> + <conditionvar> + <varequal respident="8000138060" case="Yes">8000146297</varequal> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="8000146297"/> + </respcondition> + <respcondition title="Fail" continue="Yes"> + <conditionvar> + <other/> + </conditionvar> + <setvar varname="SCORE" action="Set">0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Fail"/> + <displayfeedback feedbacktype="Solution" linkrefid="Solution"/> + <displayfeedback feedbacktype="Hint" linkrefid="Hint"/> + </respcondition> + </resprocessing> + </item> + <item ident="QTIEDIT:MCQ:8000150743" title="Multiple Frage"> + <itemcontrol feedbackswitch="No" hintswitch="No" solutionswitch="No"/> + <presentation> + <material> + <mattext texttype="text/html"><![CDATA[Neue Frage]]></mattext> + </material> + <response_lid ident="8000150745" rcardinality="Multiple" rtiming="No"> + <render_choice shuffle="No" minnumber="0" maxnumber="4"> + <flow_label class="List"> + <response_label ident="8000150748" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[Richtige Antwort]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000152077" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[Falsche Antwort]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000152080" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[Richtige Antwort]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000152091" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[Falsche Antwort]]></mattext> + </material> + </response_label> + </flow_label> + </render_choice> + </response_lid> + </presentation> + <resprocessing> + <outcomes> + <decvar varname="SCORE" vartype="Decimal" defaultval="0" minvalue="0.0" maxvalue="1.0" cutvalue="1.0"/> + </outcomes> + <respcondition title="Mastery" continue="Yes"> + <conditionvar> + <and> + <varequal respident="8000150745" case="Yes">8000150748</varequal> + <varequal respident="8000150745" case="Yes">8000152080</varequal> + </and> + <not> + <or> + <varequal respident="8000150745" case="Yes">8000152077</varequal> + <varequal respident="8000150745" case="Yes">8000152091</varequal> + </or> + </not> + </conditionvar> + <setvar varname="SCORE" action="Set">1.0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Mastery"/> + </respcondition> + <respcondition title="Fail" continue="Yes"> + <conditionvar> + <or> + <varequal respident="8000150745" case="Yes">8000152077</varequal> + <varequal respident="8000150745" case="Yes">8000152091</varequal> + </or> + </conditionvar> + <setvar varname="SCORE" action="Set">0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Fail"/> + <displayfeedback feedbacktype="Solution" linkrefid="Solution"/> + <displayfeedback feedbacktype="Hint" linkrefid="Hint"/> + </respcondition> + <respcondition title="_olat_resp_feedback" continue="Yes"> + <conditionvar> + <varequal respident="8000150745" case="Yes">8000150748</varequal> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="8000150748"/> + </respcondition> + <respcondition title="_olat_resp_feedback" continue="Yes"> + <conditionvar> + <varequal respident="8000150745" case="Yes">8000152077</varequal> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="8000152077"/> + </respcondition> + <respcondition title="_olat_resp_feedback" continue="Yes"> + <conditionvar> + <varequal respident="8000150745" case="Yes">8000152080</varequal> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="8000152080"/> + </respcondition> + <respcondition title="_olat_resp_feedback" continue="Yes"> + <conditionvar> + <varequal respident="8000150745" case="Yes">8000152091</varequal> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="8000152091"/> + </respcondition> + <respcondition title="Fail" continue="Yes"> + <conditionvar> + <other/> + </conditionvar> + <setvar varname="SCORE" action="Set">0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Fail"/> + <displayfeedback feedbacktype="Solution" linkrefid="Solution"/> + <displayfeedback feedbacktype="Hint" linkrefid="Hint"/> + </respcondition> + </resprocessing> + <itemfeedback ident="Hint" view="All"> + <hint feedbackstyle="Incremental"> + <hintmaterial> + <material> + <mattext><![CDATA[ +]]></mattext> + </material> + </hintmaterial> + </hint> + </itemfeedback> + <itemfeedback ident="Solution" view="All"> + <solution> + <solutionmaterial> + <material> + <mattext><![CDATA[ +]]></mattext> + </material> + </solutionmaterial> + </solution> + </itemfeedback> + </item> + <item ident="QTIEDIT:KPRIM:8000171225" title="Neue Frage"> + <presentation> + <material> + <mattext texttype="text/html"><![CDATA[Neue Frage]]></mattext> + </material> + <response_lid ident="8000171227" rcardinality="Multiple" rtiming="No"> + <render_choice shuffle="No" minnumber="0" maxnumber="4"> + <flow_label class="List"> + <response_label ident="8000171230" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[+ Antwort]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000171233" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[- Antwort]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000171236" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[+ Antwort]]></mattext> + </material> + </response_label> + </flow_label> + <flow_label class="List"> + <response_label ident="8000171239" rshuffle="Yes"> + <material> + <mattext texttype="text/html"><![CDATA[- Antwort]]></mattext> + </material> + </response_label> + </flow_label> + </render_choice> + </response_lid> + </presentation> + <resprocessing> + <outcomes> + <decvar varname="SCORE" vartype="Decimal" defaultval="0" minvalue="0.0" maxvalue="1.0" cutvalue="1.0"/> + </outcomes> + <respcondition continue="Yes" title="Mastery"> + <conditionvar> + <varequal respident="8000171227" case="Yes">8000171230:correct</varequal> + </conditionvar> + <setvar varname="SCORE" action="Add">0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Fail"> + <conditionvar> + <not> + <varequal respident="8000171227" case="Yes">8000171230:correct</varequal> + </not> + </conditionvar> + <setvar varname="SCORE" action="Add">-0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Mastery"> + <conditionvar> + <varequal respident="8000171227" case="Yes">8000171233:wrong</varequal> + </conditionvar> + <setvar varname="SCORE" action="Add">0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Fail"> + <conditionvar> + <not> + <varequal respident="8000171227" case="Yes">8000171233:wrong</varequal> + </not> + </conditionvar> + <setvar varname="SCORE" action="Add">-0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Mastery"> + <conditionvar> + <varequal respident="8000171227" case="Yes">8000171236:correct</varequal> + </conditionvar> + <setvar varname="SCORE" action="Add">0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Fail"> + <conditionvar> + <not> + <varequal respident="8000171227" case="Yes">8000171236:correct</varequal> + </not> + </conditionvar> + <setvar varname="SCORE" action="Add">-0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Mastery"> + <conditionvar> + <varequal respident="8000171227" case="Yes">8000171239:wrong</varequal> + </conditionvar> + <setvar varname="SCORE" action="Add">0.25</setvar> + </respcondition> + <respcondition continue="Yes" title="Fail"> + <conditionvar> + <not> + <varequal respident="8000171227" case="Yes">8000171239:wrong</varequal> + </not> + </conditionvar> + <setvar varname="SCORE" action="Add">-0.25</setvar> + </respcondition> + <respcondition title="Mastery" continue="Yes"> + <conditionvar> + <and> + <varequal respident="8000171227" case="Yes">8000171230:correct</varequal> + <varequal respident="8000171227" case="Yes">8000171233:wrong</varequal> + <varequal respident="8000171227" case="Yes">8000171236:correct</varequal> + <varequal respident="8000171227" case="Yes">8000171239:wrong</varequal> + </and> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="Mastery"/> + </respcondition> + <respcondition title="Fail" continue="Yes"> + <conditionvar> + <not> + <and> + <varequal respident="8000171227" case="Yes">8000171230:correct</varequal> + <varequal respident="8000171227" case="Yes">8000171233:wrong</varequal> + <varequal respident="8000171227" case="Yes">8000171236:correct</varequal> + <varequal respident="8000171227" case="Yes">8000171239:wrong</varequal> + </and> + </not> + </conditionvar> + <displayfeedback feedbacktype="Response" linkrefid="Fail"/> + <displayfeedback feedbacktype="Solution" linkrefid="Solution"/> + <displayfeedback feedbacktype="Hint" linkrefid="Hint"/> + </respcondition> + </resprocessing> + </item> + <item ident="QTIEDIT:FIB:8000173476" title="Lückentext Frage"> + <itemcontrol feedbackswitch="No" hintswitch="No" solutionswitch="No"/> + <presentation label="notset"> + <flow> + <material> + <mattext texttype="text/html"><![CDATA[To be or]]></mattext> + </material> + <response_str ident="8000177110" rcardinality="Single"> + <render_fib columns="3" maxchars="10"> + <flow_label class="Block"> + <response_label ident="8000177110" rshuffle="Yes"/> + </flow_label> + </render_fib> + </response_str> + <material> + <mattext texttype="text/html"><![CDATA[<p>to be</p>]]></mattext> + </material> + </flow> + </presentation> + <resprocessing> + <outcomes> + <decvar varname="SCORE" vartype="Decimal" defaultval="0" minvalue="0.0" maxvalue="1.0" cutvalue="1.0"/> + </outcomes> + <respcondition title="Mastery" continue="Yes"> + <conditionvar> + <and> + <or> + <varequal respident="8000177110" case="No"><![CDATA[New text element<br />Et encor<br />bla]]></varequal> + </or> + </and> + </conditionvar> + <setvar varname="SCORE" action="Set">1.0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Mastery"/> + </respcondition> + <respcondition title="Fail" continue="Yes"> + <conditionvar> + <other/> + </conditionvar> + <setvar varname="SCORE" action="Set">0</setvar> + <displayfeedback feedbacktype="Response" linkrefid="Fail"/> + <displayfeedback feedbacktype="Solution" linkrefid="Solution"/> + <displayfeedback feedbacktype="Hint" linkrefid="Hint"/> + </respcondition> + </resprocessing> + <itemfeedback ident="Hint" view="All"> + <hint feedbackstyle="Incremental"> + <hintmaterial> + <material> + <mattext><![CDATA[ +]]></mattext> + </material> + </hintmaterial> + </hint> + </itemfeedback> + <itemfeedback ident="Solution" view="All"> + <solution> + <solutionmaterial> + <material> + <mattext><![CDATA[ +]]></mattext> + </material> + </solutionmaterial> + </solution> + </itemfeedback> + </item> + </section> + </assessment> +</questestinterop> diff --git a/src/test/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandlerTest.java b/src/test/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandlerTest.java index 16ac4c45165ebbcdf690717e98c8da208941dd34..2ca50f36c30fc905dbcb0641443299d41c0c41c2 100644 --- a/src/test/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandlerTest.java +++ b/src/test/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandlerTest.java @@ -20,8 +20,34 @@ package org.olat.ims.qti21.repository.handlers; import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.UUID; +import org.junit.Assert; import org.junit.Test; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.FileUtils; +import org.olat.core.util.WebappHelper; +import org.olat.fileresource.types.ImsQTI21Resource.PathResourceLocator; +import org.olat.ims.qti21.model.xml.BadRessourceHelper; +import org.olat.test.OlatTestCase; +import org.springframework.beans.factory.annotation.Autowired; + +import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager; +import uk.ac.ed.ph.jqtiplus.notification.Notification; +import uk.ac.ed.ph.jqtiplus.provision.BadResourceException; +import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader; +import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ContentPackageResource; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ImsManifestException; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.QtiContentPackageExtractor; +import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.QtiContentPackageSummary; +import uk.ac.ed.ph.jqtiplus.validation.ItemValidationResult; +import uk.ac.ed.ph.jqtiplus.validation.TestValidationResult; +import uk.ac.ed.ph.jqtiplus.xmlutils.XmlResourceNotFoundException; +import uk.ac.ed.ph.jqtiplus.xmlutils.locators.ResourceLocator; /** * @@ -29,18 +55,104 @@ import org.junit.Test; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ -public class QTI21AssessmentTestHandlerTest { +public class QTI21AssessmentTestHandlerTest extends OlatTestCase { - private static final File fullPackage = new File("/Users/srosse/Desktop/QTI/Full/"); + private static final OLog log = Tracing.createLoggerFor(QTI21AssessmentTestHandlerTest.class); + @Autowired + private QTI21AssessmentTestHandler testHandler; + + /** + * The test creates a QTI 2.1 test with the QTI handler and check if all + * the elements are valid, assessment test, assessment item and + * manifest. + * + * @throws IOException + * @throws XmlResourceNotFoundException + * @throws ImsManifestException + */ @Test - public void createImsManifest() { - if(!fullPackage.exists()) { - fullPackage.mkdirs(); + public void createAssessmentTest() throws IOException, XmlResourceNotFoundException, ImsManifestException { + File tmpDir = new File(WebappHelper.getTmpDir(), "qti21fullpackage" + UUID.randomUUID()); + tmpDir.mkdirs(); + + testHandler.createMinimalAssessmentTest("Generated test", tmpDir); + + boolean foundImsManifest = false; + boolean foundAssessmentTest = false; + boolean foundAssessmentItem = false; + + boolean validAssessmentTest = false; + boolean validAssessmentItem = false; + boolean readableManifest = false; + + File[] generatedFiles = tmpDir.listFiles(); + for(File generatedFile:generatedFiles) { + String filename = generatedFile.getName(); + if(filename.equals("imsmanifest.xml")) { + foundImsManifest = true; + readableManifest = readManifest(tmpDir); + } else if(filename.startsWith("test")) { + foundAssessmentTest = true; + validAssessmentTest = validateAssessmentTest(generatedFile); + } else if(filename.startsWith("sc")) { + foundAssessmentItem = true; + validAssessmentItem = validateAssessmentItem(generatedFile); + } } - QTI21AssessmentTestHandler handler = new QTI21AssessmentTestHandler(); - handler.createMinimalAssessmentTest("Generated test", fullPackage); + //delete tmp + FileUtils.deleteDirsAndFiles(tmpDir.toPath()); + + //checks + Assert.assertTrue(foundImsManifest); + Assert.assertTrue(foundAssessmentTest); + Assert.assertTrue(foundAssessmentItem); + + Assert.assertTrue(validAssessmentTest); + Assert.assertTrue(validAssessmentItem); + + Assert.assertTrue(readableManifest); } + + private boolean validateAssessmentTest(File assessmentTestFile) { + QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); + ResourceLocator fileResourceLocator = new PathResourceLocator(assessmentTestFile.toPath()); + AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); + TestValidationResult test = assessmentObjectXmlLoader.loadResolveAndValidateTest(assessmentTestFile.toURI()); + + for(Notification notification: test.getModelValidationErrors()) { + log.error(notification.getQtiNode() + " : " + notification.getMessage()); + } + + BadResourceException e = test.getResolvedAssessmentTest().getTestLookup().getBadResourceException(); + StringBuilder err = new StringBuilder(); + BadRessourceHelper.extractMessage(e, err); + log.error(err.toString()); + return test.getModelValidationErrors().isEmpty(); + } + + private boolean validateAssessmentItem(File assessmentItemFile) { + QtiXmlReader qtiXmlReader = new QtiXmlReader(new JqtiExtensionManager()); + ResourceLocator fileResourceLocator = new PathResourceLocator(assessmentItemFile.toPath()); + AssessmentObjectXmlLoader assessmentObjectXmlLoader = new AssessmentObjectXmlLoader(qtiXmlReader, fileResourceLocator); + ItemValidationResult itemResult = assessmentObjectXmlLoader.loadResolveAndValidateItem(assessmentItemFile.toURI()); + + BadResourceException e = itemResult.getResolvedAssessmentItem().getItemLookup().getBadResourceException(); + if(e != null) { + StringBuilder err = new StringBuilder(); + BadRessourceHelper.extractMessage(e, err); + log.error(err.toString()); + } + return itemResult.getModelValidationErrors().isEmpty(); + } + + private boolean readManifest(File tmpDir) throws ImsManifestException, XmlResourceNotFoundException { + QtiContentPackageExtractor extractor = new QtiContentPackageExtractor(tmpDir); + QtiContentPackageSummary summary = extractor.parse(); + List<ContentPackageResource> items = summary.getItemResources(); + List<ContentPackageResource> tests = summary.getTestResources(); + return items.size() == 1 && tests.size() == 1; + } } diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java index b5e31dd5d407547641f15b377c8a62100e79d792..a6f3ece5a40a0989c826caa37c66e3fed5133a74 100644 --- a/src/test/java/org/olat/test/AllTestsJunit4.java +++ b/src/test/java/org/olat/test/AllTestsJunit4.java @@ -193,7 +193,8 @@ import org.junit.runners.Suite; org.olat.ims.qti21.model.xml.AssessmentHtmlBuilderTest.class, org.olat.ims.qti21.model.xml.AssessmentItemPackageTest.class, org.olat.ims.qti21.model.xml.ManifestPackageTest.class, - //org.olat.ims.qti21.model.xml.OnyxToQtiAssessementItemsTest.class, + org.olat.ims.qti21.repository.handlers.QTI21AssessmentTestHandlerTest.class, + org.olat.ims.qti21.model.xml.OnyxToQtiAssessementItemsTest.class, org.olat.ims.lti.LTIManagerTest.class, org.olat.modules.webFeed.FeedManagerImplTest.class, org.olat.modules.qpool.manager.MetadataConverterHelperTest.class,