tao-test/app/taoResultServer/test/Unit/models/Mapper/ResultMapperTest.php

199 lines
9.8 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2019 (original work) Open Assessment Technologies SA;
*
*/
namespace oat\taoResultServer\test\Unit\models\Mapper;
use oat\dtms\DateTime;
use oat\generis\test\TestCase;
use oat\oatbox\log\LoggerService;
use oat\taoResultServer\models\Mapper\ResultMapper;
use Psr\Log\NullLogger;
use qtism\data\results\AssessmentResult;
use qtism\data\storage\xml\XmlResultDocument;
use taoResultServer_models_classes_ResponseVariable;
class ResultMapperTest extends TestCase
{
public function load($file = null)
{
if (null === $file) {
$file = __DIR__ . '/../../../resources/result/simple-assessment-result.xml';
}
$doc = new XmlResultDocument();
$doc->loadFromString(file_get_contents($file));
$resultMapper = new ResultMapper();
$resultMapper->setServiceLocator($this->getServiceLocatorMock([LoggerService::SERVICE_ID => new NullLogger()]));
return $resultMapper->loadSource($doc->getDocumentComponent());
}
public function testLoad()
{
$mapper = $this->load();
$reflectionProperty = new \ReflectionProperty(ResultMapper::class, 'assessmentResult');
$reflectionProperty->setAccessible(true);
$this->assertEquals(AssessmentResult::class, get_class($reflectionProperty->getValue($mapper)));
}
public function testGetContext()
{
$expected = [
'sourcedId' => 'fixture-sourcedId',
'sessionIdentifiers' => [
'sessionIdentifier1-id' => 'http://sessionIdentifier1-sourceID',
'sessionIdentifier2-id' => 'http://sessionIdentifier2-sourceID',
]
];
$this->assertSame($expected, $this->load()->getContext());
}
public function testGetEmptyContext()
{
$resultWithEmptyContext = __DIR__ . '/../../../resources/result/qti-result-de.xml';
$expected = [
'sourcedId' => '',
'sessionIdentifiers' => []
];
$this->assertSame($expected, $this->load($resultWithEmptyContext)->getContext());
}
public function testGetContextWithoutLoad()
{
$this->expectException(\LogicException::class);
(new ResultMapper())->getContext();
}
public function testGetTestVariables()
{
$variablesByTestResult = $this->load()->getTestVariables();
$this->assertCount(1, $variablesByTestResult);
$this->assertEquals('fixture-test-identifier', key($variablesByTestResult));
$variables = $variablesByTestResult['fixture-test-identifier'];
/** @var taoResultServer_models_classes_ResponseVariable $variable */
$variable = reset($variables);
$this->assertInstanceOf(taoResultServer_models_classes_ResponseVariable::class, $variable);
$this->assertEquals('response-identifier', $variable->getIdentifier());
$this->assertEquals('fixture-test-value3;fixture-test-value4;fixture-test-value5', $variable->getCandidateResponse());
$this->assertEquals('fixture-test-value3;fixture-test-value4;fixture-test-value5', $variable->getValue());
$this->assertEquals('fixture-test-value1;fixture-test-value2', $variable->getCorrectResponse());
$this->assertEquals('single', $variable->getCardinality());
$this->assertNull($variable->getBaseType());
$epochDateTime = (new DateTime())->setTimestamp(explode(' ', $variable->getEpoch())[1]);
$this->assertSame('2018-06-27T09:41:45', $epochDateTime->format('Y-m-d\TH:i:s'));
}
public function testGetTestWithEmptyTestResult()
{
$resultWithEmptyTestResult = __DIR__ . '/../../../resources/result/qti-result-de.xml';
$this->assertEmpty($this->load($resultWithEmptyTestResult)->getTestVariables());
}
public function testGetTestVariablesWithTemplateVariables()
{
$resultWithTemplateVariables = __DIR__ . '/../../../resources/result/result-with-template-variable.xml';
$this->expectException(\common_exception_NotImplemented::class);
$this->load($resultWithTemplateVariables)->getTestVariables();
}
public function testGetItemVariables()
{
$variablesByItemResult = $this->load()->getItemVariables();
$this->assertCount(3, $variablesByItemResult);
$this->assertArrayHasKey('fixture-identifier-itemResult1', $variablesByItemResult);
$this->assertArrayHasKey('fixture-identifier-itemResult2', $variablesByItemResult);
/** @var taoResultServer_models_classes_ResponseVariable $variable0 */
$variable0 = $variablesByItemResult['fixture-identifier-itemResult1'][0];
$this->assertInstanceOf(taoResultServer_models_classes_ResponseVariable::class, $variable0);
$this->assertEquals('fixture-identifier1', $variable0->getIdentifier());
$this->assertEquals('fixture-value8;fixture-value9;fixture-value10', $variable0->getValue());
$this->assertEquals('fixture-value8;fixture-value9;fixture-value10', $variable0->getCandidateResponse());
$this->assertEquals('fixture-value6;fixture-value7', $variable0->getCorrectResponse());
$this->assertEquals('single', $variable0->getCardinality());
$this->assertEquals('string', $variable0->getBaseType());
$epochDateTime = (new DateTime())->setTimestamp(explode(' ', $variable0->getEpoch())[1]);
$this->assertSame('2018-06-27T09:41:45', $epochDateTime->format('Y-m-d\TH:i:s'));
/** @var \taoResultServer_models_classes_OutcomeVariable $variable1 */
$variable1 = $variablesByItemResult['fixture-identifier-itemResult1'][1];
$this->assertInstanceOf(\taoResultServer_models_classes_OutcomeVariable::class, $variable1);
$this->assertEquals('fixture-identifier2', $variable1->getIdentifier());
$this->assertEquals('fixture-value11', $variable1->getValue());
$this->assertEquals('2', $variable1->getNormalMinimum());
$this->assertEquals('3', $variable1->getNormalMaximum());
$this->assertEquals('single', $variable1->getCardinality());
$this->assertEquals('string', $variable1->getBaseType());
$epochDateTime = (new DateTime())->setTimestamp(explode(' ', $variable1->getEpoch())[1]);
$this->assertSame('2018-06-27T09:41:45', $epochDateTime->format('Y-m-d\TH:i:s'));
/** @var taoResultServer_models_classes_ResponseVariable $variable2 */
$variable2 = $variablesByItemResult['fixture-identifier-itemResult2'][0];
$this->assertInstanceOf(taoResultServer_models_classes_ResponseVariable::class, $variable2);
$this->assertEquals('fixture-identifier3', $variable2->getIdentifier());
$this->assertEquals('fixture-value16', $variable2->getValue());
$this->assertEquals('fixture-value16', $variable2->getCandidateResponse());
$this->assertEquals('fixture-value14', $variable2->getCorrectResponse());
$this->assertEquals('single', $variable2->getCardinality());
$this->assertEquals('string', $variable2->getBaseType());
$epochDateTime = (new DateTime())->setTimestamp(explode(' ', $variable2->getEpoch())[1]);
$this->assertSame('2018-06-27T09:41:45', $epochDateTime->format('Y-m-d\TH:i:s'));
/** @var \taoResultServer_models_classes_OutcomeVariable $variable3 */
$variable3 = $variablesByItemResult['fixture-identifier-itemResult2'][1];
$this->assertInstanceOf(\taoResultServer_models_classes_OutcomeVariable::class, $variable3);
$this->assertEquals('fixture-identifier4', $variable3->getIdentifier());
$this->assertEquals('fixture-value19', $variable3->getValue());
$this->assertEquals('4', $variable3->getNormalMinimum());
$this->assertEquals('6', $variable3->getNormalMaximum());
$this->assertEquals('single', $variable3->getCardinality());
$this->assertEquals('string', $variable3->getBaseType());
$epochDateTime = (new DateTime())->setTimestamp(explode(' ', $variable3->getEpoch())[1]);
$this->assertSame('2018-06-27T09:41:45', $epochDateTime->format('Y-m-d\TH:i:s'));
/** @var taoResultServer_models_classes_ResponseVariable $variable4 */
$variable4 = $variablesByItemResult['fixture-identifier-itemResult3'][0];
$this->assertInstanceOf(\taoResultServer_models_classes_ResponseVariable::class, $variable4);
$this->assertEquals('fixture-identifier5', $variable4->getIdentifier());
$this->assertEmpty($variable4->getValue());
$this->assertEmpty($variable4->getCandidateResponse());
$this->assertEquals('fixture-value20', $variable4->getCorrectResponse());
$this->assertEquals('single', $variable4->getCardinality());
$this->assertEquals('identifier', $variable4->getBaseType());
}
public function testGetItemVariablesWithTemplateVariables()
{
$resultWithTemplateVariables = __DIR__ . '/../../../resources/result/result-with-template-variable.xml';
$this->expectException(\common_exception_NotImplemented::class);
$this->load($resultWithTemplateVariables)->getItemVariables();
}
public function testGetTestVariablesWithoutLoad()
{
$this->expectException(\LogicException::class);
(new ResultMapper())->getTestVariables();
}
}