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
 * User agent test suite.
19
 *
20
 * @package    core
21
 * @copyright  2013 Sam Hemelryk
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 * @covers \core_useragent
24
 */
25
class useragent_test extends advanced_testcase {
26
 
27
    /**
28
     * Restores the user agent to the default one.
29
     */
30
    public function tearDown(): void {
31
        core_useragent::instance(true);
32
    }
33
 
34
    /**
35
     * Data provider for known user agents.
36
     *
37
     * @return array
38
     */
39
    public function user_agents_providers() {
40
        // Note: When adding new entries to this list, please ensure that any new browser versions are added to the corresponding list.
41
        // This ensures that regression tests are applied to all known user agents.
42
        return array(
43
            'Microsoft Edge for Windows 10 Desktop' => array(
44
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136',
45
                array(
46
                    'is_edge'                       => true,
47
                    'check_edge_version'            => array(
48
                        '12'                        => true,
49
                    ),
50
 
51
                    // Edge pretends to be WebKit.
52
                    'is_webkit'                     => true,
53
 
54
                    // Edge pretends to be Chrome.
55
                    // Note: Because Edge pretends to be Chrome, it will not be picked up as a Safari browser.
56
                    'is_chrome'                     => true,
57
                    'check_chrome_version'          => array(
58
                        '7'                         => true,
59
                        '8'                         => true,
60
                        '10'                        => true,
61
                        '39'                        => true,
62
                    ),
63
 
64
                    'versionclasses'                => array(
65
                        'edge',
66
                    ),
67
                ),
68
            ),
69
            'Microsoft Edge for Windows 10 Mobile' => array(
70
                'Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10136',
71
                array(
72
                    'is_edge'                       => true,
73
                    'check_edge_version'              => array(
74
                        '12'                        => true,
75
                    ),
76
 
77
                    // Edge pretends to be WebKit.
78
                    'is_webkit'                     => true,
79
 
80
                    // Mobile Edge pretends to be Android.
81
                    'is_webkit_android'             => true,
82
                    'check_webkit_android_version'  => array(
83
                        '525'                       => true,
84
                        '527'                       => true,
85
                    ),
86
 
87
                    // Edge pretends to be Chrome.
88
                    // Note: Because Edge pretends to be Chrome, it will not be picked up as a Safari browser.
89
                    'is_chrome'                     => true,
90
                    'check_chrome_version'          => array(
91
                        '7'                         => true,
92
                        '8'                         => true,
93
                        '10'                        => true,
94
                        '39'                        => true,
95
                    ),
96
 
97
                    'versionclasses'                => array(
98
                        'edge'
99
                    ),
100
 
101
                    'devicetype'                    => 'mobile',
102
                ),
103
            ),
104
 
105
            // Windows XP; Firefox 1.0.6.
106
            array(
107
                'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6',
108
                array(
109
                    'is_firefox'                    => true,
110
 
111
                    'is_gecko'                      => true,
112
                    'check_gecko_version'           => array(
113
                        '1'                         => true,
114
                    ),
115
 
116
                    'versionclasses'                => array(
117
                        'gecko',
118
                        'gecko17',
119
                    ),
120
                ),
121
            ),
122
 
123
            // Windows XP; Firefox 1.0.6.
124
            array(
125
                'Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8) Gecko/20051107 Firefox/1.5',
126
                array(
127
                    'is_firefox'                    => true,
128
                    'check_firefox_version'         => array(
129
                        '1.5'                       => true,
130
                    ),
131
 
132
                    'is_gecko'                      => true,
133
                    'check_gecko_version'           => array(
134
                        '1'                         => true,
135
                        '20030516'                  => true,
136
                        '20051116'                  => true,
137
                    ),
138
 
139
                    'versionclasses'                => array(
140
                        'gecko',
141
                        'gecko18',
142
                    ),
143
                ),
144
            ),
145
 
146
            // Windows XP; Firefox 1.5.0.1.
147
            array(
148
                'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1',
149
                array(
150
                    'is_firefox'                    => true,
151
                    'check_firefox_version'         => array(
152
                        '1.5'                       => true,
153
                    ),
154
 
155
                    'is_gecko'                      => true,
156
                    'check_gecko_version'           => array(
157
                        '1'                         => true,
158
                        '20030516'                  => true,
159
                        '20051116'                  => true,
160
                    ),
161
 
162
                    'versionclasses'                => array(
163
                        'gecko',
164
                        'gecko18',
165
                    ),
166
                ),
167
            ),
168
 
169
            // Windows XP; Firefox 2.0.
170
            array(
171
                'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1',
172
                array(
173
                    'is_firefox'                    => true,
174
                    'check_firefox_version'         => array(
175
                        '1.5'                       => true,
176
                    ),
177
 
178
                    'is_gecko'                      => true,
179
                    'check_gecko_version'           => array(
180
                        '1'                         => true,
181
                        '2'                         => true,
182
                        '20030516'                  => true,
183
                        '20051116'                  => true,
184
                        '2006010100'                => true,
185
                    ),
186
 
187
                    'versionclasses'                => array(
188
                        'gecko',
189
                        'gecko18',
190
                    ),
191
                ),
192
            ),
193
 
194
            // Ubuntu Linux amd64; Firefox 2.0.
195
            array(
196
                'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)',
197
                array(
198
                    'is_firefox'                    => true,
199
                    'check_firefox_version'         => array(
200
                        '1.5'                       => true,
201
                    ),
202
 
203
                    'is_gecko'                      => true,
204
                    'check_gecko_version'           => array(
205
                        '1'                         => true,
206
                        '2'                         => true,
207
                        '20030516'                  => true,
208
                        '20051116'                  => true,
209
                        '2006010100'                => true,
210
                    ),
211
 
212
                    'versionclasses'                => array(
213
                        'gecko',
214
                        'gecko18',
215
                    ),
216
                ),
217
            ),
218
 
219
            // SUSE; Firefox 3.0.6.
220
            array(
221
                'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.6) Gecko/2009012700 SUSE/3.0.6-1.4 Firefox/3.0.6',
222
                array(
223
                    'is_firefox'                    => true,
224
                    'check_firefox_version'         => array(
225
                        '1.5'                       => true,
226
                        '3.0'                       => true,
227
                    ),
228
 
229
                    'is_gecko'                      => true,
230
                    'check_gecko_version'           => array(
231
                        '1'                         => true,
232
                        '2'                         => true,
233
                        '20030516'                  => true,
234
                        '20051116'                  => true,
235
                        '2006010100'                => true,
236
                    ),
237
 
238
                    'versionclasses'                => array(
239
                        'gecko',
240
                        'gecko19',
241
                    ),
242
                ),
243
            ),
244
 
245
            // Linux i686; Firefox 3.6.
246
            array(
247
                'Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6',
248
                array(
249
                    'is_firefox'                    => true,
250
                    'check_firefox_version'         => array(
251
                        '1.5'                       => true,
252
                        '3.0'                       => true,
253
                    ),
254
 
255
                    'is_gecko'                      => true,
256
                    'check_gecko_version'           => array(
257
                        '1'                         => true,
258
                        '2'                         => true,
259
                        '20030516'                  => true,
260
                        '20051116'                  => true,
261
                        '2006010100'                => true,
262
                        '3.6'                       => true,
263
                        '20100101'                  => true,
264
                    ),
265
 
266
                    'versionclasses'                => array(
267
                        'gecko',
268
                        'gecko20',
269
                    ),
270
                ),
271
            ),
272
 
273
            // Windows; Firefox 11.0.
274
            array(
275
                'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0',
276
                array(
277
                    'is_firefox'                    => true,
278
                    'check_firefox_version'         => array(
279
                        '1.5'                       => true,
280
                        '3.0'                       => true,
281
                        '4'                         => true,
282
                        '10'                        => true,
283
                    ),
284
 
285
                    'is_gecko'                      => true,
286
                    'check_gecko_version'           => array(
287
                        '1'                         => true,
288
                        '2'                         => true,
289
                        '20030516'                  => true,
290
                        '20051116'                  => true,
291
                        '2006010100'                => true,
292
                        '20100101'                  => true,
293
                        '3.6'                       => true,
294
                        '4.0'                       => true,
295
                    ),
296
 
297
                    'versionclasses'                => array(
298
                        'gecko',
299
                    ),
300
                ),
301
            ),
302
 
303
            // Windows; Firefox 15.0a2.
304
            array(
305
                'Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2',
306
                array(
307
                    'is_firefox'                    => true,
308
                    'check_firefox_version'         => array(
309
                        '1.5'                       => true,
310
                        '3.0'                       => true,
311
                        '4'                         => true,
312
                        '10'                        => true,
313
                        '15'                        => true,
314
                    ),
315
 
316
                    'is_gecko'                      => true,
317
                    'check_gecko_version'           => array(
318
                        '1'                         => true,
319
                        '2'                         => true,
320
                        '20030516'                  => true,
321
                        '20051116'                  => true,
322
                        '2006010100'                => true,
323
                        '20100101'                  => true,
324
                        '3.6'                       => true,
325
                        '4.0'                       => true,
326
                        '15.0'                      => true,
327
                    ),
328
 
329
                    'versionclasses'                => array(
330
                        'gecko',
331
                    ),
332
                ),
333
            ),
334
 
335
            // Firefox 18; Mac OS X 10.
336
            array(
337
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/18.0 Firefox/18.0',
338
                array(
339
                    'is_firefox'                    => true,
340
                    'check_firefox_version'         => array(
341
                        '1.5'                       => true,
342
                        '3.0'                       => true,
343
                        '4'                         => true,
344
                        '10'                        => true,
345
                        '15'                        => true,
346
                        '18'                        => true,
347
                    ),
348
 
349
                    'is_gecko'                      => true,
350
                    'check_gecko_version'           => array(
351
                        '1'                         => true,
352
                        '2'                         => true,
353
                        '20030516'                  => true,
354
                        '20051116'                  => true,
355
                        '2006010100'                => true,
356
                        '3.6'                       => true,
357
                        '4.0'                       => true,
358
                        '15.0'                      => true,
359
                        '18.0'                      => true,
360
                        '20100101'                  => true,
361
                    ),
362
 
363
                    'versionclasses'                => array(
364
                        'gecko',
365
                    ),
366
                ),
367
            ),
368
 
369
            // Firefox 33; Mac OS X 10.10.
370
            array(
371
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0',
372
                array(
373
                    'is_firefox'                    => true,
374
                    'check_firefox_version'         => array(
375
                        '1.5'                       => true,
376
                        '3.0'                       => true,
377
                        '4'                         => true,
378
                        '10'                        => true,
379
                        '15'                        => true,
380
                        '18'                        => true,
381
                        '19'                        => true,
382
                        '33'                        => true,
383
                    ),
384
 
385
                    'is_gecko'                      => true,
386
                    'check_gecko_version'           => array(
387
                        '1'                         => true,
388
                        '2'                         => true,
389
                        '20030516'                  => true,
390
                        '20051116'                  => true,
391
                        '2006010100'                => true,
392
                        '3.6'                       => true,
393
                        '4.0'                       => true,
394
                        '15.0'                      => true,
395
                        '18.0'                      => true,
396
                        '19.0'                      => true,
397
                        '20100101'                  => true,
398
                    ),
399
 
400
                    'versionclasses'                => array(
401
                        'gecko',
402
                    ),
403
                ),
404
            ),
405
 
406
            // SeaMonkey 2.0; Windows.
407
            array(
408
                'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0',
409
                array(
410
                    'is_gecko'                      => true,
411
                    'check_gecko_version'           => array(
412
                        '1'                         => true,
413
                        '2'                         => true,
414
                        '20030516'                  => true,
415
                        '20051106'                  => true,
416
                        '20051116'                  => true,
417
                        '2006010100'                => true,
418
                    ),
419
 
420
                    'versionclasses'                => array(
421
                        'gecko',
422
                        'gecko19',
423
                    ),
424
                ),
425
            ),
426
 
427
            // SeaMonkey 2.1; Linux.
428
            array(
429
                'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110609 Firefox/4.0.1 SeaMonkey/2.1',
430
                array(
431
                    'is_gecko'                      => true,
432
                    'check_gecko_version'           => array(
433
                        '1'                         => true,
434
                        '2'                         => true,
435
                        '20030516'                  => true,
436
                        '20051116'                  => true,
437
                        '2006010100'                => true,
438
                        '20100101'                  => true,
439
                        '3.6'                       => true,
440
                        '4.0'                       => true,
441
                    ),
442
 
443
                    'is_firefox'                    => true,
444
                    'check_firefox_version'         => array(
445
                        '1.5'                       => true,
446
                        '3.0'                       => true,
447
                        '4'                         => true,
448
                    ),
449
 
450
                    'versionclasses'                => array(
451
                        'gecko',
452
                        'gecko20',
453
                    ),
454
                ),
455
            ),
456
 
457
            // SeaMonkey 2.3; FreeBSD.
458
            array(
459
                'Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0) Gecko/20110818 Firefox/6.0 SeaMonkey/2.3',
460
                array(
461
                    'is_gecko'                      => true,
462
                    'check_gecko_version'           => array(
463
                        '1'                         => true,
464
                        '2'                         => true,
465
                        '20030516'                  => true,
466
                        '20051116'                  => true,
467
                        '2006010100'                => true,
468
                        '20100101'                  => true,
469
                        '3.6'                       => true,
470
                        '4.0'                       => true,
471
                    ),
472
 
473
                    'is_firefox'                    => true,
474
                    'check_firefox_version'         => array(
475
                        '1.5'                       => true,
476
                        '3.0'                       => true,
477
                        '4'                         => true,
478
                    ),
479
 
480
                    'versionclasses'                => array(
481
                        'gecko',
482
                    ),
483
                ),
484
            ),
485
 
486
            // Mac OS X; MS Word 14.
487
            array(
488
                'Mozilla/5.0 (Macintosh; Intel Mac OS X) Word/14.38.0',
489
                array(
490
                    'versionclasses'                => array(
491
                    ),
492
 
493
                    'is_msword'                     => true,
494
                ),
495
            ),
496
 
497
            // Safari 312; Max OS X.
498
            array(
499
                'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
500
                array(
501
                    'is_safari'                     => true,
502
                    'check_safari_version'          => array(
503
                        '1'                         => true,
504
                        '312'                       => true,
505
                    ),
506
 
507
                    'is_webkit'                     => true,
508
 
509
                    'versionclasses'                => array(
510
                        'safari',
511
                    ),
512
                ),
513
            ),
514
 
515
            // Safari 412; Max OS X.
516
            array(
517
                'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
518
                array(
519
                    'is_safari'                     => true,
520
                    'check_safari_version'          => array(
521
                        '1'                         => true,
522
                        '312'                       => true,
523
                    ),
524
 
525
                    'is_webkit'                     => true,
526
 
527
                    'versionclasses'                => array(
528
                        'safari',
529
                    ),
530
                ),
531
            ),
532
 
533
            // Safari 2.0; Max OS X.
534
            array(
535
                'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
536
                array(
537
                    'is_safari'                     => true,
538
                    'check_safari_version'          => array(
539
                        '1'                         => true,
540
                        '312'                       => true,
541
                    ),
542
 
543
                    'is_webkit'                     => true,
544
 
545
                    'versionclasses'                => array(
546
                        'safari',
547
                    ),
548
                ),
549
            ),
550
 
551
            // iOS Safari 528; iPhone.
552
            array(
553
                'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_1_2 like Mac OS X; cs-cz) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7D11 Safari/528.16',
554
                array(
555
                    // Note: We do *not* identify mobile Safari as Safari.
556
                    'is_safari_ios'                 => true,
557
                    'is_ios'                        => true,
558
                    'check_safari_ios_version'      => array(
559
                        '527'                       => true,
560
                    ),
561
 
562
                    'is_webkit'                     => true,
563
 
564
                    'versionclasses'                => array(
565
                        'ios'
566
                    ),
567
 
568
                    'devicetype'                    => 'mobile',
569
               ),
570
            ),
571
 
572
            // Safari; iPhone 6 Plus; iOS 8.1; Build 12B411.
573
            array(
574
                'Mozilla/5.0 (iPhone; CPU iPhone OS 10_10 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411 Safari/600.1.4',
575
                array(
576
                    // Note: We do *not* identify mobile Safari as Safari.
577
                    'is_safari_ios'                 => true,
578
                    'is_ios'                        => true,
579
                    'check_safari_ios_version'      => array(
580
                        '527'                       => true,
581
                        '590'                       => true,
582
                        '600'                       => true,
583
                    ),
584
 
585
                    'is_webkit'                     => true,
586
 
587
                    'versionclasses'                => array(
588
                        'ios',
589
                    ),
590
 
591
                    'devicetype'                    => 'mobile',
592
               ),
593
            ),
594
 
595
            // iOS Safari 533; iPad.
596
            array(
597
                'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5',
598
                array(
599
                    // Note: We do *not* identify mobile Safari as Safari.
600
                    'is_safari_ios'                 => true,
601
                    'is_ios'                        => true,
602
                    'check_safari_ios_version'      => array(
603
                        '527'                       => true,
604
                    ),
605
 
606
                    'is_webkit'                     => true,
607
 
608
                    'versionclasses'                => array(
609
                        'ios',
610
                    ),
611
 
612
                    'devicetype'                    => 'tablet',
613
               ),
614
            ),
615
 
616
            // Android WebKit 525; G1 Phone.
617
            'Android WebKit 525; G1 Phone' => array(
618
                'Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10+ (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 – G1 Phone',
619
                array(
620
                    'is_webkit_android'             => true,
621
                    'check_webkit_android_version'  => array(
622
                        '525'                       => true,
623
                    ),
624
 
625
                    'is_webkit'                     => true,
626
 
627
                    'versionclasses'                => array(
628
                        'android',
629
                    ),
630
 
631
                    'devicetype'                    => 'mobile',
632
 
633
                    'supports_svg'                  => false,
634
               ),
635
            ),
636
 
637
            // Android WebKit 530; Nexus.
638
            'Android WebKit 530; Nexus' => array(
639
                'Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 –Nexus',
640
                array(
641
                    'is_webkit_android'             => true,
642
                    'check_webkit_android_version'  => array(
643
                        '525'                       => true,
644
                        '527'                       => true,
645
                    ),
646
 
647
                    'is_webkit'                     => true,
648
 
649
                    'versionclasses'                => array(
650
                        'android',
651
                    ),
652
 
653
                    'devicetype'                    => 'mobile',
654
 
655
                    'supports_svg'                  => false,
656
               ),
657
            ),
658
 
659
            // Android WebKit 537; Samsung GT-9505.
660
            array(
661
                'Mozilla/5.0 (Linux; Android 4.3; it-it; SAMSUNG GT-I9505/I9505XXUEMJ7 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36',
662
                array(
663
                    'is_webkit_android'             => true,
664
                    'check_webkit_android_version'  => array(
665
                        '525'                       => true,
666
                        '527'                       => true,
667
                    ),
668
 
669
                    'is_webkit'                     => true,
670
 
671
                    'is_chrome'                     => true,
672
                    'check_chrome_version'          => array(
673
                        '7'                         => true,
674
                        '8'                         => true,
675
                        '10'                        => true,
676
                    ),
677
 
678
                    'versionclasses'                => array(
679
                        'chrome',
680
                        'android',
681
                    ),
682
 
683
                    'devicetype'                    => 'mobile',
684
                ),
685
            ),
686
 
687
            // Android WebKit 537; Nexus 5.
688
            array(
689
                'Mozilla/5.0 (Linux; Android 5.0; Nexus 5 Build/LPX13D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.102 Mobile Safari/537.36',
690
                array(
691
                    'is_webkit_android'             => true,
692
                    'check_webkit_android_version'  => array(
693
                        '525'                       => true,
694
                        '527'                       => true,
695
                    ),
696
 
697
                    'is_webkit'                     => true,
698
 
699
                    'is_chrome'                     => true,
700
                    'check_chrome_version'          => array(
701
                        '7'                         => true,
702
                        '8'                         => true,
703
                        '10'                        => true,
704
                    ),
705
 
706
                    'versionclasses'                => array(
707
                        'chrome',
708
                        'android',
709
                    ),
710
 
711
                    'devicetype'                    => 'mobile',
712
                ),
713
            ),
714
 
715
            // Chrome 8; Mac OS X.
716
            array(
717
                'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10',
718
                array(
719
                    'is_chrome'                     => true,
720
                    'check_chrome_version'          => array(
721
                        '7'                         => true,
722
                        '8'                         => true,
723
                    ),
724
 
725
                    'is_webkit'                     => true,
726
 
727
                    'versionclasses'                => array(
728
                        'chrome',
729
                    ),
730
                ),
731
            ),
732
 
733
            // Chrome 39; Mac OS X.
734
            array(
735
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
736
                array(
737
                    'is_chrome'                     => true,
738
                    'check_chrome_version'          => array(
739
                        '7'                         => true,
740
                        '8'                         => true,
741
                        '10'                        => true,
742
                        '39'                        => true,
743
                    ),
744
 
745
                    'is_webkit'                     => true,
746
 
747
                    'versionclasses'                => array(
748
                        'chrome',
749
                    ),
750
                ),
751
            ),
752
 
753
            // Opera 12.15 (Build 1748); Mac OS X.
754
            array(
755
                'Opera/9.80 (Macintosh; Intel Mac OS X 10.10.0; Edition MAS) Presto/2.12.388 Version/12.15',
756
                array(
757
                    'is_opera'                      => true,
758
                    'check_opera_version'           => array(
759
                        '8.0'                       => true,
760
                        '9.0'                       => true,
761
                        '10.0'                      => true,
762
                        '12.15'                     => true,
763
                    ),
764
 
765
                    'versionclasses'                => array(
766
                        'opera',
767
                    ),
768
               ),
769
            ),
770
 
771
            // Google web crawlers.
772
            array(
773
                'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
774
                array(
775
                    'is_web_crawler'                => true,
776
                    'versionclasses'                => array(
777
                    ),
778
               ),
779
            ),
780
            array(
781
                'Googlebot/2.1 (+http://www.googlebot.com/bot.html)',
782
                array(
783
                    'is_web_crawler'                => true,
784
                    'versionclasses'                => array(
785
                    ),
786
               ),
787
            ),
788
            array(
789
                'Googlebot-Image/1.0',
790
                array(
791
                    'is_web_crawler'                => true,
792
                    'versionclasses'                => array(
793
                    ),
794
               ),
795
            ),
796
 
797
            // Yahoo crawlers.
798
            // See https://help.yahoo.com/kb/slurp-crawling-page-sln22600.html.
799
            array(
800
                'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
801
                array(
802
                    'is_web_crawler'                => true,
803
                    'versionclasses'                => array(
804
                    ),
805
               ),
806
            ),
807
 
808
            // Bing / MSN / AdIdx crawlers.
809
            // See http://www.bing.com/webmaster/help/which-crawlers-does-bing-use-8c184ec0.
810
            array(
811
                'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
812
                array(
813
                    'is_web_crawler'                => true,
814
                    'versionclasses'                => array(
815
                    ),
816
               ),
817
            ),
818
            array(
819
                'Mozilla/5.0 (compatible; bingbot/2.0 +http://www.bing.com/bingbot.htm)',
820
                array(
821
                    'is_web_crawler'                => true,
822
                    'versionclasses'                => array(
823
                    ),
824
               ),
825
            ),
826
            array(
827
                'Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
828
                array(
829
                    'is_web_crawler'                => true,
830
                    'is_webkit'                     => true,
831
                    'is_safari_ios'                 => true,
832
                    'is_ios'                        => true,
833
                    'check_safari_ios_version'      => array(
834
                        '527'                       => true,
835
                    ),
836
 
837
                    'versionclasses'                => array(
838
                        'ios',
839
                    ),
840
 
841
                    'devicetype'                    => 'mobile',
842
               ),
843
            ),
844
            array(
845
                'Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
846
                array(
847
                    'is_web_crawler'                => true,
848
                    'is_ie'                         => true,
849
                    'check_ie_version'              => array(
850
                        '0'                         => true,
851
                        '5.0'                       => true,
852
                        '5.5'                       => true,
853
                        '6.0'                       => true,
854
                        '7.0'                       => true,
855
                        '8.0'                       => true,
856
                        '9.0'                       => true,
857
                        '10'                        => true,
858
                        '11'                        => true,
859
                    ),
860
                    'versionclasses'                => array(
861
                        'ie',
862
                        'ie11',
863
                    ),
864
                    'devicetype'                    => 'mobile',
865
               ),
866
            ),
867
 
868
            array(
869
                'msnbot/2.0b (+http://search.msn.com/msnbot.htm)',
870
                array(
871
                    'is_web_crawler'                => true,
872
                    'versionclasses'                => array(
873
                    ),
874
               ),
875
            ),
876
            array(
877
                'msnbot/2.1',
878
                array(
879
                    'is_web_crawler'                => true,
880
                    'versionclasses'                => array(
881
                    ),
882
               ),
883
            ),
884
            array(
885
                'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)',
886
                array(
887
                    'is_web_crawler'                => true,
888
                    'versionclasses'                => array(
889
                    ),
890
               ),
891
            ),
892
            array(
893
                'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b',
894
                array(
895
                    'is_web_crawler'                => true,
896
                    'is_webkit'                     => true,
897
                    'is_safari'                     => true,
898
                    'check_safari_version'          => array(
899
                        '1'                         => true,
900
                        '312'                       => true,
901
                        '500'                       => true,
902
                    ),
903
 
904
                    'versionclasses'                => array(
905
                        'safari',
906
                    ),
907
               ),
908
            ),
909
            array(
910
                'Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko BingPreview/1.0b',
911
                array(
912
                    'is_web_crawler'                => true,
913
                    'is_ie'                         => true,
914
                    'check_ie_version'              => array(
915
                        '0'                         => true,
916
                        '5.0'                       => true,
917
                        '5.5'                       => true,
918
                        '6.0'                       => true,
919
                        '7.0'                       => true,
920
                        '8.0'                       => true,
921
                        '9.0'                       => true,
922
                        '10'                        => true,
923
                        '11'                        => true,
924
                    ),
925
                    'versionclasses'                => array(
926
                        'ie',
927
                        'ie11',
928
                    ),
929
                    'devicetype'                    => 'mobile',
930
               ),
931
            ),
932
 
933
            // Yandex.
934
            // See http://help.yandex.com/search/robots/agent.xml.
935
            array(
936
                'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
937
                array(
938
                    'is_web_crawler'                => true,
939
                    'versionclasses'                => array(
940
                    ),
941
               ),
942
            ),
943
            array(
944
                'Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)',
945
                array(
946
                    'is_web_crawler'                => true,
947
                    'versionclasses'                => array(
948
                    ),
949
               ),
950
            ),
951
 
952
            // AltaVista.
953
            array(
954
                'AltaVista V2.0B crawler@evreka.com',
955
                array(
956
                    'is_web_crawler'                => true,
957
                    'versionclasses'                => array(
958
                    ),
959
               ),
960
            ),
961
 
962
            // ZoomSpider.
963
            array(
964
                'ZoomSpider - wrensoft.com [ZSEBOT]',
965
                array(
966
                    'is_web_crawler'                => true,
967
                    'versionclasses'                => array(
968
                    ),
969
               ),
970
            ),
971
 
972
            // Baidu.
973
            array(
974
                'Baiduspider+(+http://www.baidu.com/search/spider_jp.html)',
975
                array(
976
                    'is_web_crawler'                => true,
977
                    'versionclasses'                => array(
978
                    ),
979
               ),
980
            ),
981
            array(
982
                'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
983
                array(
984
                    'is_web_crawler'                => true,
985
                    'versionclasses'                => array(
986
                    ),
987
               ),
988
            ),
989
 
990
            // Ask.com.
991
            array(
992
                'User-Agent: Mozilla/2.0 (compatible; Ask Jeeves/Teoma)',
993
                array(
994
                    'is_web_crawler'                => true,
995
                    'versionclasses'                => array(
996
                    ),
997
               ),
998
            ),
999
 
1000
            // MoodleBot.
1001
            array(
1002
                'User-Agent: MoodleBot/3.8 (+https://moodle.org)',
1003
                array(
1004
                    'is_web_crawler'                => true,
1005
                    'versionclasses'                => array(
1006
                    ),
1007
               ),
1008
            ),
1009
 
1010
            // Macos Desktop app.
1011
            array(
1012
                'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) moodlemobile/3.6.0 Chrome/69.0.3497.106 Electron/4.0.1 Safari/537.36 MoodleMobile',
1013
                array(
1014
                    'is_moodle_app'                => true,
1015
                    'is_webkit'                    => true,
1016
                    'is_chrome'                    => true,
1017
                    'check_chrome_version'         => array(
1018
                        '7'                        => true,
1019
                        '8'                        => true,
1020
                        '10'                       => true,
1021
                        '39'                       => true,
1022
                    ),
1023
                    'versionclasses'               => array(
1024
                        'chrome',
1025
                    ),
1026
               ),
1027
            ),
1028
 
1029
            // Linux Desktop app.
1030
            array(
1031
                'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) moodledesktop/3.6.0 Chrome/69.0.3497.106 Electron/4.0.1 Safari/537.36 MoodleMobile',
1032
                array(
1033
                    'is_moodle_app'                => true,
1034
                    'is_webkit'                    => true,
1035
                    'is_chrome'                    => true,
1036
                    'check_chrome_version'         => array(
1037
                        '7'                        => true,
1038
                        '8'                        => true,
1039
                        '10'                       => true,
1040
                        '39'                       => true,
1041
                    ),
1042
                    'versionclasses'               => array(
1043
                        'chrome',
1044
                    ),
1045
               ),
1046
            ),
1047
 
1048
            // Windows Desktop app.
1049
            array(
1050
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) moodledesktop/3.6.0 Chrome/69.0.3497.106 Electron/4.0.1 Safari/537.36 MoodleMobile',
1051
                array(
1052
                    'is_moodle_app'                => true,
1053
                    'is_webkit'                    => true,
1054
                    'is_chrome'                    => true,
1055
                    'check_chrome_version'         => array(
1056
                        '7'                        => true,
1057
                        '8'                        => true,
1058
                        '10'                       => true,
1059
                        '39'                       => true,
1060
                    ),
1061
                    'versionclasses'               => array(
1062
                        'chrome',
1063
                    ),
1064
               ),
1065
            ),
1066
 
1067
            // Android app.
1068
            array(
1069
                'Mozilla/5.0 (Linux; Android 7.1.1; Moto G Play Build/NPIS26.48-43-2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 MoodleMobile',
1070
                array(
1071
                    'is_moodle_app'                => true,
1072
                    'is_webkit'                    => true,
1073
                    'is_webkit_android'            => true,
1074
                    'is_chrome'                    => true,
1075
                    'check_chrome_version'         => array(
1076
                        '7'                        => true,
1077
                        '8'                        => true,
1078
                        '10'                       => true,
1079
                        '39'                       => true,
1080
                    ),
1081
                    'devicetype'                   => 'mobile',
1082
                    'check_webkit_android_version' => array(
1083
                        '525'                       => true,
1084
                        '527'                       => true,
1085
                    ),
1086
                    'versionclasses'               => array(
1087
                        'android',
1088
                        'chrome'
1089
                    ),
1090
               ),
1091
            ),
1092
 
1093
            // Android app, user agent lower case.
1094
            array(
1095
                'Mozilla/5.0 (Linux; Android 7.1.1; Moto G Play Build/NPIS26.48-43-2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/71.0.3578.99 Mobile Safari/537.36 moodlemobile',
1096
                array(
1097
                    'is_moodle_app'                => true,
1098
                    'is_webkit'                    => true,
1099
                    'is_webkit_android'            => true,
1100
                    'is_chrome'                    => true,
1101
                    'check_chrome_version'         => array(
1102
                        '7'                        => true,
1103
                        '8'                        => true,
1104
                        '10'                       => true,
1105
                        '39'                       => true,
1106
                    ),
1107
                    'devicetype'                   => 'mobile',
1108
                    'check_webkit_android_version' => array(
1109
                        '525'                       => true,
1110
                        '527'                       => true,
1111
                    ),
1112
                    'versionclasses'               => array(
1113
                        'android',
1114
                        'chrome'
1115
                    ),
1116
               ),
1117
            ),
1118
 
1119
            // iOS (iPhone) app.
1120
            array(
1121
                'Mozilla/5.0 (iPhone; CPU OS 13_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Mobile/14G60 MoodleMobile',
1122
                array(
1123
                    'is_moodle_app'                => true,
1124
                    'is_ios'                       => true,
1125
                    'is_webkit'                    => true,
1126
                    'devicetype'                   => 'mobile',
1127
                    'versionclasses'               => array(
1128
                    ),
1129
               ),
1130
            ),
1131
 
1132
            // iOS (iPad) app.
1133
            array(
1134
                'Mozilla/5.0 (iPad; CPU OS 12_1_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16D39 MoodleMobile',
1135
                array(
1136
                    'is_moodle_app'                => true,
1137
                    'is_ios'                       => true,
1138
                    'is_webkit'                    => true,
1139
                    'devicetype'                   => 'tablet',
1140
                    'versionclasses'               => array(
1141
                    ),
1142
               ),
1143
            ),
1144
        );
1145
    }
