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;
 }