wiki.techinc.nl/tests/phpunit/unit/includes/user/TempUser/ScrambleMappingTest.php
Daimona Eaytoy 4637824f68 Replace unchecked MWException with SPL exceptions
Bug: T328220
Change-Id: I4e0454ce3ad3741756e2010a76e548d6c9a6bcb5
2024-01-28 22:41:46 +01:00

41 lines
1.3 KiB
PHP

<?php
namespace MediaWiki\Tests\User\TempUser;
use MediaWiki\User\TempUser\ScrambleMapping;
use OutOfBoundsException;
use PHPUnit\Framework\TestCase;
/**
* @covers \MediaWiki\User\TempUser\ScrambleMapping
*/
class ScrambleMappingTest extends TestCase {
public function testMap() {
if ( !extension_loaded( 'gmp' ) && !extension_loaded( 'bcmath' ) ) {
$this->markTestSkipped( 'need extension gmp or bcmath' );
}
$map = new ScrambleMapping( [] );
$duplicates = 0;
// This has been verified up to 1e8 but for CI purposes we will use 200
$n = 200;
// Make a bit array for duplicate detection, with enough space for one extra digit
$bitArray = str_repeat( "\0", $n * 10 / 8 );
for ( $i = 0; $i < $n; $i++ ) {
$value = (int)$map->getSerialIdForIndex( $i );
$minor = $value % 8;
$major = ( $value - $minor ) / 8;
$prevBits = ord( $bitArray[$major] );
$prevStatus = ( $prevBits & ( 1 << $minor ) );
$duplicates += ( $prevStatus ? 1 : 0 );
$newBits = $prevBits | ( 1 << $minor );
$bitArray[$major] = chr( $newBits );
}
$this->assertSame( 0, $duplicates, 'duplicate detected' );
}
public function testOffsetTooLarge() {
$map = new ScrambleMapping( [ 'offset' => 10 ] );
$this->expectException( OutOfBoundsException::class );
$map->getSerialIdForIndex( 1 );
}
}