1146
 
1147
    /**
1148
     * Test instance generation.
1149
     */
11 efrain 1150
    public function test_instance(): void {
1 efrain 1151
        $this->assertInstanceOf('core_useragent', core_useragent::instance());
1152
        $this->assertInstanceOf('core_useragent', core_useragent::instance(true));
1153
    }
1154
 
1155
    /**
1156
     * @dataProvider user_agents_providers
1157
     */
11 efrain 1158
    public function test_useragent_edge($useragent, $tests): void {
1 efrain 1159
        // Setup the core_useragent instance.
1160
        core_useragent::instance(true, $useragent);
1161
 
1162
        // Edge Tests.
1163
        if (isset($tests['is_edge']) && $tests['is_edge']) {
1164
            $this->assertTrue(core_useragent::is_edge());
1165
        } else {
1166
            $this->assertFalse(core_useragent::is_edge());
1167
        }
1168
 
1169
        $versions = array(
1170
            // New versions of should be added here.
1171
            '12'   => false,
1172
        );
1173
 
1174
        if (isset($tests['check_edge_version'])) {
1175
            // The test provider has overwritten some of the above checks.
1176
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1177
            $versions = $tests['check_edge_version'] + $versions;
1178
        }
1179
 
1180
        foreach ($versions as $version => $result) {
1181
            $this->assertEquals($result, core_useragent::check_edge_version($version),
1182
                "Version incorrectly determined for Edge version '{$version}'");
1183
        }
1184
    }
