2136 lines
85 KiB
PHP
2136 lines
85 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) 2015-2019 (original work) Open Assessment Technologies SA;
|
|
*/
|
|
|
|
namespace oat\taoQtiTest\scripts\update;
|
|
|
|
use oat\libCat\custom\EchoAdaptEngine;
|
|
use oat\oatbox\filesystem\FileSystemService;
|
|
use oat\oatbox\service\ServiceNotFoundException;
|
|
use oat\tao\model\accessControl\func\AccessRule;
|
|
use oat\tao\model\accessControl\func\AclProxy;
|
|
use oat\tao\model\asset\AssetService;
|
|
use oat\tao\model\ClientLibConfigRegistry;
|
|
use oat\tao\model\ClientLibRegistry;
|
|
use oat\tao\model\import\ImportersService;
|
|
use oat\tao\model\taskQueue\TaskLogInterface;
|
|
use oat\tao\model\user\TaoRoles;
|
|
use oat\tao\scripts\update\OntologyUpdater;
|
|
use oat\taoDelivery\model\container\delivery\DeliveryContainerRegistry;
|
|
use oat\taoQtiTest\models\cat\CatService;
|
|
use oat\taoQtiTest\models\compilation\CompilationService;
|
|
use oat\taoQtiTest\models\container\QtiTestDeliveryContainer;
|
|
use oat\taoQtiTest\models\creator\CreatorItems;
|
|
use oat\taoQtiTest\models\export\metadata\TestExporter;
|
|
use oat\taoQtiTest\models\export\metadata\TestMetadataByClassExportHandler;
|
|
use oat\taoQtiTest\models\export\metadata\TestMetadataExporter;
|
|
use oat\taoQtiTest\models\ExtendedStateService;
|
|
use oat\taoQtiTest\models\files\QtiFlysystemFileManager;
|
|
use oat\taoQtiTest\models\import\QtiTestImporter;
|
|
use oat\taoQtiTest\models\PhpCodeCompilationDataService;
|
|
use oat\taoQtiTest\models\QtiTestListenerService;
|
|
use oat\taoQtiTest\models\QtiTestUtils;
|
|
use oat\taoQtiTest\models\runner\communicator\QtiCommunicationService;
|
|
use oat\taoQtiTest\models\runner\communicator\TestStateChannel;
|
|
use oat\taoQtiTest\models\runner\config\Business\Contract\OverriddenOptionsRepositoryInterface;
|
|
use oat\taoQtiTest\models\runner\config\DataAccess\Repository\NoopOverriddenOptionsRepository;
|
|
use oat\taoQtiTest\models\runner\config\QtiRunnerConfig;
|
|
use oat\taoQtiTest\models\runner\map\QtiRunnerMap;
|
|
use oat\taoQtiTest\models\runner\OfflineQtiRunnerService;
|
|
use oat\taoQtiTest\models\runner\QtiRunnerMessageService;
|
|
use oat\taoQtiTest\models\runner\rubric\QtiRunnerRubric;
|
|
use oat\taoQtiTest\models\runner\StorageManager;
|
|
use oat\taoQtiTest\models\runner\synchronisation\action\NextItemData;
|
|
use oat\taoQtiTest\models\runner\synchronisation\action\Pause;
|
|
use oat\taoQtiTest\models\runner\synchronisation\SynchronisationService;
|
|
use oat\taoQtiTest\models\runner\TestDefinitionSerializerService;
|
|
use oat\taoQtiTest\models\runner\time\QtiTimer;
|
|
use oat\taoQtiTest\models\runner\time\QtiTimerFactory;
|
|
use oat\taoQtiTest\models\runner\time\QtiTimeStorage;
|
|
use oat\taoQtiTest\models\runner\time\storageFormat\QtiTimeStoragePackedFormat;
|
|
use oat\taoQtiTest\models\runner\time\TimerAdjustmentService;
|
|
use oat\taoQtiTest\models\runner\time\TimerAdjustmentServiceInterface;
|
|
use oat\taoQtiTest\models\runner\time\TimerLabelFormatterService;
|
|
use oat\taoQtiTest\models\runner\time\TimerStrategyService;
|
|
use oat\taoQtiTest\models\runner\toolsStates\NoStorage;
|
|
use oat\taoQtiTest\models\runner\toolsStates\ToolsStateStorage;
|
|
use oat\taoQtiTest\models\SectionPauseService;
|
|
use oat\taoQtiTest\models\tasks\ImportQtiTest;
|
|
use oat\taoQtiTest\models\TestCategoryPresetProvider;
|
|
use oat\taoQtiTest\models\TestCategoryPresetRegistry;
|
|
use oat\taoQtiTest\models\TestCategoryRulesGenerator;
|
|
use oat\taoQtiTest\models\TestCategoryRulesService;
|
|
use oat\taoQtiTest\models\TestModelService;
|
|
use oat\taoQtiTest\models\TestRunnerClientConfigRegistry;
|
|
use oat\taoQtiTest\models\TestSessionService;
|
|
use oat\taoQtiTest\models\xmlEditor\XmlEditor;
|
|
use oat\taoQtiTest\models\xmlEditor\XmlEditorInterface;
|
|
use oat\taoQtiTest\scripts\install\RegisterCreatorServices;
|
|
use oat\taoQtiTest\scripts\install\RegisterQtiPackageExporter;
|
|
use oat\taoQtiTest\scripts\install\RegisterTestRunnerPlugins;
|
|
use oat\taoQtiTest\scripts\install\SetSynchronisationService;
|
|
use oat\taoQtiTest\scripts\install\SetupEventListeners;
|
|
use oat\taoQtiTest\scripts\install\SyncChannelInstaller;
|
|
use oat\taoTests\models\runner\plugins\PluginRegistry;
|
|
use oat\taoTests\models\runner\plugins\TestPlugin;
|
|
use oat\taoTests\models\runner\providers\ProviderRegistry;
|
|
use oat\taoTests\models\runner\providers\TestProvider;
|
|
use oat\taoTests\models\runner\time\TimerStrategyInterface;
|
|
|
|
/**
|
|
*
|
|
* @author Jean-Sébastien Conan <jean-sebastien.conan@vesperiagroup.com>
|
|
* @deprecated use migrations instead. See https://github.com/oat-sa/generis/wiki/Tao-Update-Process
|
|
*/
|
|
class Updater extends \common_ext_ExtensionUpdater
|
|
{
|
|
|
|
/**
|
|
*
|
|
* @param string $initialVersion
|
|
* @return string $versionUpdatedTo
|
|
*/
|
|
public function update($initialVersion)
|
|
{
|
|
|
|
if ($this->isBetween('0.0.0', '2.23.0')) {
|
|
throw new \common_exception_NotImplemented('Updates from versions prior to Tao 3.1 are not longer supported, please update to Tao 3.1 first');
|
|
}
|
|
$this->skip('2.23.0', '2.24.2');
|
|
|
|
if ($this->isVersion('2.24.2')) {
|
|
$className = \taoQtiTest_helpers_SessionManager::DEFAULT_TEST_SESSION;
|
|
try {
|
|
$deliveryConfig = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoDelivery')->getConfig('deliveryServer');
|
|
if ($deliveryConfig) {
|
|
$deliveryContainer = $deliveryConfig->getOption('deliveryContainer');
|
|
if (false !== strpos($deliveryContainer, 'DeliveryClientContainer')) {
|
|
$className = 'oat\\taoQtiTest\\models\\runner\\session\\TestSession';
|
|
}
|
|
}
|
|
} catch (\common_ext_ExtensionException $e) {
|
|
}
|
|
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['test-session'] = $className;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('2.25.0');
|
|
}
|
|
|
|
if ($this->isVersion('2.25.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['overlay']['full'] = false;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('2.26.0');
|
|
}
|
|
|
|
$this->skip('2.26.0', '2.27.0');
|
|
|
|
if ($this->isVersion('2.27.0')) {
|
|
$serviceExtension = 'taoQtiTest';
|
|
$serviceController = 'Runner';
|
|
try {
|
|
$deliveryConfig = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoDelivery')->getConfig('testRunner');
|
|
if ($deliveryConfig) {
|
|
$serviceExtension = $deliveryConfig['serviceExtension'];
|
|
$serviceController = $deliveryConfig['serviceController'];
|
|
}
|
|
} catch (\common_ext_ExtensionException $e) {
|
|
}
|
|
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['bootstrap'] = [
|
|
'serviceExtension' => $serviceExtension,
|
|
'serviceController' => $serviceController,
|
|
'communication' => [
|
|
'enabled' => false,
|
|
'type' => 'poll',
|
|
'extension' => null,
|
|
'controller' => null,
|
|
'action' => 'messages',
|
|
'service' => null,
|
|
'params' => []
|
|
]
|
|
];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
try {
|
|
$this->getServiceManager()->get(QtiCommunicationService::CONFIG_ID);
|
|
} catch (ServiceNotFoundException $e) {
|
|
$service = new QtiCommunicationService();
|
|
$service->setServiceManager($this->getServiceManager());
|
|
$this->getServiceManager()->register(QtiCommunicationService::CONFIG_ID, $service);
|
|
}
|
|
|
|
$this->setVersion('2.28.0');
|
|
}
|
|
|
|
if ($this->isVersion('2.28.0')) {
|
|
$testRunnerConfig = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->getConfig('testRunner');
|
|
|
|
if (array_key_exists('timerWarning', $testRunnerConfig)) {
|
|
foreach ($testRunnerConfig['timerWarning'] as &$value) {
|
|
if ($value !== null && is_int($value)) {
|
|
$value = [$value => 'warning'];
|
|
}
|
|
}
|
|
|
|
\common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('testRunner', $testRunnerConfig);
|
|
}
|
|
|
|
$this->setVersion('2.29.0');
|
|
}
|
|
|
|
if ($this->isVersion('2.29.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['bootstrap']['timeout'] = 0;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('2.30.0');
|
|
}
|
|
|
|
if ($this->isVersion('2.30.0')) {
|
|
try {
|
|
$service = $this->getServiceManager()->get(QtiCommunicationService::CONFIG_ID);
|
|
} catch (ServiceNotFoundException $e) {
|
|
$service = new QtiCommunicationService();
|
|
}
|
|
|
|
$service->setServiceManager($this->getServiceManager());
|
|
|
|
$service->attachChannel(new TestStateChannel(), QtiCommunicationService::CHANNEL_TYPE_OUTPUT);
|
|
|
|
$this->getServiceManager()->register(QtiCommunicationService::CONFIG_ID, $service);
|
|
|
|
$this->setVersion('2.31.0');
|
|
}
|
|
|
|
if ($this->isVersion('2.31.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
if (!isset($config['bootstrap']) || (isset($config['bootstrap']['timeout']) && count($config['bootstrap']) == 1)) {
|
|
$config['bootstrap'] = array_merge($config['bootstrap'], [
|
|
'serviceExtension' => 'taoQtiTest',
|
|
'serviceController' => 'Runner',
|
|
'communication' => [
|
|
'enabled' => false,
|
|
'type' => 'poll',
|
|
'extension' => null,
|
|
'controller' => null,
|
|
'action' => 'messages',
|
|
'service' => null,
|
|
'params' => []
|
|
],
|
|
]);
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
}
|
|
|
|
$this->setVersion('2.31.1');
|
|
}
|
|
|
|
$this->skip('2.31.1', '3.0.0');
|
|
|
|
if ($this->isVersion('3.0.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['enable-allow-skipping'] = false;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('3.1.0');
|
|
}
|
|
|
|
$this->skip('3.1.0', '3.4.0');
|
|
|
|
if ($this->isVersion('3.4.0')) {
|
|
$ext = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$uri = $ext->getConfig(\taoQtiTest_models_classes_QtiTestService::CONFIG_QTITEST_FILESYSTEM);
|
|
$fileResource = new \core_kernel_classes_Resource($uri);
|
|
if ($fileResource->exists()) {
|
|
$fileSystem = $fileResource->getOnePropertyValue(new \core_kernel_classes_Property('http://www.tao.lu/Ontologies/generis.rdf#FileRepository'));
|
|
if (!empty($fileSystem) && $fileSystem instanceof \core_kernel_classes_Literal) {
|
|
\taoQtiTest_models_classes_QtiTestService::singleton()->setQtiTestFileSystem((string) $fileSystem);
|
|
}
|
|
}
|
|
$this->setVersion('4.0.0');
|
|
}
|
|
|
|
$this->skip('4.0.0', '4.6.0');
|
|
|
|
if ($this->isVersion('4.6.0')) {
|
|
$registry = TestRunnerClientConfigRegistry::getRegistry();
|
|
$runnerConfig = $registry->get(TestRunnerClientConfigRegistry::RUNNER);
|
|
if (isset($runnerConfig['plugins']) && is_array($runnerConfig['plugins'])) {
|
|
foreach ($runnerConfig['plugins'] as $plugin) {
|
|
//if the plugin is registered
|
|
if ($plugin['module'] == 'taoQtiTest/runner/plugins/controls/disableRightClick') {
|
|
//we migrate the category
|
|
$registry->removePlugin('taoQtiTest/runner/plugins/controls/disableRightClick', 'controls', null);
|
|
$registry->registerPlugin('taoQtiTest/runner/plugins/security/disableRightClick', 'security', null);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->setVersion('4.7.0');
|
|
}
|
|
|
|
$this->skip('4.7.0', '4.8.2');
|
|
|
|
if ($this->isVersion('4.8.2')) {
|
|
//regsiter the core plugins into taoTests
|
|
$registerCorePlugins = new RegisterTestRunnerPlugins();
|
|
$registerCorePlugins([]);
|
|
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
//list the installed plugins
|
|
$oldRegistry = TestRunnerClientConfigRegistry::getRegistry();
|
|
$runnerConfig = $oldRegistry->get(TestRunnerClientConfigRegistry::RUNNER);
|
|
if (isset($runnerConfig['plugins']) && is_array($runnerConfig['plugins'])) {
|
|
foreach ($runnerConfig['plugins'] as $plugin) {
|
|
//if they are not yet in the config, migrate them automatically
|
|
if (! $registry->isRegistered($plugin['module'])) {
|
|
$pluginId = basename($plugin['module']);
|
|
$pluginName = ucfirst(join(preg_split('/(?=[A-Z])/', $pluginId), ' '));
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => $pluginId,
|
|
'name' => $pluginName,
|
|
'module' => $plugin['module'],
|
|
'category' => $plugin['category'],
|
|
'position' => $plugin['position'],
|
|
'active' => true
|
|
]));
|
|
}
|
|
}
|
|
}
|
|
|
|
//then remove the old config
|
|
$registry->remove(TestRunnerClientConfigRegistry::RUNNER);
|
|
$registry->remove(TestRunnerClientConfigRegistry::RUNNER_PROD);
|
|
|
|
$this->setVersion('5.0.0');
|
|
}
|
|
|
|
$this->skip('5.0.0', '5.4.0');
|
|
|
|
if ($this->isVersion('5.4.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['collapser'] = [
|
|
'collapseTools' => true,
|
|
'collapseNavigation' => false,
|
|
'hover' => false
|
|
];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.5.0');
|
|
}
|
|
|
|
$this->skip('5.5.0', '5.5.3');
|
|
|
|
if ($this->isVersion('5.5.3')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['force-branchrules'] = false;
|
|
$config['force-preconditions'] = false;
|
|
$config['path-tracking'] = false;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.6.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.6.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['always-allow-jumps'] = false;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.7.0');
|
|
}
|
|
|
|
$this->skip('5.7.0', '5.8.4');
|
|
|
|
if ($this->isVersion('5.8.4')) {
|
|
OntologyUpdater::syncModels();
|
|
$testModelService = new TestModelService([
|
|
'exportHandlers' => [
|
|
new \taoQtiTest_models_classes_export_TestExport(),
|
|
new \taoQtiTest_models_classes_export_TestExport22()
|
|
],
|
|
'importHandlers' => [
|
|
new \taoQtiTest_models_classes_import_TestImport()
|
|
]
|
|
]);
|
|
$testModelService->setServiceManager($this->getServiceManager());
|
|
|
|
$this->getServiceManager()->register(TestModelService::SERVICE_ID, $testModelService);
|
|
$this->setVersion('5.9.0');
|
|
}
|
|
|
|
$this->skip('5.9.0', '5.10.2');
|
|
|
|
if ($this->isVersion('5.10.2')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['check-informational'] = false;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.11.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.11.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'modalFeedback',
|
|
'name' => 'QTI modal feedbacks',
|
|
'module' => 'taoQtiTest/runner/plugins/content/modalFeedback/modalFeedback',
|
|
'description' => 'Display Qti modalFeedback element',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti', 'required' ]
|
|
]));
|
|
$this->setVersion('5.12.0');
|
|
}
|
|
|
|
$this->skip('5.12.0', '5.16.2');
|
|
|
|
if ($this->isVersion('5.16.2')) {
|
|
$service = new TestExporter();
|
|
$service->setServiceManager($this->getServiceManager());
|
|
$this->getServiceManager()->register(TestMetadataExporter::SERVICE_ID, $service);
|
|
$this->setVersion('5.17.0');
|
|
}
|
|
|
|
$this->skip('5.17.0', '5.17.3');
|
|
|
|
if ($this->isVersion('5.17.3')) {
|
|
\common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('TestCompiler', [
|
|
'enable-category-rules-generation' => false
|
|
]);
|
|
|
|
$categoryRulesService = new TestCategoryRulesService(
|
|
[
|
|
'score-variable-identifier' => 'SCORE',
|
|
'weight-identifier' => 'WEIGHT',
|
|
'category-exclusions' => [
|
|
'/x-tao-/'
|
|
],
|
|
'flags' => TestCategoryRulesGenerator::COUNT | TestCategoryRulesGenerator::CORRECT | TestCategoryRulesGenerator::SCORE
|
|
]
|
|
);
|
|
$categoryRulesService->setServiceManager($this->getServiceManager());
|
|
|
|
$this->getServiceManager()->register(TestCategoryRulesService::SERVICE_ID, $categoryRulesService);
|
|
|
|
$this->setVersion('5.18.0');
|
|
}
|
|
|
|
$this->skip('5.18.0', '5.23.0');
|
|
|
|
if ($this->isVersion('5.23.0')) {
|
|
$ext = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$uri = $ext->getConfig(\taoQtiTest_models_classes_QtiTestService::CONFIG_QTITEST_FILESYSTEM);
|
|
if (!is_string($uri)) {
|
|
if (is_object($uri) && $uri instanceof \core_kernel_classes_Resource) {
|
|
\taoQtiTest_models_classes_QtiTestService::singleton()->setQtiTestFileSystem($uri->getUri());
|
|
} else {
|
|
throw new \common_exception_InconsistentData('Invalid qti test storage directory configuration');
|
|
}
|
|
}
|
|
$this->setVersion('5.23.1');
|
|
}
|
|
|
|
$this->skip('5.23.1', '5.25.1');
|
|
|
|
if ($this->isVersion('5.25.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['test-taker-unanswered-items-message'] = true;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
|
|
$this->setVersion('5.26.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.26.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'documentViewer',
|
|
'name' => 'Document Viewer',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/documentViewer/documentViewer',
|
|
'description' => 'Display a document as requested by an event',
|
|
'category' => 'tools',
|
|
'active' => false,
|
|
'tags' => []
|
|
]));
|
|
$this->setVersion('5.27.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.27.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['keep-timer-up-to-timeout'] = false;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.28.0');
|
|
}
|
|
|
|
$this->skip('5.28.0', '5.30.1');
|
|
|
|
if ($this->isVersion('5.30.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['allow-shortcuts'] = true;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.31.0');
|
|
}
|
|
|
|
$this->skip('5.31.0', '5.31.1');
|
|
|
|
if ($this->isVersion('5.31.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['shortcuts'] = [
|
|
'calculator' => [
|
|
'toggle' => 'C',
|
|
],
|
|
'zoom' => [
|
|
'in' => 'I',
|
|
'out' => 'O'
|
|
],
|
|
'comment' => [
|
|
'toggle' => 'A',
|
|
],
|
|
'itemThemeSwitcher' => [
|
|
'toggle' => 'T',
|
|
],
|
|
'review' => [
|
|
'toggle' => 'R',
|
|
'flag' => 'M'
|
|
]
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.32.0');
|
|
}
|
|
|
|
$this->skip('5.32.0', '5.32.1');
|
|
|
|
if ($this->isVersion('5.32.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['next'] = [
|
|
'trigger' => 'J',
|
|
];
|
|
$config['shortcuts']['previous'] = [
|
|
'trigger' => 'K',
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.33.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.33.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'responsesAccess',
|
|
'name' => 'Shortcuts to access the item responses',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/responsesAccess',
|
|
'description' => 'Provide a way to navigate between item responses using the keyboard',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['shortcuts']['responsesAccess'] = [
|
|
'previous' => 'Shift+Tab',
|
|
'next' => 'Tab'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.34.0');
|
|
}
|
|
|
|
$this->skip('5.34.0', '5.36.0');
|
|
|
|
if ($this->isVersion('5.36.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'highlighter',
|
|
'name' => 'Text Highlighter',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/highlighter/plugin',
|
|
'description' => 'Allows the test taker to highlight text',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => []
|
|
]));
|
|
$this->setVersion('5.37.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.37.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['itemThemeSwitcher'] = [
|
|
'toggle' => 'T',
|
|
'loop' => 'Y',
|
|
'select' => 'U'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.37.1');
|
|
}
|
|
|
|
$this->skip('5.37.1', '5.38.1');
|
|
|
|
if ($this->isVersion('5.38.1')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'highlighter',
|
|
'name' => 'Text Highlighter',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/highlighter/plugin',
|
|
'description' => 'Allows the test taker to highlight text',
|
|
'category' => 'tools',
|
|
'active' => false,
|
|
'tags' => []
|
|
]));
|
|
$this->setVersion('5.38.2');
|
|
}
|
|
|
|
$this->skip('5.38.2', '5.40.0');
|
|
|
|
if ($this->isVersion('5.40.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/content/accessibility/responsesAccess');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'keyNavigation',
|
|
'name' => 'Using key to navigate item content',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation',
|
|
'description' => 'Provide a way to navigate within item with the keyboard',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
unset($config['shortcuts']['responsesAccess']);
|
|
$config['shortcuts']['keyNavigation'] = [
|
|
'previous' => 'Shift+Tab',
|
|
'next' => 'Tab'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.41.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.41.0')) {
|
|
$fsService = $this->getServiceManager()->get(FileSystemService::SERVICE_ID);
|
|
$fsService->createFileSystem('taoQtiTestSessionFilesystem');
|
|
$this->getServiceManager()->register(FileSystemService::SERVICE_ID, $fsService);
|
|
|
|
$service = new QtiFlysystemFileManager();
|
|
$service->setServiceManager($this->getServiceManager());
|
|
$this->getServiceManager()->register(QtiFlysystemFileManager::SERVICE_ID, $service);
|
|
|
|
$this->setVersion('5.42.0');
|
|
}
|
|
|
|
$this->skip('5.42.0', '5.44.0');
|
|
|
|
if ($this->isVersion('5.44.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'magnifier',
|
|
'name' => 'Magnifier',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/magnifier/magnifier',
|
|
'description' => 'Gives student access to a magnification tool',
|
|
'category' => 'tools',
|
|
'active' => false,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['magnifier'] = [
|
|
'toggle' => 'L',
|
|
'in' => 'Shift+I',
|
|
'out' => 'Shift+O',
|
|
'close' => 'esc'
|
|
];
|
|
|
|
$config['plugins']['magnifier'] = [
|
|
'zoomMin' => 2,
|
|
'zoomMax' => 8,
|
|
'zoomStep' => .5
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.45.0');
|
|
}
|
|
|
|
$this->skip('5.45.0', '5.46.2');
|
|
|
|
if ($this->isVersion('5.46.2')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['dialog'] = [
|
|
'accept' => 'Enter',
|
|
'reject' => 'Esc'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.47.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.47.0')) {
|
|
$qtiTest = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $qtiTest->getConfig('testRunner');
|
|
$config = array_merge($config, [
|
|
'test-taker-review-show-legend' => true,
|
|
'test-taker-review-default-open' => true,
|
|
]);
|
|
$qtiTest->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.48.0');
|
|
}
|
|
|
|
$this->skip('5.48.0', '5.49.0');
|
|
|
|
if ($this->isVersion('5.49.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['itemThemeSwitcher'] = [
|
|
'toggle' => 'T',
|
|
'up' => 'ArrowUp',
|
|
'down' => 'ArrowDown',
|
|
'select' => 'Enter'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.49.1');
|
|
}
|
|
|
|
if ($this->isVersion('5.49.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['test-taker-review-use-title'] = true;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.50.0');
|
|
}
|
|
|
|
if ($this->isVersion('5.50.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
if (!$registry->isRegistered('taoQtiTest/runner/plugins/tools/magnifier/magnifier')) {
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'magnifier',
|
|
'name' => 'Magnifier',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/magnifier/magnifier',
|
|
'description' => 'Gives student access to a magnification tool',
|
|
'category' => 'tools',
|
|
'active' => false,
|
|
'tags' => [ ]
|
|
]));
|
|
}
|
|
|
|
$this->setVersion('5.50.1');
|
|
}
|
|
|
|
$this->skip('5.50.1', '5.58.3');
|
|
|
|
if ($this->isVersion('5.58.3')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['area-masking'] = [
|
|
'toggle' => 'Y'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('5.59.0');
|
|
}
|
|
|
|
$this->skip('5.59.0', '6.0.0');
|
|
|
|
if ($this->isVersion('6.0.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/content/accessibility/responsesAccess');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'keyNavigation',
|
|
'name' => 'Using key to navigate test runner',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation',
|
|
'description' => 'Provide a way to navigate within the test runner with the keyboard',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
$this->setVersion('6.1.0');
|
|
}
|
|
|
|
$this->skip('6.1.0', '6.3.0');
|
|
|
|
if ($this->isVersion('6.3.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['itemThemeSwitcher'] = [
|
|
'toggle' => 'T'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('6.3.1');
|
|
}
|
|
|
|
$this->skip('6.3.1', '6.4.3');
|
|
|
|
if ($this->isVersion('6.4.3')) {
|
|
$service = new QtiRunnerConfig();
|
|
$service->setServiceManager($this->getServiceManager());
|
|
$this->getServiceManager()->register(QtiRunnerConfig::SERVICE_ID, $service);
|
|
|
|
$this->setVersion('6.5.0');
|
|
}
|
|
|
|
$this->skip('6.5.0', '6.9.0');
|
|
|
|
if ($this->isVersion('6.9.0')) {
|
|
//removes the shortcut from dialog
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['shortcuts']['dialog'] = [];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('6.10.0');
|
|
}
|
|
|
|
if ($this->isVersion('6.10.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['test-session-storage'] = '\taoQtiTest_helpers_TestSessionStorage';
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('6.11.0');
|
|
}
|
|
|
|
$this->skip('6.11.0', '6.13.0');
|
|
|
|
if ($this->isVersion('6.13.0')) {
|
|
|
|
/** @var ImportersService $importersService */
|
|
$importersService = $this->getServiceManager()->get(ImportersService::SERVICE_ID);
|
|
if ($importersService->hasOption(ImportersService::OPTION_IMPORTERS)) {
|
|
$importers = $importersService->getOption(ImportersService::OPTION_IMPORTERS);
|
|
} else {
|
|
$importers = [];
|
|
}
|
|
$importers[QtiTestImporter::IMPORTER_ID] = QtiTestImporter::class;
|
|
$importersService->setOption(ImportersService::OPTION_IMPORTERS, $importers);
|
|
|
|
$this->getServiceManager()->register(ImportersService::SERVICE_ID, $importersService);
|
|
|
|
$this->setVersion('6.14.0');
|
|
}
|
|
|
|
$this->skip('6.14.0', '6.16.0');
|
|
|
|
if ($this->isVersion('6.16.0')) {
|
|
// Register line reader plugin
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/content/accessibility/responsesAccess');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'lineReader',
|
|
'name' => 'Line Reader',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/lineReader/plugin',
|
|
'description' => 'Display a customisable mask with a customisable hole in it!',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
// Register line reader shortcut
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['shortcuts']['line-reader'] = [
|
|
'toggle' => 'G'
|
|
];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('6.17.0');
|
|
}
|
|
|
|
$this->skip('6.17.0', '6.17.2');
|
|
|
|
if ($this->isVersion('6.17.2')) {
|
|
$this->getServiceManager()->register(ExtendedStateService::SERVICE_ID, new ExtendedStateService());
|
|
$this->getServiceManager()->register(TestSessionService::SERVICE_ID, new TestSessionService());
|
|
$this->getServiceManager()->register(QtiTestListenerService::SERVICE_ID, new QtiTestListenerService());
|
|
$this->getServiceManager()->register(QtiRunnerMessageService::SERVICE_ID, new QtiRunnerMessageService());
|
|
|
|
$this->runExtensionScript(SetupEventListeners::class);
|
|
|
|
$this->setVersion(('6.18.0'));
|
|
}
|
|
|
|
$this->skip('6.18.0', '7.4.1');
|
|
|
|
if ($this->isVersion('7.4.1')) {
|
|
// Register item trace variables plugin
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/controls/trace/itemTraceVariables');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'itemTraceVariables',
|
|
'name' => 'Item trace variables',
|
|
'module' => 'taoQtiTest/runner/plugins/controls/trace/itemTraceVariables',
|
|
'description' => 'Send item trace variables',
|
|
'category' => 'controls',
|
|
'active' => false,
|
|
'tags' => [ 'core', 'technical' ]
|
|
]));
|
|
|
|
$this->setVersion('7.5.0');
|
|
}
|
|
|
|
$this->skip('7.5.0', '7.5.6');
|
|
|
|
if ($this->isVersion('7.5.6')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['test-taker-review-display-subsection-title'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
$this->setVersion('7.6.0');
|
|
}
|
|
|
|
$this->skip('7.6.0', '8.0.0');
|
|
|
|
if ($this->isVersion('8.0.0')) {
|
|
// Register answer masking plugin
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'answerMasking',
|
|
'name' => 'Answer Masking',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/answerMasking/plugin',
|
|
'description' => 'Hide all answers of a choice interaction and allow revealing them',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
// Register answer masking shortcut
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['shortcuts']['answer-masking'] = [
|
|
'toggle' => 'D'
|
|
];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('8.1.0');
|
|
}
|
|
|
|
$this->skip('8.1.0', '9.1.3');
|
|
|
|
if ($this->isVersion('9.1.3')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
foreach ($registry->getMap() as $module => $plugin) {
|
|
if (preg_match("/^taoQtiTest/", $module) && is_null($plugin['bundle'])) {
|
|
$plugin['bundle'] = 'taoQtiTest/loader/testPlugins.min';
|
|
$registry->register(TestPlugin::fromArray($plugin));
|
|
}
|
|
}
|
|
$this->setVersion('9.2.0');
|
|
}
|
|
|
|
$this->skip('9.2.0', '9.3.2');
|
|
|
|
if ($this->isVersion('9.3.2')) {
|
|
if (!$this->getServiceManager()->has(TestCategoryPresetProvider::SERVICE_ID)) {
|
|
$this->getServiceManager()->register(TestCategoryPresetProvider::SERVICE_ID, new TestCategoryPresetProvider());
|
|
}
|
|
$this->setVersion('9.3.3');
|
|
}
|
|
|
|
$this->skip('9.3.3', '9.5.0');
|
|
|
|
// display 'item x' instead of 'item x of y' in the progress bar
|
|
if ($this->isVersion('9.5.0')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['progress-indicator-show-total'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
$this->setVersion('9.6.0');
|
|
}
|
|
|
|
$this->skip('9.6.0', '9.9.1');
|
|
|
|
if ($this->isVersion('9.9.1')) {
|
|
$registry = TestCategoryPresetRegistry::getRegistry();
|
|
$registry->set('taoQtiTest', '\oat\taoQtiTest\models\QtiCategoryPresetProvider');
|
|
$this->setVersion('9.10.0');
|
|
}
|
|
|
|
$this->skip('9.10.0', '9.11.2');
|
|
|
|
if ($this->isVersion('9.11.2')) {
|
|
$testModelService = $this->getServiceManager()->get(TestModelService::SERVICE_ID);
|
|
$exportHandlers = $testModelService->getOption('exportHandlers');
|
|
array_unshift($exportHandlers, new TestMetadataByClassExportHandler());
|
|
$testModelService->setOption('exportHandlers', $exportHandlers);
|
|
$this->getServiceManager()->register(TestModelService::SERVICE_ID, $testModelService);
|
|
|
|
$this->setVersion('9.12.0');
|
|
}
|
|
|
|
$this->skip('9.12.0', '9.14.1');
|
|
|
|
if ($this->isVersion('9.14.1')) {
|
|
/* deprecated as of 25.8.0
|
|
$testModelService = $this->getServiceManager()->get(TestModelService::SERVICE_ID);
|
|
$testModelService->setOption('testCompilerClass', 'taoQtiTest_models_classes_QtiTestCompiler');
|
|
$this->getServiceManager()->register(TestModelService::SERVICE_ID, $testModelService);
|
|
*/
|
|
$this->setVersion('9.15.0');
|
|
}
|
|
|
|
$this->skip('9.15.0', '9.17.0');
|
|
|
|
if ($this->isVersion('9.17.0')) {
|
|
$this->getServiceManager()->register(SectionPauseService::SERVICE_ID, new SectionPauseService());
|
|
$this->setVersion('9.18.0');
|
|
}
|
|
|
|
$this->skip('9.18.0', '9.19.0');
|
|
|
|
if ($this->isVersion('9.19.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'preventSkipping',
|
|
'name' => 'Prevent Skipping',
|
|
'module' => 'taoQtiTest/runner/plugins/navigation/preventSkipping',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Prevent to submit empty responses',
|
|
'category' => 'navigation',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$this->setVersion('10.0.0');
|
|
}
|
|
|
|
if ($this->isVersion('10.0.0')) {
|
|
$service = new QtiRunnerMap();
|
|
$this->getServiceManager()->propagate($service);
|
|
$this->getServiceManager()->register(QtiRunnerMap::SERVICE_ID, $service);
|
|
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['item-cache-size'] = 3;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('10.1.0');
|
|
}
|
|
|
|
$this->skip('10.1.0', '10.3.0');
|
|
|
|
if ($this->isVersion('10.3.0')) {
|
|
$registry = DeliveryContainerRegistry::getRegistry();
|
|
$registry->setServiceLocator($this->getServiceManager());
|
|
$registry->registerContainerType('qtiTest', new QtiTestDeliveryContainer());
|
|
$this->setVersion('10.4.0');
|
|
}
|
|
|
|
$this->skip('10.4.0', '10.5.1');
|
|
|
|
if ($this->isVersion('10.5.1')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/tools/highlighter/plugin');
|
|
$registry->remove('taoQtiTest/runner/plugins/tools/magnifier/magnifier');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'highlighter',
|
|
'name' => 'Text Highlighter',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/highlighter/plugin',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Allows the test taker to highlight text',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'magnifier',
|
|
'name' => 'Magnifier',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/magnifier/magnifier',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Gives student access to a magnification tool',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'eliminator',
|
|
'name' => 'Eliminate choices',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/answerElimination/eliminator',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Allows student to eliminate choices',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'area-masking',
|
|
'name' => 'Area Masking',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/areaMasking/areaMasking',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Mask areas of the item',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
$this->setVersion('10.6.0');
|
|
}
|
|
|
|
if ($this->isVersion('10.6.0')) {
|
|
// Install the synchronisation service
|
|
$this->runExtensionScript(SetSynchronisationService::class);
|
|
|
|
// Install the Sync Channel
|
|
$this->runExtensionScript(SyncChannelInstaller::class);
|
|
|
|
$this->setVersion('10.7.0');
|
|
}
|
|
|
|
$this->skip('10.7.0', '10.10.0');
|
|
|
|
if ($this->isVersion('10.10.0')) {
|
|
$qtiListenerService = $this->getServiceManager()->get(QtiTestListenerService::SERVICE_ID);
|
|
$qtiListenerService->setOption(QtiTestListenerService::OPTION_ARCHIVE_EXCLUDE, []);
|
|
$this->getServiceManager()->register(QtiTestListenerService::SERVICE_ID, $qtiListenerService);
|
|
|
|
$this->setVersion('10.11.0');
|
|
}
|
|
|
|
if ($this->isVersion('10.11.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/tools/zoom');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'zoom',
|
|
'name' => 'Zoom',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/zoom',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Allows Test-taker to zoom in and out the item content',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
$this->setVersion('10.11.1');
|
|
}
|
|
|
|
$this->skip('10.11.1', '10.14.1');
|
|
|
|
if ($this->isVersion('10.14.1')) {
|
|
// Default is now EchoAdapt. This should change in the futre.
|
|
$catService = new CatService([
|
|
CatService::OPTION_ENGINE_ENDPOINTS => [
|
|
'http://URL_SERVER/cat/api/' => [
|
|
CatService::OPTION_ENGINE_CLASS => EchoAdaptEngine::class,
|
|
CatService::OPTION_ENGINE_ARGS => []
|
|
]
|
|
]
|
|
]);
|
|
|
|
$this->getServiceManager()->register(CatService::SERVICE_ID, $catService);
|
|
|
|
$this->setVersion('10.15.0');
|
|
}
|
|
|
|
$this->skip('10.15.0', '10.15.2');
|
|
|
|
if ($this->isVersion('10.15.2')) {
|
|
$this->getServiceManager()->register(QtiRunnerRubric::SERVICE_ID, new QtiRunnerRubric());
|
|
$this->setVersion('10.16.0');
|
|
}
|
|
|
|
if ($this->isVersion('10.16.0')) {
|
|
OntologyUpdater::syncModels();
|
|
$this->setVersion('10.17.0');
|
|
}
|
|
|
|
$this->skip('10.17.0', '11.0.0');
|
|
|
|
if ($this->isVersion('11.0.0')) {
|
|
$registerCreatorService = new RegisterCreatorServices();
|
|
$registerCreatorService->setServiceLocator($this->getServiceManager());
|
|
$registerCreatorService([]);
|
|
$this->setVersion('11.1.0');
|
|
}
|
|
|
|
$this->skip('11.1.0', '11.5.1');
|
|
|
|
if ($this->isVersion('11.5.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['enable-validate-responses'] = false;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->remove('taoQtiTest/runner/plugins/navigation/preventSkipping');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'allowSkipping',
|
|
'name' => 'Allow Skipping',
|
|
'module' => 'taoQtiTest/runner/plugins/navigation/allowSkipping',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Allow submission of null/default responses',
|
|
'category' => 'navigation',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'validateResponses',
|
|
'name' => 'Validate Responses',
|
|
'module' => 'taoQtiTest/runner/plugins/navigation/validateResponses',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Prevent submission of invalid responses',
|
|
'category' => 'navigation',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$this->setVersion('11.6.0');
|
|
}
|
|
|
|
$this->skip('11.6.0', '11.8.1');
|
|
|
|
if ($this->isVersion('11.8.1')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'warnBeforeLeaving',
|
|
'name' => 'Warn before leaving',
|
|
'module' => 'taoQtiTest/runner/plugins/navigation/warnBeforeLeaving',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Warn the test taker when closing the browser',
|
|
'category' => 'navigation',
|
|
'active' => false, //registered by but activated
|
|
'tags' => [ ]
|
|
]));
|
|
$this->setVersion('11.9.0');
|
|
}
|
|
|
|
$this->skip('11.9.0', '11.16.0');
|
|
|
|
if ($this->isVersion('11.16.0')) {
|
|
/** @var CatService $catService */
|
|
$catService = $this->getServiceManager()->get(CatService::SERVICE_ID);
|
|
$engines = $catService->getOption(CatService::OPTION_ENGINE_ENDPOINTS);
|
|
|
|
if (!isset($engines['http://YOUR_URL_OAUTH/cat/api/'])) {
|
|
$oauthOptions = [
|
|
CatService::OPTION_ENGINE_CLASS => EchoAdaptEngine::class,
|
|
CatService::OPTION_ENGINE_ARGS => [
|
|
CatService::OPTION_ENGINE_VERSION => 'v1.1',
|
|
CatService::OPTION_ENGINE_CLIENT => [
|
|
'class' => 'oat\taoOauth\model\OAuthClient',
|
|
'options' => [
|
|
'client_id' => '',
|
|
'client_secret' => '',
|
|
'resource_owner_details_url' => false,
|
|
'authorize_url' => false,
|
|
'http_client_options' => [],
|
|
'token_url' => '',
|
|
'token_key' => '',
|
|
'tokenParameters' => [
|
|
'audience' => ''
|
|
],
|
|
'token_storage' => 'cache'
|
|
]
|
|
],
|
|
]
|
|
];
|
|
|
|
$engines['http://YOUR_URL_OAUTH/cat/api/'] = $oauthOptions;
|
|
$catService->setOption(CatService::OPTION_ENGINE_ENDPOINTS, $engines);
|
|
$this->getServiceManager()->register(CatService::SERVICE_ID, $catService);
|
|
}
|
|
|
|
$this->setVersion('12.0.0');
|
|
}
|
|
|
|
$this->skip('12.0.0', '13.1.0');
|
|
|
|
if ($this->isVersion('13.1.0')) {
|
|
$config = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->getConfig('TestCompiler');
|
|
$config['enable-rubric-block-stylesheet-scoping'] = true;
|
|
\common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest')->setConfig('TestCompiler', $config);
|
|
|
|
$this->setVersion('13.2.0');
|
|
}
|
|
|
|
$this->skip('13.2.0', '14.1.4');
|
|
|
|
if ($this->isVersion('14.1.4')) {
|
|
/** @var CreatorItems $creatorItemsService */
|
|
$creatorItemsService = $this->getServiceManager()->get(CreatorItems::SERVICE_ID);
|
|
$creatorItemsService->setOption(CreatorItems::ITEM_MODEL_SEARCH_OPTION, CreatorItems::ITEM_MODEL_QTI_URI);
|
|
$creatorItemsService->setOption(CreatorItems::ITEM_CONTENT_SEARCH_OPTION, '*');
|
|
|
|
$this->getServiceManager()->register(CreatorItems::SERVICE_ID, $creatorItemsService);
|
|
|
|
$this->setVersion('14.1.5');
|
|
}
|
|
|
|
$this->skip('14.1.5', '16.0.1');
|
|
|
|
if ($this->isVersion('16.0.1')) {
|
|
// Update the synchronisation service
|
|
$this->runExtensionScript(SetSynchronisationService::class);
|
|
|
|
$this->setVersion('16.1.0');
|
|
}
|
|
|
|
$this->skip('16.1.0', '16.1.1');
|
|
|
|
if ($this->isVersion('16.1.1')) {
|
|
$this->getServiceManager()->register(
|
|
PhpCodeCompilationDataService::SERVICE_ID,
|
|
new PhpCodeCompilationDataService()
|
|
);
|
|
|
|
$this->setVersion('16.2.0');
|
|
}
|
|
|
|
$this->skip('16.2.0', '16.3.3');
|
|
|
|
if ($this->isVersion('16.3.3')) {
|
|
$qtiTimerFactory = new QtiTimerFactory([
|
|
QtiTimerFactory::OPTION_TIMER_CLASS => QtiTimer::class,
|
|
QtiTimerFactory::OPTION_STORAGE_CLASS => QtiTimeStorage::class,
|
|
QtiTimerFactory::OPTION_STORAGE_FORMAT_CLASS => QtiTimeStoragePackedFormat::class,
|
|
]);
|
|
|
|
$this->getServiceManager()->register(QtiTimerFactory::SERVICE_ID, $qtiTimerFactory);
|
|
|
|
$this->setVersion('17.0.0');
|
|
}
|
|
|
|
$this->skip('17.0.0', '17.1.0');
|
|
|
|
if ($this->isVersion('17.1.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['bootstrap']['communication']['syncActions'] = ['move', 'skip', 'storeTraceData', 'timeout', 'exitTest'];
|
|
$extension->setConfig('testRunner', $config);
|
|
$this->setVersion('17.2.0');
|
|
}
|
|
|
|
$this->skip('17.2.0', '17.5.1');
|
|
|
|
if ($this->isVersion('17.5.1')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['bootstrap']['communication']['syncActions'][] = 'getNextItemData';
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
/** @var SynchronisationService $synchronisationService */
|
|
$synchronisationService = $this->getServiceManager()->get(SynchronisationService::SERVICE_ID);
|
|
$actions = $synchronisationService->getAvailableActions();
|
|
$actions['getNextItemData'] = NextItemData::class;
|
|
$synchronisationService->setAvailableActions($actions);
|
|
$this->getServiceManager()->register(SynchronisationService::SERVICE_ID, $synchronisationService);
|
|
|
|
$this->setVersion('17.6.0');
|
|
}
|
|
|
|
$this->skip('17.6.0', '17.7.1');
|
|
|
|
if ($this->isVersion('17.7.1')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(
|
|
TestPlugin::fromArray(
|
|
[
|
|
'id' => 'collapser',
|
|
'name' => 'Collapser',
|
|
'module' => 'taoQtiTest/runner/plugins/content/responsiveness/collapser',
|
|
'description' => 'Reduce the size of the tools when the available space is not enough',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => [ 'core' ]
|
|
]
|
|
)
|
|
);
|
|
|
|
$this->setVersion('17.8.0');
|
|
}
|
|
|
|
$this->skip('17.8.0', '17.9.0');
|
|
|
|
if ($this->isVersion('17.9.0')) {
|
|
$storageManager = new StorageManager();
|
|
$this->getServiceManager()->register(StorageManager::SERVICE_ID, $storageManager);
|
|
$this->setVersion('17.10.0');
|
|
}
|
|
|
|
$this->skip('17.10.0', '17.16.0');
|
|
|
|
if ($this->isVersion('17.16.0')) {
|
|
$synchronisationService = $this->getServiceManager()->get(SynchronisationService::SERVICE_ID);
|
|
$actions = $synchronisationService->getAvailableActions();
|
|
$actions['pause'] = Pause::class;
|
|
$synchronisationService->setAvailableActions($actions);
|
|
$this->getServiceManager()->register(SynchronisationService::SERVICE_ID, $synchronisationService);
|
|
|
|
$this->setVersion('17.17.0');
|
|
}
|
|
|
|
$this->skip('17.17.0', '17.17.6');
|
|
|
|
if ($this->isVersion('17.17.6')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['catEngineWarning'] = [
|
|
'echoDelayUpdate' => 15,
|
|
'echoPauseLimit' => 120,
|
|
'echoExceptionName' => 'CatEngine'
|
|
];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('17.18.0');
|
|
}
|
|
|
|
$this->skip('17.18.0', '17.18.2');
|
|
|
|
if ($this->isVersion('17.18.2')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
unset($config['catEngineWarning']);
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('17.19.0');
|
|
}
|
|
|
|
$this->skip('17.19.0', '18.5.1');
|
|
|
|
if ($this->isVersion('18.5.1')) {
|
|
$registry = ProviderRegistry::getRegistry();
|
|
$registry->register(
|
|
TestProvider::fromArray(
|
|
[
|
|
'id' => 'qti',
|
|
'name' => 'QTI runner',
|
|
'module' => 'taoQtiTest/runner/provider/qti',
|
|
'bundle' => 'taoQtiTest/loader/qtiTestRunner.min',
|
|
'description' => 'QTI implementation of the test runner',
|
|
'category' => 'runner',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti', 'runner' ]
|
|
]
|
|
)
|
|
);
|
|
|
|
$this->setVersion('18.6.0');
|
|
}
|
|
|
|
$this->skip('18.6.0', '18.9.4');
|
|
|
|
if ($this->isVersion('18.9.4')) {
|
|
AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAOTest.rdf#TestsManagerRole', ['ext' => 'taoQtiTest', 'mod' => 'RestQtiTests']));
|
|
$this->setVersion('18.9.5');
|
|
}
|
|
|
|
$this->skip('18.9.5', '23.2.0');
|
|
|
|
if ($this->isVersion('23.2.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
if ($registry->isRegistered('taoQtiTest/runner/plugins/tools/textToSpeech/plugin')) {
|
|
$registry->remove('taoQtiTest/runner/plugins/tools/textToSpeech/plugin');
|
|
}
|
|
|
|
$this->setVersion('23.2.1');
|
|
}
|
|
|
|
$this->skip('23.2.1', '23.4.0');
|
|
|
|
if ($this->isVersion('23.4.0')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['guidedNavigation'] = false;
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->remove('taoQtiTest/runner/plugins/controls/timer/timer');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'timer',
|
|
'name' => 'Timer indicator',
|
|
'module' => 'taoQtiTest/runner/plugins/controls/timer/plugin',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Add countdown when remaining time',
|
|
'category' => 'controls',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$this->setVersion('24.0.0');
|
|
}
|
|
|
|
$this->skip('24.0.0', '24.1.0');
|
|
|
|
if ($this->isVersion('24.1.0')) {
|
|
AclProxy::applyRule(new AccessRule('grant', TaoRoles::REST_PUBLISHER, ['ext' => 'taoQtiTest', 'mod' => 'RestQtiTests']));
|
|
$this->setVersion('24.2.0');
|
|
}
|
|
|
|
$this->skip('24.2.0', '24.7.0');
|
|
|
|
if ($this->isVersion('24.7.0')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['progress-indicator-renderer'] = 'percentage';
|
|
$config['progress-indicator-show-label'] = 'true';
|
|
|
|
// as the percentage indicator now takes care of the scope, ensure the legacy is respected
|
|
if ($config['progress-indicator'] == 'percentage') {
|
|
$config['progress-indicator-scope'] = 'test';
|
|
}
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('24.8.0');
|
|
}
|
|
|
|
$this->skip('24.8.0', '24.8.4');
|
|
|
|
if ($this->isVersion('24.8.4')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['progress-categories'] = [];
|
|
$extension->setConfig('testRunner', $config);
|
|
$this->setVersion('24.9.0');
|
|
}
|
|
|
|
$this->skip('24.9.0', '25.1.0');
|
|
|
|
if ($this->isVersion('25.1.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'focusOnFirstField',
|
|
'name' => 'Focus on first form field',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/focusOnFirstField',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Sets focus on first form field',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => []
|
|
]));
|
|
$this->setVersion('25.2.0');
|
|
}
|
|
$this->skip('25.2.0', '25.5.1');
|
|
|
|
if ($this->isVersion('25.5.1')) {
|
|
$timerLabel = new TimerLabelFormatterService([
|
|
TimerLabelFormatterService::OPTION_DEFAULT_TIMER_LABEL => 'Time Remaining'
|
|
]);
|
|
|
|
$this->getServiceManager()->register(TimerLabelFormatterService::SERVICE_ID, $timerLabel);
|
|
|
|
$this->setVersion('25.6.0');
|
|
}
|
|
|
|
$this->skip('25.6.0', '25.7.2');
|
|
|
|
if ($this->isVersion('25.7.2')) {
|
|
/** @var TimerLabelFormatterService $timerLabel */
|
|
$timerLabel = $this->getServiceManager()->get(TimerLabelFormatterService::SERVICE_ID);
|
|
$timerLabel->setOption(TimerLabelFormatterService::OPTION_DEFAULT_TIMER_LABEL, 'timer_name_translation_token');
|
|
|
|
$this->getServiceManager()->register(TimerLabelFormatterService::SERVICE_ID, $timerLabel);
|
|
$this->setVersion('25.7.3');
|
|
}
|
|
|
|
$this->skip('25.7.3', '25.7.5');
|
|
|
|
if ($this->isVersion('25.7.5')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['enable-allow-skipping'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('25.7.6');
|
|
}
|
|
|
|
$this->skip('25.7.6', '25.8.0');
|
|
|
|
if ($this->isVersion('25.8.0')) {
|
|
/** @var TaskLogInterface|ConfigurableService $taskLogService */
|
|
$taskLogService = $this->getServiceManager()->get(TaskLogInterface::SERVICE_ID);
|
|
|
|
$taskLogService->linkTaskToCategory(ImportQtiTest::class, TaskLogInterface::CATEGORY_IMPORT);
|
|
|
|
$this->getServiceManager()->register(TaskLogInterface::SERVICE_ID, $taskLogService);
|
|
|
|
$this->setVersion('25.9.0');
|
|
}
|
|
|
|
$this->skip('25.9.0', '25.9.2');
|
|
|
|
// test compiler settings refactoring
|
|
if ($this->isVersion('25.9.2')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('TestCompiler');
|
|
|
|
$model = $this->getServiceManager()->get(TestModelService::SERVICE_ID);
|
|
$model->setOption(TestModelService::SUBSERVICE_COMPILATION, new CompilationService([
|
|
CompilationService::OPTION_RUBRIC_BLOCK_CSS_SCOPE => $config['enable-rubric-block-stylesheet-scoping']
|
|
]));
|
|
$this->getServiceManager()->register(TestModelService::SERVICE_ID, $model);
|
|
$this->setVersion('25.10.0');
|
|
}
|
|
|
|
if ($this->isVersion('25.10.0')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['restore-timer-from-client'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('25.10.1');
|
|
}
|
|
|
|
$this->skip('25.10.1', '26.1.1');
|
|
|
|
if ($this->isVersion('26.1.1')) {
|
|
/** @var TimerLabelFormatterService $timerLabel */
|
|
$timerLabel = $this->getServiceManager()->get(TimerLabelFormatterService::SERVICE_ID);
|
|
$timerLabel->setOption(TimerLabelFormatterService::OPTION_DEFAULT_TIMER_LABEL, '');
|
|
|
|
$this->getServiceManager()->register(TimerLabelFormatterService::SERVICE_ID, $timerLabel);
|
|
|
|
$this->setVersion('26.1.2');
|
|
}
|
|
|
|
$this->skip('26.1.2', '29.6.1');
|
|
|
|
if ($this->isVersion('29.6.1')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['test-taker-review-skipahead'] = false;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('29.7.0');
|
|
}
|
|
|
|
$this->skip('29.7.0', '29.7.3');
|
|
|
|
if ($this->isVersion('29.7.3')) {
|
|
$this->getServiceManager()->register(
|
|
ToolsStateStorage::SERVICE_ID,
|
|
new NoStorage([])
|
|
);
|
|
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['tool-state-server-storage'] = [];
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('29.8.0');
|
|
}
|
|
|
|
$this->skip('29.8.0', '30.4.0');
|
|
|
|
if ($this->isVersion('30.4.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'linearNextItemWarning',
|
|
'name' => 'Linear next item warning',
|
|
'module' => 'taoQtiTest/runner/plugins/navigation/next/linearNextItemWarning',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Displays a dialog before next item in linear test parts',
|
|
'category' => 'navigation',
|
|
'active' => false,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['force-enable-linear-next-item-warning'] = false;
|
|
$config['enable-linear-next-item-warning-checkbox'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('30.5.0');
|
|
}
|
|
|
|
$this->skip('30.5.0', '30.5.3');
|
|
|
|
if ($this->isVersion('30.5.3')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['calculator']['degree'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('30.6.0');
|
|
}
|
|
|
|
$this->skip('30.6.0', '30.6.1');
|
|
|
|
if ($this->isVersion('30.6.1')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['dialog']['alert']['focus'] = 'ok';
|
|
$config['plugins']['dialog']['confirm']['focus'] = 'ok';
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('30.7.0');
|
|
}
|
|
|
|
$this->skip('30.7.0', '32.0.0');
|
|
|
|
if ($this->isVersion('32.0.0')) {
|
|
AclProxy::applyRule(new AccessRule('grant', 'http://www.tao.lu/Ontologies/TAO.rdf#DeliveryRole', ['ext' => 'taoQtiTest', 'mod' => 'OfflineRunner']));
|
|
|
|
$offlineQtiRunnerService = new OfflineQtiRunnerService();
|
|
$testDefinitionSerializerService = new TestDefinitionSerializerService();
|
|
|
|
$offlineQtiRunnerService->setServiceManager($this->getServiceManager());
|
|
$testDefinitionSerializerService->setServiceManager($this->getServiceManager());
|
|
$this->getServiceManager()->register(OfflineQtiRunnerService::SERVICE_ID, $offlineQtiRunnerService);
|
|
$this->getServiceManager()->register(TestDefinitionSerializerService::SERVICE_ID, $testDefinitionSerializerService);
|
|
|
|
$this->setVersion('32.1.0');
|
|
}
|
|
|
|
$this->skip('32.1.0', '32.7.1');
|
|
|
|
if ($this->isVersion('32.7.1')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['keyNavigation']['contentNavigatorType'] = 'default';
|
|
$extension->setConfig('testRunner', $config);
|
|
$this->setVersion('32.8.0');
|
|
}
|
|
|
|
$this->skip('32.8.0', '32.10.1');
|
|
|
|
if ($this->isVersion('32.10.1')) {
|
|
$extension = $this->getServiceManager()->get(\common_ext_ExtensionsManager::SERVICE_ID)->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['validateResponses']['validateOnPreviousMove'] = true;
|
|
$extension->setConfig('testRunner', $config);
|
|
$this->setVersion('32.11.0');
|
|
}
|
|
|
|
$this->skip('32.11.0', '33.8.0');
|
|
|
|
if ($this->isVersion('33.8.0')) {
|
|
OntologyUpdater::syncModels();
|
|
$this->setVersion('33.9.0');
|
|
}
|
|
|
|
if ($this->isVersion('33.9.0')) {
|
|
$providerRegistry = ProviderRegistry::getRegistry();
|
|
$providerRegistry->register(
|
|
TestProvider::fromArray([
|
|
'id' => 'request',
|
|
'name' => 'request communicator',
|
|
'module' => 'core/communicator/request',
|
|
'category' => 'communicator',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
])
|
|
);
|
|
$providerRegistry->register(
|
|
TestProvider::fromArray([
|
|
'id' => 'poll',
|
|
'name' => 'poll communicator',
|
|
'module' => "core/communicator/poll",
|
|
'category' => 'communicator',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
])
|
|
);
|
|
|
|
//if the proxy was different
|
|
$clientLibRegistry = ClientLibConfigRegistry::getRegistry();
|
|
if ($clientLibRegistry->isRegistered('taoQtiTest/runner/proxy/loader')) {
|
|
$registeredProxy = $clientLibRegistry->get('taoQtiTest/runner/proxy/loader');
|
|
$providerRegistry->register(
|
|
TestProvider::fromArray([
|
|
'id' => $registeredProxy['providerName'],
|
|
'module' => $registeredProxy['module'],
|
|
'bundle' => 'taoQtiTest/loader/taoQtiTestRunner.min',
|
|
'category' => 'proxy',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
])
|
|
);
|
|
} else {
|
|
$providerRegistry->register(
|
|
TestProvider::fromArray([
|
|
'id' => 'qtiServiceProxy',
|
|
'module' => 'taoQtiTest/runner/proxy/qtiServiceProxy',
|
|
'bundle' => 'taoQtiTest/loader/taoQtiTestRunner.min',
|
|
'category' => 'proxy',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
])
|
|
);
|
|
}
|
|
|
|
$this->setVersion('33.10.0');
|
|
}
|
|
|
|
$this->skip('33.10.0', '33.10.1');
|
|
|
|
if ($this->isVersion('33.10.1')) {
|
|
$providerRegistry = ProviderRegistry::getRegistry();
|
|
$providerRegistry->remove('taoQtiTest/runner/provider/qti');
|
|
$providerRegistry->register(
|
|
TestProvider::fromArray([
|
|
'id' => 'qti',
|
|
'module' => 'taoQtiTest/runner/provider/qti',
|
|
'bundle' => 'taoQtiTest/loader/taoQtiTestRunner.min',
|
|
'position' => null,
|
|
'name' => 'QTI runner',
|
|
'description' => 'QTI implementation of the test runner',
|
|
'category' => 'runner',
|
|
'active' => true,
|
|
'tags' => [
|
|
'core',
|
|
'qti',
|
|
'runner'
|
|
]
|
|
])
|
|
);
|
|
if ($providerRegistry->isRegistered('taoQtiTest/runner/proxy/qtiServiceProxy')) {
|
|
$registeredProxy = $providerRegistry->get('taoQtiTest/runner/proxy/qtiServiceProxy');
|
|
$registeredProxy['bundle'] = 'taoQtiTest/loader/taoQtiTestRunner.min';
|
|
$providerRegistry->register(
|
|
TestProvider::fromArray($registeredProxy)
|
|
);
|
|
}
|
|
$this->setVersion('33.10.2');
|
|
}
|
|
|
|
$this->skip('33.10.2', '33.10.3');
|
|
|
|
if ($this->isVersion('33.10.3')) {
|
|
$assetService = $this->getServiceManager()->get(AssetService::SERVICE_ID);
|
|
$taoTestRunnerQtiDir = $assetService->getJsBaseWww('taoQtiTest') . 'node_modules/@oat-sa/tao-test-runner-qti/dist';
|
|
$clientLibRegistry = ClientLibRegistry::getRegistry();
|
|
$clientLibRegistry->register('taoQtiTest/runner', $taoTestRunnerQtiDir);
|
|
$this->setVersion('34.0.0');
|
|
}
|
|
|
|
$this->skip('34.0.0', '34.2.1');
|
|
|
|
if ($this->isVersion('34.2.1')) {
|
|
$this->getServiceManager()->register(
|
|
TimerStrategyInterface::SERVICE_ID,
|
|
new TimerStrategyService()
|
|
);
|
|
$this->setVersion('34.3.0');
|
|
}
|
|
|
|
$this->skip('34.3.0', '35.1.1');
|
|
|
|
if ($this->isVersion('35.1.1')) {
|
|
$providerRegistry = ProviderRegistry::getRegistry();
|
|
if ($providerRegistry->isRegistered('taoQtiTest/runner/proxy/offline/proxy')) {
|
|
$pluginRegistry = PluginRegistry::getRegistry();
|
|
$pluginRegistry->remove('taoTestRunnerPlugins/runner/plugins/security/autoPause');
|
|
$pluginRegistry->register(TestPlugin::fromArray([
|
|
'id' => 'connectivity',
|
|
'name' => 'Connectivity check',
|
|
'module' => 'taoQtiTest/runner/plugins/controls/connectivity/connectivity',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Pause the test when the network loose the connection',
|
|
'category' => 'controls',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'technical' ]
|
|
]));
|
|
}
|
|
|
|
$this->setVersion('35.1.2');
|
|
}
|
|
|
|
$this->skip('35.1.2', '35.1.3');
|
|
|
|
if ($this->isVersion('35.1.3')) {
|
|
// Register APIP TTS plugin
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'apiptts',
|
|
'name' => 'APIP Text To Speech',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/apipTextToSpeech/plugin',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Allow Test-taker to playback media files associated according to APIP protocol to item content.',
|
|
'category' => 'tools',
|
|
'active' => false,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
// Register APIP TTS plugin shortcuts
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['apiptts'] = [
|
|
'enterTogglePlayback' => 'Enter',
|
|
'togglePlayback' => 'P',
|
|
'spaceTogglePlayback' => 'Space'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('35.2.0');
|
|
}
|
|
|
|
$this->skip('35.2.0', '35.5.0');
|
|
|
|
if ($this->isVersion('35.5.0')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'apiptts',
|
|
'name' => 'APIP Text To Speech',
|
|
'module' => 'taoQtiTest/runner/plugins/tools/apipTextToSpeech/plugin',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Allow Test-taker to playback media files associated according to APIP protocol to item content.',
|
|
'category' => 'tools',
|
|
'active' => true,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
$this->setVersion('35.6.0');
|
|
}
|
|
|
|
$this->skip('35.6.0', '35.10.2.2');
|
|
|
|
if ($this->isBetween('35.10.2', '35.10.2.2')) {
|
|
$this->getServiceManager()->register(QtiTestUtils::SERVICE_ID, new QtiTestUtils([]));
|
|
$this->setVersion('35.11.0');
|
|
}
|
|
|
|
$this->skip('35.11.0', '35.13.3');
|
|
|
|
if ($this->isVersion('35.13.3')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
$registry->remove('taoQtiTest/runner/plugins/content/accessibility/keyNavigation');
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'keyNavigation',
|
|
'name' => 'Keyboard Navigation',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/keyNavigation/plugin',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Provide a way to navigate within the test runner with the keyboard',
|
|
'category' => 'content',
|
|
'active' => true,
|
|
'tags' => [ 'core', 'qti' ]
|
|
]));
|
|
|
|
$this->setVersion('36.0.0');
|
|
}
|
|
|
|
$this->skip('36.0.0', '37.0.1');
|
|
|
|
if ($this->isVersion('37.0.1')) {
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
$config['plugins']['dialog']['alert']['focus'] = 'navigable-modal-body';
|
|
$config['plugins']['dialog']['confirm']['focus'] = 'navigable-modal-body';
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('37.0.2');
|
|
}
|
|
|
|
$this->skip('37.0.2', '37.0.4');
|
|
|
|
if ($this->isVersion('37.0.4')) {
|
|
$this->getServiceManager()->register(
|
|
OverriddenOptionsRepositoryInterface::SERVICE_ID,
|
|
new NoopOverriddenOptionsRepository()
|
|
);
|
|
|
|
$this->setVersion('37.1.0');
|
|
}
|
|
|
|
$this->skip('37.1.0', '37.2.1');
|
|
|
|
if ($this->isVersion('37.2.1')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'jumplinks',
|
|
'name' => 'Jump links',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/jumplinks/plugin',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Provide a jump links to fastest keyboard navigation',
|
|
'category' => 'content',
|
|
'active' => false,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
$this->setVersion('37.3.0');
|
|
}
|
|
|
|
$this->skip('37.3.0', '37.4.2');
|
|
|
|
if ($this->isversion('37.4.2')) {
|
|
$this->getServiceManager()->register(
|
|
TimerAdjustmentServiceInterface::SERVICE_ID,
|
|
new TimerAdjustmentService()
|
|
);
|
|
$this->setVersion('37.5.0');
|
|
}
|
|
|
|
$this->skip('37.5.0', '37.9.3');
|
|
|
|
if ($this->isVersion('37.9.3')) {
|
|
$registry = PluginRegistry::getRegistry();
|
|
|
|
$registry->register(TestPlugin::fromArray([
|
|
'id' => 'mainLandmark',
|
|
'name' => 'Main landmark',
|
|
'module' => 'taoQtiTest/runner/plugins/content/accessibility/mainLandmark/header',
|
|
'bundle' => 'taoQtiTest/loader/testPlugins.min',
|
|
'description' => 'Landmark header for the test runner main',
|
|
'category' => 'content',
|
|
'active' => false,
|
|
'tags' => [ ]
|
|
]));
|
|
|
|
$this->setVersion('37.10.2');
|
|
}
|
|
|
|
$this->skip('37.10.2', '38.1.1');
|
|
|
|
if ($this->isVersion('38.1.1')) {
|
|
// Register accessibility shortcuts
|
|
$extension = \common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiTest');
|
|
$config = $extension->getConfig('testRunner');
|
|
|
|
$config['shortcuts']['next'] = [
|
|
'trigger' => 'J',
|
|
'triggerAccessibility' => 'Alt+Shift+N'
|
|
];
|
|
|
|
$config['shortcuts']['previous'] = [
|
|
'trigger' => 'K',
|
|
'triggerAccessibility' => 'Alt+Shift+P'
|
|
];
|
|
|
|
$config['shortcuts']['jumplinks'] = [
|
|
'goToQuestion' => 'Alt+Shift+Q',
|
|
'goToTop' => 'Alt+Shift+T'
|
|
];
|
|
|
|
$extension->setConfig('testRunner', $config);
|
|
|
|
$this->setVersion('38.2.0');
|
|
}
|
|
|
|
$this->skip('38.2.0', '38.5.0');
|
|
|
|
if ($this->isVersion('38.5.0')) {
|
|
OntologyUpdater::syncModels();
|
|
|
|
AclProxy::applyRule(new AccessRule('deny', 'http://www.tao.lu/Ontologies/TAOTest.rdf#TaoQtiManagerRole', ['ext' => 'taoQtiTest', 'mod' => 'XmlEditor']));
|
|
AclProxy::applyRule(new AccessRule('grant', XmlEditorInterface::XML_EDITOR_ROLE, ['ext' => 'taoQtiTest', 'mod' => 'XmlEditor']));
|
|
|
|
$this->setVersion('38.6.0');
|
|
|
|
}
|
|
|
|
$this->skip('38.6.0', '38.6.1');
|
|
|
|
if ($this->isversion('38.6.1')) {
|
|
|
|
$this->getServiceManager()->register(
|
|
XmlEditorInterface::SERVICE_ID,
|
|
new XmlEditor([
|
|
XmlEditor::OPTION_XML_EDITOR_LOCK => true
|
|
])
|
|
);
|
|
|
|
$this->setVersion('38.7.0');
|
|
}
|
|
|
|
$this->skip('38.7.0', '38.12.2');
|
|
|
|
if ($this->isVersion('38.12.2')) {
|
|
$this->runExtensionScript(RegisterQtiPackageExporter::class);
|
|
$this->setVersion('38.13.0');
|
|
}
|
|
|
|
$this->skip('38.13.0', '38.14.0');
|
|
|
|
|
|
//Updater files are deprecated. Please use migrations.
|
|
//See: https://github.com/oat-sa/generis/wiki/Tao-Update-Process
|
|
|
|
$this->setVersion($this->getExtension()->getManifest()->getVersion());
|
|
}
|
|
}
|