Revert "merged master"
[lhc/web/wiklou.git] / tests / phpunit / includes / GlobalFunctions / GlobalTest.php
index 25581de..746add5 100644 (file)
@@ -55,6 +55,12 @@ class GlobalTest extends MediaWikiTestCase {
                        wfUrlencode( "\xE7\x89\xB9\xE5\x88\xA5:Contributions/Foobar" ) );
        }
 
+       function testExpandIRI() {
+               $this->assertEquals(
+                       "https://te.wikibooks.org/wiki/ఉబుంటు_వాడుకరి_మార్గదర్శని",
+                       wfExpandIRI( "https://te.wikibooks.org/wiki/%E0%B0%89%E0%B0%AC%E0%B1%81%E0%B0%82%E0%B0%9F%E0%B1%81_%E0%B0%B5%E0%B0%BE%E0%B0%A1%E0%B1%81%E0%B0%95%E0%B0%B0%E0%B0%BF_%E0%B0%AE%E0%B0%BE%E0%B0%B0%E0%B1%8D%E0%B0%97%E0%B0%A6%E0%B0%B0%E0%B1%8D%E0%B0%B6%E0%B0%A8%E0%B0%BF" ) );
+       }
+
        function testReadOnlyEmpty() {
                global $wgReadOnly;
                $wgReadOnly = null;
@@ -94,24 +100,80 @@ class GlobalTest extends MediaWikiTestCase {
                $this->assertTrue( $end > $start, "Time is running backwards!" );
        }
 
-       function testArrayToCGI() {
+       function dataArrayToCGI() {
+               return array(
+                       array( array(), '' ), // empty
+                       array( array( 'foo' => 'bar' ), 'foo=bar' ), // string test
+                       array( array( 'foo' => '' ), 'foo=' ), // empty string test
+                       array( array( 'foo' => 1 ), 'foo=1' ), // number test
+                       array( array( 'foo' => true ), 'foo=1' ), // true test
+                       array( array( 'foo' => false ), '' ), // false test
+                       array( array( 'foo' => null ), 'foo' ), // null test
+                       array( array( 'foo' => 'A&B=5+6@!"\'' ), 'foo=A%26B%3D5%2B6%40%21%22%27' ), // urlencoding test
+                       array( array( 'foo' => 'bar', 'baz' => 'is', 'asdf' => 'qwerty' ), 'foo=bar&baz=is&asdf=qwerty' ), // multi-item test
+                       array( array( 'foo' => array( 'bar' => 'baz' ) ), 'foo%5Bbar%5D=baz' ),
+                       array( array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ), 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf' ),
+                       array( array( 'foo' => array( 'bar', 'baz' ) ), 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
+                       array( array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ), 'foo%5Bbar%5D%5Bbar%5D=baz' ),
+               );
+       }
+
+       /**
+        * @dataProvider dataArrayToCGI
+        */
+       function testArrayToCGI( $array, $result ) {
+               $this->assertEquals( $result, wfArrayToCGI( $array ) );
+       }
+
+
+       function testArrayToCGI2() {
                $this->assertEquals(
-                       "baz=AT%26T&foo=bar",
+                       "baz=bar&foo=bar",
                        wfArrayToCGI(
-                               array( 'baz' => 'AT&T', 'ignore' => '' ),
+                               array( 'baz' => 'bar' ),
                                array( 'foo' => 'bar', 'baz' => 'overridden value' ) ) );
-               $this->assertEquals(
-                       "path%5B0%5D=wiki&path%5B1%5D=test&cfg%5Bservers%5D%5Bhttp%5D=localhost",
-                       wfArrayToCGI( array(
-                               'path' => array( 'wiki', 'test' ),
-                               'cfg' => array( 'servers' => array( 'http' => 'localhost' ) ) ) ) );
        }
 
-       function testCgiToArray() {
-               $this->assertEquals(
-                       array( 'path' => array( 'wiki', 'test' ),
-                       'cfg' => array( 'servers' => array( 'http' => 'localhost' ) ) ),
-                       wfCgiToArray( 'path%5B0%5D=wiki&path%5B1%5D=test&cfg%5Bservers%5D%5Bhttp%5D=localhost' ) );
+       function dataCgiToArray() {
+               return array(
+                       array( '', array() ), // empty
+                       array( 'foo=bar', array( 'foo' => 'bar' ) ), // string
+                       array( 'foo=', array( 'foo' => '' ) ), // empty string
+                       array( 'foo', array( 'foo' => '' ) ), // missing =
+                       array( 'foo=bar&qwerty=asdf', array( 'foo' => 'bar', 'qwerty' => 'asdf' ) ), // multiple value
+                       array( 'foo=A%26B%3D5%2B6%40%21%22%27', array( 'foo' => 'A&B=5+6@!"\'' ) ), // urldecoding test
+                       array( 'foo%5Bbar%5D=baz', array( 'foo' => array( 'bar' => 'baz' ) ) ),
+                       array( 'foo%5Bbar%5D=baz&foo%5Bqwerty%5D=asdf', array( 'foo' => array( 'bar' => 'baz', 'qwerty' => 'asdf' ) ) ),
+                       array( 'foo%5B0%5D=bar&foo%5B1%5D=baz', array( 'foo' => array( 0 => 'bar', 1 => 'baz' ) ) ),
+                       array( 'foo%5Bbar%5D%5Bbar%5D=baz', array( 'foo' => array( 'bar' => array( 'bar' => 'baz' ) ) ) ),
+               );
+       }
+
+       /**
+        * @dataProvider dataCgiToArray
+        */
+       function testCgiToArray( $cgi, $result ) {
+               $this->assertEquals( $result, wfCgiToArray( $cgi ) );
+       }
+
+       function dataCgiRoundTrip() {
+               return array(
+                       array( '' ),
+                       array( 'foo=bar' ),
+                       array( 'foo=' ),
+                       array( 'foo=bar&baz=biz' ),
+                       array( 'foo=A%26B%3D5%2B6%40%21%22%27' ),
+                       array( 'foo%5Bbar%5D=baz' ),
+                       array( 'foo%5B0%5D=bar&foo%5B1%5D=baz' ),
+                       array( 'foo%5Bbar%5D%5Bbar%5D=baz' ),
+               );
+       }
+
+       /**
+        * @dataProvider dataCgiRoundTrip
+        */
+       function testCgiRoundTrip( $cgi ) {
+               $this->assertEquals( $cgi, wfArrayToCGI( wfCgiToArray( $cgi ) ) );
        }
 
        function testMimeTypeMatch() {
@@ -176,263 +238,6 @@ class GlobalTest extends MediaWikiTestCase {
                                array( 'text/*'                => 1.0 ),
                                array( 'application/xhtml+xml' => 1.0 ) ) );
        }
-
-       function testTimestamp() {
-               $t = gmmktime( 12, 34, 56, 1, 15, 2001 );
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, $t ),
-                       'TS_UNIX to TS_MW' );
-               $this->assertEquals(
-                       '19690115123456',
-                       wfTimestamp( TS_MW, -30281104 ),
-                       'Negative TS_UNIX to TS_MW' );
-               $this->assertEquals(
-                       979562096,
-                       wfTimestamp( TS_UNIX, $t ),
-                       'TS_UNIX to TS_UNIX' );
-               $this->assertEquals(
-                       '2001-01-15 12:34:56',
-                       wfTimestamp( TS_DB, $t ),
-                       'TS_UNIX to TS_DB' );
-               $this->assertEquals(
-                       '20010115T123456Z',
-                       wfTimestamp( TS_ISO_8601_BASIC, $t ),
-                       'TS_ISO_8601_BASIC to TS_DB' );
-
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, '20010115123456' ),
-                       'TS_MW to TS_MW' );
-               $this->assertEquals(
-                       979562096,
-                       wfTimestamp( TS_UNIX, '20010115123456' ),
-                       'TS_MW to TS_UNIX' );
-               $this->assertEquals(
-                       '2001-01-15 12:34:56',
-                       wfTimestamp( TS_DB, '20010115123456' ),
-                       'TS_MW to TS_DB' );
-               $this->assertEquals(
-                       '20010115T123456Z',
-                       wfTimestamp( TS_ISO_8601_BASIC, '20010115123456' ),
-                       'TS_MW to TS_ISO_8601_BASIC' );
-
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, '2001-01-15 12:34:56' ),
-                       'TS_DB to TS_MW' );
-               $this->assertEquals(
-                       979562096,
-                       wfTimestamp( TS_UNIX, '2001-01-15 12:34:56' ),
-                       'TS_DB to TS_UNIX' );
-               $this->assertEquals(
-                       '2001-01-15 12:34:56',
-                       wfTimestamp( TS_DB, '2001-01-15 12:34:56' ),
-                       'TS_DB to TS_DB' );
-               $this->assertEquals(
-                       '20010115T123456Z',
-                       wfTimestamp( TS_ISO_8601_BASIC, '2001-01-15 12:34:56' ),
-                       'TS_DB to TS_ISO_8601_BASIC' );
-
-               # rfc2822 section 3.3
-
-               $this->assertEquals(
-                       'Mon, 15 Jan 2001 12:34:56 GMT',
-                       wfTimestamp( TS_RFC2822, '20010115123456' ),
-                       'TS_MW to TS_RFC2822' );
-
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, 'Mon, 15 Jan 2001 12:34:56 GMT' ),
-                       'TS_RFC2822 to TS_MW' );
-
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, ' Mon, 15 Jan 2001 12:34:56 GMT' ),
-                       'TS_RFC2822 with leading space to TS_MW' );
-
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, '15 Jan 2001 12:34:56 GMT' ),
-                       'TS_RFC2822 without optional day-of-week to TS_MW' );
-
-               # FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space
-               # obs-FWS = 1*WSP *(CRLF 1*WSP) ; Section 4.2
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, 'Mon, 15         Jan 2001 12:34:56 GMT' ),
-                       'TS_RFC2822 to TS_MW' );
-
-               # WSP = SP / HTAB ; rfc2234
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, "Mon, 15 Jan\x092001 12:34:56 GMT" ),
-                       'TS_RFC2822 with HTAB to TS_MW' );
-
-               $this->assertEquals(
-                       '20010115123456',
-                       wfTimestamp( TS_MW, "Mon, 15 Jan\x09 \x09  2001 12:34:56 GMT" ),
-                       'TS_RFC2822 with HTAB and SP to TS_MW' );
-
-               $this->assertEquals(
-                       '19941106084937',
-                       wfTimestamp( TS_MW, "Sun, 6 Nov 94 08:49:37 GMT" ),
-                       'TS_RFC2822 with obsolete year to TS_MW' );
-       }
-
-       /**
-        * This test checks wfTimestamp() with values outside.
-        * It needs PHP 64 bits or PHP > 5.1.
-        * See r74778 and bug 25451
-        */
-       function testOldTimestamps() {
-               $this->assertEquals( 'Fri, 13 Dec 1901 20:45:54 GMT',
-                       wfTimestamp( TS_RFC2822, '19011213204554' ),
-                       'Earliest time according to php documentation' );
-
-               $this->assertEquals( 'Tue, 19 Jan 2038 03:14:07 GMT',
-                       wfTimestamp( TS_RFC2822, '20380119031407' ),
-                       'Latest 32 bit time' );
-
-               $this->assertEquals( '-2147483648',
-                       wfTimestamp( TS_UNIX, '19011213204552' ),
-                       'Earliest 32 bit unix time' );
-
-               $this->assertEquals( '2147483647',
-                       wfTimestamp( TS_UNIX, '20380119031407' ),
-                       'Latest 32 bit unix time' );
-
-               $this->assertEquals( 'Fri, 13 Dec 1901 20:45:52 GMT',
-                       wfTimestamp( TS_RFC2822, '19011213204552' ),
-                       'Earliest 32 bit time' );
-
-               $this->assertEquals( 'Fri, 13 Dec 1901 20:45:51 GMT',
-                       wfTimestamp( TS_RFC2822, '19011213204551' ),
-                       'Earliest 32 bit time - 1' );
-
-               $this->assertEquals( 'Tue, 19 Jan 2038 03:14:08 GMT',
-                       wfTimestamp( TS_RFC2822, '20380119031408' ),
-                       'Latest 32 bit time + 1' );
-
-               $this->assertEquals( '19011212000000',
-                       wfTimestamp(TS_MW, '19011212000000'),
-                       'Convert to itself r74778#c10645' );
-
-               $this->assertEquals( '-2147483649',
-                       wfTimestamp( TS_UNIX, '19011213204551' ),
-                       'Earliest 32 bit unix time - 1' );
-
-               $this->assertEquals( '2147483648',
-                       wfTimestamp( TS_UNIX, '20380119031408' ),
-                       'Latest 32 bit unix time + 1' );
-
-               $this->assertEquals( '19011213204551',
-                       wfTimestamp( TS_MW, '-2147483649' ),
-                       '1901 negative unix time to MediaWiki' );
-
-               $this->assertEquals( '18010115123456',
-                       wfTimestamp( TS_MW, '-5331871504' ),
-                       '1801 negative unix time to MediaWiki' );
-
-               $this->assertEquals( 'Tue, 09 Aug 0117 12:34:56 GMT',
-                       wfTimestamp( TS_RFC2822, '0117-08-09 12:34:56'),
-                       'Death of Roman Emperor [[Trajan]]');
-
-               /* @todo FIXME: 00 to 101 years are taken as being in [1970-2069] */
-
-               $this->assertEquals( 'Sun, 01 Jan 0101 00:00:00 GMT',
-                       wfTimestamp( TS_RFC2822, '-58979923200'),
-                       '1/1/101');
-
-               $this->assertEquals( 'Mon, 01 Jan 0001 00:00:00 GMT',
-                       wfTimestamp( TS_RFC2822, '-62135596800'),
-                       'Year 1');
-
-               /* It is not clear if we should generate a year 0 or not
-                * We are completely off RFC2822 requirement of year being
-                * 1900 or later.
-                */
-               $this->assertEquals( 'Wed, 18 Oct 0000 00:00:00 GMT',
-                       wfTimestamp( TS_RFC2822, '-62142076800'),
-                       'ISO 8601:2004 [[year 0]], also called [[1 BC]]');
-       }
-
-       function testHttpDate() {
-               # The Resource Loader uses wfTimestamp() to convert timestamps
-               # from If-Modified-Since header.
-               # Thus it must be able to parse all rfc2616 date formats
-               # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1
-
-               $this->assertEquals(
-                       '19941106084937',
-                       wfTimestamp( TS_MW, 'Sun, 06 Nov 1994 08:49:37 GMT' ),
-                       'RFC 822 date' );
-
-               $this->assertEquals(
-                       '19941106084937',
-                       wfTimestamp( TS_MW, 'Sunday, 06-Nov-94 08:49:37 GMT' ),
-                       'RFC 850 date' );
-
-               $this->assertEquals(
-                       '19941106084937',
-                       wfTimestamp( TS_MW, 'Sun Nov  6 08:49:37 1994' ),
-                       "ANSI C's asctime() format" );
-
-               // See http://www.squid-cache.org/mail-archive/squid-users/200307/0122.html and r77171
-               $this->assertEquals(
-                       '20101122141242',
-                       wfTimestamp( TS_MW, 'Mon, 22 Nov 2010 14:12:42 GMT; length=52626' ),
-                       "Netscape extension to HTTP/1.0" );
-
-       }
-
-       function testTimestampParameter() {
-               // There are a number of assumptions in our codebase where wfTimestamp() should give 
-               // the current date but it is not given a 0 there. See r71751 CR
-
-               $now = wfTimestamp( TS_UNIX );
-               // We check that wfTimestamp doesn't return false (error) and use a LessThan assert 
-               // for the cases where the test is run in a second boundary.
-               
-               $zero = wfTimestamp( TS_UNIX, 0 );
-               $this->assertNotEquals( false, $zero );
-               $this->assertLessThan( 5, $zero - $now );
-
-               $empty = wfTimestamp( TS_UNIX, '' );
-               $this->assertNotEquals( false, $empty );
-               $this->assertLessThan( 5, $empty - $now );
-
-               $null = wfTimestamp( TS_UNIX, null );
-               $this->assertNotEquals( false, $null );
-               $this->assertLessThan( 5, $null - $now );
-       }
-
-       function testBasename() {
-               $sets = array(
-                       '' => '',
-                       '/' => '',
-                       '\\' => '',
-                       '//' => '',
-                       '\\\\' => '',
-                       'a' => 'a',
-                       'aaaa' => 'aaaa',
-                       '/a' => 'a',
-                       '\\a' => 'a',
-                       '/aaaa' => 'aaaa',
-                       '\\aaaa' => 'aaaa',
-                       '/aaaa/' => 'aaaa',
-                       '\\aaaa\\' => 'aaaa',
-                       '\\aaaa\\' => 'aaaa',
-                       '/mnt/upload3/wikipedia/en/thumb/8/8b/Zork_Grand_Inquisitor_box_cover.jpg/93px-Zork_Grand_Inquisitor_box_cover.jpg' => '93px-Zork_Grand_Inquisitor_box_cover.jpg',
-                       'C:\\Progra~1\\Wikime~1\\Wikipe~1\\VIEWER.EXE' => 'VIEWER.EXE',
-                       'Östergötland_coat_of_arms.png' => 'Östergötland_coat_of_arms.png',
-                       );
-               foreach ( $sets as $from => $to ) {
-                       $this->assertEquals( $to, wfBaseName( $from ),
-                               "wfBaseName('$from') => '$to'" );
-               }
-       }
-       
        
        function testFallbackMbstringFunctions() {
                
@@ -701,172 +506,43 @@ class GlobalTest extends MediaWikiTestCase {
                );
        }
 