1185
 
1186
    /**
1187
     * @dataProvider user_agents_providers
1188
     */
11 efrain 1189
    public function test_useragent_ie($useragent, $tests): void {
1 efrain 1190
        // Setup the core_useragent instance.
1191
        core_useragent::instance(true, $useragent);
1192
 
1193
        // IE Tests.
1194
        if (isset($tests['is_ie']) && $tests['is_ie']) {
1195
            $this->assertTrue(core_useragent::is_ie());
1196
        } else {
1197
            $this->assertFalse(core_useragent::is_ie());
1198
        }
1199
 
1200
        $versions = array(
1201
            // New versions of should be added here.
1202
            '0'    => false,
1203
            '5.0'  => false,
1204
            '5.5'  => false,
1205
            '6.0'  => false,
1206
            '7.0'  => false,
1207
            '8.0'  => false,
1208
            '9.0'  => false,
1209
            '10'   => false,
1210
            '11'   => false,
1211
            '12'   => false,
1212
            '13'   => false,
1213
            '14'   => false,
1214
        );
1215
 
1216
        if (isset($tests['check_ie_version'])) {
1217
            // The test provider has overwritten some of the above checks.
1218
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1219
            $versions = $tests['check_ie_version'] + $versions;
1220
        }
1221
 
1222
        foreach ($versions as $version => $result) {
1223
            $this->assertEquals($result, core_useragent::check_ie_version($version),
1224
                "Version incorrectly determined for IE version '{$version}'");
1225
        }
1226
 
1227
        // IE Compatibility mode.
1228
        if (isset($tests['iecompatibility']) && $tests['iecompatibility']) {
1229
            $this->assertTrue(core_useragent::check_ie_compatibility_view(), "IE Compability false negative");
1230
        } else {
1231
            $this->assertFalse(core_useragent::check_ie_compatibility_view(), "IE Compability false positive");
1232
        }
1233
 
1234
    }
