MediaWiki  REL1_24
wfBaseConvertTest.php
Go to the documentation of this file.
00001 <?php
00006 class WfBaseConvertTest extends MediaWikiTestCase {
00007     public static function provideSingleDigitConversions() {
00008         return array(
00009             //      2    3    5    8   10   16   36
00010             array( '0', '0', '0', '0', '0', '0', '0' ),
00011             array( '1', '1', '1', '1', '1', '1', '1' ),
00012             array( '10', '2', '2', '2', '2', '2', '2' ),
00013             array( '11', '10', '3', '3', '3', '3', '3' ),
00014             array( '100', '11', '4', '4', '4', '4', '4' ),
00015             array( '101', '12', '10', '5', '5', '5', '5' ),
00016             array( '110', '20', '11', '6', '6', '6', '6' ),
00017             array( '111', '21', '12', '7', '7', '7', '7' ),
00018             array( '1000', '22', '13', '10', '8', '8', '8' ),
00019             array( '1001', '100', '14', '11', '9', '9', '9' ),
00020             array( '1010', '101', '20', '12', '10', 'a', 'a' ),
00021             array( '1011', '102', '21', '13', '11', 'b', 'b' ),
00022             array( '1100', '110', '22', '14', '12', 'c', 'c' ),
00023             array( '1101', '111', '23', '15', '13', 'd', 'd' ),
00024             array( '1110', '112', '24', '16', '14', 'e', 'e' ),
00025             array( '1111', '120', '30', '17', '15', 'f', 'f' ),
00026             array( '10000', '121', '31', '20', '16', '10', 'g' ),
00027             array( '10001', '122', '32', '21', '17', '11', 'h' ),
00028             array( '10010', '200', '33', '22', '18', '12', 'i' ),
00029             array( '10011', '201', '34', '23', '19', '13', 'j' ),
00030             array( '10100', '202', '40', '24', '20', '14', 'k' ),
00031             array( '10101', '210', '41', '25', '21', '15', 'l' ),
00032             array( '10110', '211', '42', '26', '22', '16', 'm' ),
00033             array( '10111', '212', '43', '27', '23', '17', 'n' ),
00034             array( '11000', '220', '44', '30', '24', '18', 'o' ),
00035             array( '11001', '221', '100', '31', '25', '19', 'p' ),
00036             array( '11010', '222', '101', '32', '26', '1a', 'q' ),
00037             array( '11011', '1000', '102', '33', '27', '1b', 'r' ),
00038             array( '11100', '1001', '103', '34', '28', '1c', 's' ),
00039             array( '11101', '1002', '104', '35', '29', '1d', 't' ),
00040             array( '11110', '1010', '110', '36', '30', '1e', 'u' ),
00041             array( '11111', '1011', '111', '37', '31', '1f', 'v' ),
00042             array( '100000', '1012', '112', '40', '32', '20', 'w' ),
00043             array( '100001', '1020', '113', '41', '33', '21', 'x' ),
00044             array( '100010', '1021', '114', '42', '34', '22', 'y' ),
00045             array( '100011', '1022', '120', '43', '35', '23', 'z' )
00046         );
00047     }
00048 
00052     public function testDigitToBase2( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00053         $this->assertSame( $base2, wfBaseConvert( $base3, '3', '2' ) );
00054         $this->assertSame( $base2, wfBaseConvert( $base5, '5', '2' ) );
00055         $this->assertSame( $base2, wfBaseConvert( $base8, '8', '2' ) );
00056         $this->assertSame( $base2, wfBaseConvert( $base10, '10', '2' ) );
00057         $this->assertSame( $base2, wfBaseConvert( $base16, '16', '2' ) );
00058         $this->assertSame( $base2, wfBaseConvert( $base36, '36', '2' ) );
00059     }
00060 
00064     public function testDigitToBase3( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00065         $this->assertSame( $base3, wfBaseConvert( $base2, '2', '3' ) );
00066         $this->assertSame( $base3, wfBaseConvert( $base5, '5', '3' ) );
00067         $this->assertSame( $base3, wfBaseConvert( $base8, '8', '3' ) );
00068         $this->assertSame( $base3, wfBaseConvert( $base10, '10', '3' ) );
00069         $this->assertSame( $base3, wfBaseConvert( $base16, '16', '3' ) );
00070         $this->assertSame( $base3, wfBaseConvert( $base36, '36', '3' ) );
00071     }
00072 
00076     public function testDigitToBase5( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00077         $this->assertSame( $base5, wfBaseConvert( $base2, '2', '5' ) );
00078         $this->assertSame( $base5, wfBaseConvert( $base3, '3', '5' ) );
00079         $this->assertSame( $base5, wfBaseConvert( $base8, '8', '5' ) );
00080         $this->assertSame( $base5, wfBaseConvert( $base10, '10', '5' ) );
00081         $this->assertSame( $base5, wfBaseConvert( $base16, '16', '5' ) );
00082         $this->assertSame( $base5, wfBaseConvert( $base36, '36', '5' ) );
00083     }
00084 
00088     public function testDigitToBase8( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00089         $this->assertSame( $base8, wfBaseConvert( $base2, '2', '8' ) );
00090         $this->assertSame( $base8, wfBaseConvert( $base3, '3', '8' ) );
00091         $this->assertSame( $base8, wfBaseConvert( $base5, '5', '8' ) );
00092         $this->assertSame( $base8, wfBaseConvert( $base10, '10', '8' ) );
00093         $this->assertSame( $base8, wfBaseConvert( $base16, '16', '8' ) );
00094         $this->assertSame( $base8, wfBaseConvert( $base36, '36', '8' ) );
00095     }
00096 
00100     public function testDigitToBase10( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00101         $this->assertSame( $base10, wfBaseConvert( $base2, '2', '10' ) );
00102         $this->assertSame( $base10, wfBaseConvert( $base3, '3', '10' ) );
00103         $this->assertSame( $base10, wfBaseConvert( $base5, '5', '10' ) );
00104         $this->assertSame( $base10, wfBaseConvert( $base8, '8', '10' ) );
00105         $this->assertSame( $base10, wfBaseConvert( $base16, '16', '10' ) );
00106         $this->assertSame( $base10, wfBaseConvert( $base36, '36', '10' ) );
00107     }
00108 
00112     public function testDigitToBase16( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00113         $this->assertSame( $base16, wfBaseConvert( $base2, '2', '16' ) );
00114         $this->assertSame( $base16, wfBaseConvert( $base3, '3', '16' ) );
00115         $this->assertSame( $base16, wfBaseConvert( $base5, '5', '16' ) );
00116         $this->assertSame( $base16, wfBaseConvert( $base8, '8', '16' ) );
00117         $this->assertSame( $base16, wfBaseConvert( $base10, '10', '16' ) );
00118         $this->assertSame( $base16, wfBaseConvert( $base36, '36', '16' ) );
00119     }
00120 
00124     public function testDigitToBase36( $base2, $base3, $base5, $base8, $base10, $base16, $base36 ) {
00125         $this->assertSame( $base36, wfBaseConvert( $base2, '2', '36' ) );
00126         $this->assertSame( $base36, wfBaseConvert( $base3, '3', '36' ) );
00127         $this->assertSame( $base36, wfBaseConvert( $base5, '5', '36' ) );
00128         $this->assertSame( $base36, wfBaseConvert( $base8, '8', '36' ) );
00129         $this->assertSame( $base36, wfBaseConvert( $base10, '10', '36' ) );
00130         $this->assertSame( $base36, wfBaseConvert( $base16, '16', '36' ) );
00131     }
00132 
00133     public function testLargeNumber() {
00134         $this->assertSame( '1100110001111010000000101110100', wfBaseConvert( 'sd89ys', 36, 2 ) );
00135         $this->assertSame( '11102112120221201101', wfBaseConvert( 'sd89ys', 36, 3 ) );
00136         $this->assertSame( '12003102232400', wfBaseConvert( 'sd89ys', 36, 5 ) );
00137         $this->assertSame( '14617200564', wfBaseConvert( 'sd89ys', 36, 8 ) );
00138         $this->assertSame( '1715274100', wfBaseConvert( 'sd89ys', 36, 10 ) );
00139         $this->assertSame( '663d0174', wfBaseConvert( 'sd89ys', 36, 16 ) );
00140     }
00141 
00142     public static function provideNumbers() {
00143         $x = array();
00144         $chars = '0123456789abcdefghijklmnopqrstuvwxyz';
00145         for ( $i = 0; $i < 50; $i++ ) {
00146             $base = mt_rand( 2, 36 );
00147             $len = mt_rand( 10, 100 );
00148 
00149             $str = '';
00150             for ( $j = 0; $j < $len; $j++ ) {
00151                 $str .= $chars[mt_rand( 0, $base - 1 )];
00152             }
00153 
00154             $x[] = array( $base, $str );
00155         }
00156 
00157         return $x;
00158     }
00159 
00163     public function testIdentity( $base, $number ) {
00164         $this->assertSame( $number, wfBaseConvert( $number, $base, $base, strlen( $number ) ) );
00165     }
00166 
00167     public function testInvalid() {
00168         $this->assertFalse( wfBaseConvert( '101', 1, 15 ) );
00169         $this->assertFalse( wfBaseConvert( '101', 15, 1 ) );
00170         $this->assertFalse( wfBaseConvert( '101', 37, 15 ) );
00171         $this->assertFalse( wfBaseConvert( '101', 15, 37 ) );
00172         $this->assertFalse( wfBaseConvert( 'abcde', 10, 11 ) );
00173         $this->assertFalse( wfBaseConvert( '12930', 2, 10 ) );
00174         $this->assertFalse( wfBaseConvert( '101', 'abc', 15 ) );
00175         $this->assertFalse( wfBaseConvert( '101', 15, 'abc' ) );
00176     }
00177 
00178     public function testPadding() {
00179         $number = "10101010101";
00180         $this->assertSame(
00181             strlen( $number ) + 5,
00182             strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) + 5 ) )
00183         );
00184         $this->assertSame(
00185             strlen( $number ),
00186             strlen( wfBaseConvert( $number, 2, 2, strlen( $number ) - 5 ) )
00187         );
00188     }
00189 
00190     public function testLeadingZero() {
00191         $this->assertSame( '24', wfBaseConvert( '010', 36, 16 ) );
00192         $this->assertSame( '37d4', wfBaseConvert( '0b10', 36, 16 ) );
00193         $this->assertSame( 'a734', wfBaseConvert( '0x10', 36, 16 ) );
00194     }
00195 }