public function testWeighted()
 {
     $assessmentItemRef = new ExtendedAssessmentItemRef('Q01', './Q01.xml');
     $weights = new WeightCollection(array(new Weight('weight1', 1.1)));
     $assessmentItemRef->setWeights($weights);
     $assessmentItemRef->addOutcomeDeclaration(new OutcomeDeclaration('var1', BaseType::INTEGER, Cardinality::SINGLE));
     $assessmentItemRef->addOutcomeDeclaration(new OutcomeDeclaration('var2', BaseType::FLOAT, Cardinality::MULTIPLE));
     $assessmentItemRefs = new AssessmentItemRefCollection(array($assessmentItemRef));
     $assessmentTest = new AssessmentTest('A01', 'An assessmentTest');
     $assessmentSection = new AssessmentSection('S01', 'An assessmentSection', true);
     $assessmentSection->setSectionParts($assessmentItemRefs);
     $assessmentSections = new AssessmentSectionCollection(array($assessmentSection));
     $testPart = new TestPart('P01', $assessmentSections);
     $assessmentTest->setTestParts(new TestPartCollection(array($testPart)));
     $sessionManager = new SessionManager();
     $assessmentTestSession = $sessionManager->createAssessmentTestSession($assessmentTest);
     $assessmentTestSession->beginTestSession();
     $assessmentTestSession['Q01.var1'] = new Integer(1337);
     $variableExpr = $this->createComponentFromXml('<variable identifier="Q01.var1" weightIdentifier="weight1" />');
     $variableProcessor = new VariableProcessor($variableExpr);
     $variableProcessor->setState($assessmentTestSession);
     // -- single cardinality test.
     $result = $variableProcessor->process();
     $this->assertInstanceOf('qtism\\common\\datatypes\\Float', $result);
     $this->assertEquals(1470.7, $result->getValue());
     // The value in the state must be intact.
     $this->assertEquals(1337, $assessmentTestSession['Q01.var1']->getValue());
     // What if the indicated weight is not found?
     $variableExpr = $this->createComponentFromXml('<variable identifier="Q01.var1" weightIdentifier="weight2" />');
     $variableProcessor->setExpression($variableExpr);
     $result = $variableProcessor->process();
     $this->assertEquals(1337, $result->getValue());
     // -- multiple cardinality test.
     $assessmentTestSession['Q01.var2'] = new MultipleContainer(BaseType::FLOAT, array(new Float(10.1), new Float(12.1)));
     $variableExpr = $this->createComponentFromXml('<variable identifier="Q01.var2" weightIdentifier="weight1"/>');
     $variableProcessor->setExpression($variableExpr);
     $result = $variableProcessor->process();
     $this->assertEquals(11.11, $result[0]->getValue());
     $this->assertEquals(13.31, $result[1]->getValue());
     // The value in the state must be unchanged.
     $stateVal = $assessmentTestSession['Q01.var2'];
     $this->assertEquals(10.1, $stateVal[0]->getValue());
     $this->assertEquals(12.1, $stateVal[1]->getValue());
 }
 public function testMarshallModerate()
 {
     $factory = new CompactMarshallerFactory();
     $component = new ExtendedAssessmentItemRef('Q01', './q01.xml');
     $weights = new WeightCollection();
     // some noise
     $weights[] = new Weight('W01', 1.0);
     $weights[] = new Weight('W02', 2.0);
     $responseDeclarations = new ResponseDeclarationCollection();
     $responseDeclarations[] = new ResponseDeclaration('R01', BaseType::INTEGER, Cardinality::SINGLE);
     $responseDeclarations[] = new ResponseDeclaration('R02', BaseType::BOOLEAN, Cardinality::SINGLE);
     $outcomeDeclarations = new OutcomeDeclarationCollection();
     $outcomeDeclarations[] = new OutcomeDeclaration('O01', BaseType::FLOAT, Cardinality::SINGLE);
     $outcomeDeclarations[] = new OutcomeDeclaration('O02', BaseType::FLOAT, Cardinality::SINGLE);
     $component->setWeights($weights);
     $component->setResponseDeclarations($responseDeclarations);
     $component->setOutcomeDeclarations($outcomeDeclarations);
     $marshaller = $factory->createMarshaller($component);
     $element = $marshaller->marshall($component);
     $this->assertInstanceOf('\\DOMElement', $element);
     $this->assertEquals('assessmentItemRef', $element->nodeName);
     $this->assertEquals('Q01', $element->getAttribute('identifier'));
     $this->assertEquals('./q01.xml', $element->getAttribute('href'));
     $weightElts = $element->getElementsByTagName('weight');
     $this->assertEquals(2, $weightElts->length);
     $this->assertEquals('W01', $weightElts->item(0)->getAttribute('identifier'));
     $this->assertEquals('W02', $weightElts->item(1)->getAttribute('identifier'));
     $responseDeclarationElts = $element->getElementsByTagName('responseDeclaration');
     $this->assertEquals(2, $responseDeclarationElts->length);
     $this->assertEquals('R01', $responseDeclarationElts->item(0)->getAttribute('identifier'));
     $this->assertEquals('R02', $responseDeclarationElts->item(1)->getAttribute('identifier'));
     $outcomeDeclarationElts = $element->getElementsByTagName('outcomeDeclaration');
     $this->assertEquals(2, $outcomeDeclarationElts->length);
     $this->assertEquals('O01', $outcomeDeclarationElts->item(0)->getAttribute('identifier'));
     $this->assertEquals('O02', $outcomeDeclarationElts->item(1)->getAttribute('identifier'));
 }
 /**
  * Get the TAO Uri of the Test Definition from an ExtendedAssessmentItemRef object.
  * 
  * @param ExtendedAssessmentItemRef $itemRef
  * @return string A URI.
  */
 protected static function getTestDefinitionUri(ExtendedAssessmentItemRef $itemRef)
 {
     $parts = explode('|', $itemRef->getHref());
     return $parts[2];
 }
 /**
  * Unmarshall an extended version of an assessmentItemRef DOMElement into 
  * a ExtendedAssessmentItemRef object.
  * 
  * @return 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());
     $responseDeclarationElts = self::getChildElementsByTagName($element, 'responseDeclaration');
     $responseDeclarations = new ResponseDeclarationCollection();
     foreach ($responseDeclarationElts as $responseDeclarationElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($responseDeclarationElt);
         $responseDeclarations[] = $marshaller->unmarshall($responseDeclarationElt);
     }
     $compactAssessmentItemRef->setResponseDeclarations($responseDeclarations);
     $outcomeDeclarationElts = self::getChildElementsByTagName($element, 'outcomeDeclaration');
     $outcomeDeclarations = new OutcomeDeclarationCollection();
     foreach ($outcomeDeclarationElts as $outcomeDeclarationElt) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($outcomeDeclarationElt);
         $outcomeDeclarations[] = $marshaller->unmarshall($outcomeDeclarationElt);
     }
     $compactAssessmentItemRef->setOutcomeDeclarations($outcomeDeclarations);
     $responseProcessingElts = self::getChildElementsByTagName($element, 'responseProcessing');
     if (count($responseProcessingElts) === 1) {
         $marshaller = $this->getMarshallerFactory()->createMarshaller($responseProcessingElts[0]);
         $compactAssessmentItemRef->setResponseProcessing($marshaller->unmarshall($responseProcessingElts[0]));
     }
     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);
     }
     return $compactAssessmentItemRef;
 }
 /**
  * @depends testMarshallMinimal
  */
 public function testMarshallShufflingGroups()
 {
     $factory = new CompactMarshallerFactory();
     $component = new ExtendedAssessmentItemRef('Q01', './q01.xml');
     $group1 = new ShufflingGroup(new IdentifierCollection(array('id1', 'id2', 'id3')));
     $group2 = new ShufflingGroup(new IdentifierCollection(array('id4', 'id5', 'id6')));
     $shufflingGroups = new ShufflingGroupCollection(array($group1, $group2));
     $shufflings = new ShufflingCollection(array(new Shuffling('RESPONSE', $shufflingGroups)));
     $component->setShufflings($shufflings);
     $marshaller = $factory->createMarshaller($component);
     $element = $marshaller->marshall($component);
     $this->assertInstanceOf('\\DOMElement', $element);
     $this->assertEquals('assessmentItemRef', $element->nodeName);
     $this->assertEquals('Q01', $element->getAttribute('identifier'));
     $this->assertEquals('./q01.xml', $element->getAttribute('href'));
     $shufflingElts = $element->getElementsByTagName('shuffling');
     $this->assertEquals(1, $shufflingElts->length);
     $this->assertEquals('RESPONSE', $shufflingElts->item(0)->getAttribute('responseIdentifier'));
     $shufflingGroupElts = $shufflingElts->item(0)->getElementsByTagName('shufflingGroup');
     $this->assertEquals(2, $shufflingGroupElts->length);
     $this->assertEquals('id1 id2 id3', $shufflingGroupElts->item(0)->getAttribute('identifiers'));
     $this->assertEquals('id4 id5 id6', $shufflingGroupElts->item(1)->getAttribute('identifiers'));
 }
 /**
  * Dereference the file referenced by an assessmentItemRef and add
  * outcome/responseDeclarations to the compact one.
  *
  * @param ExtendedAssessmentItemRef $compactAssessmentItemRef A previously instantiated ExtendedAssessmentItemRef object.
  * @param FileResolver $resolver The Resolver to be used to resolver AssessmentItemRef's href attribute.
  * @throws XmlStorageException If an error occurs (e.g. file not found at URI or unmarshalling issue) during the dereferencing.
  */
 protected static function resolveAssessmentItemRef(ExtendedAssessmentItemRef $compactAssessmentItemRef, FileResolver $resolver)
 {
     try {
         $href = $resolver->resolve($compactAssessmentItemRef->getHref());
         $doc = new XmlDocument();
         $doc->load($href);
         foreach ($doc->getDocumentComponent()->getResponseDeclarations() as $resp) {
             $compactAssessmentItemRef->addResponseDeclaration($resp);
         }
         foreach ($doc->getDocumentComponent()->getOutcomeDeclarations() as $out) {
             $compactAssessmentItemRef->addOutcomeDeclaration($out);
         }
         if ($doc->getDocumentComponent()->hasResponseProcessing() === true) {
             $compactAssessmentItemRef->setResponseProcessing($doc->getDocumentComponent()->getResponseProcessing());
         }
         $compactAssessmentItemRef->setAdaptive($doc->getDocumentComponent()->isAdaptive());
         $compactAssessmentItemRef->setTimeDependent($doc->getDocumentComponent()->isTimeDependent());
     } catch (Exception $e) {
         $msg = "An error occured while unreferencing file '{$href}'.";
         throw new XmlStorageException($msg, $e);
     }
 }
