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
/**
18
 * Unit tests for Accumulative grading strategy logic
19
 *
20
 * @package    workshopform_accumulative
21
 * @category   test
22
 * @copyright  2009 David Mudrak <david.mudrak@gmail.com>
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
25
namespace workshopform_accumulative;
26
 
27
use workshop;
28
use workshop_accumulative_strategy;
29
 
30
defined('MOODLE_INTERNAL') || die();
31
 
32
// Include the code to test
33
global $CFG;
34
require_once($CFG->dirroot . '/mod/workshop/locallib.php');
35
require_once($CFG->dirroot . '/mod/workshop/form/accumulative/lib.php');
36
 
37
/**
38
 * Unit tests for Accumulative grading strategy lib.php
39
 */
40
class lib_test extends \advanced_testcase {
41
    /** workshop instance emulation */
42
    protected $workshop;
43
 
44
    /** @var testable_workshop_accumulative_strategy instance of the strategy logic class being tested */
45
    protected $strategy;
46
 
47
    /**
48
     * Setup testing environment
49
     */
50
    protected function setUp(): void {
51
        parent::setUp();
52
        $this->resetAfterTest();
53
        $this->setAdminUser();
54
        $course = $this->getDataGenerator()->create_course();
55
        $workshop = $this->getDataGenerator()->create_module('workshop', array('strategy' => 'accumulative', 'course' => $course));
56
        $cm = get_fast_modinfo($course)->instances['workshop'][$workshop->id];
57
        $this->workshop = new workshop($workshop, $cm, $course);
58
        $this->strategy = new testable_workshop_accumulative_strategy($this->workshop);
59
    }
60
 
61
    protected function tearDown(): void {
62
        $this->workshop = null;
63
        $this->strategy = null;
64
        parent::tearDown();
65
    }
66
 
11 efrain 67
    public function test_calculate_peer_grade_null_grade(): void {
1 efrain 68
        // fixture set-up
69
        $this->strategy->dimensions = array();
70
        $grades = array();
71
        // exercise SUT
72
        $suggested = $this->strategy->calculate_peer_grade($grades);
73
        // validate
74
        $this->assertNull($suggested);
75
    }
76
 
11 efrain 77
    public function test_calculate_peer_grade_one_numerical(): void {
1 efrain 78
        // fixture set-up
79
        $this->strategy->dimensions[1003] = (object)array('grade' => '20', 'weight' => '1');
80
        $grades[] = (object)array('dimensionid' => 1003, 'grade' => '5.00000');
81
        // exercise SUT
82
        $suggested = $this->strategy->calculate_peer_grade($grades);
83
        // validate
84
        $this->assertEquals(grade_floatval(5/20 * 100), $suggested);
85
    }
86
 
11 efrain 87
    public function test_calculate_peer_grade_negative_weight(): void {
1 efrain 88
        // fixture set-up
89
        $this->strategy->dimensions[1003] = (object)array('grade' => '20', 'weight' => '-1');
90
        $grades[] = (object)array('dimensionid' => 1003, 'grade' => '20');
91
        // exercise SUT
92
        $this->expectException(\coding_exception::class);
93
        $suggested = $this->strategy->calculate_peer_grade($grades);
94
    }
95
 
11 efrain 96
    public function test_calculate_peer_grade_one_numerical_weighted(): void {
1 efrain 97
        // fixture set-up
98
        $this->strategy->dimensions[1003] = (object)array('grade' => '20', 'weight' => '3');
99
        $grades[] = (object)array('dimensionid' => '1003', 'grade' => '5');
100
        // exercise SUT
101
        $suggested = $this->strategy->calculate_peer_grade($grades);
102
        // validate
103
        $this->assertEquals(grade_floatval(5/20 * 100), $suggested);
104
    }
105
 
11 efrain 106
    public function test_calculate_peer_grade_three_numericals_same_weight(): void {
1 efrain 107
        // fixture set-up
108
        $this->strategy->dimensions[1003] = (object)array('grade' => '20', 'weight' => '2');
109
        $this->strategy->dimensions[1004] = (object)array('grade' => '100', 'weight' => '2');
110
        $this->strategy->dimensions[1005] = (object)array('grade' => '10', 'weight' => '2');
111
        $grades[] = (object)array('dimensionid' => 1003, 'grade' => '11.00000');
112
        $grades[] = (object)array('dimensionid' => 1004, 'grade' => '87.00000');
113
        $grades[] = (object)array('dimensionid' => 1005, 'grade' => '10.00000');
114
 
115
        // exercise SUT
116
        $suggested = $this->strategy->calculate_peer_grade($grades);
117
 
118
        // validate
119
        $this->assertEquals(grade_floatval((11/20 + 87/100 + 10/10)/3 * 100), $suggested);
120
    }
121
 
11 efrain 122
    public function test_calculate_peer_grade_three_numericals_different_weights(): void {
1 efrain 123
        // fixture set-up
124
        $this->strategy->dimensions[1003] = (object)array('grade' => '15', 'weight' => 3);
125
        $this->strategy->dimensions[1004] = (object)array('grade' => '80', 'weight' => 1);
126
        $this->strategy->dimensions[1005] = (object)array('grade' => '5', 'weight' => 2);
127
        $grades[] = (object)array('dimensionid' => 1003, 'grade' => '7.00000');
128
        $grades[] = (object)array('dimensionid' => 1004, 'grade' => '66.00000');
129
        $grades[] = (object)array('dimensionid' => 1005, 'grade' => '4.00000');
130
 
131
        // exercise SUT
132
        $suggested = $this->strategy->calculate_peer_grade($grades);
133
 
134
        // validate
135
        $this->assertEquals(grade_floatval((7/15*3 + 66/80*1 + 4/5*2)/6 * 100), $suggested);
136
    }
137
 
11 efrain 138
    public function test_calculate_peer_grade_one_scale_max(): void {
1 efrain 139
        $this->resetAfterTest(true);
140
 
141
        // fixture set-up
142
        $scale11 = $this->getDataGenerator()->create_scale(array('scale'=>'E,D,C,B,A', 'id'=>11));
143
        $this->strategy->dimensions[1008] = (object)array('grade' => (-$scale11->id), 'weight' => 1);
144
        $grades[] = (object)array('dimensionid' => 1008, 'grade' => '5.00000');
145
 
146
        // exercise SUT
147
        $suggested = $this->strategy->calculate_peer_grade($grades);
148
 
149
        // validate
150
        $this->assertEquals(100.00000, $suggested);
151
    }
152
 
11 efrain 153
    public function test_calculate_peer_grade_one_scale_min_with_scale_caching(): void {
1 efrain 154
        $this->resetAfterTest(true);
155
 
156
        // fixture set-up
157
        $scale11 = $this->getDataGenerator()->create_scale(array('scale'=>'E,D,C,B,A', 'id'=>11));
158
        $this->strategy->dimensions[1008] = (object)array('grade' => (-$scale11->id), 'weight' => 1);
159
        $grades[] = (object)array('dimensionid' => 1008, 'grade' => '1.00000');
160
 
161
        // exercise SUT
162
        $suggested = $this->strategy->calculate_peer_grade($grades);
163
 
164
        // validate
165
        $this->assertEquals(0.00000, $suggested);
166
    }
167
 
11 efrain 168
    public function test_calculate_peer_grade_two_scales_weighted(): void {
1 efrain 169
        $this->resetAfterTest(true);
170
        // fixture set-up
171
        $scale13 = $this->getDataGenerator()->create_scale(array('scale'=>'Poor,Good,Excellent', 'id'=>13));
172
        $scale17 = $this->getDataGenerator()->create_scale(array('scale'=>'-,*,**,***,****,*****,******', 'id'=>17));
173
        $this->strategy->dimensions[1012] = (object)array('grade' => (-$scale13->id), 'weight' => 2);
174
        $this->strategy->dimensions[1019] = (object)array('grade' => (-$scale17->id), 'weight' => 3);
175
        $grades[] = (object)array('dimensionid' => 1012, 'grade' => '2.00000'); // "Good"
176
        $grades[] = (object)array('dimensionid' => 1019, 'grade' => '5.00000'); // "****"
177
 
178
        // exercise SUT
179
        $suggested = $this->strategy->calculate_peer_grade($grades);
180
 
181
        // validate
182
        $this->assertEquals(grade_floatval((1/2*2 + 4/6*3)/5 * 100), $suggested);
183
    }
184
 
11 efrain 185
    public function test_calculate_peer_grade_scale_exception(): void {
1 efrain 186
        $this->resetAfterTest(true);
187
        // fixture set-up
188
        $scale13 = $this->getDataGenerator()->create_scale(array('scale'=>'Poor,Good,Excellent', 'id'=>13));
189
        $this->strategy->dimensions[1012] = (object)array('grade' => (-$scale13->id), 'weight' => 1);
190
        $grades[] = (object)array('dimensionid' => 1012, 'grade' => '4.00000'); // exceeds the number of scale items
191
 
192
        // Exercise SUT.
193
        $this->expectException(\coding_exception::class);
194
        $suggested = $this->strategy->calculate_peer_grade($grades);
195
    }
196
}
197
 
198
 
199
/**
200
 * Test subclass that makes all the protected methods we want to test public
201
 */
202
class testable_workshop_accumulative_strategy extends workshop_accumulative_strategy {
203
 
204
    /** allows to set dimensions manually */
205
    public $dimensions = array();
206
 
207
    /**
208
     * This is where the calculation of suggested grade for submission is done
209
     */
210
    public function calculate_peer_grade(array $grades) {
211
        return parent::calculate_peer_grade($grades);
212
    }
213
}