-
-       /**
-        * test @see wfBCP47().
-        * Please note the BCP explicitly state that language codes are case
-        * insensitive, there are some exceptions to the rule :)
-        * This test is used to verify our formatting against all lower and
-        * all upper cases language code.
-        *
-        * @see http://tools.ietf.org/html/bcp47
-        * @dataProvider provideLanguageCodes()
-        */
-       function testBCP47( $code, $expected ) {
-               $code = strtolower( $code );
-               $this->assertEquals( $expected, wfBCP47($code),
-                       "Applying BCP47 standard to lower case '$code'"
-               );
-
-               $code = strtoupper( $code );
-               $this->assertEquals( $expected, wfBCP47($code),
-                       "Applying BCP47 standard to upper case '$code'"
-               );
-       }
-
-       /**
-        * Array format is ($code, $expected)
-        */
-       function provideLanguageCodes() {
-               return array(
-                       // Extracted from BCP47 (list not exhaustive)
-                       # 2.1.1
-                       array( 'en-ca-x-ca'    , 'en-CA-x-ca'     ),
-                       array( 'sgn-be-fr'     , 'sgn-BE-FR'      ),
-                       array( 'az-latn-x-latn', 'az-Latn-x-latn' ),
-                       # 2.2
-                       array( 'sr-Latn-RS', 'sr-Latn-RS' ),
-                       array( 'az-arab-ir', 'az-Arab-IR' ),
-
-                       # 2.2.5
-                       array( 'sl-nedis'  , 'sl-nedis'   ),
-                       array( 'de-ch-1996', 'de-CH-1996' ),
-
-                       # 2.2.6
-                       array(
-                               'en-latn-gb-boont-r-extended-sequence-x-private',
-                               'en-Latn-GB-boont-r-extended-sequence-x-private'
-                       ),
-
-                       // Examples from BCP47 Appendix A
-                       # Simple language subtag:
-                       array( 'DE', 'de' ),
-                       array( 'fR', 'fr' ),
-                       array( 'ja', 'ja' ),
-
-                       # Language subtag plus script subtag:
-                       array( 'zh-hans', 'zh-Hans'),
-                       array( 'sr-cyrl', 'sr-Cyrl'),
-                       array( 'sr-latn', 'sr-Latn'),
-
-                       # Extended language subtags and their primary language subtag
-                       # counterparts:
-                       array( 'zh-cmn-hans-cn', 'zh-cmn-Hans-CN' ),
-                       array( 'cmn-hans-cn'   , 'cmn-Hans-CN'    ),
-                       array( 'zh-yue-hk'     , 'zh-yue-HK'      ),
-                       array( 'yue-hk'        , 'yue-HK'         ),
-
-                       # Language-Script-Region:
-                       array( 'zh-hans-cn', 'zh-Hans-CN' ),
-                       array( 'sr-latn-RS', 'sr-Latn-RS' ),
-
-                       # Language-Variant:
-                       array( 'sl-rozaj'      , 'sl-rozaj'       ),
-                       array( 'sl-rozaj-biske', 'sl-rozaj-biske' ),
-                       array( 'sl-nedis'      , 'sl-nedis'       ),
-
-                       # Language-Region-Variant:
-                       array( 'de-ch-1901'  , 'de-CH-1901'  ),
-                       array( 'sl-it-nedis' , 'sl-IT-nedis' ),
-
-                       # Language-Script-Region-Variant:
-                       array( 'hy-latn-it-arevela', 'hy-Latn-IT-arevela' ),
-
-                       # Language-Region:
-                       array( 'de-de' , 'de-DE' ),
-                       array( 'en-us' , 'en-US' ),
-                       array( 'es-419', 'es-419'),
-
-                       # Private use subtags:
-                       array( 'de-ch-x-phonebk'      , 'de-CH-x-phonebk' ),
-                       array( 'az-arab-x-aze-derbend', 'az-Arab-x-aze-derbend' ),
-                       /**
-                        * Previous test does not reflect the BCP which states:
-                        *  az-Arab-x-AZE-derbend
-                        * AZE being private, it should be lower case, hence the test above
-                        * should probably be:
-                       #array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
-                        */
-
-                       # Private use registry values:
-                       array( 'x-whatever', 'x-whatever' ),
-                       array( 'qaa-qaaa-qm-x-southern', 'qaa-Qaaa-QM-x-southern' ),
-                       array( 'de-qaaa'   , 'de-Qaaa'    ),
-                       array( 'sr-latn-qm', 'sr-Latn-QM' ),
-                       array( 'sr-qaaa-rs', 'sr-Qaaa-RS' ),
-
-                       # Tags that use extensions
-                       array( 'en-us-u-islamcal', 'en-US-u-islamcal' ),
-                       array( 'zh-cn-a-myext-x-private', 'zh-CN-a-myext-x-private' ),
-                       array( 'en-a-myext-b-another', 'en-a-myext-b-another' ),
-
-                       # Invalid:
-                       // de-419-DE
-                       // a-DE
-                       // ar-a-aaa-b-bbb-a-ccc
-       
-               /*      
-                       // ISO 15924 :
-                       array( 'sr-Cyrl', 'sr-Cyrl' ),
-                       # @todo FIXME: Fix our function?
-                       array( 'SR-lATN', 'sr-Latn' ),
-                       array( 'fr-latn', 'fr-Latn' ),
-                       // Use lowercase for single segment
-                       // ISO 3166-1-alpha-2 code
-                       array( 'US', 'us' ),  # USA
-                       array( 'uS', 'us' ),  # USA
-                       array( 'Fr', 'fr' ),  # France
-                       array( 'va', 'va' ),  # Holy See (Vatican City State)
-                */);
-       }
-
        /**
-        * @dataProvider provideMakeUrlIndex()
+        * @dataProvider provideMakeUrlIndexes()
         */
