From 4f315786e8a010865d41af7726aa9743aed64bb8 Mon Sep 17 00:00:00 2001 From: Jean-Michel Vedrine Date: Thu, 7 Feb 2013 13:57:20 +0100 Subject: [PATCH] MDL-37897 Remove useless Blackboard question import format --- lib/db/upgrade.php | 7 + lib/pluginlib.php | 3 +- question/format/blackboard/format.php | 494 ------------------ .../blackboard/lang/en/qformat_blackboard.php | 29 - .../tests/blackboardformat_test.php | 328 ------------ .../tests/fixtures/sample_blackboard.dat | 142 ----- question/format/blackboard/version.php | 32 -- .../lang/en/qformat_blackboard_six.php | 4 +- version.php | 2 +- 9 files changed, 12 insertions(+), 1029 deletions(-) delete mode 100644 question/format/blackboard/format.php delete mode 100644 question/format/blackboard/lang/en/qformat_blackboard.php delete mode 100644 question/format/blackboard/tests/blackboardformat_test.php delete mode 100644 question/format/blackboard/tests/fixtures/sample_blackboard.dat delete mode 100644 question/format/blackboard/version.php diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 09ea47dd0d9c5..5b079054a8d1a 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -1670,5 +1670,12 @@ function xmldb_main_upgrade($oldversion) { upgrade_main_savepoint(true, 2013022600.00); } + if ($oldversion < 2013022800.01) { + // Cleanup qformat blackboard settings. + unset_all_config_for_plugin('qformat_blackboard'); + + upgrade_main_savepoint(true, 2013022800.01); + } + return true; } diff --git a/lib/pluginlib.php b/lib/pluginlib.php index a626ab4881c9d..fdc95f6b1f1f0 100644 --- a/lib/pluginlib.php +++ b/lib/pluginlib.php @@ -362,6 +362,7 @@ public function some_plugins_updatable() { public static function is_deleted_standard_plugin($type, $name) { static $plugins = array( // do not add 1.9-2.2 plugin removals here + 'qformat' => array('blackboard'), ); if (!isset($plugins[$type])) { @@ -508,7 +509,7 @@ public static function standard_plugins_list($type) { ), 'qformat' => array( - 'aiken', 'blackboard', 'blackboard_six', 'examview', 'gift', + 'aiken', 'blackboard_six', 'examview', 'gift', 'learnwise', 'missingword', 'multianswer', 'webct', 'xhtml', 'xml' ), diff --git a/question/format/blackboard/format.php b/question/format/blackboard/format.php deleted file mode 100644 index 9d30323f7732a..0000000000000 --- a/question/format/blackboard/format.php +++ /dev/null @@ -1,494 +0,0 @@ -. - -/** - * Blackboard question importer. - * - * @package qformat_blackboard - * @copyright 2003 Scott Elliott - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - - -defined('MOODLE_INTERNAL') || die(); - -require_once($CFG->libdir . '/xmlize.php'); - - -/** - * Blackboard question importer. - * - * @copyright 2003 Scott Elliott - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class qformat_blackboard extends qformat_based_on_xml { - // Is the current question's question text escaped HTML (true for most if not all Blackboard files). - public $ishtml = true; - - - public function provide_import() { - return true; - } - - /** - * Check if the given file is capable of being imported by this plugin. - * As {@link file_storage::mimetype()} now uses finfo PHP extension if available, - * the value returned by $file->get_mimetype for a .dat file is not the same on all servers. - * So if the parent method fails we must use mimeinfo on the filename. - * @param stored_file $file the file to check - * @return bool whether this plugin can import the file - */ - public function can_import_file($file) { - return parent::can_import_file($file) || mimeinfo('type', $file->get_filename()) == $this->mime_type(); - } - - public function mime_type() { - return mimeinfo('type', '.dat'); - } - - /** - * Parse the array of lines into an array of questions - * this *could* burn memory - but it won't happen that much - * so fingers crossed! - * @param array of lines from the input file. - * @param stdClass $context - * @return array (of objects) question objects. - */ - protected function readquestions($lines) { - - $text = implode($lines, ' '); - unset($lines); - - // This converts xml to big nasty data structure, - // the 0 means keep white space as it is. - try { - $xml = xmlize($text, 0, 'UTF-8', true); - } catch (xml_format_exception $e) { - $this->error($e->getMessage(), ''); - return false; - } - - $questions = array(); - - $this->process_tf($xml, $questions); - $this->process_mc($xml, $questions); - $this->process_ma($xml, $questions); - $this->process_fib($xml, $questions); - $this->process_matching($xml, $questions); - $this->process_essay($xml, $questions); - - return $questions; - } - - /** - * Do question import processing common to every qtype. - * @param array $questiondata the xml tree related to the current question - * @return object initialized question object. - */ - public function process_common($questiondata) { - global $CFG; - - // This routine initialises the question object. - $question = $this->defaultquestion(); - - // Determine if the question is already escaped html. - $this->ishtml = $this->getpath($questiondata, - array('#', 'BODY', 0, '#', 'FLAGS', 0, '#', 'ISHTML', 0, '@', 'value'), - false, false); - - // Put questiontext in question object. - $text = $this->getpath($questiondata, - array('#', 'BODY', 0, '#', 'TEXT', 0, '#'), - '', true, get_string('importnotext', 'qformat_blackboard')); - - if ($this->ishtml) { - $question->questiontext = $this->cleaninput($text); - $question->questiontextformat = FORMAT_HTML; - $question->questiontextfiles = array(); - - } else { - $question->questiontext = $text; - } - // Put name in question object. We must ensure it is not empty and it is less than 250 chars. - $id = $this->getpath($questiondata, array('@', 'id'), '', true); - $question->name = $this->create_default_question_name($question->questiontext, - get_string('defaultname', 'qformat_blackboard', $id)); - - $question->generalfeedback = ''; - $question->generalfeedbackformat = FORMAT_HTML; - $question->generalfeedbackfiles = array(); - - // TODO : read the mark from the POOL TITLE QUESTIONLIST section. - $question->defaultmark = 1; - return $question; - } - - /** - * Process Essay Questions - * @param array xml the xml tree - * @param array questions the questions already parsed - */ - public function process_essay($xml, &$questions) { - - if ($this->getpath($xml, array('POOL', '#', 'QUESTION_ESSAY'), false, false)) { - $essayquestions = $this->getpath($xml, - array('POOL', '#', 'QUESTION_ESSAY'), false, false); - } else { - return; - } - - foreach ($essayquestions as $thisquestion) { - - $question = $this->process_common($thisquestion); - - $question->qtype = 'essay'; - - $question->answer = ''; - $answer = $this->getpath($thisquestion, - array('#', 'ANSWER', 0, '#', 'TEXT', 0, '#'), '', true); - $question->graderinfo = $this->text_field($this->cleaninput($answer)); - $question->feedback = ''; - $question->responseformat = 'editor'; - $question->responsefieldlines = 15; - $question->attachments = 0; - $question->fraction = 0; - - $questions[] = $question; - } - } - - /** - * Process True / False Questions - * @param array xml the xml tree - * @param array questions the questions already parsed - */ - public function process_tf($xml, &$questions) { - - if ($this->getpath($xml, array('POOL', '#', 'QUESTION_TRUEFALSE'), false, false)) { - $tfquestions = $this->getpath($xml, - array('POOL', '#', 'QUESTION_TRUEFALSE'), false, false); - } else { - return; - } - - foreach ($tfquestions as $thisquestion) { - - $question = $this->process_common($thisquestion); - - $question->qtype = 'truefalse'; - $question->single = 1; // Only one answer is allowed. - - $choices = $this->getpath($thisquestion, array('#', 'ANSWER'), array(), false); - - $correct_answer = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'CORRECTANSWER', 0, '@', 'answer_id'), - '', true); - - // First choice is true, second is false. - $id = $this->getpath($choices[0], array('@', 'id'), '', true); - $correctfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_CORRECT', 0, '#'), - '', true); - $incorrectfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_INCORRECT', 0, '#'), - '', true); - if (strcmp($id, $correct_answer) == 0) { // True is correct. - $question->answer = 1; - $question->feedbacktrue = $this->text_field($this->cleaninput($correctfeedback)); - $question->feedbackfalse = $this->text_field($this->cleaninput($incorrectfeedback)); - } else { // False is correct. - $question->answer = 0; - $question->feedbacktrue = $this->text_field($this->cleaninput($incorrectfeedback)); - $question->feedbackfalse = $this->text_field($this->cleaninput($correctfeedback)); - } - $question->correctanswer = $question->answer; - $questions[] = $question; - } - } - - /** - * Process Multiple Choice Questions with single answer - * @param array xml the xml tree - * @param array questions the questions already parsed - */ - public function process_mc($xml, &$questions) { - - if ($this->getpath($xml, array('POOL', '#', 'QUESTION_MULTIPLECHOICE'), false, false)) { - $mcquestions = $this->getpath($xml, - array('POOL', '#', 'QUESTION_MULTIPLECHOICE'), false, false); - } else { - return; - } - - foreach ($mcquestions as $thisquestion) { - - $question = $this->process_common($thisquestion); - - $correctfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_CORRECT', 0, '#'), - '', true); - $incorrectfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_INCORRECT', 0, '#'), - '', true); - $question->correctfeedback = $this->text_field($this->cleaninput($correctfeedback)); - $question->partiallycorrectfeedback = $this->text_field(''); - $question->incorrectfeedback = $this->text_field($this->cleaninput($incorrectfeedback)); - - $question->qtype = 'multichoice'; - $question->single = 1; // Only one answer is allowed. - - $choices = $this->getpath($thisquestion, array('#', 'ANSWER'), false, false); - $correct_answer_id = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'CORRECTANSWER', 0, '@', 'answer_id'), - '', true); - foreach ($choices as $choice) { - $choicetext = $this->getpath($choice, array('#', 'TEXT', 0, '#'), '', true); - // Put this choice in the question object. - $question->answer[] = $this->text_field($this->cleaninput($choicetext)); - - $choice_id = $this->getpath($choice, array('@', 'id'), '', true); - // If choice is the right answer, give 100% mark, otherwise give 0%. - if (strcmp ($choice_id, $correct_answer_id) == 0) { - $question->fraction[] = 1; - } else { - $question->fraction[] = 0; - } - // There is never feedback specific to each choice. - $question->feedback[] = $this->text_field(''); - } - $questions[] = $question; - } - } - - /** - * Process Multiple Choice Questions With Multiple Answers - * @param array xml the xml tree - * @param array questions the questions already parsed - */ - public function process_ma($xml, &$questions) { - if ($this->getpath($xml, array('POOL', '#', 'QUESTION_MULTIPLEANSWER'), false, false)) { - $maquestions = $this->getpath($xml, - array('POOL', '#', 'QUESTION_MULTIPLEANSWER'), false, false); - } else { - return; - } - - foreach ($maquestions as $thisquestion) { - $question = $this->process_common($thisquestion); - - $correctfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_CORRECT', 0, '#'), - '', true); - $incorrectfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_INCORRECT', 0, '#'), - '', true); - $question->correctfeedback = $this->text_field($this->cleaninput($correctfeedback)); - // As there is no partially correct feedback we use incorrect one. - $question->partiallycorrectfeedback = $this->text_field($this->cleaninput($incorrectfeedback)); - $question->incorrectfeedback = $this->text_field($this->cleaninput($incorrectfeedback)); - - $question->qtype = 'multichoice'; - $question->defaultmark = 1; - $question->single = 0; // More than one answers allowed. - - $choices = $this->getpath($thisquestion, array('#', 'ANSWER'), false, false); - $correct_answer_ids = array(); - foreach ($this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'CORRECTANSWER'), false, false) as $correctanswer) { - if ($correctanswer) { - $correct_answer_ids[] = $this->getpath($correctanswer, - array('@', 'answer_id'), - '', true); - } - } - $fraction = 1/count($correct_answer_ids); - - foreach ($choices as $choice) { - $choicetext = $this->getpath($choice, array('#', 'TEXT', 0, '#'), '', true); - // Put this choice in the question object. - $question->answer[] = $this->text_field($this->cleaninput($choicetext)); - - $choice_id = $this->getpath($choice, array('@', 'id'), '', true); - - $iscorrect = in_array($choice_id, $correct_answer_ids); - - if ($iscorrect) { - $question->fraction[] = $fraction; - } else { - $question->fraction[] = 0; - } - // There is never feedback specific to each choice. - $question->feedback[] = $this->text_field(''); - } - $questions[] = $question; - } - } - - /** - * Process Fill in the Blank Questions - * @param array xml the xml tree - * @param array questions the questions already parsed - */ - public function process_fib($xml, &$questions) { - if ($this->getpath($xml, array('POOL', '#', 'QUESTION_FILLINBLANK'), false, false)) { - $fibquestions = $this->getpath($xml, - array('POOL', '#', 'QUESTION_FILLINBLANK'), false, false); - } else { - return; - } - - foreach ($fibquestions as $thisquestion) { - - $question = $this->process_common($thisquestion); - - $question->qtype = 'shortanswer'; - $question->usecase = 0; // Ignore case. - - $correctfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_CORRECT', 0, '#'), - '', true); - $incorrectfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_INCORRECT', 0, '#'), - '', true); - $answers = $this->getpath($thisquestion, array('#', 'ANSWER'), false, false); - foreach ($answers as $answer) { - $question->answer[] = $this->getpath($answer, - array('#', 'TEXT', 0, '#'), '', true); - $question->fraction[] = 1; - $question->feedback[] = $this->text_field($this->cleaninput($correctfeedback)); - } - $question->answer[] = '*'; - $question->fraction[] = 0; - $question->feedback[] = $this->text_field($this->cleaninput($incorrectfeedback)); - - $questions[] = $question; - } - } - - /** - * Process Matching Questions - * @param array xml the xml tree - * @param array questions the questions already parsed - */ - public function process_matching($xml, &$questions) { - if ($this->getpath($xml, array('POOL', '#', 'QUESTION_MATCH'), false, false)) { - $matchquestions = $this->getpath($xml, - array('POOL', '#', 'QUESTION_MATCH'), false, false); - } else { - return; - } - // Blackboard questions can't be imported in core Moodle without a loss in data, - // as core match question don't allow HTML in subanswers. The contributed ddmatch - // question type support HTML in subanswers. - // The ddmatch question type is not part of core, so we need to check if it is defined. - $ddmatch_is_installed = question_bank::is_qtype_installed('ddmatch'); - - foreach ($matchquestions as $thisquestion) { - - $question = $this->process_common($thisquestion); - if ($ddmatch_is_installed) { - $question->qtype = 'ddmatch'; - } else { - $question->qtype = 'match'; - } - - $correctfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_CORRECT', 0, '#'), - '', true); - $incorrectfeedback = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'FEEDBACK_WHEN_INCORRECT', 0, '#'), - '', true); - $question->correctfeedback = $this->text_field($this->cleaninput($correctfeedback)); - // As there is no partially correct feedback we use incorrect one. - $question->partiallycorrectfeedback = $this->text_field($this->cleaninput($incorrectfeedback)); - $question->incorrectfeedback = $this->text_field($this->cleaninput($incorrectfeedback)); - - $choices = $this->getpath($thisquestion, - array('#', 'CHOICE'), false, false); // Blackboard "choices" are Moodle subanswers. - $answers = $this->getpath($thisquestion, - array('#', 'ANSWER'), false, false); // Blackboard "answers" are Moodle subquestions. - $correctanswers = $this->getpath($thisquestion, - array('#', 'GRADABLE', 0, '#', 'CORRECTANSWER'), false, false); // Mapping between choices and answers. - $mappings = array(); - foreach ($correctanswers as $correctanswer) { - if ($correctanswer) { - $correct_choice_id = $this->getpath($correctanswer, - array('@', 'choice_id'), '', true); - $correct_answer_id = $this->getpath($correctanswer, - array('@', 'answer_id'), - '', true); - $mappings[$correct_answer_id] = $correct_choice_id; - } - } - - foreach ($choices as $choice) { - if ($ddmatch_is_installed) { - $choicetext = $this->text_field($this->cleaninput($this->getpath($choice, - array('#', 'TEXT', 0, '#'), '', true))); - } else { - $choicetext = trim(strip_tags($this->getpath($choice, - array('#', 'TEXT', 0, '#'), '', true))); - } - - if ($choicetext != '') { // Only import non empty subanswers. - $subquestion = ''; - $choice_id = $this->getpath($choice, - array('@', 'id'), '', true); - $fiber = array_search($choice_id, $mappings); - $fiber = array_keys ($mappings, $choice_id); - foreach ($fiber as $correct_answer_id) { - // We have found a correspondance for this choice so we need to take the associated answer. - foreach ($answers as $answer) { - $current_ans_id = $this->getpath($answer, - array('@', 'id'), '', true); - if (strcmp ($current_ans_id, $correct_answer_id) == 0) { - $subquestion = $this->getpath($answer, - array('#', 'TEXT', 0, '#'), '', true); - break; - } - } - $question->subquestions[] = $this->text_field($this->cleaninput($subquestion)); - $question->subanswers[] = $choicetext; - } - - if ($subquestion == '') { // Then in this case, $choice is a distractor. - $question->subquestions[] = $this->text_field(''); - $question->subanswers[] = $choicetext; - } - } - } - - // Verify that this matching question has enough subquestions and subanswers. - $subquestioncount = 0; - $subanswercount = 0; - $subanswers = $question->subanswers; - foreach ($question->subquestions as $key => $subquestion) { - $subquestion = $subquestion['text']; - $subanswer = $subanswers[$key]; - if ($subquestion != '') { - $subquestioncount++; - } - $subanswercount++; - } - if ($subquestioncount < 2 || $subanswercount < 3) { - $this->error(get_string('notenoughtsubans', 'qformat_blackboard', $question->questiontext)); - } else { - $questions[] = $question; - } - - } - } -} diff --git a/question/format/blackboard/lang/en/qformat_blackboard.php b/question/format/blackboard/lang/en/qformat_blackboard.php deleted file mode 100644 index f5fa9576ea487..0000000000000 --- a/question/format/blackboard/lang/en/qformat_blackboard.php +++ /dev/null @@ -1,29 +0,0 @@ -. - -/** - * Strings for component 'qformat_blackboard', language 'en', branch 'MOODLE_20_STABLE' - * - * @package qformat_blackboard - * @copyright 2010 Helen Foster - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -$string['defaultname'] = 'Imported question {$a}'; -$string['importnotext'] = 'Missing question text in XML file'; -$string['notenoughtsubans'] = 'Unable to import matching question \'{$a}\' because a matching question must comprise at least two questions and three answers.'; -$string['pluginname'] = 'Blackboard'; -$string['pluginname_help'] = 'Blackboard format enables questions saved in the Blackboard version 5 "POOL" type export format to be imported.'; diff --git a/question/format/blackboard/tests/blackboardformat_test.php b/question/format/blackboard/tests/blackboardformat_test.php deleted file mode 100644 index d67e5269702cd..0000000000000 --- a/question/format/blackboard/tests/blackboardformat_test.php +++ /dev/null @@ -1,328 +0,0 @@ -. - -/** - * Unit tests for the Moodle Blackboard format. - * - * @package qformat_blackboard - * @copyright 2012 Jean-Michel Vedrine - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - - -defined('MOODLE_INTERNAL') || die(); - -global $CFG; -require_once($CFG->libdir . '/questionlib.php'); -require_once($CFG->dirroot . '/question/format.php'); -require_once($CFG->dirroot . '/question/format/blackboard/format.php'); -require_once($CFG->dirroot . '/question/engine/tests/helpers.php'); - - -/** - * Unit tests for the blackboard question import format. - * - * @copyright 2012 Jean-Michel Vedrine - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -class qformat_blackboard_test extends question_testcase { - - public function make_test_xml() { - $xml = file_get_contents(__DIR__ . '/fixtures/sample_blackboard.dat'); - return $xml; - } - - public function test_import_match() { - - $xmldata = xmlize($this->make_test_xml()); - $questions = array(); - - $importer = new qformat_blackboard(); - $importer->process_matching($xmldata, $questions); - $q = $questions[0]; - $expectedq = new stdClass(); - $expectedq->qtype = 'match'; - $expectedq->name = 'Classify the animals.'; - $expectedq->questiontext = 'Classify the animals.'; - $expectedq->questiontextformat = FORMAT_HTML; - $expectedq->correctfeedback = array('text' => '', - 'format' => FORMAT_HTML, 'files' => array()); - $expectedq->partiallycorrectfeedback = array('text' => '', - 'format' => FORMAT_HTML, 'files' => array()); - $expectedq->incorrectfeedback = array('text' => '', - 'format' => FORMAT_HTML, 'files' => array()); - $expectedq->generalfeedback = ''; - $expectedq->generalfeedbackformat = FORMAT_HTML; - $expectedq->defaultmark = 1; - $expectedq->length = 1; - $expectedq->penalty = 0.3333333; - $expectedq->shuffleanswers = get_config('quiz', 'shuffleanswers'); - $expectedq->subquestions = array( - array('text' => 'cat', 'format' => FORMAT_HTML, 'files' => array()), - array('text' => '', 'format' => FORMAT_HTML, 'files' => array()), - array('text' => 'frog', 'format' => FORMAT_HTML, 'files' => array()), - array('text' => 'newt', 'format' => FORMAT_HTML, 'files' => array())); - $expectedq->subanswers = array('mammal', 'insect', 'amphibian', 'amphibian'); - - $this->assert(new question_check_specified_fields_expectation($expectedq), $q); - } - - public function test_import_multichoice_single() { - - $xmldata = xmlize($this->make_test_xml()); - $questions = array(); - - $importer = new qformat_blackboard(); - $importer->process_mc($xmldata, $questions); - $q = $questions[0]; - - $expectedq = new stdClass(); - $expectedq->qtype = 'multichoice'; - $expectedq->single = 1; - $expectedq->name = 'What\'s between orange and green in the spectrum?'; - $expectedq->questiontext = 'What\'s between orange and green in the spectrum?'; - $expectedq->questiontextformat = FORMAT_HTML; - $expectedq->correctfeedback = array('text' => 'You gave the right answer.', - 'format' => FORMAT_HTML, 'files' => array()); - $expectedq->partiallycorrectfeedback = array('text' => '', - 'format' => FORMAT_HTML, 'files' => array()); - $expectedq->incorrectfeedback = array('text' => 'Only yellow is between orange and green in the spectrum.', - 'format' => FORMAT_HTML, 'files' => array()); - $expectedq->generalfeedback = ''; - $expectedq->generalfeedbackformat = FORMAT_HTML; - $expectedq->defaultmark = 1; - $expectedq->length = 1; - $expectedq->penalty = 0.3333333; - $expectedq->shuffleanswers = get_config('quiz', 'shuffleanswers'); - $expectedq->answer = array( - 0 => array( - 'text' => 'red', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 1 => array( - 'text' => 'yellow', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 2 => array( - 'text' => 'blue', - 'format' => FORMAT_HTML, - 'files' => array(), - ) - ); - $expectedq->fraction = array(0, 1, 0); - $expectedq->feedback = array( - 0 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 1 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 2 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ) - ); - - $this->assert(new question_check_specified_fields_expectation($expectedq), $q); - } - - public function test_import_multichoice_multi() { - - $xmldata = xmlize($this->make_test_xml()); - $questions = array(); - - $importer = new qformat_blackboard(); - $importer->process_ma($xmldata, $questions); - $q = $questions[0]; - - $expectedq = new stdClass(); - $expectedq->qtype = 'multichoice'; - $expectedq->single = 0; - $expectedq->name = 'What\'s between orange and green in the spectrum?'; - $expectedq->questiontext = 'What\'s between orange and green in the spectrum?'; - $expectedq->questiontextformat = FORMAT_HTML; - $expectedq->correctfeedback = array( - 'text' => 'You gave the right answer.', - 'format' => FORMAT_HTML, - 'files' => array()); - $expectedq->partiallycorrectfeedback = array( - 'text' => 'Only yellow and off-beige are between orange and green in the spectrum.', - 'format' => FORMAT_HTML, - 'files' => array()); - $expectedq->incorrectfeedback = array( - 'text' => 'Only yellow and off-beige are between orange and green in the spectrum.', - 'format' => FORMAT_HTML, - 'files' => array()); - $expectedq->generalfeedback = ''; - $expectedq->generalfeedbackformat = FORMAT_HTML; - $expectedq->defaultmark = 1; - $expectedq->length = 1; - $expectedq->penalty = 0.3333333; - $expectedq->shuffleanswers = get_config('quiz', 'shuffleanswers'); - $expectedq->answer = array( - 0 => array( - 'text' => 'yellow', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 1 => array( - 'text' => 'red', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 2 => array( - 'text' => 'off-beige', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 3 => array( - 'text' => 'blue', - 'format' => FORMAT_HTML, - 'files' => array(), - ) - ); - $expectedq->fraction = array(0.5, 0, 0.5, 0); - $expectedq->feedback = array( - 0 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 1 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 2 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 3 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ) - ); - - $this->assert(new question_check_specified_fields_expectation($expectedq), $q); - } - - public function test_import_truefalse() { - - $xmldata = xmlize($this->make_test_xml()); - $questions = array(); - - $importer = new qformat_blackboard(); - $importer->process_tf($xmldata, $questions); - $q = $questions[0]; - - $expectedq = new stdClass(); - $expectedq->qtype = 'truefalse'; - $expectedq->name = '42 is the Absolute Answer to everything.'; - $expectedq->questiontext = '42 is the Absolute Answer to everything.'; - $expectedq->questiontextformat = FORMAT_HTML; - $expectedq->generalfeedback = ''; - $expectedq->generalfeedbackformat = FORMAT_HTML; - $expectedq->defaultmark = 1; - $expectedq->length = 1; - $expectedq->correctanswer = 0; - $expectedq->feedbacktrue = array( - 'text' => '42 is the Ultimate Answer.', - 'format' => FORMAT_HTML, - 'files' => array(), - ); - $expectedq->feedbackfalse = array( - 'text' => 'You gave the right answer.', - 'format' => FORMAT_HTML, - 'files' => array(), - ); - $this->assert(new question_check_specified_fields_expectation($expectedq), $q); - } - - public function test_import_fill_in_the_blank() { - - $xmldata = xmlize($this->make_test_xml()); - $questions = array(); - - $importer = new qformat_blackboard(); - $importer->process_fib($xmldata, $questions); - $q = $questions[0]; - - $expectedq = new stdClass(); - $expectedq->qtype = 'shortanswer'; - $expectedq->name = 'Name an amphibian: __________.'; - $expectedq->questiontext = 'Name an amphibian: __________.'; - $expectedq->questiontextformat = FORMAT_HTML; - $expectedq->generalfeedback = ''; - $expectedq->generalfeedbackformat = FORMAT_HTML; - $expectedq->defaultmark = 1; - $expectedq->length = 1; - $expectedq->usecase = 0; - $expectedq->answer = array('frog', '*'); - $expectedq->fraction = array(1, 0); - $expectedq->feedback = array( - 0 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ), - 1 => array( - 'text' => '', - 'format' => FORMAT_HTML, - 'files' => array(), - ) - ); - - $this->assert(new question_check_specified_fields_expectation($expectedq), $q); - } - - public function test_import_essay() { - - $xmldata = xmlize($this->make_test_xml()); - $questions = array(); - - $importer = new qformat_blackboard(); - $importer->process_essay($xmldata, $questions); - $q = $questions[0]; - - $expectedq = new stdClass(); - $expectedq->qtype = 'essay'; - $expectedq->name = 'How are you?'; - $expectedq->questiontext = 'How are you?'; - $expectedq->questiontextformat = FORMAT_HTML; - $expectedq->generalfeedback = ''; - $expectedq->generalfeedbackformat = FORMAT_HTML; - $expectedq->defaultmark = 1; - $expectedq->length = 1; - $expectedq->responseformat = 'editor'; - $expectedq->responsefieldlines = 15; - $expectedq->attachments = 0; - $expectedq->graderinfo = array( - 'text' => 'Blackboard answer for essay questions will be imported as informations for graders.', - 'format' => FORMAT_HTML, - 'files' => array()); - - $this->assert(new question_check_specified_fields_expectation($expectedq), $q); - } -} diff --git a/question/format/blackboard/tests/fixtures/sample_blackboard.dat b/question/format/blackboard/tests/fixtures/sample_blackboard.dat deleted file mode 100644 index f4d918317045b..0000000000000 --- a/question/format/blackboard/tests/fixtures/sample_blackboard.dat +++ /dev/null @@ -1,142 +0,0 @@ - - - - <QUESTIONLIST> - <QUESTION id='q1' class='QUESTION_TRUEFALSE' points='1'/> - <QUESTION id='q7' class='QUESTION_MULTIPLECHOICE' points='1'/> - <QUESTION id='q8' class='QUESTION_MULTIPLEANSWER' points='1'/> - <QUESTION id='q39-44' class='QUESTION_MATCH' points='1'/> - <QUESTION id='q9' class='QUESTION_ESSAY' points='1'/> - <QUESTION id='q27' class='QUESTION_FILLINBLANK' points='1'/> - </QUESTIONLIST> - <QUESTION_TRUEFALSE id='q1'> - <BODY> - <TEXT><![CDATA[<span style="font-size:12pt">42 is the Absolute Answer to everything.</span>]]></TEXT> - <FLAGS> - <ISHTML value='true'/> - <ISNEWLINELITERAL value='false'/> - </FLAGS> - </BODY> - <ANSWER id='q1_a1'> - <TEXT>False</TEXT> - </ANSWER> - <ANSWER id='q1_a2'> - <TEXT>True</TEXT> - </ANSWER> - <GRADABLE> - <CORRECTANSWER answer_id='q1_a2'/> - <FEEDBACK_WHEN_CORRECT><![CDATA[You gave the right answer.]]></FEEDBACK_WHEN_CORRECT> - <FEEDBACK_WHEN_INCORRECT><![CDATA[42 is the Ultimate Answer.]]></FEEDBACK_WHEN_INCORRECT> - </GRADABLE> - </QUESTION_TRUEFALSE> - <QUESTION_MULTIPLECHOICE id='q7'> - <BODY> - <TEXT><![CDATA[<span style="font-size:12pt">What's between orange and green in the spectrum?</span>]]></TEXT> - <FLAGS> - <ISHTML value='true'/> - <ISNEWLINELITERAL value='false'/> - </FLAGS> - </BODY> - <ANSWER id='q7_a1' position='1'> - <TEXT><![CDATA[<span style="font-size:12pt">red</span>]]></TEXT> - </ANSWER> - <ANSWER id='q7_a2' position='2'> - <TEXT><![CDATA[<span style="font-size:12pt">yellow</span>]]></TEXT> - </ANSWER> - <ANSWER id='q7_a3' position='3'> - <TEXT><![CDATA[<span style="font-size:12pt">blue</span>]]></TEXT> - </ANSWER> - <GRADABLE> - <CORRECTANSWER answer_id='q7_a2'/> - <FEEDBACK_WHEN_CORRECT><![CDATA[You gave the right answer.]]></FEEDBACK_WHEN_CORRECT> - <FEEDBACK_WHEN_INCORRECT><![CDATA[Only yellow is between orange and green in the spectrum.]]></FEEDBACK_WHEN_INCORRECT> - </GRADABLE> - </QUESTION_MULTIPLECHOICE> - <QUESTION_MULTIPLEANSWER id='q8'> - <BODY> - <TEXT><![CDATA[<span style="font-size:12pt">What's between orange and green in the spectrum?</span>]]></TEXT> - <FLAGS> - <ISHTML value='true'/> - <ISNEWLINELITERAL value='false'/> - </FLAGS> - </BODY> - <ANSWER id='q8_a1' position='1'> - <TEXT><![CDATA[<span style="font-size:12pt">yellow</span>]]></TEXT> - </ANSWER> - <ANSWER id='q8_a2' position='2'> - <TEXT><![CDATA[<span style="font-size:12pt">red</span>]]></TEXT> - </ANSWER> - <ANSWER id='q8_a3' position='3'> - <TEXT><![CDATA[<span style="font-size:12pt">off-beige</span>]]></TEXT> - </ANSWER> - <ANSWER id='q8_a4' position='4'> - <TEXT><![CDATA[<span style="font-size:12pt">blue</span>]]></TEXT> - </ANSWER> - <GRADABLE> - <CORRECTANSWER answer_id='q8_a1'/> - <CORRECTANSWER answer_id='q8_a3'/> - <FEEDBACK_WHEN_CORRECT><![CDATA[You gave the right answer.]]></FEEDBACK_WHEN_CORRECT> - <FEEDBACK_WHEN_INCORRECT><![CDATA[Only yellow and off-beige are between orange and green in the spectrum.]]></FEEDBACK_WHEN_INCORRECT> - </GRADABLE> - </QUESTION_MULTIPLEANSWER> - <QUESTION_MATCH id='q39-44'> - <BODY> - <TEXT><![CDATA[<i>Classify the animals.</i>]]></TEXT> - <FLAGS> - <ISHTML value='true'/> - <ISNEWLINELITERAL value='false'/> - </FLAGS> - </BODY> - <ANSWER id='q39-44_a1' position='1'> - <TEXT><![CDATA[frog]]></TEXT> - </ANSWER> - <ANSWER id='q39-44_a2' position='2'> - <TEXT><![CDATA[cat]]></TEXT> - </ANSWER> - <ANSWER id='q39-44_a3' position='3'> - <TEXT><![CDATA[newt]]></TEXT> - </ANSWER> - <CHOICE id='q39-44_c1' position='1'> - <TEXT><![CDATA[mammal]]></TEXT> - </CHOICE> - <CHOICE id='q39-44_c2' position='2'> - <TEXT><![CDATA[insect]]></TEXT> - </CHOICE> - <CHOICE id='q39-44_c3' position='3'> - <TEXT><![CDATA[amphibian]]></TEXT> - </CHOICE> - <GRADABLE> - <CORRECTANSWER answer_id='q39-44_a1' choice_id='q39-44_c3'/> - <CORRECTANSWER answer_id='q39-44_a2' choice_id='q39-44_c1'/> - <CORRECTANSWER answer_id='q39-44_a3' choice_id='q39-44_c3'/> - </GRADABLE> - </QUESTION_MATCH> - <QUESTION_ESSAY id='q9'> - <BODY> - <TEXT><![CDATA[How are you?]]></TEXT> - <FLAGS> - <ISHTML value='true'/> - <ISNEWLINELITERAL value='false'/> - </FLAGS> - </BODY> - <ANSWER id='q9_a1'> - <TEXT><![CDATA[Blackboard answer for essay questions will be imported as informations for graders.]]></TEXT> - </ANSWER> - <GRADABLE> - </GRADABLE> - </QUESTION_ESSAY> - <QUESTION_FILLINBLANK id='q27'> - <BODY> - <TEXT><![CDATA[<span style="font-size:12pt">Name an amphibian: __________.</span>]]></TEXT> - <FLAGS> - <ISHTML value='true'/> - <ISNEWLINELITERAL value='false'/> - </FLAGS> - </BODY> - <ANSWER id='q27_a1' position='1'> - <TEXT>frog</TEXT> - </ANSWER> - <GRADABLE> - </GRADABLE> - </QUESTION_FILLINBLANK> -</POOL> diff --git a/question/format/blackboard/version.php b/question/format/blackboard/version.php deleted file mode 100644 index 0c61840950b94..0000000000000 --- a/question/format/blackboard/version.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php -// This file is part of Moodle - http://moodle.org/ -// -// Moodle 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, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle 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 Moodle. If not, see <http://www.gnu.org/licenses/>. - -/** - * Version information for the calculated question type. - * - * @package qformat_blackboard - * @copyright 2011 The Open University - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -defined('MOODLE_INTERNAL') || die(); - -$plugin->component = 'qformat_blackboard'; -$plugin->version = 2012112900; - -$plugin->requires = 2012112900; - -$plugin->maturity = MATURITY_STABLE; diff --git a/question/format/blackboard_six/lang/en/qformat_blackboard_six.php b/question/format/blackboard_six/lang/en/qformat_blackboard_six.php index c7c925e6ae476..4c3e68cbf5412 100644 --- a/question/format/blackboard_six/lang/en/qformat_blackboard_six.php +++ b/question/format/blackboard_six/lang/en/qformat_blackboard_six.php @@ -28,6 +28,6 @@ $string['filenothandled'] = 'This archive contains reference to a file material {$a} which is not currently handled by import'; $string['imagenotfound'] = 'Image file with path {$a} was not found in the import.'; $string['notenoughtsubans'] = 'Unable to import matching question \'{$a}\' because a matching question must comprise at least two questions and three answers.'; -$string['pluginname'] = 'Blackboard V6+'; -$string['pluginname_help'] = 'Blackboard V6+ format enables questions saved in all Blackboard export formats to be imported via a dat or zip file. For zip files, images import is supported.'; +$string['pluginname'] = 'Blackboard'; +$string['pluginname_help'] = 'Blackboard format enables questions saved in all Blackboard export formats to be imported via a dat or zip file. For zip files, images import is supported.'; $string['unhandledpresblock'] = 'Unhandled presentation block'; diff --git a/version.php b/version.php index 8d6bcfd0b9ea2..8625638d72a71 100644 --- a/version.php +++ b/version.php @@ -31,7 +31,7 @@ -$version = 2013022800.00; // YYYYMMDD = weekly release date of this DEV branch +$version = 2013022800.01; // YYYYMMDD = weekly release date of this DEV branch // RR = release increments - 00 in DEV branches // .XX = incremental changes