1235
 
1236
    /**
1237
     * @dataProvider user_agents_providers
1238
     */
11 efrain 1239
    public function test_useragent_msword($useragent, $tests): void {
1 efrain 1240
        // Setup the core_useragent instance.
1241
        core_useragent::instance(true, $useragent);
1242
 
1243
        // MSWord Tests.
1244
        if (isset($tests['is_msword']) && $tests['is_msword']) {
1245
            $this->assertTrue(core_useragent::is_msword());
1246
        } else {
1247
            $this->assertFalse(core_useragent::is_msword());
1248
        }
1249
    }
1250
 
1251
    /**
1252
     * @dataProvider user_agents_providers
1253
     */
11 efrain 1254
    public function test_useragent_supports($useragent, $tests): void {
1 efrain 1255
        // Setup the core_useragent instance.
1256
        core_useragent::instance(true, $useragent);
1257
 
1258
        // Supports SVG.
1259
        if (!isset($tests['supports_svg']) || $tests['supports_svg']) {
1260
            $this->assertTrue(core_useragent::supports_svg(),
1261
                "SVG Support was not reported (and should have been)");
1262
        } else {
1263
            $this->assertFalse(core_useragent::supports_svg(),
1264
                "SVG Support was reported (and should not have been)");
1265
        }
1266
 
1267
        // Supports JSON ContentType.
1268
        if (!isset($tests['supports_json_contenttype']) || $tests['supports_json_contenttype']) {
1269
            $this->assertTrue(core_useragent::supports_json_contenttype(),
1270
                "JSON ContentType Support was not reported (and should have been)");
1271
        } else {
1272
            $this->assertFalse(core_useragent::supports_json_contenttype(),
1273
                "JSON ContentType Support was reported (and should not have been)");
1274
        }
1275
    }
