public function testCreateFormExploded(XmlCompactDocument $compactDoc = null) { $doc = new XmlDocument('2.1'); $file = self::samplesDir() . 'custom/interaction_mix_saschen_assessmentsectionref/interaction_mix_sachsen.xml'; $doc->load($file); $compactDoc = XmlCompactDocument::createFromXmlAssessmentTestDocument($doc, new LocalFileResolver()); $this->assertInstanceOf('qtism\\data\\storage\\xml\\XmlCompactDocument', $compactDoc); $this->assertEquals('InteractionMixSachsen_1901710679', $compactDoc->getDocumentComponent()->getIdentifier()); $this->assertEquals('Interaction Mix (Sachsen)', $compactDoc->getDocumentComponent()->getTitle()); $outcomeDeclarations = $compactDoc->getDocumentComponent()->getOutcomeDeclarations(); $this->assertEquals(2, count($outcomeDeclarations)); $this->assertEquals('SCORE', $outcomeDeclarations['SCORE']->getIdentifier()); $testParts = $compactDoc->getDocumentComponent()->getTestParts(); $this->assertEquals(1, count($testParts)); $this->assertEquals('testpartID', $testParts['testpartID']->getIdentifier()); $this->assertEquals(NavigationMode::NONLINEAR, $testParts['testpartID']->getNavigationMode()); $assessmentSections1stLvl = $testParts['testpartID']->getAssessmentSections(); $this->assertEquals(1, count($assessmentSections1stLvl)); $this->assertEquals('Container_45665458', $assessmentSections1stLvl['Container_45665458']->getIdentifier()); $assessmentSections2ndLvl = $assessmentSections1stLvl['Container_45665458']->getSectionParts(); $this->assertEquals(1, count($assessmentSections2ndLvl)); $this->assertInstanceOf('qtism\\data\\ExtendedAssessmentSection', $assessmentSections2ndLvl['Sektion_181865064']); $this->assertEquals(0, count($assessmentSections2ndLvl['Sektion_181865064']->getRubricBlockRefs())); $this->assertEquals('Sektion_181865064', $assessmentSections2ndLvl['Sektion_181865064']->getIdentifier()); $assessmentItemRefs = $assessmentSections2ndLvl['Sektion_181865064']->getSectionParts(); $this->assertEquals(13, count($assessmentItemRefs)); // Pick up 4 for a test... $assessmentItemRef = $assessmentItemRefs['Hotspot_278940407']; $this->assertInstanceOf('qtism\\data\\ExtendedAssessmentItemRef', $assessmentItemRef); $this->assertEquals('Hotspot_278940407', $assessmentItemRef->getIdentifier()); $responseDeclarations = $assessmentItemRef->getResponseDeclarations(); $this->assertEquals(1, count($responseDeclarations)); $this->assertEquals('RESPONSE', $responseDeclarations['RESPONSE']->getIdentifier()); $outcomeDeclarations = $assessmentItemRef->getOutcomeDeclarations(); $this->assertEquals(5, count($outcomeDeclarations)); $this->assertEquals('FEEDBACKBASIC', $outcomeDeclarations['FEEDBACKBASIC']->getIdentifier()); $file = tempnam('/tmp', 'qsm'); $compactDoc->save($file); $this->assertTrue(file_exists($file)); $compactDoc = new XmlCompactDocument('1.0'); $compactDoc->load($file); $compactDoc->schemaValidate(); unlink($file); $this->assertFalse(file_exists($file)); }
/** * Get the route (the way items are delivered into a test). * This method will compute the shuffling and other predefined conditions to take the test. * * @param string $testFilePath - the path of the QTI Test definition * @return array the test structure as it should be delivered. */ private function getRoute($testFilePath) { $route = array(); // Load the test definition. $testDefinition = new XmlDocument(); $testDefinition->load($testFilePath); // Make the test definition a compact one. Compact tests combine all needed // information to run a test instance. $resolver = new taoQtiTest_helpers_ItemResolver(); $compactTestDef = XmlCompactDocument::createFromXmlAssessmentTestDocument($testDefinition, $resolver); $sessionManager = new SessionManager(); $testSession = $sessionManager->createAssessmentTestSession($compactTestDef->getDocumentComponent()); $assessmentTest = $testSession->getAssessmentTest(); $renderingEngine = new XhtmlRenderingEngine(); $testPartId = null; $sectionId = null; //We are getting items with their respective test part and sections, so we need to restructure it foreach ($testSession->getRoute() as $routeItem) { $item = array('id' => $routeItem->getAssessmentItemRef()->getIdentifier(), 'href' => $routeItem->getAssessmentItemRef()->getHref()); $routeSections = $routeItem->getAssessmentSections()->getArrayCopy(); $lastSection = $routeSections[count($routeSections) - 1]; if ($sectionId != $lastSection->getIdentifier() || $testPartId != $routeItem->getTestPart()->getIdentifier()) { $sectionId = $lastSection->getIdentifier(); $rubricBlocks = array(); foreach ($routeItem->getAssessmentSections() as $section) { foreach ($section->getRubricBlocks() as $rubricBlock) { $xmlRendering = $renderingEngine->render($rubricBlock); $strRendering = $xmlRendering->saveXML($xmlRendering->documentElement); $finalRendering = ''; // No formatting at all :) ! foreach (preg_split('/\\n|\\r/u', $strRendering, -1, PREG_SPLIT_NO_EMPTY) as $line) { $finalRendering .= trim($line); } $rubricBlocks[] = $finalRendering; } } $section = array('id' => $section->getIdentifier(), 'title' => $section->getTitle(), 'rubricBlock' => $rubricBlocks, 'items' => array($item)); if ($testPartId != $routeItem->getTestPart()->getIdentifier()) { $testPartId = $routeItem->getTestPart()->getIdentifier(); $route[] = array('id' => $testPartId, 'sections' => array($section)); } else { $route = $this->addSectionToRoute($route, $testPartId, $section); } } else { $route = $this->addItemToRoute($route, $testPartId, $sectionId, $item); } } return array('id' => $assessmentTest->getIdentifier(), 'title' => $assessmentTest->getTitle(), 'testParts' => $route); }
public function testCreateFromAssessmentTestEndAttemptIdentifiers() { $doc = new XmlDocument('2.1'); $file = self::samplesDir() . 'custom/test_contains_endattemptinteractions.xml'; $doc->load($file); $compactDoc = XmlCompactDocument::createFromXmlAssessmentTestDocument($doc, new LocalFileResolver()); // ExtendedAssessmentItemRefs! $assessmentItemRefs = $compactDoc->getDocumentComponent()->getComponentsByClassName('assessmentItemRef'); $this->assertEquals(2, count($assessmentItemRefs)); $assessmentItemRef = $assessmentItemRefs[0]; $endAttemptIdentifiers = $assessmentItemRef->getEndAttemptIdentifiers(); $this->assertEquals(1, count($endAttemptIdentifiers)); $this->assertEquals('HINT', $endAttemptIdentifiers[0]); $assessmentItemRef = $assessmentItemRefs[1]; $endAttemptIdentifiers = $assessmentItemRef->getEndAttemptIdentifiers(); $this->assertEquals(2, count($endAttemptIdentifiers)); $this->assertEquals('LOST', $endAttemptIdentifiers[0]); $this->assertEquals('LOST2', $endAttemptIdentifiers[1]); }
/** * Compact the test and items in a single QTI-XML Compact Document. * * @return XmlCompactDocument. */ protected function compactTest() { $testService = taoQtiTest_models_classes_QtiTestService::singleton(); $test = $this->getResource(); common_Logger::t('Compacting QTI test ' . $test->getLabel() . '...'); $resolver = new taoQtiTest_helpers_ItemResolver(Service::singleton()); $originalDoc = $testService->getDoc($test); $compiledDoc = XmlCompactDocument::createFromXmlAssessmentTestDocument($originalDoc, $resolver, $resolver); common_Logger::t("QTI Test XML transformed in a compact version."); return $compiledDoc; }