Example #7
0
 /**
  * Dereference the file referenced by an assessmentItemRef and add
  * outcome/responseDeclarations to the compact one.
  *
  * @param \qtism\data\ExtendedAssessmentItemRef $compactAssessmentItemRef A previously instantiated ExtendedAssessmentItemRef object.
  * @param \qtism\data\storage\FileResolver $resolver The Resolver to be used to resolver AssessmentItemRef's href attribute.
  * @throws \qtism\data\storage\xml\XmlStorageException If an error occurs (e.g. file not found at URI or unmarshalling issue) during the dereferencing.
  */
 protected static function resolveAssessmentItemRef(ExtendedAssessmentItemRef $compactAssessmentItemRef, FileResolver $resolver)
 {
     try {
         $href = $resolver->resolve($compactAssessmentItemRef->getHref());
         $doc = new XmlDocument();
         $doc->load($href);
         $item = $doc->getDocumentComponent();
         foreach ($item->getResponseDeclarations() as $resp) {
             $compactAssessmentItemRef->addResponseDeclaration($resp);
         }
         foreach ($item->getOutcomeDeclarations() as $out) {
             $compactAssessmentItemRef->addOutcomeDeclaration($out);
         }
         foreach ($item->getTemplateDeclarations() as $tpl) {
             $compactAssessmentItemRef->addTemplateDeclaration($tpl);
         }
         foreach ($item->getModalFeedbackRules() as $modalFeedbackRule) {
             $compactAssessmentItemRef->addModalFeedbackRule($modalFeedbackRule);
         }
         if ($item->hasResponseProcessing() === true) {
             $compactAssessmentItemRef->setResponseProcessing($item->getResponseProcessing());
         }
         if ($item->hasTemplateProcessing() === true) {
             $compactAssessmentItemRef->setTemplateProcessing($item->getTemplateProcessing());
         }
         $compactAssessmentItemRef->setShufflings($item->getShufflings());
         $compactAssessmentItemRef->setAdaptive($item->isAdaptive());
         $compactAssessmentItemRef->setTimeDependent($item->isTimeDependent());
         $compactAssessmentItemRef->setEndAttemptIdentifiers($item->getEndAttemptIdentifiers());
     } catch (Exception $e) {
         $msg = "An error occured while unreferencing file '{$href}'.";
         throw new XmlStorageException($msg, XmlStorageException::RESOLUTION, $e);
     }
 }