-       function testMakeUrlIndex( $url, $expected ) {
-               $index = wfMakeUrlIndex( $url );
-               $this->assertEquals( $expected, $index, "wfMakeUrlIndex(\"$url\")" );
+       function testMakeUrlIndexes( $url, $expected ) {
+               $index = wfMakeUrlIndexes( $url );
+               $this->assertEquals( $expected, $index, "wfMakeUrlIndexes(\"$url\")" );
        }
 
-       function provideMakeUrlIndex() {
+       function provideMakeUrlIndexes() {
                return array(
                        array(
                                // just a regular :)
                                'https://bugzilla.wikimedia.org/show_bug.cgi?id=28627',
-                               'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627'
+                               array( 'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627' )
                        ),
                        array(
                                // mailtos are handled special
                                // is this really right though? that final . probably belongs earlier?
                                'mailto:wiki@wikimedia.org',
-                               'mailto:org.wikimedia@wiki.',
+                               array( 'mailto:org.wikimedia@wiki.' )
                        ),
 
                        // file URL cases per bug 28627...
                        array(
                                // three slashes: local filesystem path Unix-style
                                'file:///whatever/you/like.txt',
-                               'file://./whatever/you/like.txt'
+                               array( 'file://./whatever/you/like.txt' )
                        ),
                        array(
                                // three slashes: local filesystem path Windows-style
                                'file:///c:/whatever/you/like.txt',
-                               'file://./c:/whatever/you/like.txt'
+                               array( 'file://./c:/whatever/you/like.txt' )
                        ),
                        array(
                                // two slashes: UNC filesystem path Windows-style
                                'file://intranet/whatever/you/like.txt',
-                               'file://intranet./whatever/you/like.txt'
+                               array( 'file://intranet./whatever/you/like.txt' )
                        ),
                        // Multiple-slash cases that can sorta work on Mozilla
                        // if you hack it just right are kinda pathological,
@@ -875,6 +551,15 @@ class GlobalTest extends MediaWikiTestCase {
                        //
                        // Those will survive the algorithm but with results that
                        // are less consistent.
+
+                       // protocol-relative URL cases per bug 29854...
+                       array(
+                               '//bugzilla.wikimedia.org/show_bug.cgi?id=28627',
+                               array(
+                                       'http://org.wikimedia.bugzilla./show_bug.cgi?id=28627',
+                                       'https://org.wikimedia.bugzilla./show_bug.cgi?id=28627'
+                               )
+                       ),
                );
        }
        
@@ -934,39 +619,6 @@ class GlobalTest extends MediaWikiTestCase {
                                "Called eval.php --help --test with wrapper and php option" ),
                );
        }
-
-       /**
-        * @dataProvider provideWfIsBadImageList
-        */
-       function testWfIsBadImage( $name, $title, $blacklist, $expected, $desc ) {
-               $this->assertEquals( $expected, wfIsBadImage( $name, $title, $blacklist ), $desc );
-       }
-
-       function provideWfIsBadImageList() {
-               $blacklist = '* [[File:Bad.jpg]] except [[Nasty page]]';
-               return array(
-                       array( 'Bad.jpg', false, $blacklist, true,
-                               'Called on a bad image' ),
-                       array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'A page' ), $blacklist, true,
-                               'Called on a bad image' ),
-                       array( 'NotBad.jpg', false, $blacklist, false,
-                               'Called on a non-bad image' ),
-                       array( 'Bad.jpg', Title::makeTitle( NS_MAIN, 'Nasty page' ), $blacklist, false,
-                               'Called on a bad image but is on a whitelisted page' ),
-                       array( 'File:Bad.jpg', false, $blacklist, false,
-                               'Called on a bad image with File:' ),
-               );
-       }
        /* TODO: many more! */
 }
 
-
-class MockOutputPage {
-       
-       public $message;
-       
-       function debug( $message ) {
-               $this->message = "JAJA is a stupid error message. Anyway, here's your message: $message";
-       }
-}
-