1276
 
1277
    /**
1278
     * @dataProvider user_agents_providers
1279
     */
11 efrain 1280
    public function test_useragent_webkit($useragent, $tests): void {
1 efrain 1281
        // Setup the core_useragent instance.
1282
        core_useragent::instance(true, $useragent);
1283
 
1284
        if (isset($tests['is_webkit']) && $tests['is_webkit']) {
1285
            $this->assertTrue(core_useragent::is_webkit(),
1286
                "Browser was not identified as a webkit browser");
1287
            $this->assertTrue(core_useragent::check_webkit_version());
1288
        } else {
1289
            $this->assertFalse(core_useragent::is_webkit(),
1290
                "Browser was incorrectly identified as a webkit browser");
1291
            $this->assertFalse(core_useragent::check_webkit_version());
1292
        }
1293
 
1294
        $versions = array(
1295
            // New versions should be added here.
1296
        );
1297
 
1298
        if (isset($tests['check_webkit_version'])) {
1299
            // The test provider has overwritten some of the above checks.
1300
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1301
            $versions = $tests['check_webkit_version'] + $versions;
1302
        }
1303
 
1304
        foreach ($versions as $version => $result) {
1305
            $this->assertEquals($result, core_useragent::check_webkit_version($version),
1306
                "Version incorrectly determined for Webkit version '{$version}'");
1307
        }
1308
    }
