public function testMarshall()
 {
     $section = new ExtendedAssessmentSection('S01', 'Section 01', true);
     $section->setSectionParts(new SectionPartCollection(array(new AssessmentSectionRef('SR01', './SR01.xml'))));
     $section->setRubricBlockRefs(new RubricBlockRefCollection(array(new RubricBlockRef('R01', './R01.xml'))));
     $factory = new CompactMarshallerFactory();
     $marshaller = $factory->createMarshaller($section);
     $elt = $marshaller->marshall($section);
     $this->assertEquals('assessmentSection', $elt->nodeName);
     $this->assertEquals('S01', $elt->getAttribute('identifier'));
     $this->assertEquals('Section 01', $elt->getAttribute('title'));
     $this->assertEquals('true', $elt->getAttribute('visible'));
     $assessmentSectionRefElts = $elt->getElementsByTagName('assessmentSectionRef');
     $this->assertEquals(1, $assessmentSectionRefElts->length);
     $assessmentSectionRefElt = $assessmentSectionRefElts->item(0);
     $this->assertEquals('SR01', $assessmentSectionRefElt->getAttribute('identifier'));
     $this->assertEquals('./SR01.xml', $assessmentSectionRefElt->getAttribute('href'));
     $rubricBlockRefElts = $elt->getElementsByTagName('rubricBlockRef');
     $this->assertEquals(1, $rubricBlockRefElts->length);
     $rubricBlockRefElt = $rubricBlockRefElts->item(0);
     $this->assertEquals('R01', $rubricBlockRefElt->getAttribute('identifier'));
     $this->assertEquals('./R01.xml', $rubricBlockRefElt->getAttribute('href'));
 }
 /**
  * Unmarshall an extendedAssessmentSection element into its QTI data model representation.
  * 
  * @param DOMElement $element
  * @param QtiComponentCollection $children
  * @return QtiComponent
  */
 protected function unmarshallChildrenKnown(DOMElement $element, QtiComponentCollection $children)
 {
     $baseComponent = parent::unmarshallChildrenKnown($element, $children);
     $component = ExtendedAssessmentSection::createFromAssessmentSection($baseComponent);
     $rubricBlockRefElts = self::getChildElementsByTagName($element, 'rubricBlockRef');
     if (count($rubricBlockRefElts) > 0) {
         $rubricBlockRefs = new RubricBlockRefCollection();
         foreach ($rubricBlockRefElts as $rubricBlockRefElt) {
             $marshaller = $this->getMarshallerFactory()->createMarshaller($rubricBlockRefElt);
             $rubricBlockRefs[] = $marshaller->unmarshall($rubricBlockRefElt);
         }
         $component->setRubricBlockRefs($rubricBlockRefs);
     }
     return $component;
 }
 /**
  * Create a new instance of XmlCompactDocument from an XmlAssessmentTestDocument.
  *
  * @param XmlDocument $xmlAssessmentTestDocument An XmlAssessmentTestDocument object you want to store as a compact XML file.
  * @return XmlCompactDocument An XmlCompactAssessmentTestDocument object.
  * @throws XmlStorageException If an error occurs while transforming the XmlAssessmentTestDocument object into an XmlCompactAssessmentTestDocument object.
  */
 public static function createFromXmlAssessmentTestDocument(XmlDocument $xmlAssessmentTestDocument, FileResolver $itemResolver = null)
 {
     $compactAssessmentTest = new XmlCompactDocument();
     $identifier = $xmlAssessmentTestDocument->getDocumentComponent()->getIdentifier();
     $title = $xmlAssessmentTestDocument->getDocumentComponent()->getTitle();
     $assessmentTest = new AssessmentTest($identifier, $title);
     $assessmentTest->setOutcomeDeclarations($xmlAssessmentTestDocument->getDocumentComponent()->getOutcomeDeclarations());
     $assessmentTest->setOutcomeProcessing($xmlAssessmentTestDocument->getDocumentComponent()->getOutcomeProcessing());
     $assessmentTest->setTestFeedbacks($xmlAssessmentTestDocument->getDocumentComponent()->getTestFeedbacks());
     $assessmentTest->setTestParts($xmlAssessmentTestDocument->getDocumentComponent()->getTestParts());
     $assessmentTest->setTimeLimits($xmlAssessmentTestDocument->getDocumentComponent()->getTimeLimits());
     $assessmentTest->setToolName($xmlAssessmentTestDocument->getDocumentComponent()->getToolName());
     $assessmentTest->setToolVersion($xmlAssessmentTestDocument->getDocumentComponent()->getToolVersion());
     // File resolution.
     $sectionResolver = new LocalFileResolver($xmlAssessmentTestDocument->getUrl());
     if (is_null($itemResolver) === true) {
         $itemResolver = new LocalFileResolver($xmlAssessmentTestDocument->getUrl());
     } else {
         $itemResolver->setBasePath($xmlAssessmentTestDocument->getUrl());
     }
     // It simply consists of replacing assessmentItemRef and assessmentSectionRef elements.
     $trail = array();
     // trailEntry[0] = a component, trailEntry[1] = from where we are coming (parent).
     $mark = array();
     $root = $xmlAssessmentTestDocument->getDocumentComponent();
     array_push($trail, array($root, $root));
     while (count($trail > 0)) {
         $trailer = array_pop($trail);
         $component = $trailer[0];
         $previous = $trailer[1];
         if (!in_array($component, $mark) && count($component->getComponents()) > 0) {
             // First pass on a hierarchical node... go deeper in the n-ary tree.
             array_push($mark, $component);
             // We want to go back on this component.
             array_push($trail, $trailer);
             // Prepare further exploration.
             foreach ($component->getComponents()->getArrayCopy() as $comp) {
                 array_push($trail, array($comp, $component));
             }
         } else {
             if (in_array($component, $mark) || count($component->getComponents()) === 0) {
                 // Second pass on a hierarchical node (we are bubbling up accross the n-ary tree)
                 // OR
                 // Leaf node
                 if ($component instanceof AssessmentItemRef) {
                     // Transform the ref in an compact extended ref.
                     $compactRef = ExtendedAssessmentItemRef::createFromAssessmentItemRef($component);
                     // find the old one and replace it.
                     $previousParts = $previous->getSectionParts();
                     foreach ($previousParts as $k => $previousPart) {
                         if ($previousParts[$k] === $component) {
                             // If the previous processed component is an XmlAssessmentSectionDocument,
                             // it means that the given baseUri must be adapted.
                             $baseUri = $xmlAssessmentTestDocument->getUrl();
                             if ($component instanceof XmlDocument && $component->getDocumentComponent() instanceof AssessmentSection) {
                                 $baseUri = $component->getUrl();
                             }
                             $itemResolver->setBasePath($baseUri);
                             self::resolveAssessmentItemRef($compactRef, $itemResolver);
                             $previousParts->replace($component, $compactRef);
                             break;
                         }
                     }
                 } else {
                     if ($component instanceof AssessmentSectionRef) {
                         // We follow the unreferenced AssessmentSection as if it was
                         // the 1st pass.
                         $assessmentSection = self::resolveAssessmentSectionRef($component, $sectionResolver);
                         $previousParts = $previous->getSectionParts();
                         foreach ($previousParts as $k => $previousPart) {
                             if ($previousParts[$k] === $component) {
                                 $previousParts->replace($component, $assessmentSection);
                                 break;
                             }
                         }
                         array_push($trail, array($assessmentSection, $previous));
                     } else {
                         if ($component instanceof AssessmentSection) {
                             $assessmentSection = ExtendedAssessmentSection::createFromAssessmentSection($component);
                             $previousParts = $previous instanceof TestPart ? $previous->getAssessmentSections() : $previous->getSectionParts();
                             foreach ($previousParts as $k => $previousPart) {
                                 if ($previousParts[$k] === $component) {
                                     $previousParts->replace($component, $assessmentSection);
                                     break;
                                 }
                             }
                         } else {
                             if ($component === $root) {
                                 // 2nd pass on the root, we have to stop.
                                 $compactAssessmentTest->setDocumentComponent($assessmentTest);
                                 return $compactAssessmentTest;
                             }
                         }
                     }
                 }
             }
         }
     }
 }