public function testSaveSimpleItemSessionControlOnTestPart() { $doc = new XmlDocument('2.1'); $doc->load(self::samplesDir() . 'custom/simple_itemsessioncontrol_testpart.xml'); $file = tempnam('/tmp', 'qsm'); $doc->save($file); $doc = new XmlDocument('2.1'); $doc->load($file); $testParts = $doc->getDocumentComponent()->getTestParts(); $this->assertTrue($testParts['testPartId']->hasItemSessionControl()); $this->assertInternalType('integer', 0, $testParts['testPartId']->getItemSessionControl()->getMaxAttempts()); $this->assertEquals(0, $testParts['testPartId']->getItemSessionControl()->getMaxAttempts()); unlink($file); }
public function testWrite() { $uri = self::samplesDir() . 'custom/standalone_assessmentsection.xml'; $doc = new XmlDocument(); $doc->load($uri); $assessmentSection = $doc->getDocumentComponent(); // Write the file. $uri = tempnam('/tmp', 'qsm'); $doc->save($uri); $this->assertTrue(file_exists($uri)); // Reload it. $doc->load($uri); $this->assertInstanceOf('qtism\\data\\AssessmentSection', $doc->getDocumentComponent()); // Retest. $this->testLoad($doc->getDocumentComponent()); unlink($uri); }
public function testLoadAndSaveXIncludeNsInTag() { $doc = new XmlDocument(); $doc->load(self::samplesDir() . 'custom/items/xinclude/xinclude_ns_in_tag.xml', true); $includes = $doc->getDocumentComponent()->getComponentsByClassName('include'); $this->assertEquals(1, count($includes)); $this->assertEquals('xinclude_ns_in_tag_content1.xml', $includes[0]->getHref()); $file = tempnam('/tmp', 'qsm'); $doc->save($file); // Does it validate again? $doc = new XmlDocument(); try { $doc->load($file, true); $this->assertTrue(true); } catch (XmlStorageException $e) { $this->assertFalse(true, "The document using xinclude should validate after being saved."); } }
public function testWritePCIItem() { $doc = new XmlDocument(); $doc->load(self::samplesDir() . 'custom/interactions/custom_interaction_pci.xml'); $file = tempnam('/tmp', 'qsm'); $doc->save($file); $this->testLoadPCIItem($file); unlink($file); }
/** * Import the Test itself by importing its QTI-XML definition into the system, after * the QTI Items composing the test were also imported. * * The $itemMapping argument makes the implementation of this method able to know * what are the items that were imported. The $itemMapping is an associative array * where keys are the assessmentItemRef's identifiers and the values are the core_kernel_classes_Resources of * the items that are now stored in the system. * * When this method returns false, it means that an error occured at the level of the content of the imported test * itself e.g. an item referenced by the test is not present in the content package. In this case, $report might * contain useful information to return to the client. * * @param core_kernel_classes_Resource $testResource A Test Resource the new content must be bind to. * @param XmlDocument $testDefinition An XmlAssessmentTestDocument object. * @param oat\taoQtiItem\model\qti\Resource $qtiResource The manifest resource describing the test to be imported. * @param array $itemMapping An associative array that represents the mapping between assessmentItemRef elements and the imported items. * @param string $extractionFolder The absolute path to the temporary folder containing the content of the imported IMS QTI Package Archive. * @param common_report_Report $report A Report object to be filled during the import. * @return core_kernel_file_File The newly created test content. * @throws taoQtiTest_models_classes_QtiTestServiceException If an unexpected runtime error occurs. */ protected function importTestDefinition(core_kernel_classes_Resource $testResource, XmlDocument $testDefinition, Resource $qtiResource, array $itemMapping, $extractionFolder, common_report_Report $report) { foreach ($itemMapping as $itemRefId => $itemResource) { $itemRef = $testDefinition->getDocumentComponent()->getComponentByIdentifier($itemRefId); $itemRef->setHref($itemResource->getUri()); } // Bind the newly created test content to the Test Resource in database. $ds = DIRECTORY_SEPARATOR; $testContent = $this->createContent($testResource); $testPath = $testContent->getAbsolutePath(); $finalPath = taoQtiTest_helpers_Utils::storeQtiResource($testContent, $qtiResource, $extractionFolder, false, TAOQTITEST_FILENAME); // Delete template test.xml file (created by self::createContent() method) from the root. // (Absolutely necessary when the test.xml file is not in the root folder of the archive) unlink($testPath . $ds . TAOQTITEST_FILENAME); try { $testDefinition->save($finalPath); } catch (StorageException $e) { throw new taoQtiTest_models_classes_QtiTestServiceException("An error occured while saving the QTI-XML test.", taoQtiTest_models_classes_QtiTestServiceException::TEST_WRITE_ERROR); } return $testContent; }
/** * Embed external resources into the XML * * @param string $originalXml * @throws \tao_models_classes_FileNotFoundException * @return string */ public static function embedAssets($originalXml) { $basedir = dirname($originalXml) . DIRECTORY_SEPARATOR; $xmlDocument = new XmlDocument(); $xmlDocument->load($originalXml, true); //get images and object to base64 their src/data $images = $xmlDocument->getDocumentComponent()->getComponentsByClassName('img'); $objects = $xmlDocument->getDocumentComponent()->getComponentsByClassName('object'); /** @var $image \qtism\data\content\xhtml\Img */ foreach ($images as $image) { $source = $image->getSrc(); $image->setSrc(self::secureEncode($basedir, $source)); } /** @var $object \qtism\data\content\xhtml\Object */ foreach ($objects as $object) { $data = $object->getData(); $object->setData(self::secureEncode($basedir, $data)); } // save the document to a tempfile $newXml = tempnam(sys_get_temp_dir(), 'sharedStimulus_') . '.xml'; $xmlDocument->save($newXml); return $newXml; }
public function testWriteInteractionMixSachsen() { $doc = new XmlDocument('2.1'); $doc->load(self::decorateUri('interaction_mix_sachsen/interaction_mix_sachsen.xml'), true); $file = tempnam('/tmp', 'qsm'); $doc->save($file); $this->assertTrue(file_exists($file)); $doc = new XmlDocument('2.1'); $doc->load($file); $this->testLoadInteractionMixSachsen($doc); // correctly namespaced ? $dom = $doc->getDomDocument(); $assessmentTestElt = $dom->documentElement; $this->assertEquals('assessmentTest', $assessmentTestElt->nodeName); $this->assertEquals('http://www.imsglobal.org/xsd/imsqti_v2p1', $assessmentTestElt->namespaceURI); // childrend in namespace ? $outcomeDeclarationElts = $dom->documentElement->getElementsByTagName('outcomeDeclaration'); $this->assertEquals(2, $outcomeDeclarationElts->length); $outcomeDeclarationElt = $outcomeDeclarationElts->item(0); $this->assertEquals('http://www.imsglobal.org/xsd/imsqti_v2p1', $outcomeDeclarationElt->namespaceURI); unlink($file); $this->assertFalse(file_exists($file)); }
public function beforeSave(QtiComponent $documentComponent, $uri) { // Take care of rubricBlock explosion. Transform // actual rubricBlocks in rubricBlockRefs. if ($this->mustExplodeRubricBlocks() === true) { // Get all rubricBlock elements... $iterator = new QtiComponentIterator($documentComponent, array('rubricBlock')); $sectionCount = new SplObjectStorage(); foreach ($iterator as $rubricBlock) { // $section contains the assessmentSection the rubricBlock is related to. $section = $iterator->parent(); // determine the occurence number of the rubricBlock relative to its section. if (isset($sectionCount[$section]) === false) { $sectionCount[$section] = 0; } $sectionCount[$section] = $sectionCount[$section] + 1; $occurence = $sectionCount[$section]; // determine a suitable file name for the external rubricBlock definition. $rubricBlockRefId = 'RB_' . $section->getIdentifier() . '_' . $occurence; $href = './rubricBlock_' . $rubricBlockRefId . '.xml'; $doc = new XmlDocument(); $doc->setDocumentComponent($rubricBlock); try { $pathinfo = pathinfo($uri); $doc->save($pathinfo['dirname'] . DIRECTORY_SEPARATOR . $href); // replace the rubric block with a reference. $sectionRubricBlocks = $section->getRubricBlocks(); $sectionRubricBlocks->remove($rubricBlock); $sectionRubricBlockRefs = $section->getRubricBlockRefs(); $sectionRubricBlockRefs[] = new RubricBlockRef($rubricBlockRefId, $href); } catch (XmlStorageException $e) { $msg = "An error occured while creating external rubrickBlock definition(s)."; throw new XmlStorageException($msg, $e); } } } }
public function testWriteNestedLax() { $doc = new XmlDocument(); $doc->load(self::samplesDir() . 'custom/operators/custom_operator_nested_1.xml'); $file = tempnam('/tmp', 'qsm'); $doc->save($file); $this->testReadNestedLax($file); //unlink($file); }
/** * @see \qtism\data\storage\xml\XmlDocument::beforeSave() */ public function beforeSave(QtiComponent $documentComponent, $uri) { // Take care of rubricBlock explosion. Transform actual rubricBlocks in rubricBlockRefs. if ($this->mustExplodeRubricBlocks() === true) { // Get all rubricBlock elements... $iterator = new QtiComponentIterator($documentComponent, array('rubricBlock')); $sectionCount = new SplObjectStorage(); foreach ($iterator as $rubricBlock) { // $section contains the assessmentSection the rubricBlock is related to. $section = $iterator->parent(); // determine the occurence number of the rubricBlock relative to its section. if (isset($sectionCount[$section]) === false) { $sectionCount[$section] = 0; } $sectionCount[$section] = $sectionCount[$section] + 1; $occurence = $sectionCount[$section]; // determine a suitable file name for the external rubricBlock definition. $rubricBlockRefId = 'RB_' . $section->getIdentifier() . '_' . $occurence; $href = './rubricBlock_' . $rubricBlockRefId . '.xml'; $doc = new XmlDocument(); $doc->setDocumentComponent($rubricBlock); try { $pathinfo = pathinfo($uri); $doc->save($pathinfo['dirname'] . DIRECTORY_SEPARATOR . $href); // replace the rubric block with a reference. $sectionRubricBlocks = $section->getRubricBlocks(); $sectionRubricBlocks->remove($rubricBlock); $sectionRubricBlockRefs = $section->getRubricBlockRefs(); $sectionRubricBlockRefs[] = new RubricBlockRef($rubricBlockRefId, $href); } catch (XmlStorageException $e) { $msg = "An error occured while creating external rubrickBlock definition(s)."; throw new XmlStorageException($msg, XmlStorageException::UNKNOWN, $e); } } } // Take care of testFeedback explosion. Transform actual testFeedbacks in testFeedbackRefs. if ($this->mustExplodeTestFeedbacks() === true) { $iterator = new QtiComponentIterator($documentComponent, array('testFeedback')); $testPartCount = new SplObjectStorage(); $testCount = 0; foreach ($iterator as $testFeedback) { $parent = $iterator->parent(); if ($parent instanceof TestPart) { if (isset($testPartCount[$parent]) === false) { $testPartCount[$parent] = 0; } $testPartCount[$parent] = $testPartCount[$parent] + 1; $occurence = $testPartCount[$parent]; } else { // It's a testFeedback related to an assessmentTest. $testCount += 1; $occurence = $testCount; } $parentId = $parent->getIdentifier(); $href = "./testFeedback_TF_{$parentId}_{$occurence}.xml"; // Generate the document. $doc = new XmlDocument(); $doc->setDocumentComponent($testFeedback); try { $pathinfo = pathinfo($uri); $doc->save($pathinfo['dirname'] . DIRECTORY_SEPARATOR . $href); $parent->getTestFeedbacks()->remove($testFeedback); $testFeedbackRefs = $parent->getTestFeedbackRefs(); $testFeedbackRefs[] = new TestFeedbackRef($testFeedback->getIdentifier(), $testFeedback->getOutcomeIdentifier(), $testFeedback->getAccess(), $testFeedback->getShowHide(), $href); } catch (XmlStorageException $e) { $msg = "An error occured while creating external testFeedback definition(s)."; throw new XmlStorageException($msg, XmlStorageException::UNKNOWN, $e); } } } }
public function testSaveUnknownLocation() { $doc = new XmlDocument('2.1.1'); $doc->loadFromString('<assessmentItemRef identifier="Q01" href="./Q01.xml"/>'); $expectedMsg = "An error occured while saving QTI-XML file at '/unknown/location/qti.xml'. Maybe the save location is not reachable?"; $this->setExpectedException('\\qtism\\data\\storage\\xml\\XmlStorageException', $expectedMsg, XmlStorageException::WRITE); $doc->save('/unknown/location/qti.xml'); }