1309
 
1310
    /**
1311
     * @dataProvider user_agents_providers
1312
     */
11 efrain 1313
    public function test_useragent_webkit_android($useragent, $tests): void {
1 efrain 1314
        // Setup the core_useragent instance.
1315
        core_useragent::instance(true, $useragent);
1316
 
1317
        if (isset($tests['is_webkit_android']) && $tests['is_webkit_android']) {
1318
            $this->assertTrue(core_useragent::is_webkit_android(),
1319
                "Browser was not identified as an Android webkit browser");
1320
            $this->assertTrue(core_useragent::check_webkit_android_version());
1321
        } else {
1322
            $this->assertFalse(core_useragent::is_webkit_android(),
1323
                "Browser was incorrectly identified as an Android webkit browser");
1324
            $this->assertFalse(core_useragent::check_webkit_android_version());
1325
        }
1326
 
1327
        $versions = array(
1328
            // New versions should be added here.
1329
            '525'       => false,
1330
            '527'       => false,
1331
            '590'       => false,
1332
        );
1333
 
1334
        if (isset($tests['check_webkit_android_version'])) {
1335
            // The test provider has overwritten some of the above checks.
1336
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1337
            $versions = $tests['check_webkit_android_version'] + $versions;
1338
        }
1339
 
1340
        foreach ($versions as $version => $result) {
1341
            $this->assertEquals($result, core_useragent::check_webkit_android_version($version),
1342
                "Version incorrectly determined for Android webkit version '{$version}'");
1343
        }
1344
    }
