Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace qformat_multianswer;
18
 
19
use qformat_multianswer;
20
use question_check_specified_fields_expectation;
21
 
22
defined('MOODLE_INTERNAL') || die();
23
 
24
global $CFG;
25
require_once($CFG->libdir . '/questionlib.php');
26
require_once($CFG->dirroot . '/question/format.php');
27
require_once($CFG->dirroot . '/question/format/multianswer/format.php');
28
require_once($CFG->dirroot . '/question/engine/tests/helpers.php');
29
 
30
/**
31
 * Unit tests for the Embedded answer (Cloze) question importer.
32
 *
33
 * @package   qformat_multianswer
34
 * @copyright 2012 The Open University
35
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36
 */
37
class multianswerformat_test extends \question_testcase {
38
 
11 efrain 39
    public function test_import(): void {
1 efrain 40
        $lines = file(__DIR__ . '/fixtures/questions.multianswer.txt');
41
 
42
        $importer = new qformat_multianswer();
43
        $qs = $importer->readquestions($lines);
44
 
45
        $expectedq = (object) array(
46
            'name' => 'Match the following cities with the correct state:
47
* San Francisco: {#1}
48
* ...',
49
            'questiontext' => 'Match the following cities with the correct state:
50
* San Francisco: {#1}
51
* Tucson: {#2}
52
* Los Angeles: {#3}
53
* Phoenix: {#4}
54
The capital of France is {#5}.
55
',
56
            'questiontextformat' => FORMAT_MOODLE,
57
            'generalfeedback' => '',
58
            'generalfeedbackformat' => FORMAT_MOODLE,
59
            'qtype' => 'multianswer',
60
            'defaultmark' => 5,
61
            'penalty' => 0.3333333,
62
            'length' => 1,
63
        );
64
 
65
        $this->assertEquals(1, count($qs));
66
        $this->assert(new question_check_specified_fields_expectation($expectedq), $qs[0]);
67
 
68
        $this->assertEquals('multichoice', $qs[0]->options->questions[1]->qtype);
69
        $this->assertEquals('multichoice', $qs[0]->options->questions[2]->qtype);
70
        $this->assertEquals('multichoice', $qs[0]->options->questions[3]->qtype);
71
        $this->assertEquals('multichoice', $qs[0]->options->questions[4]->qtype);
72
        $this->assertEquals('shortanswer', $qs[0]->options->questions[5]->qtype);
73
    }
74
 
11 efrain 75
    public function test_read_brokencloze_1(): void {
1 efrain 76
        $lines = file(__DIR__ . '/fixtures/broken_multianswer_1.txt');
77
        $importer = new qformat_multianswer();
78
 
79
        // The importer echoes some errors, so we need to capture and check that.
80
        ob_start();
81
        $questions = $importer->readquestions($lines);
82
        $output = ob_get_contents();
83
        ob_end_clean();
84
 
85
        // Check that there were some expected errors.
86
        $this->assertStringContainsString('Error importing question', $output);
87
        $this->assertStringContainsString('Invalid embedded answers (Cloze) question', $output);
88
        $this->assertStringContainsString('This type of question requires at least 2 choices', $output);
89
 
90
        // No question  have been imported.
91
        $this->assertCount(0, $questions);
92
    }
93
 
11 efrain 94
    public function test_read_brokencloze_2(): void {
1 efrain 95
        $lines = file(__DIR__ . '/fixtures/broken_multianswer_2.txt');
96
        $importer = new qformat_multianswer();
97
 
98
        // The importer echoes some errors, so we need to capture and check that.
99
        ob_start();
100
        $questions = $importer->readquestions($lines);
101
        $output = ob_get_contents();
102
        ob_end_clean();
103
 
104
        // Check that there were some expected errors.
105
        $this->assertStringContainsString('Error importing question', $output);
106
        $this->assertStringContainsString('Invalid embedded answers (Cloze) question', $output);
107
        $this->assertStringContainsString('One of the answers should have a score of 100% so it is possible to get full marks for this question.',
108
                $output);
109
 
110
        // No question  have been imported.
111
        $this->assertCount(0, $questions);
112
    }
113
 
11 efrain 114
    public function test_read_brokencloze_3(): void {
1 efrain 115
        $lines = file(__DIR__ . '/fixtures/broken_multianswer_3.txt');
116
        $importer = new qformat_multianswer();
117
 
118
        // The importer echoes some errors, so we need to capture and check that.
119
        ob_start();
120
        $questions = $importer->readquestions($lines);
121
        $output = ob_get_contents();
122
        ob_end_clean();
123
 
124
        // Check that there were some expected errors.
125
        $this->assertStringContainsString('Error importing question', $output);
126
        $this->assertStringContainsString('Invalid embedded answers (Cloze) question', $output);
127
        $this->assertStringContainsString('The answer must be a number, for example -1.234 or 3e8, or \'*\'.', $output);
128
 
129
        // No question  have been imported.
130
        $this->assertCount(0, $questions);
131
    }
132
 
11 efrain 133
    public function test_read_brokencloze_4(): void {
1 efrain 134
        $lines = file(__DIR__ . '/fixtures/broken_multianswer_4.txt');
135
        $importer = new qformat_multianswer();
136
 
137
        // The importer echoes some errors, so we need to capture and check that.
138
        ob_start();
139
        $questions = $importer->readquestions($lines);
140
        $output = ob_get_contents();
141
        ob_end_clean();
142
 
143
        // Check that there were some expected errors.
144
        $this->assertStringContainsString('Error importing question', $output);
145
        $this->assertStringContainsString('Invalid embedded answers (Cloze) question', $output);
146
        $this->assertStringContainsString('The question text must include at least one embedded answer.', $output);
147
 
148
        // No question  have been imported.
149
        $this->assertCount(0, $questions);
150
    }
151
}