MDL-52214 core: Fix the is_web_crawler() regression
[moodle.git] / lib / tests / useragent_test.php
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/>.
17 /**
18  * Tests the user agent class.
19  *
20  * @package    core
21  * @copyright  2013 Sam Hemelryk
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 /**
26  * User agent test suite.
27  *
28  * @package    core
29  * @copyright  2013 Sam Hemelryk
30  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31  */
32 class core_useragent_testcase extends advanced_testcase {
34     /**
35      * Restores the user agent to the default one.
36      */
37     public function tearDown() {
38         core_useragent::instance(true);
39     }
41     public function user_agents_providers() {
42         // Note: When adding new entries to this list, please ensure that any new browser versions are added to the corresponding list.
43         // This ensures that regression tests are applied to all known user agents.
44         return array(
45             'Microsoft Edge for Windows 10 Desktop' => array(
46                 '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',
47                 array(
48                     'is_edge'                       => true,
49                     'check_edge_version'            => array(
50                         '12'                        => true,
51                     ),
53                     // Edge pretends to be WebKit.
54                     'is_webkit'                     => true,
56                     // Edge pretends to be Chrome.
57                     // Note: Because Edge pretends to be Chrome, it will not be picked up as a Safari browser.
58                     'is_chrome'                     => true,
59                     'check_chrome_version'          => array(
60                         '7'                         => true,
61                         '8'                         => true,
62                         '10'                        => true,
63                         '39'                        => true,
64                     ),
66                     'versionclasses'                => array(
67                         'safari',
68                     ),
69                 ),
70             ),
71             'Microsoft Edge for Windows 10 Mobile' => array(
72                 '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',
73                 array(
74                     'is_edge'                       => true,
75                     'check_edge_version'              => array(
76                         '12'                        => true,
77                     ),
79                     // Edge pretends to be WebKit.
80                     'is_webkit'                     => true,
82                     // Mobile Edge pretends to be Android.
83                     'is_webkit_android'             => true,
84                     'check_webkit_android_version'  => array(
85                         '525'                       => true,
86                         '527'                       => true,
87                     ),
89                     // Edge pretends to be Chrome.
90                     // Note: Because Edge pretends to be Chrome, it will not be picked up as a Safari browser.
91                     'is_chrome'                     => true,
92                     'check_chrome_version'          => array(
93                         '7'                         => true,
94                         '8'                         => true,
95                         '10'                        => true,
96                         '39'                        => true,
97                     ),
99                     'versionclasses'                => array(
100                         'safari',
101                         'android',
102                     ),
104                     'devicetype'                    => 'mobile',
105                 ),
106             ),
107             // Windows 98; Internet Explorer 5.0.
108             array(
109                 'Mozilla/4.0 (compatible; MSIE 5.00; Windows 98)',
110                 array(
111                     // MSIE 5.0 is not considered a browser at all: known false results.
112                     'is_ie'                         => false,
113                     'check_ie_version'              => array(
114                         '0'                         => true,
115                         '5.0'                       => true,
116                     ),
117                     'versionclasses'                => array(
118                         // IE 5.0 is not considered a browser.
119                     ),
121                     // IE 5.0 is a legacy browser.
122                     'devicetype'                    => 'legacy',
124                     'supports_svg'                  => false,
125                     'supports_json_contenttype'     => false,
126                 ),
127             ),
129             // Windows 2000; Internet Explorer 5.5.
130             array(
131                 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)',
132                 array(
133                     'is_ie'                         => true,
134                     'check_ie_version'              => array(
135                         '0'                         => true,
136                         '5.0'                       => true,
137                         '5.5'                       => true,
138                     ),
139                     'versionclasses'                => array(
140                         'ie',
141                     ),
143                     // IE 6.0 is a legacy browser.
144                     'devicetype'                    => 'legacy',
146                     'supports_svg'                  => false,
147                     'supports_json_contenttype'     => false,
148                 ),
149             ),
151             // Windows XP SP2; Internet Explorer 6.0.
152             array(
153                 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
154                 array(
155                     'is_ie'                         => true,
156                     'check_ie_version'              => array(
157                         '0'                         => true,
158                         '5.0'                       => true,
159                         '5.5'                       => true,
160                         '6.0'                       => true,
161                     ),
162                     'versionclasses'                => array(
163                         'ie',
164                         'ie6',
165                     ),
167                     // IE 7.0 is a legacy browser.
168                     'devicetype'                    => 'legacy',
170                     'supports_svg'                  => false,
171                     'supports_json_contenttype'     => false,
172                 ),
173             ),
175             // Windows XP SP2; Internet Explorer 7.0.
176             array(
177                 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; YPC 3.0.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
178                 array(
179                     'is_ie'                         => true,
180                     'check_ie_version'              => array(
181                         '0'                         => true,
182                         '5.0'                       => true,
183                         '5.5'                       => true,
184                         '6.0'                       => true,
185                         '7.0'                       => true,
186                     ),
187                     'versionclasses'                => array(
188                         'ie',
189                         'ie7',
190                     ),
192                     'supports_svg'                  => false,
193                     'supports_json_contenttype'     => false,
194                 ),
195             ),
197             // Windows XP SP2; Internet Explorer 7.0; Meridio extension.
198             array(
199                 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Meridio for Excel 5.0.251; Meridio for PowerPoint 5.0.251; Meridio for Word 5.0.251; Meridio Protocol; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)',
200                 array(
201                     'is_ie'                         => true,
202                     'check_ie_version'              => array(
203                         '0'                         => true,
204                         '5.0'                       => true,
205                         '5.5'                       => true,
206                         '6.0'                       => true,
207                         '7.0'                       => true,
208                     ),
209                     'versionclasses'                => array(
210                         'ie',
211                         'ie7',
212                     ),
214                     'supports_svg'                  => false,
215                     'supports_json_contenttype'     => false,
216                 ),
217             ),
219             // Windows Vista; Internet Explorer 8.0.
220             array(
221                 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)',
222                 array(
223                     'is_ie'                         => true,
224                     'check_ie_version'              => array(
225                         '0'                         => true,
226                         '5.0'                       => true,
227                         '5.5'                       => true,
228                         '6.0'                       => true,
229                         '7.0'                       => true,
230                         '8.0'                       => true,
231                     ),
232                     'versionclasses'                => array(
233                         'ie',
234                         'ie8',
235                     ),
237                     'supports_svg'                  => false,
238                 ),
239             ),
241             // Windows 7; Internet Explorer 9.0.
242             array(
243                 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',
244                 array(
245                     'is_ie'                         => true,
246                     'check_ie_version'              => array(
247                         '0'                         => true,
248                         '5.0'                       => true,
249                         '5.5'                       => true,
250                         '6.0'                       => true,
251                         '7.0'                       => true,
252                         '8.0'                       => true,
253                         '9.0'                       => true,
254                     ),
255                     'versionclasses'                => array(
256                         'ie',
257                         'ie9',
258                     ),
259                 ),
260             ),
262             // Windows 7; Internet Explorer 9.0i.
263             array(
264                 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)',
265                 array(
266                     'is_ie'                         => true,
267                     'check_ie_version'              => array(
268                         '0'                         => true,
269                         '5.0'                       => true,
270                         '5.5'                       => true,
271                         '6.0'                       => true,
272                         '7.0'                       => true,
273                         '8.0'                       => true,
274                         '9.0'                       => true,
275                     ),
276                     'versionclasses'                => array(
277                         'ie',
278                         'ie9',
279                     ),
280                     'iecompatibility'               => true,
282                     // IE 9 in Compatiblity mode does not support SVG.
283                     'supports_svg'                  => false,
285                     // IE in Compatiblity mode does not support JSON ContentType.
286                     'supports_json_contenttype'     => false,
287                 ),
288             ),
290             // Windows 8; Internet Explorer 10.0.
291             array(
292                 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0; Touch)',
293                 array(
294                     'is_ie'                         => true,
295                     'check_ie_version'              => array(
296                         '0'                         => true,
297                         '5.0'                       => true,
298                         '5.5'                       => true,
299                         '6.0'                       => true,
300                         '7.0'                       => true,
301                         '8.0'                       => true,
302                         '9.0'                       => true,
303                         '10'                        => true,
304                     ),
305                     'versionclasses'                => array(
306                         'ie',
307                         'ie10',
308                     ),
309                 ),
310             ),
312             // Windows 8; Internet Explorer 10.0i.
313             array(
314                 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; Trident/6.0; Touch; .NET4.0E; .NET4.0C; Tablet PC 2.0)',
315                 array(
316                     'is_ie'                         => true,
317                     'check_ie_version'              => array(
318                         '0'                         => true,
319                         '5.0'                       => true,
320                         '5.5'                       => true,
321                         '6.0'                       => true,
322                         '7.0'                       => true,
323                         '8.0'                       => true,
324                         '9.0'                       => true,
325                         '10'                        => true,
326                     ),
327                     'iecompatibility'               => true,
328                     'versionclasses'                => array(
329                         'ie',
330                         'ie10',
331                     ),
333                     // IE in Compatiblity mode does not support JSON ContentType.
334                     'supports_json_contenttype'     => false,
335                 ),
336             ),
338             // Windows 8.1; Internet Explorer 11.0.
339             array(
340                 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)',
341                 array(
342                     'is_ie'                         => true,
343                     'check_ie_version'              => array(
344                         '0'                         => true,
345                         '5.0'                       => true,
346                         '5.5'                       => true,
347                         '6.0'                       => true,
348                         '7.0'                       => true,
349                         '8.0'                       => true,
350                         '9.0'                       => true,
351                         '10'                        => true,
352                         '11'                        => true,
353                     ),
354                     'versionclasses'                => array(
355                         'ie',
356                         'ie11',
357                     ),
358                 ),
359             ),
361             // Windows 8.1; Internet Explorer 11.0i.
362             array(
363                 ' Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)',
364                 array(
365                     'is_ie'                         => true,
366                     'check_ie_version'              => array(
367                         '0'                         => true,
368                         '5.0'                       => true,
369                         '5.5'                       => true,
370                         '6.0'                       => true,
371                         '7.0'                       => true,
372                         '8.0'                       => true,
373                         '9.0'                       => true,
374                         '10'                        => true,
375                         '11'                        => true,
376                     ),
377                     'iecompatibility'               => true,
378                     'versionclasses'                => array(
379                         'ie',
380                         'ie11',
381                     ),
383                     // IE in Compatiblity mode does not support JSON ContentType.
384                     'supports_json_contenttype'     => false,
385                 ),
386             ),
388             // Windows XP; Firefox 1.0.6.
389             array(
390                 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6',
391                 array(
392                     'is_firefox'                    => true,
394                     'is_gecko'                      => true,
395                     'check_gecko_version'           => array(
396                         '1'                         => true,
397                     ),
399                     'versionclasses'                => array(
400                         'gecko',
401                         'gecko17',
402                     ),
403                 ),
404             ),
406             // Windows XP; Firefox 1.0.6.
407             array(
408                 'Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8) Gecko/20051107 Firefox/1.5',
409                 array(
410                     'is_firefox'                    => true,
411                     'check_firefox_version'         => array(
412                         '1.5'                       => true,
413                     ),
415                     'is_gecko'                      => true,
416                     'check_gecko_version'           => array(
417                         '1'                         => true,
418                         '20030516'                  => true,
419                         '20051116'                  => true,
420                     ),
422                     'versionclasses'                => array(
423                         'gecko',
424                         'gecko18',
425                     ),
426                 ),
427             ),
429             // Windows XP; Firefox 1.5.0.1.
430             array(
431                 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1',
432                 array(
433                     'is_firefox'                    => true,
434                     'check_firefox_version'         => array(
435                         '1.5'                       => true,
436                     ),
438                     'is_gecko'                      => true,
439                     'check_gecko_version'           => array(
440                         '1'                         => true,
441                         '20030516'                  => true,
442                         '20051116'                  => true,
443                     ),
445                     'versionclasses'                => array(
446                         'gecko',
447                         'gecko18',
448                     ),
449                 ),
450             ),
452             // Windows XP; Firefox 2.0.
453             array(
454                 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1',
455                 array(
456                     'is_firefox'                    => true,
457                     'check_firefox_version'         => array(
458                         '1.5'                       => true,
459                     ),
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                     ),
470                     'versionclasses'                => array(
471                         'gecko',
472                         'gecko18',
473                     ),
474                 ),
475             ),
477             // Ubuntu Linux amd64; Firefox 2.0.
478             array(
479                 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1) Gecko/20060601 Firefox/2.0 (Ubuntu-edgy)',
480                 array(
481                     'is_firefox'                    => true,
482                     'check_firefox_version'         => array(
483                         '1.5'                       => true,
484                     ),
486                     'is_gecko'                      => true,
487                     'check_gecko_version'           => array(
488                         '1'                         => true,
489                         '2'                         => true,
490                         '20030516'                  => true,
491                         '20051116'                  => true,
492                         '2006010100'                => true,
493                     ),
495                     'versionclasses'                => array(
496                         'gecko',
497                         'gecko18',
498                     ),
499                 ),
500             ),
502             // SUSE; Firefox 3.0.6.
503             array(
504                 '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',
505                 array(
506                     'is_firefox'                    => true,
507                     'check_firefox_version'         => array(
508                         '1.5'                       => true,
509                         '3.0'                       => true,
510                     ),
512                     'is_gecko'                      => true,
513                     'check_gecko_version'           => array(
514                         '1'                         => true,
515                         '2'                         => true,
516                         '20030516'                  => true,
517                         '20051116'                  => true,
518                         '2006010100'                => true,
519                     ),
521                     'versionclasses'                => array(
522                         'gecko',
523                         'gecko19',
524                     ),
525                 ),
526             ),
528             // Linux i686; Firefox 3.6.
529             array(
530                 'Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/3.6',
531                 array(
532                     'is_firefox'                    => true,
533                     'check_firefox_version'         => array(
534                         '1.5'                       => true,
535                         '3.0'                       => true,
536                     ),
538                     'is_gecko'                      => true,
539                     'check_gecko_version'           => array(
540                         '1'                         => true,
541                         '2'                         => true,
542                         '20030516'                  => true,
543                         '20051116'                  => true,
544                         '2006010100'                => true,
545                         '3.6'                       => true,
546                         '20100101'                  => true,
547                     ),
549                     'versionclasses'                => array(
550                         'gecko',
551                         'gecko20',
552                     ),
553                 ),
554             ),
556             // Windows; Firefox 11.0.
557             array(
558                 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko Firefox/11.0',
559                 array(
560                     'is_firefox'                    => true,
561                     'check_firefox_version'         => array(
562                         '1.5'                       => true,
563                         '3.0'                       => true,
564                         '4'                         => true,
565                         '10'                        => true,
566                     ),
568                     'is_gecko'                      => true,
569                     'check_gecko_version'           => array(
570                         '1'                         => true,
571                         '2'                         => true,
572                         '20030516'                  => true,
573                         '20051116'                  => true,
574                         '2006010100'                => true,
575                         '20100101'                  => true,
576                         '3.6'                       => true,
577                         '4.0'                       => true,
578                     ),
580                     'versionclasses'                => array(
581                         'gecko',
582                     ),
583                 ),
584             ),
586             // Windows; Firefox 15.0a2.
587             array(
588                 'Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20120716 Firefox/15.0a2',
589                 array(
590                     'is_firefox'                    => true,
591                     'check_firefox_version'         => array(
592                         '1.5'                       => true,
593                         '3.0'                       => true,
594                         '4'                         => true,
595                         '10'                        => true,
596                         '15'                        => true,
597                     ),
599                     'is_gecko'                      => true,
600                     'check_gecko_version'           => array(
601                         '1'                         => true,
602                         '2'                         => true,
603                         '20030516'                  => true,
604                         '20051116'                  => true,
605                         '2006010100'                => true,
606                         '20100101'                  => true,
607                         '3.6'                       => true,
608                         '4.0'                       => true,
609                         '15.0'                      => true,
610                     ),
612                     'versionclasses'                => array(
613                         'gecko',
614                     ),
615                 ),
616             ),
618             // Firefox 18; Mac OS X 10.
619             array(
620                 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/18.0 Firefox/18.0',
621                 array(
622                     'is_firefox'                    => true,
623                     'check_firefox_version'         => array(
624                         '1.5'                       => true,
625                         '3.0'                       => true,
626                         '4'                         => true,
627                         '10'                        => true,
628                         '15'                        => true,
629                         '18'                        => true,
630                     ),
632                     'is_gecko'                      => true,
633                     'check_gecko_version'           => array(
634                         '1'                         => true,
635                         '2'                         => true,
636                         '20030516'                  => true,
637                         '20051116'                  => true,
638                         '2006010100'                => true,
639                         '3.6'                       => true,
640                         '4.0'                       => true,
641                         '15.0'                      => true,
642                         '18.0'                      => true,
643                         '20100101'                  => true,
644                     ),
646                     'versionclasses'                => array(
647                         'gecko',
648                     ),
649                 ),
650             ),
652             // Firefox 33; Mac OS X 10.10.
653             array(
654                 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0',
655                 array(
656                     'is_firefox'                    => true,
657                     'check_firefox_version'         => array(
658                         '1.5'                       => true,
659                         '3.0'                       => true,
660                         '4'                         => true,
661                         '10'                        => true,
662                         '15'                        => true,
663                         '18'                        => true,
664                         '19'                        => true,
665                         '33'                        => true,
666                     ),
668                     'is_gecko'                      => true,
669                     'check_gecko_version'           => array(
670                         '1'                         => true,
671                         '2'                         => true,
672                         '20030516'                  => true,
673                         '20051116'                  => true,
674                         '2006010100'                => true,
675                         '3.6'                       => true,
676                         '4.0'                       => true,
677                         '15.0'                      => true,
678                         '18.0'                      => true,
679                         '19.0'                      => true,
680                         '20100101'                  => true,
681                     ),
683                     'versionclasses'                => array(
684                         'gecko',
685                     ),
686                 ),
687             ),
689             // SeaMonkey 2.0; Windows.
690             array(
691                 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1b3pre) Gecko/20081208 SeaMonkey/2.0',
692                 array(
693                     'is_gecko'                      => true,
694                     'check_gecko_version'           => array(
695                         '1'                         => true,
696                         '2'                         => true,
697                         '20030516'                  => true,
698                         '20051106'                  => true,
699                         '20051116'                  => true,
700                         '2006010100'                => true,
701                     ),
703                     'versionclasses'                => array(
704                         'gecko',
705                         'gecko19',
706                     ),
707                 ),
708             ),
710             // SeaMonkey 2.1; Linux.
711             array(
712                 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20110609 Firefox/4.0.1 SeaMonkey/2.1',
713                 array(
714                     'is_gecko'                      => true,
715                     'check_gecko_version'           => array(
716                         '1'                         => true,
717                         '2'                         => true,
718                         '20030516'                  => true,
719                         '20051116'                  => true,
720                         '2006010100'                => true,
721                         '20100101'                  => true,
722                         '3.6'                       => true,
723                         '4.0'                       => true,
724                     ),
726                     'is_firefox'                    => true,
727                     'check_firefox_version'         => array(
728                         '1.5'                       => true,
729                         '3.0'                       => true,
730                         '4'                         => true,
731                     ),
733                     'versionclasses'                => array(
734                         'gecko',
735                         'gecko20',
736                     ),
737                 ),
738             ),
740             // SeaMonkey 2.3; FreeBSD.
741             array(
742                 'Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0) Gecko/20110818 Firefox/6.0 SeaMonkey/2.3',
743                 array(
744                     'is_gecko'                      => true,
745                     'check_gecko_version'           => array(
746                         '1'                         => true,
747                         '2'                         => true,
748                         '20030516'                  => true,
749                         '20051116'                  => true,
750                         '2006010100'                => true,
751                         '20100101'                  => true,
752                         '3.6'                       => true,
753                         '4.0'                       => true,
754                     ),
756                     'is_firefox'                    => true,
757                     'check_firefox_version'         => array(
758                         '1.5'                       => true,
759                         '3.0'                       => true,
760                         '4'                         => true,
761                     ),
763                     'versionclasses'                => array(
764                         'gecko',
765                     ),
766                 ),
767             ),
769             // Windows 7; MS Word 2010.
770             array(
771                 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; ms-office)',
772                 array(
773                     'is_ie'                         => true,
774                     'check_ie_version'              => array(
775                         '0'                         => true,
776                         '5.0'                       => true,
777                         '5.5'                       => true,
778                         '6.0'                       => true,
779                         '7.0'                       => true,
780                         '8.0'                       => true,
781                     ),
782                     'iecompatibility'               => true,
783                     'versionclasses'                => array(
784                         'ie',
785                         'ie8',
786                     ),
788                     'is_msword'                     => true,
790                     'supports_svg'                  => false,
791                     'supports_json_contenttype'     => false,
792                 ),
793             ),
795             // Windows 7; MS Outlook 2010.
796             array(
797                 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E; Microsoft Outlook 14.0.7113; ms-office; MSOffice 14)',
798                 array(
799                     'is_ie'                         => true,
800                     'check_ie_version'              => array(
801                         '0'                         => true,
802                         '5.0'                       => true,
803                         '5.5'                       => true,
804                         '6.0'                       => true,
805                         '7.0'                       => true,
806                         '8.0'                       => true,
807                     ),
808                     'iecompatibility'               => true,
809                     'versionclasses'                => array(
810                         'ie',
811                         'ie8',
812                     ),
814                     // Note: Outlook is deliberately not considered to be MS Word.
815                     'is_msword'                     => false,
817                     'supports_svg'                  => false,
818                     'supports_json_contenttype'     => false,
819                 ),
820             ),
822             // Mac OS X; MS Word 14.
823             array(
824                 'Mozilla/5.0 (Macintosh; Intel Mac OS X) Word/14.38.0',
825                 array(
826                     'versionclasses'                => array(
827                     ),
829                     'is_msword'                     => true,
830                 ),
831             ),
833             // Safari 312; Max OS X.
834             array(
835                 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
836                 array(
837                     'is_safari'                     => true,
838                     'check_safari_version'          => array(
839                         '1'                         => true,
840                         '312'                       => true,
841                     ),
843                     'is_webkit'                     => true,
845                     'versionclasses'                => array(
846                         'safari',
847                     ),
848                 ),
849             ),
851             // Safari 412; Max OS X.
852             array(
853                 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
854                 array(
855                     'is_safari'                     => true,
856                     'check_safari_version'          => array(
857                         '1'                         => true,
858                         '312'                       => true,
859                     ),
861                     'is_webkit'                     => true,
863                     'versionclasses'                => array(
864                         'safari',
865                     ),
866                 ),
867             ),
869             // Safari 2.0; Max OS X.
870             array(
871                 'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
872                 array(
873                     'is_safari'                     => true,
874                     'check_safari_version'          => array(
875                         '1'                         => true,
876                         '312'                       => true,
877                     ),
879                     'is_webkit'                     => true,
881                     'versionclasses'                => array(
882                         'safari',
883                     ),
884                 ),
885             ),
887             // iOS Safari 528; iPhone.
888             array(
889                 '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',
890                 array(
891                     // Note: We do *not* identify mobile Safari as Safari.
892                     'is_safari_ios'                 => true,
893                     'check_safari_ios_version'      => array(
894                         '527'                       => true,
895                     ),
897                     'is_webkit'                     => true,
899                     'versionclasses'                => array(
900                         'safari',
901                         'ios',
902                     ),
904                     'devicetype'                    => 'mobile',
905                ),
906             ),
908             // Safari; iPhone 6 Plus; iOS 8.1; Build 12B411.
909             array(
910                 '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',
911                 array(
912                     // Note: We do *not* identify mobile Safari as Safari.
913                     'is_safari_ios'                 => true,
914                     'check_safari_ios_version'      => array(
915                         '527'                       => true,
916                         '590'                       => true,
917                         '600'                       => true,
918                     ),
920                     'is_webkit'                     => true,
922                     'versionclasses'                => array(
923                         'safari',
924                         'ios',
925                     ),
927                     'devicetype'                    => 'mobile',
928                ),
929             ),
931             // iOS Safari 533; iPad.
932             array(
933                 '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',
934                 array(
935                     // Note: We do *not* identify mobile Safari as Safari.
936                     'is_safari_ios'                 => true,
937                     'check_safari_ios_version'      => array(
938                         '527'                       => true,
939                     ),
941                     'is_webkit'                     => true,
943                     'versionclasses'                => array(
944                         'safari',
945                         'ios',
946                     ),
948                     'devicetype'                    => 'tablet',
949                ),
950             ),
952             // Android WebKit 525; G1 Phone.
953             array(
954                 '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',
955                 array(
956                     'is_webkit_android'             => true,
957                     'check_webkit_android_version'  => array(
958                         '525'                       => true,
959                     ),
961                     'is_webkit'                     => true,
963                     'versionclasses'                => array(
964                         'android',
965                         'safari',
966                     ),
968                     'devicetype'                    => 'mobile',
970                     'supports_svg'                  => false,
971                ),
972             ),
974             // Android WebKit 530; Nexus.
975             array(
976                 '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',
977                 array(
978                     'is_webkit_android'             => true,
979                     'check_webkit_android_version'  => array(
980                         '525'                       => true,
981                         '527'                       => true,
982                     ),
984                     'is_webkit'                     => true,
986                     'versionclasses'                => array(
987                         'android',
988                         'safari',
989                     ),
991                     'devicetype'                    => 'mobile',
993                     'supports_svg'                  => false,
994                ),
995             ),
997             // Android WebKit 537; Samsung GT-9505.
998             array(
999                 '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',
1000                 array(
1001                     'is_webkit_android'             => true,
1002                     'check_webkit_android_version'  => array(
1003                         '525'                       => true,
1004                         '527'                       => true,
1005                     ),
1007                     'is_webkit'                     => true,
1009                     'is_chrome'                     => true,
1010                     'check_chrome_version'          => array(
1011                         '7'                         => true,
1012                         '8'                         => true,
1013                         '10'                        => true,
1014                     ),
1016                     'versionclasses'                => array(
1017                         'safari',
1018                         'android',
1019                     ),
1021                     'devicetype'                    => 'mobile',
1022                 ),
1023             ),
1025             // Android WebKit 537; Nexus 5.
1026             array(
1027                 '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',
1028                 array(
1029                     'is_webkit_android'             => true,
1030                     'check_webkit_android_version'  => array(
1031                         '525'                       => true,
1032                         '527'                       => true,
1033                     ),
1035                     'is_webkit'                     => true,
1037                     'is_chrome'                     => true,
1038                     'check_chrome_version'          => array(
1039                         '7'                         => true,
1040                         '8'                         => true,
1041                         '10'                        => true,
1042                     ),
1044                     'versionclasses'                => array(
1045                         'safari',
1046                         'android',
1047                     ),
1049                     'devicetype'                    => 'mobile',
1050                 ),
1051             ),
1053             // Chrome 8; Mac OS X.
1054             array(
1055                 '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',
1056                 array(
1057                     'is_chrome'                     => true,
1058                     'check_chrome_version'          => array(
1059                         '7'                         => true,
1060                         '8'                         => true,
1061                     ),
1063                     'is_webkit'                     => true,
1065                     'versionclasses'                => array(
1066                         'safari',
1067                     ),
1068                 ),
1069             ),
1071             // Chrome 39; Mac OS X.
1072             array(
1073                 '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',
1074                 array(
1075                     'is_chrome'                     => true,
1076                     'check_chrome_version'          => array(
1077                         '7'                         => true,
1078                         '8'                         => true,
1079                         '10'                        => true,
1080                         '39'                        => true,
1081                     ),
1083                     'is_webkit'                     => true,
1085                     'versionclasses'                => array(
1086                         'safari',
1087                     ),
1088                 ),
1089             ),
1091             // Opera 8.51; Windows XP.
1092             array(
1093                 'Opera/8.51 (Windows NT 5.1; U; en)',
1094                 array(
1095                     'is_opera'                      => true,
1096                     'check_opera_version'           => array(
1097                         '8.0'                       => true,
1098                     ),
1100                     'versionclasses'                => array(
1101                         'opera',
1102                     ),
1104                     'supports_svg'                  => false,
1105                ),
1106             ),
1108             // Opera 9.0; Windows XP.
1109             array(
1110                 'Opera/9.0 (Windows NT 5.1; U; en)',
1111                 array(
1112                     'is_opera'                      => true,
1113                     'check_opera_version'           => array(
1114                         '8.0'                       => true,
1115                         '9.0'                       => true,
1116                     ),
1118                     'versionclasses'                => array(
1119                         'opera',
1120                     ),
1122                     'supports_svg'                  => false,
1123                ),
1124             ),
1126             // Opera 12.15 (Build 1748); Mac OS X.
1127             array(
1128                 'Opera/9.80 (Macintosh; Intel Mac OS X 10.10.0; Edition MAS) Presto/2.12.388 Version/12.15',
1129                 array(
1130                     'is_opera'                      => true,
1131                     'check_opera_version'           => array(
1132                         '8.0'                       => true,
1133                         '9.0'                       => true,
1134                         '10.0'                      => true,
1135                         '12.15'                     => true,
1136                     ),
1138                     'versionclasses'                => array(
1139                         'opera',
1140                     ),
1142                     'supports_svg'                  => false,
1143                ),
1144             ),
1146             // Opera 9.0; Debian Linux.
1147             array(
1148                 'Opera/9.01 (X11; Linux i686; U; en)',
1149                 array(
1150                     'is_opera'                      => true,
1151                     'check_opera_version'           => array(
1152                         '8.0'                       => true,
1153                         '9.0'                       => true,
1154                     ),
1156                     'versionclasses'                => array(
1157                         'opera',
1158                     ),
1160                     'supports_svg'                  => false,
1161                ),
1162             ),
1164             // Google web crawlers.
1165             array(
1166                 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
1167                 array(
1168                     'is_web_crawler'                => true,
1169                     'versionclasses'                => array(
1170                     ),
1171                ),
1172             ),
1173             array(
1174                 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)',
1175                 array(
1176                     'is_web_crawler'                => true,
1177                     'versionclasses'                => array(
1178                     ),
1179                ),
1180             ),
1181             array(
1182                 'Googlebot-Image/1.0',
1183                 array(
1184                     'is_web_crawler'                => true,
1185                     'versionclasses'                => array(
1186                     ),
1187                ),
1188             ),
1190             // Yahoo crawlers.
1191             // See https://help.yahoo.com/kb/slurp-crawling-page-sln22600.html.
1192             array(
1193                 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
1194                 array(
1195                     'is_web_crawler'                => true,
1196                     'versionclasses'                => array(
1197                     ),
1198                ),
1199             ),
1201             // Bing / MSN / AdIdx crawlers.
1202             // See http://www.bing.com/webmaster/help/which-crawlers-does-bing-use-8c184ec0.
1203             array(
1204                 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
1205                 array(
1206                     'is_web_crawler'                => true,
1207                     'versionclasses'                => array(
1208                     ),
1209                ),
1210             ),
1211             array(
1212                 'Mozilla/5.0 (compatible; bingbot/2.0 +http://www.bing.com/bingbot.htm)',
1213                 array(
1214                     'is_web_crawler'                => true,
1215                     'versionclasses'                => array(
1216                     ),
1217                ),
1218             ),
1219             array(
1220                 '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)',
1221                 array(
1222                     'is_web_crawler'                => true,
1223                     'is_webkit'                     => true,
1224                     'is_safari_ios'                 => true,
1225                     'check_safari_ios_version'      => array(
1226                         '527'                       => true,
1227                     ),
1229                     'versionclasses'                => array(
1230                         'safari',
1231                         'ios',
1232                     ),
1234                     'devicetype'                    => 'mobile',
1235                ),
1236             ),
1237             array(
1238                 '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)',
1239                 array(
1240                     'is_web_crawler'                => true,
1241                     'is_ie'                         => true,
1242                     'check_ie_version'              => array(
1243                         '0'                         => true,
1244                         '5.0'                       => true,
1245                         '5.5'                       => true,
1246                         '6.0'                       => true,
1247                         '7.0'                       => true,
1248                         '8.0'                       => true,
1249                         '9.0'                       => true,
1250                         '10'                        => true,
1251                         '11'                        => true,
1252                     ),
1253                     'versionclasses'                => array(
1254                         'ie',
1255                         'ie11',
1256                     ),
1257                     'devicetype'                    => 'mobile',
1258                ),
1259             ),
1261             array(
1262                 'msnbot/2.0b (+http://search.msn.com/msnbot.htm)',
1263                 array(
1264                     'is_web_crawler'                => true,
1265                     'versionclasses'                => array(
1266                     ),
1267                ),
1268             ),
1269             array(
1270                 'msnbot/2.1',
1271                 array(
1272                     'is_web_crawler'                => true,
1273                     'versionclasses'                => array(
1274                     ),
1275                ),
1276             ),
1277             array(
1278                 'msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)',
1279                 array(
1280                     'is_web_crawler'                => true,
1281                     'versionclasses'                => array(
1282                     ),
1283                ),
1284             ),
1285             array(
1286                 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b',
1287                 array(
1288                     'is_web_crawler'                => true,
1289                     'is_webkit'                     => true,
1290                     'is_safari'                     => true,
1291                     'check_safari_version'          => array(
1292                         '1'                         => true,
1293                         '312'                       => true,
1294                         '500'                       => true,
1295                     ),
1297                     'versionclasses'                => array(
1298                         'safari',
1299                     ),
1300                ),
1301             ),
1302             array(
1303                 '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',
1304                 array(
1305                     'is_web_crawler'                => true,
1306                     'is_ie'                         => true,
1307                     'check_ie_version'              => array(
1308                         '0'                         => true,
1309                         '5.0'                       => true,
1310                         '5.5'                       => true,
1311                         '6.0'                       => true,
1312                         '7.0'                       => true,
1313                         '8.0'                       => true,
1314                         '9.0'                       => true,
1315                         '10'                        => true,
1316                         '11'                        => true,
1317                     ),
1318                     'versionclasses'                => array(
1319                         'ie',
1320                         'ie11',
1321                     ),
1322                     'devicetype'                    => 'mobile',
1323                ),
1324             ),
1326             // Yandex.
1327             // See http://help.yandex.com/search/robots/agent.xml.
1328             array(
1329                 'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
1330                 array(
1331                     'is_web_crawler'                => true,
1332                     'versionclasses'                => array(
1333                     ),
1334                ),
1335             ),
1336             array(
1337                 'Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)',
1338                 array(
1339                     'is_web_crawler'                => true,
1340                     'versionclasses'                => array(
1341                     ),
1342                ),
1343             ),
1345             // AltaVista.
1346             array(
1347                 'AltaVista V2.0B crawler@evreka.com',
1348                 array(
1349                     'is_web_crawler'                => true,
1350                     'versionclasses'                => array(
1351                     ),
1352                ),
1353             ),
1355             // ZoomSpider.
1356             array(
1357                 'ZoomSpider - wrensoft.com [ZSEBOT]',
1358                 array(
1359                     'is_web_crawler'                => true,
1360                     'versionclasses'                => array(
1361                     ),
1362                ),
1363             ),
1365             // Baidu.
1366             array(
1367                 'Baiduspider+(+http://www.baidu.com/search/spider_jp.html)',
1368                 array(
1369                     'is_web_crawler'                => true,
1370                     'versionclasses'                => array(
1371                     ),
1372                ),
1373             ),
1374             array(
1375                 'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
1376                 array(
1377                     'is_web_crawler'                => true,
1378                     'versionclasses'                => array(
1379                     ),
1380                ),
1381             ),
1383             // Ask.com.
1384             array(
1385                 'User-Agent: Mozilla/2.0 (compatible; Ask Jeeves/Teoma)',
1386                 array(
1387                     'is_web_crawler'                => true,
1388                     'versionclasses'                => array(
1389                     ),
1390                ),
1391             ),
1392         );
1393     }
1395     /**
1396      * Test instance generation.
1397      */
1398     public function test_instance() {
1399         $this->assertInstanceOf('core_useragent', core_useragent::instance());
1400         $this->assertInstanceOf('core_useragent', core_useragent::instance(true));
1401     }
1403     /**
1404      * @dataProvider user_agents_providers
1405      */
1406     public function test_useragent_edge($useragent, $tests) {
1407         // Setup the core_useragent instance.
1408         core_useragent::instance(true, $useragent);
1410         // Edge Tests.
1411         if (isset($tests['is_edge']) && $tests['is_edge']) {
1412             $this->assertTrue(core_useragent::is_edge());
1413         } else {
1414             $this->assertFalse(core_useragent::is_edge());
1415         }
1417         $versions = array(
1418             // New versions of should be added here.
1419             '12'   => false,
1420         );
1422         if (isset($tests['check_edge_version'])) {
1423             // The test provider has overwritten some of the above checks.
1424             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1425             $versions = $tests['check_edge_version'] + $versions;
1426         }
1428         foreach ($versions as $version => $result) {
1429             $this->assertEquals($result, core_useragent::check_edge_version($version),
1430                 "Version incorrectly determined for Edge version '{$version}'");
1431         }
1432     }
1434     /**
1435      * @dataProvider user_agents_providers
1436      */
1437     public function test_useragent_ie($useragent, $tests) {
1438         // Setup the core_useragent instance.
1439         core_useragent::instance(true, $useragent);
1441         // IE Tests.
1442         if (isset($tests['is_ie']) && $tests['is_ie']) {
1443             $this->assertTrue(core_useragent::is_ie());
1444         } else {
1445             $this->assertFalse(core_useragent::is_ie());
1446         }
1448         $versions = array(
1449             // New versions of should be added here.
1450             '0'    => false,
1451             '5.0'  => false,
1452             '5.5'  => false,
1453             '6.0'  => false,
1454             '7.0'  => false,
1455             '8.0'  => false,
1456             '9.0'  => false,
1457             '10'   => false,
1458             '11'   => false,
1459             '12'   => false,
1460             '13'   => false,
1461             '14'   => false,
1462         );
1464         if (isset($tests['check_ie_version'])) {
1465             // The test provider has overwritten some of the above checks.
1466             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1467             $versions = $tests['check_ie_version'] + $versions;
1468         }
1470         foreach ($versions as $version => $result) {
1471             $this->assertEquals($result, core_useragent::check_ie_version($version),
1472                 "Version incorrectly determined for IE version '{$version}'");
1473         }
1475         // IE Compatibility mode.
1476         if (isset($tests['iecompatibility']) && $tests['iecompatibility']) {
1477             $this->assertTrue(core_useragent::check_ie_compatibility_view(), "IE Compability false negative");
1478         } else {
1479             $this->assertFalse(core_useragent::check_ie_compatibility_view(), "IE Compability false positive");
1480         }
1482     }
1484     /**
1485      * @dataProvider user_agents_providers
1486      */
1487     public function test_useragent_msword($useragent, $tests) {
1488         // Setup the core_useragent instance.
1489         core_useragent::instance(true, $useragent);
1491         // MSWord Tests.
1492         if (isset($tests['is_msword']) && $tests['is_msword']) {
1493             $this->assertTrue(core_useragent::is_msword());
1494         } else {
1495             $this->assertFalse(core_useragent::is_msword());
1496         }
1497     }
1500     /**
1501      * @dataProvider user_agents_providers
1502      */
1503     public function test_useragent_supports($useragent, $tests) {
1504         // Setup the core_useragent instance.
1505         core_useragent::instance(true, $useragent);
1507         // Supports SVG.
1508         if (!isset($tests['supports_svg']) || $tests['supports_svg']) {
1509             $this->assertTrue(core_useragent::supports_svg(),
1510                 "SVG Support was not reported (and should have been)");
1511         } else {
1512             $this->assertFalse(core_useragent::supports_svg(),
1513                 "SVG Support was reported (and should not have been)");
1514         }
1516         // Supports JSON ContentType.
1517         if (!isset($tests['supports_json_contenttype']) || $tests['supports_json_contenttype']) {
1518             $this->assertTrue(core_useragent::supports_json_contenttype(),
1519                 "JSON ContentType Support was not reported (and should have been)");
1520         } else {
1521             $this->assertFalse(core_useragent::supports_json_contenttype(),
1522                 "JSON ContentType Support was reported (and should not have been)");
1523         }
1524     }
1526     /**
1527      * @dataProvider user_agents_providers
1528      */
1529     public function test_useragent_webkit($useragent, $tests) {
1530         // Setup the core_useragent instance.
1531         core_useragent::instance(true, $useragent);
1533         if (isset($tests['is_webkit']) && $tests['is_webkit']) {
1534             $this->assertTrue(core_useragent::is_webkit(),
1535                 "Browser was not identified as a webkit browser");
1536             $this->assertTrue(core_useragent::check_webkit_version());
1537         } else {
1538             $this->assertFalse(core_useragent::is_webkit(),
1539                 "Browser was incorrectly identified as a webkit browser");
1540             $this->assertFalse(core_useragent::check_webkit_version());
1541         }
1543         $versions = array(
1544             // New versions should be added here.
1545         );
1547         if (isset($tests['check_webkit_version'])) {
1548             // The test provider has overwritten some of the above checks.
1549             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1550             $versions = $tests['check_webkit_version'] + $versions;
1551         }
1553         foreach ($versions as $version => $result) {
1554             $this->assertEquals($result, core_useragent::check_webkit_version($version),
1555                 "Version incorrectly determined for Webkit version '{$version}'");
1556         }
1557     }
1559     /**
1560      * @dataProvider user_agents_providers
1561      */
1562     public function test_useragent_webkit_android($useragent, $tests) {
1563         // Setup the core_useragent instance.
1564         core_useragent::instance(true, $useragent);
1566         if (isset($tests['is_webkit_android']) && $tests['is_webkit_android']) {
1567             $this->assertTrue(core_useragent::is_webkit_android(),
1568                 "Browser was not identified as an Android webkit browser");
1569             $this->assertTrue(core_useragent::check_webkit_android_version());
1570         } else {
1571             $this->assertFalse(core_useragent::is_webkit_android(),
1572                 "Browser was incorrectly identified as an Android webkit browser");
1573             $this->assertFalse(core_useragent::check_webkit_android_version());
1574         }
1576         $versions = array(
1577             // New versions should be added here.
1578             '525'       => false,
1579             '527'       => false,
1580             '590'       => false,
1581         );
1583         if (isset($tests['check_webkit_android_version'])) {
1584             // The test provider has overwritten some of the above checks.
1585             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1586             $versions = $tests['check_webkit_android_version'] + $versions;
1587         }
1589         foreach ($versions as $version => $result) {
1590             $this->assertEquals($result, core_useragent::check_webkit_android_version($version),
1591                 "Version incorrectly determined for Android webkit version '{$version}'");
1592         }
1593     }
1595     /**
1596      * @dataProvider user_agents_providers
1597      */
1598     public function test_useragent_chrome($useragent, $tests) {
1599         // Setup the core_useragent instance.
1600         core_useragent::instance(true, $useragent);
1602         if (isset($tests['is_chrome']) && $tests['is_chrome']) {
1603             $this->assertTrue(core_useragent::is_chrome(),
1604                 "Browser was not identified as a chrome browser");
1605             $this->assertTrue(core_useragent::check_chrome_version());
1606         } else {
1607             $this->assertFalse(core_useragent::is_chrome(),
1608                 "Browser was incorrectly identified as a chrome browser");
1609             $this->assertFalse(core_useragent::check_chrome_version());
1610         }
1612         $versions = array(
1613             // New versions should be added here.
1614             '7'         => false,
1615             '8'         => false,
1616             '10'        => false,
1617             '39'        => false,
1618         );
1620         if (isset($tests['check_chrome_version'])) {
1621             // The test provider has overwritten some of the above checks.
1622             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1623             $versions = $tests['check_chrome_version'] + $versions;
1624         }
1626         foreach ($versions as $version => $result) {
1627             $this->assertEquals($result, core_useragent::check_chrome_version($version),
1628                 "Version incorrectly determined for Chrome version '{$version}'");
1629         }
1630     }
1632     /**
1633      * @dataProvider user_agents_providers
1634      */
1635     public function test_useragent_safari($useragent, $tests) {
1636         // Setup the core_useragent instance.
1637         core_useragent::instance(true, $useragent);
1639         if (isset($tests['is_safari']) && $tests['is_safari']) {
1640             $this->assertTrue(core_useragent::is_safari(),
1641                 "Browser was not identified as a safari browser");
1642             $this->assertTrue(core_useragent::check_safari_version());
1643         } else {
1644             $this->assertFalse(core_useragent::is_safari(),
1645                 "Browser was incorrectly identified as a safari browser");
1646             $this->assertFalse(core_useragent::check_safari_version());
1647         }
1649         // Check Safari (generic).
1650         $versions = array(
1651             // New versions should be added here.
1652             '1'         => false,
1653             '312'       => false,
1654             '500'       => false,
1655         );
1657         if (isset($tests['check_safari_version'])) {
1658             // The test provider has overwritten some of the above checks.
1659             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1660             $versions = $tests['check_safari_version'] + $versions;
1661         }
1663         foreach ($versions as $version => $result) {
1664             $this->assertEquals($result, core_useragent::check_safari_version($version),
1665                 "Version incorrectly determined for Safari (generic) version '{$version}'");
1666         }
1667     }
1669     /**
1670      * @dataProvider user_agents_providers
1671      */
1672     public function test_useragent_ios_safari($useragent, $tests) {
1673         // Setup the core_useragent instance.
1674         core_useragent::instance(true, $useragent);
1676         if (isset($tests['is_safari_ios']) && $tests['is_safari_ios']) {
1677             $this->assertTrue(core_useragent::is_safari_ios(),
1678                 "Browser was not identified as an iOS safari browser");
1679             $this->assertTrue(core_useragent::check_safari_ios_version());
1680         } else {
1681             $this->assertFalse(core_useragent::is_safari_ios(),
1682                 "Browser was incorrectly identified as an iOS safari browser");
1683             $this->assertFalse(core_useragent::check_safari_ios_version());
1684         }
1686         // Check iOS Safari.
1687         $versions = array(
1688             // New versions should be added here.
1689             '527'       => false,
1690             '590'       => false,
1691             '600'       => false,
1692         );
1694         if (isset($tests['check_safari_ios_version'])) {
1695             // The test provider has overwritten some of the above checks.
1696             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1697             $versions = $tests['check_safari_ios_version'] + $versions;
1698         }
1700         foreach ($versions as $version => $result) {
1701             $this->assertEquals($result, core_useragent::check_safari_ios_version($version),
1702                 "Version incorrectly determined for iOS Safari version '{$version}'");
1703         }
1704     }
1706     /**
1707      * @dataProvider user_agents_providers
1708      */
1709     public function test_useragent_gecko($useragent, $tests) {
1710         // Setup the core_useragent instance.
1711         core_useragent::instance(true, $useragent);
1713         if (isset($tests['is_gecko']) && $tests['is_gecko']) {
1714             $this->assertTrue(core_useragent::is_gecko(),
1715                 "Browser was not identified as a gecko browser");
1716             $this->assertTrue(core_useragent::check_gecko_version());
1717         } else {
1718             $this->assertFalse(core_useragent::is_gecko(),
1719                 "Browser was incorrectly identified as a gecko browser");
1720             $this->assertFalse(core_useragent::check_gecko_version());
1721         }
1723         $versions = array(
1724             // New versions should be added here.
1725             '1'             => false,
1726             '2'             => false,
1727             '3.6'           => false,
1728             '4.0'           => false,
1729             '20030516'      => false,
1730             '20051116'      => false,
1731             '2006010100'    => false,
1732             '20100101'      => false,
1733             '15.0'          => false,
1734             '18.0'          => false,
1735             '19.0'          => false,
1736         );
1738         if (isset($tests['check_gecko_version'])) {
1739             // The test provider has overwritten some of the above checks.
1740             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1741             $versions = $tests['check_gecko_version'] + $versions;
1742         }
1744         foreach ($versions as $version => $result) {
1745             $this->assertEquals($result, core_useragent::check_gecko_version($version),
1746                 "Version incorrectly determined for Gecko version '{$version}'");
1747         }
1748     }
1750     /**
1751      * @dataProvider user_agents_providers
1752      */
1753     public function test_useragent_firefox($useragent, $tests) {
1754         // Setup the core_useragent instance.
1755         core_useragent::instance(true, $useragent);
1757         if (isset($tests['is_firefox']) && $tests['is_firefox']) {
1758             $this->assertTrue(core_useragent::is_firefox(),
1759                 "Browser was not identified as a firefox browser");
1760             $this->assertTrue(core_useragent::check_firefox_version());
1761         } else {
1762             $this->assertFalse(core_useragent::is_firefox(),
1763                 "Browser was incorrectly identified as a firefox browser");
1764             $this->assertFalse(core_useragent::check_firefox_version());
1765         }
1767         $versions = array(
1768             // New versions should be added here.
1769             '1.5'       => false,
1770             '3.0'       => false,
1771             '4'         => false,
1772             '10'        => false,
1773             '15'        => false,
1774             '18'        => false,
1775             '19'        => false,
1776             '33'        => false,
1777         );
1779         if (isset($tests['check_firefox_version'])) {
1780             // The test provider has overwritten some of the above checks.
1781             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1782             $versions = $tests['check_firefox_version'] + $versions;
1783         }
1785         foreach ($versions as $version => $result) {
1786             $this->assertEquals($result, core_useragent::check_firefox_version($version),
1787                 "Version incorrectly determined for Firefox version '{$version}'");
1788         }
1789     }
1791     /**
1792      * @dataProvider user_agents_providers
1793      */
1794     public function test_useragent_opera($useragent, $tests) {
1795         // Setup the core_useragent instance.
1796         core_useragent::instance(true, $useragent);
1798         if (isset($tests['is_opera']) && $tests['is_opera']) {
1799             $this->assertTrue(core_useragent::is_opera(),
1800                 "Browser was not identified as a opera browser");
1801             $this->assertTrue(core_useragent::check_opera_version());
1802         } else {
1803             $this->assertFalse(core_useragent::is_opera(),
1804                 "Browser was incorrectly identified as a opera browser");
1805             $this->assertFalse(core_useragent::check_opera_version());
1806         }
1808         $versions = array(
1809             // New versions should be added here.
1810             '8.0'       => false,
1811             '9.0'       => false,
1812             '10.0'      => false,
1813             '12.15'     => false,
1814         );
1816         if (isset($tests['check_opera_version'])) {
1817             // The test provider has overwritten some of the above checks.
1818             // Must use the '+' operator, because array_merge will incorrectly rewrite the array keys for integer-based indexes.
1819             $versions = $tests['check_opera_version'] + $versions;
1820         }
1822         foreach ($versions as $version => $result) {
1823             $this->assertEquals($result, core_useragent::check_opera_version($version),
1824                 "Version incorrectly determined for Opera version '{$version}'");
1825         }
1826     }
1828     /**
1829      * @dataProvider user_agents_providers
1830      */
1831     public function test_get_device_type($useragent, $tests) {
1832         // Setup the core_useragent instance.
1833         core_useragent::instance(true, $useragent);
1835         $expected = 'default';
1836         if (isset($tests['devicetype'])) {
1837             $expected = $tests['devicetype'];
1838         }
1840         $this->assertEquals($expected, core_useragent::get_device_type(),
1841             "Device Type was not correctly identified");
1842     }
1844     /**
1845      * @dataProvider user_agents_providers
1846      */
1847     public function test_get_browser_version_classes($useragent, $tests) {
1848         // Setup the core_useragent instance.
1849         core_useragent::instance(true, $useragent);
1851         $actual = core_useragent::get_browser_version_classes();
1852         foreach ($tests['versionclasses'] as $expectedclass) {
1853             $this->assertContains($expectedclass, $actual);
1854         }
1855         $this->assertCount(count($tests['versionclasses']), $actual);
1856     }
1858     /**
1859      * @dataProvider user_agents_providers
1860      */
1861     public function test_useragent_web_crawler($useragent, $tests) {
1862         // Setup the core_useragent instance.
1863         core_useragent::instance(true, $useragent);
1865         $expectation = isset($tests['is_web_crawler']) ? $tests['is_web_crawler'] : false;
1866         $this->assertSame($expectation, core_useragent::is_web_crawler());
1867     }
1869     /**
1870      * Regression tests for the deprecated is_web_crawler() function
1871      */
1872     public function test_deprecated_is_web_crawler() {
1874         $browsers = array(
1875             'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))',
1876             'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:18.0) Gecko/18.0 Firefox/18.0',
1877             'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/412 (KHTML, like Gecko) Safari/412',
1878             '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',
1879             'Opera/9.0 (Windows NT 5.1; U; en)',
1880             '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',
1881             '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',
1882         );
1883         $crawlers = array(
1884             // Google.
1885             'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
1886             'Googlebot/2.1 (+http://www.googlebot.com/bot.html)',
1887             'Googlebot-Image/1.0',
1888             // Yahoo.
1889             'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)',
1890             // Bing.
1891             'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)',
1892             'Mozilla/5.0 (compatible; bingbot/2.0 +http://www.bing.com/bingbot.htm)',
1893             // MSN.
1894             'msnbot/2.1',
1895             // Yandex.
1896             'Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)',
1897             'Mozilla/5.0 (compatible; YandexImages/3.0; +http://yandex.com/bots)',
1898             // AltaVista.
1899             'AltaVista V2.0B crawler@evreka.com',
1900             // ZoomSpider.
1901             'ZoomSpider - wrensoft.com [ZSEBOT]',
1902             // Baidu.
1903             'Baiduspider+(+http://www.baidu.com/search/spider_jp.html)',
1904             'Baiduspider+(+http://www.baidu.com/search/spider.htm)',
1905             'BaiDuSpider',
1906             // Ask.com.
1907             'User-Agent: Mozilla/2.0 (compatible; Ask Jeeves/Teoma)',
1908         );
1910         foreach ($browsers as $agent) {
1911             core_useragent::instance(true, $agent);
1912             $this->assertSame($agent, core_useragent::get_user_agent_string());
1913             $this->assertFalse(is_web_crawler());
1914             $this->assertDebuggingCalled('is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.',
1915                 DEBUG_DEVELOPER);
1916         }
1917         foreach ($crawlers as $agent) {
1918             core_useragent::instance(true, $agent);
1919             $this->assertSame($agent, core_useragent::get_user_agent_string());
1920             $this->assertTrue(is_web_crawler(), "$agent should be considered a search engine");
1921             $this->assertDebuggingCalled('is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.',
1922                 DEBUG_DEVELOPER);
1923         }
1924     }