/**
  * @depends testMarshallMinimal
  */
 public function testMarshallTemplateDeclarations()
 {
     $factory = new CompactMarshallerFactory();
     $component = new ExtendedAssessmentItemRef('Q01', './q01.xml');
     $templateDeclarations = new TemplateDeclarationCollection();
     $templateDeclarations[] = new TemplateDeclaration('T01', BaseType::INTEGER, Cardinality::SINGLE);
     $templateDeclarations[] = new TemplateDeclaration('T02', BaseType::INTEGER, Cardinality::SINGLE);
     $component->setTemplateDeclarations($templateDeclarations);
     $marshaller = $factory->createMarshaller($component);
     $element = $marshaller->marshall($component);
     $this->assertInstanceOf('\\DOMElement', $element);
     $this->assertEquals('assessmentItemRef', $element->nodeName);
     $templateDeclarationElts = $element->getElementsByTagName('templateDeclaration');
     $this->assertEquals(2, $templateDeclarationElts->length);
     $this->assertEquals('T01', $templateDeclarationElts->item(0)->getAttribute('identifier'));
     $this->assertEquals('T02', $templateDeclarationElts->item(1)->getAttribute('identifier'));
 }
 /**
  * Unmarshall an extended version of an assessmentItemRef DOMElement into
  * a ExtendedAssessmentItemRef object.
  *
  * @param \DOMElement $element
  * @return  \qtism\data\ExtendedAssessmentItemRef A ExtendedAssessmentItemRef object.
  */
 protected function unmarshall(DOMElement $element)
 {
     $baseComponent = parent::unmarshall($element);
     $identifier = $baseComponent->getIdentifier();
     $href = $baseComponent->getHref();
     $compactAssessmentItemRef = new ExtendedAssessmentItemRef($identifier, $href);
     $compactAssessmentItemRef->setRequired($baseComponent->isRequired());
     $compactAssessmentItemRef->setFixed($baseComponent->isFixed());
     $compactAssessmentItemRef->setPreConditions($baseComponent->getPreConditions());
     $compactAssessmentItemRef->setBranchRules($baseComponent->getBranchRules());
     $compactAssessmentItemRef->setItemSessionControl($baseComponent->getItemSessionControl());
     $compactAssessmentItemRef->setTimeLimits($baseComponent->getTimeLimits());
     $compactAssessmentItemRef->setTemplateDefaults($baseComponent->getTemplateDefaults());
     $compactAssessmentItemRef->setWeights($baseComponent->getWeights());
     $compactAssessmentItemRef->setVariableMappings($baseComponent->getVariableMappings());
     $compactAssessmentItemRef->setCategories($baseComponent->getCategories());
     // ResponseDeclarations.
     $responseDeclarationElts = self::getChildElementsByTagName($element, 'responseDeclaration');
     $responseDeclarations = new ResponseDeclarationCollection();
     foreach ($responseDeclarationElts as $responseDeclarationElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($responseDeclarationElt);
         $responseDeclarations[] = $marshaller->unmarshall($responseDeclarationElt);
     }
     $compactAssessmentItemRef->setResponseDeclarations($responseDeclarations);
     // OutcomeDeclarations.
     $outcomeDeclarationElts = self::getChildElementsByTagName($element, 'outcomeDeclaration');
     $outcomeDeclarations = new OutcomeDeclarationCollection();
     foreach ($outcomeDeclarationElts as $outcomeDeclarationElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($outcomeDeclarationElt);
         $outcomeDeclarations[] = $marshaller->unmarshall($outcomeDeclarationElt);
     }
     $compactAssessmentItemRef->setOutcomeDeclarations($outcomeDeclarations);
     // TemplateDeclarations.
     $templateDeclarationElts = self::getChildElementsByTagName($element, 'templateDeclaration');
     $templateDeclarations = new TemplateDeclarationCollection();
     foreach ($templateDeclarationElts as $templateDeclarationElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($templateDeclarationElt);
         $templateDeclarations[] = $marshaller->unmarshall($templateDeclarationElt);
     }
     $compactAssessmentItemRef->setTemplateDeclarations($templateDeclarations);
     // TemplateProcessing.
     $templateProcessingElts = self::getChildElementsByTagName($element, 'templateProcessing');
     if (count($templateProcessingElts) === 1) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($templateProcessingElts[0]);
         $compactAssessmentItemRef->setTemplateProcessing($marshaller->unmarshall($templateProcessingElts[0]));
     }
     // ResponseProcessing.
     $responseProcessingElts = self::getChildElementsByTagName($element, 'responseProcessing');
     if (count($responseProcessingElts) === 1) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($responseProcessingElts[0]);
         $compactAssessmentItemRef->setResponseProcessing($marshaller->unmarshall($responseProcessingElts[0]));
     }
     // ModalFeedbacks (transformed in ModalFeedbackRules).
     $modalFeedbackElts = self::getChildElementsByTagName($element, 'modalFeedbackRule');
     $modalFeedbackRules = new ModalFeedbackRuleCollection();
     foreach ($modalFeedbackElts as $modalFeedbackElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($modalFeedbackElt);
         $modalFeedbackRules[] = $marshaller->unmarshall($modalFeedbackElt);
     }
     $compactAssessmentItemRef->setModalFeedbackRules($modalFeedbackRules);
     // Shufflings.
     $shufflingElts = self::getChildElementsByTagName($element, 'shuffling');
     $shufflings = new ShufflingCollection();
     foreach ($shufflingElts as $shufflingElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($shufflingElt);
         $shufflings[] = $marshaller->unmarshall($shufflingElt);
     }
     $compactAssessmentItemRef->setShufflings($shufflings);
     if (($adaptive = static::getDOMElementAttributeAs($element, 'adaptive', 'boolean')) !== null) {
         $compactAssessmentItemRef->setAdaptive($adaptive);
     }
     if (($timeDependent = static::getDOMElementAttributeAs($element, 'timeDependent', 'boolean')) !== null) {
         $compactAssessmentItemRef->setTimeDependent($timeDependent);
     } else {
         $msg = "The mandatory attribute 'timeDependent' is missing from element '" . $element->localName . "'.";
         throw new UnmarshallingException($msg, $element);
     }
     if (($endAttemptIdentifiers = self::getDOMElementAttributeAs($element, 'endAttemptIdentifiers')) !== null) {
         $identifiersArray = explode(" ", $endAttemptIdentifiers);
         if (count($identifiersArray) > 0) {
             $compactAssessmentItemRef->setEndAttemptIdentifiers(new IdentifierCollection($identifiersArray));
         }
     }
     return $compactAssessmentItemRef;
 }