/** * @dataProvider sequencedIdentifiersProvider * * @param string $identifier * @param string $expectedPrefix * @param string $expectedSequence * @param string $expectedVariableName */ public function testSequencedIdentifiers($identifier, $expectedPrefix, $expectedSequence, $expectedVariableName) { $v = new VariableIdentifier($identifier); $this->assertEquals($identifier, $v->getIdentifier()); $this->assertTrue($v->hasPrefix()); $this->assertTrue($v->hasSequenceNumber()); $this->assertEquals($expectedPrefix, $v->getPrefix()); $this->assertEquals($expectedVariableName, $v->getVariableName()); $this->assertEquals($expectedSequence, $v->getSequenceNumber()); }
/** * Get the item sessions held by the test session by item reference $identifier. * * @param string $identifier An item reference $identifier e.g. Q04. Prefixed or sequenced identifiers e.g. Q04.1.X are considered to be malformed. * @return AssessmentItemSessionCollection|false A collection of AssessmentItemSession objects or false if no item session could be found for $identifier. * @throws InvalidArgumentException If the given $identifier is malformed. */ public function getAssessmentItemSessions($identifier) { try { $v = new VariableIdentifier($identifier); if ($v->hasPrefix() === true || $v->hasSequenceNumber() === true) { $msg = "'{$identifier}' is not a valid item reference identifier."; throw new InvalidArgumentException($msg, 0); } $itemRefs = $this->getAssessmentItemRefs(); if (isset($itemRefs[$identifier]) === false) { return false; } try { return $this->getAssessmentItemSessionStore()->getAssessmentItemSessions($itemRefs[$identifier]); } catch (OutOfBoundsException $e) { return false; } } catch (InvalidArgumentException $e) { $msg = "'{$identifier}' is not a valid item reference identifier."; throw new InvalidArgumentException($msg, 0, $e); } }
/** * Set the value of a variable with identifier $offset. * * @throws \OutOfRangeException If $offset is not a string or an invalid variable identifier. * @throws \OutOfBoundsException If the variable with identifier $offset cannot be found. */ public function offsetSet($offset, $value) { if (gettype($offset) !== 'string') { $msg = "An AssessmentTestSession object must be addressed by string."; throw new OutOfRangeException($msg); } try { $v = new VariableIdentifier($offset); if ($v->hasPrefix() === false) { // global scope request. $data =& $this->getDataPlaceHolder(); $varName = $v->getVariableName(); if (isset($data[$varName]) === false) { $msg = "The variable '{$varName}' to be set does not exist in the current context."; throw new OutOfBoundsException($msg); } $data[$offset]->setValue($value); return; } else { // prefix given. // - prefix targets an item ? $store = $this->getAssessmentItemSessionStore(); $items = $this->getAssessmentItemRefs(); $sequence = $v->hasSequenceNumber() === true ? $v->getSequenceNumber() - 1 : 0; $prefix = $v->getPrefix(); try { if (isset($items[$prefix]) && ($session = $this->getItemSession($items[$prefix], $sequence)) !== false) { $session[$v->getVariableName()] = $value; return; } } catch (OutOfBoundsException $e) { // The session could be retrieved, but no such variable into it. } $msg = "The variable '" . $v->__toString() . "' does not exist in the current context."; throw new OutOfBoundsException($msg); } } catch (InvalidArgumentException $e) { // Invalid variable identifier. $msg = "AssessmentTestSession object addressed with an invalid identifier '{$offset}'."; throw new OutOfRangeException($msg, 0, $e); } }