ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ.. namespace core_question; use core_question\local\bank\question_version_status; use qubaid_list; use question_bank; use question_engine; use question_finder; defined('MOODLE_INTERNAL') || die(); global $CFG; require_once(__DIR__ . '/../lib.php'); /** * Unit tests for the {@see question_bank} class. * * @package core_question * @category test * @copyright 2011 The Open University * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class questionbank_test extends \advanced_testcase { public function test_sort_qtype_array() { $config = new \stdClass(); $config->multichoice_sortorder = '1'; $config->calculated_sortorder = '2'; $qtypes = array( 'frog' => 'toad', 'calculated' => 'newt', 'multichoice' => 'eft', ); $this->assertEquals(question_bank::sort_qtype_array($qtypes, $config), array( 'multichoice' => 'eft', 'calculated' => 'newt', 'frog' => 'toad', )); } public function test_fraction_options() { $fractions = question_bank::fraction_options(); $this->assertSame(get_string('none'), reset($fractions)); $this->assertSame('0.0', key($fractions)); $this->assertSame('5%', end($fractions)); $this->assertSame('0.05', key($fractions)); array_shift($fractions); array_pop($fractions); array_pop($fractions); $this->assertSame('100%', reset($fractions)); $this->assertSame('1.0', key($fractions)); $this->assertSame('11.11111%', end($fractions)); $this->assertSame('0.1111111', key($fractions)); } public function test_fraction_options_full() { $fractions = question_bank::fraction_options_full(); $this->assertSame(get_string('none'), reset($fractions)); $this->assertSame('0.0', key($fractions)); $this->assertSame('-100%', end($fractions)); $this->assertSame('-1.0', key($fractions)); array_shift($fractions); array_pop($fractions); array_pop($fractions); $this->assertSame('100%', reset($fractions)); $this->assertSame('1.0', key($fractions)); $this->assertSame('-83.33333%', end($fractions)); $this->assertSame('-0.8333333', key($fractions)); } public function test_load_many_for_cache() { $this->resetAfterTest(); $generator = $this->getDataGenerator()->get_plugin_generator('core_question'); $cat = $generator->create_question_category(); $q1 = $generator->create_question('shortanswer', null, ['category' => $cat->id]); $qs = question_finder::get_instance()->load_many_for_cache([$q1->id]); $this->assertArrayHasKey($q1->id, $qs); } public function test_load_many_for_cache_missing_id() { // Try to load a non-existent question. $this->expectException(\dml_missing_record_exception::class); question_finder::get_instance()->load_many_for_cache([-1]); } /** * Test get_questions_from_categories. * * @covers \question_finder::get_questions_from_categories * * @return void */ public function test_get_questions_from_categories(): void { $this->resetAfterTest(); /** @var core_question_generator $questiongenerator */ $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); // Create three questions in a question bank category, each with three versions. // The first question has all three versions in status ready. $cat = $questiongenerator->create_question_category(); $q1v1 = $questiongenerator->create_question('truefalse', null, ['name' => 'Q1V1', 'category' => $cat->id]); $q1v2 = $questiongenerator->update_question($q1v1, null, ['name' => 'Q1V2']); $q1v3 = $questiongenerator->update_question($q1v2, null, ['name' => 'Q1V3']); // The second question has the first version in status draft, the second version in status ready, // and third version in status draft. $q2v1 = $questiongenerator->create_question('numerical', null, ['name' => 'Q2V2', 'category' => $cat->id, 'status' => question_version_status::QUESTION_STATUS_DRAFT, ]); $q2v2 = $questiongenerator->update_question($q2v1, null, ['name' => 'Q2V2', 'status' => question_version_status::QUESTION_STATUS_READY, ]); $q2v3 = $questiongenerator->update_question($q2v2, null, ['name' => 'Q2V3', 'status' => question_version_status::QUESTION_STATUS_DRAFT]); // The third question has all three version in status draft. $q3v1 = $questiongenerator->create_question('shortanswer', null, ['name' => 'Q3V1', 'category' => $cat->id, 'status' => question_version_status::QUESTION_STATUS_DRAFT, ]); $q3v2 = $questiongenerator->update_question($q3v1, null, ['name' => 'Q3V2', 'status' => question_version_status::QUESTION_STATUS_DRAFT, ]); $q3v3 = $questiongenerator->update_question($q3v2, null, ['name' => 'Q3V3', 'status' => question_version_status::QUESTION_STATUS_DRAFT]); // Test the returned array of questions in that category is the desired one with version three of the first // question, version two of the second question, and the third question omitted completely since there are // only draft versions. $this->assertEquals([$q1v3->id => $q1v3->id, $q2v2->id => $q2v2->id], question_bank::get_finder()->get_questions_from_categories([$cat->id], "")); } }