MediaWiki
REL1_24
|
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 }