1345
 
1346
    /**
1347
     * @dataProvider user_agents_providers
1348
     */
11 efrain 1349
    public function test_useragent_chrome($useragent, $tests): void {
1 efrain 1350
        // Setup the core_useragent instance.
1351
        core_useragent::instance(true, $useragent);
1352
 
1353
        if (isset($tests['is_chrome']) && $tests['is_chrome']) {
1354
            $this->assertTrue(core_useragent::is_chrome(),
1355
                "Browser was not identified as a chrome browser");
1356
            $this->assertTrue(core_useragent::check_chrome_version());
1357
        } else {
1358
            $this->assertFalse(core_useragent::is_chrome(),
1359
                "Browser was incorrectly identified as a chrome browser");
1360
            $this->assertFalse(core_useragent::check_chrome_version());
1361
        }
1362
 
1363
        $versions = array(
1364
            // New versions should be added here.
1365
            '7'         => false,
1366
            '8'         => false,
1367
            '10'        => false,
1368
            '39'        => false,
1369
        );
1370
 
1371
        if (isset($tests['check_chrome_version'])) {
1372
            // The test provider has overwritten some of the above checks.
1373
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1374
            $versions = $tests['check_chrome_version'] + $versions;
1375
        }
1376
 
1377
        foreach ($versions as $version => $result) {
1378
            $this->assertEquals($result, core_useragent::check_chrome_version($version),
1379
                "Version incorrectly determined for Chrome version '{$version}'");
1380
        }
1381
    }
1382
 
1383
    /**
1384
     * @dataProvider user_agents_providers
1385
     */
11 efrain 1386
    public function test_useragent_safari($useragent, $tests): void {
1 efrain 1387
        // Setup the core_useragent instance.
1388
        core_useragent::instance(true, $useragent);
1389
 
1390
        if (isset($tests['is_safari']) && $tests['is_safari']) {
1391
            $this->assertTrue(core_useragent::is_safari(),
1392
                "Browser was not identified as a safari browser");
1393
            $this->assertTrue(core_useragent::check_safari_version());
1394
        } else {
1395
            $this->assertFalse(core_useragent::is_safari(),
1396
                "Browser was incorrectly identified as a safari browser");
1397
            $this->assertFalse(core_useragent::check_safari_version());
1398
        }
1399
 
1400
        // Check Safari (generic).
1401
        $versions = array(
1402
            // New versions should be added here.
1403
            '1'         => false,
1404
            '312'       => false,
1405
            '500'       => false,
1406
        );
1407
 
1408
        if (isset($tests['check_safari_version'])) {
1409
            // The test provider has overwritten some of the above checks.
1410
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1411
            $versions = $tests['check_safari_version'] + $versions;
1412
        }
1413
 
1414
        foreach ($versions as $version => $result) {
1415
            $this->assertEquals($result, core_useragent::check_safari_version($version),
1416
                "Version incorrectly determined for Safari (generic) version '{$version}'");
1417
        }
1418
    }
1419
 
1420
    /**
1421
     * @dataProvider user_agents_providers
1422
     */
11 efrain 1423
    public function test_useragent_ios_safari($useragent, $tests): void {
1 efrain 1424
        // Setup the core_useragent instance.
1425
        core_useragent::instance(true, $useragent);
1426
 
1427
        if (isset($tests['is_safari_ios']) && $tests['is_safari_ios']) {
1428
            $this->assertTrue(core_useragent::is_safari_ios(),
1429
                "Browser was not identified as an iOS safari browser");
1430
            $this->assertTrue(core_useragent::check_safari_ios_version());
1431
        } else {
1432
            $this->assertFalse(core_useragent::is_safari_ios(),
1433
                "Browser was incorrectly identified as an iOS safari browser");
1434
            $this->assertFalse(core_useragent::check_safari_ios_version());
1435
        }
1436
 
1437
        // Check iOS Safari.
1438
        $versions = array(
1439
            // New versions should be added here.
1440
            '527'       => false,
1441
            '590'       => false,
1442
            '600'       => false,
1443
        );
1444
 
1445
        if (isset($tests['check_safari_ios_version'])) {
1446
            // The test provider has overwritten some of the above checks.
1447
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1448
            $versions = $tests['check_safari_ios_version'] + $versions;
1449
        }
1450
 
1451
        foreach ($versions as $version => $result) {
1452
            $this->assertEquals($result, core_useragent::check_safari_ios_version($version),
1453
                "Version incorrectly determined for iOS Safari version '{$version}'");
1454
        }
1455
    }
1456
 
1457
    /**
1458
     * @dataProvider user_agents_providers
1459
     */
11 efrain 1460
    public function test_useragent_ios($useragent, $tests): void {
1 efrain 1461
        // Setup the core_useragent instance.
1462
        core_useragent::instance(true, $useragent);
1463
 
1464
        if (isset($tests['is_ios']) && $tests['is_ios']) {
1465
            $this->assertTrue(core_useragent::is_ios(),
1466
                "Browser was not identified as an iOS device browser");
1467
            // The iOS app is not Safari based.
1468
            if (!isset($tests['is_moodle_app']) || !$tests['is_moodle_app']) {
1469
                $this->assertTrue(core_useragent::check_safari_ios_version());
1470
            }
1471
        } else {
1472
            $this->assertFalse(core_useragent::is_ios(),
1473
                "Browser was incorrectly identified as an iOS device browser");
1474
            $this->assertFalse(core_useragent::check_safari_ios_version());
1475
        }
1476
    }
1477
 
1478
    /**
1479
     * @dataProvider user_agents_providers
1480
     */
