Skip to content

Unify structure for ext/random's randomizer tests #9410

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 31, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions ext/random/tests/02_engine/all_serialize_native.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ $engines[] = new PcgOneseq128XslRr64(1234);
$engines[] = new Xoshiro256StarStar(1234);

foreach ($engines as $engine) {
echo $engine::class, PHP_EOL;

for ($i = 0; $i < 10_000; $i++) {
$engine->generate();
}
Expand All @@ -21,9 +23,7 @@ foreach ($engines as $engine) {

for ($i = 0; $i < 10_000; $i++) {
if ($engine->generate() !== $engine2->generate()) {
$className = $engine::class;

die("failure: {$className} at {$i}");
die("failure: state differs at {$i}");
}
}
}
Expand All @@ -32,4 +32,7 @@ die('success');

?>
--EXPECT--
Random\Engine\Mt19937
Random\Engine\PcgOneseq128XslRr64
Random\Engine\Xoshiro256StarStar
success
27 changes: 10 additions & 17 deletions ext/random/tests/02_engine/all_serialize_user.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,11 @@ Random: Engine: Serialization of user engines must preserve the sequence
<?php

use Random\Engine;
use Random\Engine\Test\TestShaEngine;

final class User64 implements Engine
{
private int $count = 0;

public function generate(): string
{
return pack('P*', ++$this->count);
}
}
require __DIR__ . "/../engines.inc";

final class User32 implements Engine
final class CountingEngine32 implements Engine
{
private int $count = 0;

Expand All @@ -26,12 +19,12 @@ final class User32 implements Engine
}

$engines = [];
if (PHP_INT_SIZE >= 8) {
$engines[] = new User64();
}
$engines[] = new User32();
$engines[] = new CountingEngine32();
$engines[] = new TestShaEngine();

foreach ($engines as $engine) {
echo $engine::class, PHP_EOL;

for ($i = 0; $i < 10_000; $i++) {
$engine->generate();
}
Expand All @@ -40,9 +33,7 @@ foreach ($engines as $engine) {

for ($i = 0; $i < 10_000; $i++) {
if ($engine->generate() !== $engine2->generate()) {
$className = $engine::class;

die("failure: {$className} at {$i}");
die("failure: state differs at {$i}");
}
}
}
Expand All @@ -51,4 +42,6 @@ die('success');

?>
--EXPECT--
CountingEngine32
Random\Engine\Test\TestShaEngine
success
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ try {

for ($i = 0; $i < 10_000; $i++) {
if ($engine->generate() !== $referenceEngine->generate()) {
die('failure: state changed');
die("failure: state differs at {$i}");
}
}

Expand Down
23 changes: 9 additions & 14 deletions ext/random/tests/02_engine/user_compatibility.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,25 @@ Random: Engine: Native engines can be wrapped without changing their sequence
use Random\Engine;
use Random\Engine\Mt19937;
use Random\Engine\PcgOneseq128XslRr64;
use Random\Engine\Test\TestWrapperEngine;
use Random\Engine\Xoshiro256StarStar;

class WrapperEngine implements Engine
{
public function __construct(private readonly Engine $engine)
{
}

public function generate(): string
{
return $this->engine->generate();
}
}
require __DIR__ . "/../engines.inc";

$engines = [];
$engines[] = new Mt19937(1234);
$engines[] = new PcgOneseq128XslRr64(1234);
$engines[] = new Xoshiro256StarStar(1234);

foreach ($engines as $engine) {
echo $engine::class, PHP_EOL;

$native_engine = clone $engine;
$user_engine = new WrapperEngine(clone $engine);
$user_engine = new TestWrapperEngine(clone $engine);

for ($i = 0; $i < 10_000; $i++) {
if ($native_engine->generate() !== $user_engine->generate()) {
$className = $engine::class;
die("failure: {$className} at {$i}");
die("failure: state differs at {$i}");
}
}
}
Expand All @@ -41,4 +33,7 @@ die('success');

?>
--EXPECT--
Random\Engine\Mt19937
Random\Engine\PcgOneseq128XslRr64
Random\Engine\Xoshiro256StarStar
success
12 changes: 6 additions & 6 deletions ext/random/tests/02_engine/xoshiro256starstar_seed.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,33 @@ Random: Engine: Xoshiro256StarStar: The seed parameter must work as expected
use Random\Engine\Xoshiro256StarStar;

echo "Random integer seed", PHP_EOL;
$engine = new Xoshiro256StarStar(\random_int(\PHP_INT_MIN, \PHP_INT_MAX));
$engine = new Xoshiro256StarStar(random_int(PHP_INT_MIN, PHP_INT_MAX));
echo PHP_EOL, PHP_EOL;

echo "Random string seed", PHP_EOL;
$engine = new Xoshiro256StarStar(\random_bytes(32));
$engine = new Xoshiro256StarStar(random_bytes(32));
echo PHP_EOL, PHP_EOL;

echo "Invalid data type", PHP_EOL;
try {
$engine = new Xoshiro256StarStar(1.0);
} catch (\Throwable $e) {
} catch (Throwable $e) {
echo $e->getMessage(), PHP_EOL;
}
echo PHP_EOL, PHP_EOL;

echo "Invalid string seed length", PHP_EOL;
try {
$engine = new Xoshiro256StarStar('foobar');
} catch (\Throwable $e) {
} catch (Throwable $e) {
echo $e->getMessage(), PHP_EOL;
}
echo PHP_EOL, PHP_EOL;

echo "Null seed", PHP_EOL;
try {
$engine = new Random\Engine\Xoshiro256StarStar(\str_repeat("\x00", 32));
} catch (\Throwable $e) {
$engine = new Xoshiro256StarStar(str_repeat("\x00", 32));
} catch (Throwable $e) {
echo $e->getMessage(), PHP_EOL;
}
echo PHP_EOL, PHP_EOL;
Expand Down
81 changes: 0 additions & 81 deletions ext/random/tests/03_randomizer/basic.phpt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
--TEST--
Random: Randomizer: pickArrayKeys
Random: Randomizer: The Mt19937 engine and pickArrayKeys are consistent with array_rand()
--FILE--
<?php

use Random\Engine\Mt19937;
use Random\Randomizer;

$map = ['foo' => 0, 'bar' => 1, 'baz' => 2];
$list = range(1, 10);

Expand All @@ -14,7 +17,7 @@ $mapPickTwoFunc = array_rand($map, 2);
$listPickOneFunc = array_rand($list, 1);
$listPickTwoFunc = array_rand($list, 2);

$randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234));
$randomizer = new Randomizer(new Mt19937(1234));

[$mapPickOneMethod] = $randomizer->pickArrayKeys($map, 1);
$mapPickTwoMethod = $randomizer->pickArrayKeys($map, 2);
Expand All @@ -24,25 +27,30 @@ $listPickTwoMethod = $randomizer->pickArrayKeys($list, 2);

if ($mapPickOneFunc !== $mapPickOneMethod) {
var_dump($mapPickOneFunc, $mapPickOneMethod);
die('failure mapPickOne');

die('failure: mapPickOne');
}

if ($mapPickTwoFunc !== $mapPickTwoMethod) {
var_dump($mapPickTwoFunc, $mapPickTwoMethod);
die('failure mapPickTwo');

die('failure: mapPickTwo');
}

if ($listPickOneFunc !== $listPickOneMethod) {
var_dump($listPickOneFunc, $listPickOneMethod);
die('failure listPickOne');

die('failure: listPickOne');
}

if ($listPickTwoFunc !== $listPickTwoMethod) {
var_dump($listPickTwoFunc, $listPickOneMethod);
die('failure listPickTwo');

die('failure: listPickTwo');
}

die('success');

?>
--EXPECTF--
--EXPECT--
success
24 changes: 0 additions & 24 deletions ext/random/tests/03_randomizer/compatibility_mt.phpt

This file was deleted.

49 changes: 49 additions & 0 deletions ext/random/tests/03_randomizer/compatibility_mt_rand.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
--TEST--
Random: Randomizer: The Mt19937 engine is a drop-in replacement for mt_rand()
--FILE--
<?php

use Random\Randomizer;
use Random\Engine\Mt19937;

echo "MT_RAND_PHP", PHP_EOL;

$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_PHP));
mt_srand(1234, MT_RAND_PHP);

for ($i = 0; $i < 10_000; $i++) {
if ($randomizer->nextInt() !== mt_rand()) {
die("failure: state differs at {$i} for nextInt()");
}
}

for ($i = 0; $i < 10_000; $i++) {
if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) {
die("failure: state differs at {$i} for getInt()");
}
}

echo "MT_RAND_MT19937", PHP_EOL;

$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_MT19937));
mt_srand(1234, MT_RAND_MT19937);

for ($i = 0; $i < 10_000; $i++) {
if ($randomizer->nextInt() !== mt_rand()) {
die("failure: state differs at {$i} for nextInt()");
}
}

for ($i = 0; $i < 10_000; $i++) {
if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) {
die("failure: state differs at {$i} for getInt()");
}
}

die('success');

?>
--EXPECT--
MT_RAND_PHP
MT_RAND_MT19937
success
Loading