Proyectos de Subversion Moodle

Rev

| 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 core;
18
 
19
use core\attribute\deprecated;
20
use core\attribute\deprecated_with_reference;
21
 
22
/**
23
 * Tests for \core\attribute\sdeprecated and \core\deprecation.
24
 *
25
 * @package    core
26
 * @category   test
27
 * @copyright  2024 Andrew Lyons <andrew@nicols.co.uk>
28
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
29
 * @covers \core\attribute\deprecated
30
 * @covers \core\attribute\deprecated_with_reference
31
 * @covers \core\deprecation
32
 */
33
class deprecation_test extends \advanced_testcase {
34
    /**
35
     * @dataProvider emit_provider
36
     */
37
    public function test_emit(
38
        array $args,
39
        bool $expectdebugging,
40
        bool $expectexception,
41
    ): void {
42
        if ($expectexception) {
43
            $this->expectException(\coding_exception::class);
44
        }
45
 
46
        $attribute = new deprecated(
47
            ...$args,
48
            replacement: 'Test replacement',
49
        );
50
 
51
        $rc = new \ReflectionClass(deprecation::class);
52
        $method = $rc->getMethod('emit_deprecation_notice');
53
        $method->invoke(null, $attribute);
54
 
55
        if ($expectdebugging) {
56
            $this->assertdebuggingcalledcount(1);
57
        }
58
    }
59
 
60
    public static function emit_provider(): array {
61
        return [
62
            [
63
                [
64
                    'final' => false,
65
                    'emit' => false,
66
                ],
67
                false,
68
                false,
69
            ],
70
            [
71
                [
72
                    'final' => false,
73
                    'emit' => true,
74
                ],
75
                true,
76
                false,
77
            ],
78
            [
79
                [
80
                    'final' => true,
81
                    'emit' => false,
82
                ],
83
                false,
84
                false,
85
            ],
86
            [
87
                [
88
                    'final' => true,
89
                    'emit' => true,
90
                ],
91
                false,
92
                true,
93
            ],
94
        ];
95
    }
96
 
97
    /**
98
     * @dataProvider get_deprecation_string_provider
99
     */
100
    public function test_get_deprecation_string(
101
        ?string $replacement,
102
        ?string $since,
103
        ?string $reason,
104
        ?string $mdl,
105
        string $expected,
106
    ): void {
107
        $attribute = new deprecated_with_reference(
108
            owner: 'Test description',
109
            replacement: $replacement,
110
            since: $since,
111
            reason: $reason,
112
            mdl: $mdl,
113
            final: false,
114
            emit: true,
115
        );
116
 
117
        $this->assertEquals(
118
            $expected,
119
            deprecation::get_deprecation_string($attribute),
120
        );
121
 
122
        $rc = new \ReflectionClass(deprecation::class);
123
        $method = $rc->getMethod('emit_deprecation_notice');
124
        $method->invoke(null, $attribute);
125
 
126
        $this->assertDebuggingCalled($expected);
127
    }
128
 
129
    public static function get_deprecation_string_provider(): array {
130
        return [
131
            [
132
                'Test replacement',
133
                null,
134
                null,
135
                null,
136
                'Deprecation: Test description has been deprecated. Use Test replacement instead.',
137
            ],
138
            [
139
                'Test replacement',
140
                '4.1',
141
                null,
142
                null,
143
                'Deprecation: Test description has been deprecated since 4.1. Use Test replacement instead.',
144
            ],
145
            [
146
                'Test replacement',
147
                null,
148
                'Test reason',
149
                null,
150
                'Deprecation: Test description has been deprecated. Test reason. Use Test replacement instead.',
151
            ],
152
            [
153
                'Test replacement',
154
                null,
155
                null,
156
                null,
157
                'Deprecation: Test description has been deprecated. Use Test replacement instead.',
158
            ],
159
            [
160
                'Test replacement',
161
                null,
162
                null,
163
                'https://docs.moodle.org/311/en/Deprecated',
164
                'Deprecation: Test description has been deprecated. Use Test replacement instead. See https://docs.moodle.org/311/en/Deprecated for more information.',
165
            ],
166
            [
167
                'Test replacement',
168
                '4.1',
169
                'Test reason',
170
                'https://docs.moodle.org/311/en/Deprecated',
171
                'Deprecation: Test description has been deprecated since 4.1. Test reason. Use Test replacement instead. See https://docs.moodle.org/311/en/Deprecated for more information.',
172
            ],
173
            [
174
                null,
175
                null,
176
                'Test reason',
177
                null,
178
                'Deprecation: Test description has been deprecated. Test reason.',
179
            ],
180
            [
181
                null,
182
                null,
183
                null,
184
                'MDL-80677',
185
                'Deprecation: Test description has been deprecated. See MDL-80677 for more information.',
186
            ],
187
        ];
188
    }
189
 
190
    public function test_deprecated_without_replacement(): void {
191
        $this->expectException(\coding_exception::class);
192
        new deprecated(
193
            replacement: null,
194
        );
195
    }
196
 
197
    /**
198
     * @dataProvider from_provider
199
     */
200
    public function test_from($reference, bool $isdeprecated): void {
201
        $attribute = deprecation::from($reference);
202
        if ($isdeprecated) {
203
            $this->assertInstanceOf(deprecated::class, $attribute);
204
            $this->assertTrue(deprecation::is_deprecated($reference));
205
            $this->assertDebuggingNotCalled();
206
 
207
            deprecation::emit_deprecation_if_present($reference);
208
            $this->assertDebuggingCalled(deprecation::get_deprecation_string($attribute));
209
        } else {
210
            $this->assertNull($attribute);
211
            $this->assertFalse(deprecation::is_deprecated($reference));
212
            deprecation::emit_deprecation_if_present($reference);
213
            $this->assertDebuggingNotCalled();
214
        }
215
    }
216
 
217
    public function test_from_object(): void {
218
        require_once(dirname(__FILE__) . '/fixtures/deprecated_fixtures.php');
219
 
220
        $this->assertNull(deprecation::from(new \core\fixtures\not_deprecated_class()));
221
        $this->assertInstanceOf(deprecated::class, deprecation::from([new \core\fixtures\deprecated_class()]));
222
    }
223
 
224
    public static function from_provider(): array {
225
        require_once(dirname(__FILE__) . '/fixtures/deprecated_fixtures.php');
226
        return [
227
            // Classes.
228
            [\core\fixtures\deprecated_class::class, true],
229
            [\core\fixtures\deprecated_interface::class, true],
230
            [\core\fixtures\deprecated_trait::class, true],
231
            [[\core\fixtures\deprecated_class::class], true],
232
            [[\core\fixtures\deprecated_interface::class], true],
233
            [[\core\fixtures\deprecated_trait::class], true],
234
 
235
            [\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class, false],
236
            [[\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class], false],
237
 
238
            [\core\fixtures\not_deprecated_class::class, false],
239
            [\core\fixtures\not_deprecated_interface::class, false],
240
            [\core\fixtures\not_deprecated_trait::class, false],
241
            [[\core\fixtures\not_deprecated_class::class], false],
242
            [[\core\fixtures\not_deprecated_interface::class], false],
243
            [[\core\fixtures\not_deprecated_trait::class], false],
244
 
245
            // Class properties in a deprecated class.
246
            [\core\fixtures\deprecated_class::class . '::deprecatedproperty', true],
247
            [[\core\fixtures\deprecated_class::class, 'deprecatedproperty'], true],
248
            [\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class . '::deprecatedproperty', true],
249
            [[\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class, 'deprecatedproperty'], true],
250
            [\core\fixtures\not_deprecated_class_using_not_deprecated_trait_features::class . '::deprecatedproperty', true],
251
            [[\core\fixtures\not_deprecated_class_using_not_deprecated_trait_features::class, 'deprecatedproperty'], true],
252
 
253
            [\core\fixtures\deprecated_class::class . '::notdeprecatedproperty', true],
254
            [[\core\fixtures\deprecated_class::class, 'notdeprecatedproperty'], true],
255
            [\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class . '::notdeprecatedproperty', true],
256
            [[\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class, 'notdeprecatedproperty'], true],
257
            [\core\fixtures\not_deprecated_class_using_not_deprecated_trait_features::class . '::notdeprecatedproperty', false],
258
            [[\core\fixtures\not_deprecated_class_using_not_deprecated_trait_features::class, 'notdeprecatedproperty'], false],
259
 
260
            // Class constants in a deprecated class.
261
            [\core\fixtures\deprecated_class::class . '::DEPRECATED_CONST', true],
262
            [[\core\fixtures\deprecated_class::class, 'DEPRECATED_CONST'], true],
263
 
264
            [\core\fixtures\deprecated_class::class . '::NOT_DEPRECATED_CONST', true],
265
            [[\core\fixtures\deprecated_class::class, 'NOT_DEPRECATED_CONST'], true],
266
 
267
            // Class methods in a deprecated class.
268
            [\core\fixtures\deprecated_class::class . '::deprecated_method', true],
269
            [[\core\fixtures\deprecated_class::class, 'deprecated_method'], true],
270
 
271
            [\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class . '::deprecated_method', true],
272
            [[\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class, 'deprecated_method'], true],
273
            [\core\fixtures\not_deprecated_class_using_not_deprecated_trait_features::class . '::deprecated_method', true],
274
            [[\core\fixtures\not_deprecated_class_using_not_deprecated_trait_features::class, 'deprecated_method'], true],
275
 
276
            [\core\fixtures\deprecated_class::class . '::not_deprecated_method', true],
277
            [[\core\fixtures\deprecated_class::class, 'not_deprecated_method'], true],
278
 
279
            [\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class . '::not_deprecated_method', true],
280
            [[\core\fixtures\not_deprecated_class_using_deprecated_trait_features::class, 'not_deprecated_method'], true],
281
            [\core\fixtures\not_deprecated_class_implementing_deprecated_interface::class . '::not_deprecated_method', true],
282
            [[\core\fixtures\not_deprecated_class_implementing_deprecated_interface::class, 'not_deprecated_method'], true],
283
 
284
            // Class properties in a not-deprecated class.
285
            [\core\fixtures\not_deprecated_class::class . '::deprecatedproperty', true],
286
            [[\core\fixtures\not_deprecated_class::class, 'deprecatedproperty'], true],
287
 
288
            [\core\fixtures\not_deprecated_class::class . '::notdeprecatedproperty', false],
289
            [[\core\fixtures\not_deprecated_class::class, 'notdeprecatedproperty'], false],
290
 
291
            // Class constants in a not-deprecated class.
292
            [\core\fixtures\not_deprecated_class::class . '::DEPRECATED_CONST', true],
293
            [[\core\fixtures\not_deprecated_class::class, 'DEPRECATED_CONST'], true],
294
 
295
            [\core\fixtures\not_deprecated_class::class . '::NOT_DEPRECATED_CONST', false],
296
            [[\core\fixtures\not_deprecated_class::class, 'NOT_DEPRECATED_CONST'], false],
297
 
298
            [\core\fixtures\not_deprecated_interface::class . '::DEPRECATED_CONST', true],
299
            [[\core\fixtures\not_deprecated_interface::class, 'DEPRECATED_CONST'], true],
300
 
301
            [\core\fixtures\not_deprecated_interface::class . '::NOT_DEPRECATED_CONST', false],
302
            [[\core\fixtures\not_deprecated_interface::class, 'NOT_DEPRECATED_CONST'], false],
303
 
304
            // Class methods in a not-deprecated class.
305
            [\core\fixtures\not_deprecated_class::class . '::deprecated_method', true],
306
            [[\core\fixtures\not_deprecated_class::class, 'deprecated_method'], true],
307
 
308
            [\core\fixtures\not_deprecated_class::class . '::not_deprecated_method', false],
309
            [[\core\fixtures\not_deprecated_class::class, 'not_deprecated_method'], false],
310
 
311
            // Non-existent class.
312
            ['non_existent_class', false],
313
            [['non_existent_class'], false],
314
 
315
            // Non-existent feature in an existent class.
316
            [[\core\fixtures\not_deprecated_class::class, 'no_such_method'], false],
317
 
318
            // Not-deprecated class.
319
            [\core\fixtures\not_deprecated_class::class, false],
320
 
321
            // Deprecated global function.
322
            ['core\fixtures\deprecated_function', true],
323
            ['core\fixtures\not_deprecated_function', false],
324
 
325
            // Empty array.
326
            [[], false],
327
        ];
328
    }
329
 
330
    /**
331
     * @dataProvider deprecated_ownership_provider
332
     */
333
    public function test_deprecated_class(
334
        array $reference,
335
        string $expectedowner,
336
    ): void {
337
        require_once(dirname(__FILE__) . '/fixtures/deprecated_fixtures.php');
338
 
339
        // All attributes for any part of a deprecated class should belong to the deprecated class.
340
        $this->assertEquals(
341
            $expectedowner,
342
            deprecation::from($reference)->owner,
343
        );
344
    }
345
 
346
    public static function deprecated_ownership_provider(): array {
347
        return [
348
            // Any part of a deprecated class will emit the deprecation for the class as a whole.
349
            [
350
                [\core\fixtures\deprecated_class::class],
351
                \core\fixtures\deprecated_class::class,
352
            ],
353
            [
354
                [\core\fixtures\deprecated_class::class, 'deprecatedproperty'],
355
                \core\fixtures\deprecated_class::class,
356
            ],
357
            [
358
                [\core\fixtures\deprecated_class::class, 'notdeprecatedproperty'],
359
                \core\fixtures\deprecated_class::class,
360
            ],
361
            [
362
                [\core\fixtures\deprecated_class::class, 'deprecated_method'],
363
                \core\fixtures\deprecated_class::class,
364
            ],
365
            [
366
                [\core\fixtures\deprecated_class::class, 'not_deprecated_method'],
367
                \core\fixtures\deprecated_class::class,
368
            ],
369
            [
370
                [\core\fixtures\deprecated_class::class, 'DEPRECATED_CONST'],
371
                \core\fixtures\deprecated_class::class,
372
            ],
373
            [
374
                [\core\fixtures\deprecated_class::class, 'NOT_DEPRECATED_CONST'],
375
                \core\fixtures\deprecated_class::class,
376
            ],
377
 
378
            // A non-deprecated class will emit just for that feature.
379
            [
380
                [\core\fixtures\not_deprecated_class::class, 'deprecatedproperty'],
381
                \core\fixtures\not_deprecated_class::class . '::deprecatedproperty',
382
            ],
383
            [
384
                [\core\fixtures\not_deprecated_class::class, 'deprecated_method'],
385
                \core\fixtures\not_deprecated_class::class . '::deprecated_method',
386
            ],
387
            [
388
                [\core\fixtures\not_deprecated_class::class, 'DEPRECATED_CONST'],
389
                \core\fixtures\not_deprecated_class::class . '::DEPRECATED_CONST',
390
            ],
391
        ];
392
    }
393
}