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()); }
/** * 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); } }
/** * 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); } }