11 efrain 1481
    public function test_useragent_gecko($useragent, $tests): void {
1 efrain 1482
        // Setup the core_useragent instance.
1483
        core_useragent::instance(true, $useragent);
1484
 
1485
        if (isset($tests['is_gecko']) && $tests['is_gecko']) {
1486
            $this->assertTrue(core_useragent::is_gecko(),
1487
                "Browser was not identified as a gecko browser");
1488
            $this->assertTrue(core_useragent::check_gecko_version());
1489
        } else {
1490
            $this->assertFalse(core_useragent::is_gecko(),
1491
                "Browser was incorrectly identified as a gecko browser");
1492
            $this->assertFalse(core_useragent::check_gecko_version());
1493
        }
1494
 
1495
        $versions = array(
1496
            // New versions should be added here.
1497
            '1'             => false,
1498
            '2'             => false,
1499
            '3.6'           => false,
1500
            '4.0'           => false,
1501
            '20030516'      => false,
1502
            '20051116'      => false,
1503
            '2006010100'    => false,
1504
            '20100101'      => false,
1505
            '15.0'          => false,
1506
            '18.0'          => false,
1507
            '19.0'          => false,
1508
        );
1509
 
1510
        if (isset($tests['check_gecko_version'])) {
1511
            // The test provider has overwritten some of the above checks.
1512
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1513
            $versions = $tests['check_gecko_version'] + $versions;
1514
        }
1515
 
1516
        foreach ($versions as $version => $result) {
1517
            $this->assertEquals($result, core_useragent::check_gecko_version($version),
1518
                "Version incorrectly determined for Gecko version '{$version}'");
1519
        }
1520
    }
1521
 
1522
    /**
1523
     * @dataProvider user_agents_providers
1524
     */
11 efrain 1525
    public function test_useragent_firefox($useragent, $tests): void {
1 efrain 1526
        // Setup the core_useragent instance.
1527
        core_useragent::instance(true, $useragent);
1528
 
1529
        if (isset($tests['is_firefox']) && $tests['is_firefox']) {
1530
            $this->assertTrue(core_useragent::is_firefox(),
1531
                "Browser was not identified as a firefox browser");
1532
            $this->assertTrue(core_useragent::check_firefox_version());
1533
        } else {
1534
            $this->assertFalse(core_useragent::is_firefox(),
1535
                "Browser was incorrectly identified as a firefox browser");
1536
            $this->assertFalse(core_useragent::check_firefox_version());
1537
        }
1538
 
1539
        $versions = array(
1540
            // New versions should be added here.
1541
            '1.5'       => false,
1542
            '3.0'       => false,
1543
            '4'         => false,
1544
            '10'        => false,
1545
            '15'        => false,
1546
            '18'        => false,
1547
            '19'        => false,
1548
            '33'        => false,
1549
        );
1550
 
1551
        if (isset($tests['check_firefox_version'])) {
1552
            // The test provider has overwritten some of the above checks.
1553
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1554
            $versions = $tests['check_firefox_version'] + $versions;
1555
        }
1556
 
1557
        foreach ($versions as $version => $result) {
1558
            $this->assertEquals($result, core_useragent::check_firefox_version($version),
1559
                "Version incorrectly determined for Firefox version '{$version}'");
1560
        }
1561
    }
1562
 
1563
    /**
1564
     * @dataProvider user_agents_providers
1565
     */
11 efrain 1566
    public function test_useragent_opera($useragent, $tests): void {
1 efrain 1567
        // Setup the core_useragent instance.
1568
        core_useragent::instance(true, $useragent);
1569
 
1570
        if (isset($tests['is_opera']) && $tests['is_opera']) {
1571
            $this->assertTrue(core_useragent::is_opera(),
1572
                "Browser was not identified as a opera browser");
1573
            $this->assertTrue(core_useragent::check_opera_version());
1574
        } else {
1575
            $this->assertFalse(core_useragent::is_opera(),
1576
                "Browser was incorrectly identified as a opera browser");
1577
            $this->assertFalse(core_useragent::check_opera_version());
1578
        }
1579
 
1580
        $versions = array(
1581
            // New versions should be added here.
1582
            '8.0'       => false,
1583
            '9.0'       => false,
1584
            '10.0'      => false,
1585
            '12.15'     => false,
1586
        );
1587
 
1588
        if (isset($tests['check_opera_version'])) {
1589
            // The test provider has overwritten some of the above checks.
1590
            // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1591
            $versions = $tests['check_opera_version'] + $versions;
1592
        }
1593
 
1594
        foreach ($versions as $version => $result) {
1595
            $this->assertEquals($result, core_useragent::check_opera_version($version),
1596
                "Version incorrectly determined for Opera version '{$version}'");
1597
        }
1598
    }
1599
 
1600
    /**
1601
     * @dataProvider user_agents_providers
1602
     */
11 efrain 1603
    public function test_get_device_type($useragent, $tests): void {
1 efrain 1604
        // Setup the core_useragent instance.
1605
        core_useragent::instance(true, $useragent);
1606
 
1607
        $expected = 'default';
1608
        if (isset($tests['devicetype'])) {
1609
            $expected = $tests['devicetype'];
1610
        }
1611
 
1612
        $this->assertEquals($expected, core_useragent::get_device_type(),
1613
            "Device Type was not correctly identified");
1614
    }
1615
 
1616
    /**
1617
     * @dataProvider user_agents_providers
1618
     */
11 efrain 1619
    public function test_get_browser_version_classes($useragent, $tests): void {
1 efrain 1620
        // Setup the core_useragent instance.
1621
        core_useragent::instance(true, $useragent);
1622
 
1623
        $actual = core_useragent::get_browser_version_classes();
1624
        foreach ($tests['versionclasses'] as $expectedclass) {
1625
            $this->assertContains($expectedclass, $actual);
1626
        }
1627
        $this->assertCount(count($tests['versionclasses']), $actual);
1628
    }
1629
 
1630
    /**
1631
     * @dataProvider user_agents_providers
1632
     */
11 efrain 1633
    public function test_useragent_web_crawler($useragent, $tests): void {
1 efrain 1634
        // Setup the core_useragent instance.
1635
        core_useragent::instance(true, $useragent);
1636
 
1637
        $expectation = isset($tests['is_web_crawler']) ? $tests['is_web_crawler'] : false;
1638
        $this->assertSame($expectation, core_useragent::is_web_crawler());
1639
    }
1640
 
1641
    /**
1642
     * @dataProvider user_agents_providers
1643
     */
11 efrain 1644
    public function test_useragent_moodle_app($useragent, $tests): void {
1 efrain 1645
        // Setup the core_useragent instance.
1646
        core_useragent::instance(true, $useragent);
1647
 
1648
        $expectation = isset($tests['is_moodle_app']) ? $tests['is_moodle_app'] : false;
1649
        $this->assertSame($expectation, core_useragent::is_moodle_app());
1650
    }
1651
}