/** * @depends testMarshallMinimal */ 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); $templateRules = new TemplateRuleCollection(); $templateRules[] = new SetCorrectResponse('R01', new BaseValue(BaseType::INTEGER, 20)); $templateProcessing = new TemplateProcessing($templateRules); $templateDefaults = new TemplateDefaultCollection(); $templateDefaults[] = new TemplateDefault('T01', new BaseValue(BaseType::INTEGER, 20)); $component->setWeights($weights); $component->setResponseDeclarations($responseDeclarations); $component->setOutcomeDeclarations($outcomeDeclarations); $component->setTemplateProcessing($templateProcessing); $component->setTemplateDefaults($templateDefaults); $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')); $templateProcessingElts = $element->getElementsByTagName('templateProcessing'); $this->assertEquals(1, $templateProcessingElts->length); $templateProcessingElt = $templateProcessingElts->item(0); $baseValueElements = $templateProcessingElt->getElementsByTagName('baseValue'); $this->assertEquals(1, $baseValueElements->length); $templateDefaultElts = $element->getElementsByTagName('templateDefault'); $this->assertEquals(1, $templateDefaultElts->length); }
/** * 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; }
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()); }