File: ScrambleMappingTest.php

package info (click to toggle)
mediawiki 1%3A1.43.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 417,464 kB
  • sloc: php: 1,062,949; javascript: 664,290; sql: 9,714; python: 5,458; xml: 3,489; sh: 1,131; makefile: 64
file content (41 lines) | stat: -rw-r--r-- 1,315 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?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 );
	}
}