142 lines
4.1 KiB
PHP
142 lines
4.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Arokettu\Random\Tests;
|
|
|
|
use Error;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Random\Engine\Mt19937;
|
|
use Random\Engine\PcgOneseq128XslRr64;
|
|
use Random\Engine\Secure;
|
|
use Random\Engine\Xoshiro256StarStar;
|
|
use Random\Randomizer;
|
|
use RuntimeException;
|
|
use Throwable;
|
|
|
|
class DynamicPropertiesTest extends TestCase
|
|
{
|
|
use AssertRegexCompat;
|
|
|
|
public function testRandomizer(): void
|
|
{
|
|
try {
|
|
$r = new Randomizer();
|
|
$r->test = 123;
|
|
} catch (Throwable $e) {
|
|
self::assertEquals(
|
|
'Cannot create dynamic property Random\Randomizer::$test',
|
|
$e->getMessage()
|
|
);
|
|
self::assertEquals(Error::class, \get_class($e));
|
|
self::assertEquals(0, $e->getCode());
|
|
self::assertNull($e->getPrevious());
|
|
|
|
return;
|
|
}
|
|
|
|
throw new RuntimeException('Throwable expected'); // do not use expectException to test getPrevious()
|
|
}
|
|
|
|
public function testRandomizerNonexistent(): void
|
|
{
|
|
if (!\method_exists($this, 'expectWarning')) { // not PHPUnit 8/9
|
|
$this->markTestSkipped('PHPUnit is too old for this test');
|
|
}
|
|
|
|
$this->expectWarning();
|
|
$this->expectWarningMessage('Undefined property: Random\Randomizer::$test');
|
|
|
|
$r = new Randomizer();
|
|
self::assertNull(@$r->test);
|
|
$x = \strval($r->test); // trigger warning
|
|
}
|
|
|
|
public function testRandomizerIsset(): void
|
|
{
|
|
$r = new Randomizer();
|
|
self::assertTrue(isset($r->engine));
|
|
self::assertFalse(isset($r->test));
|
|
}
|
|
|
|
public function testSecure(): void
|
|
{
|
|
try {
|
|
$engine = new Secure();
|
|
$engine->test = 123;
|
|
} catch (Throwable $e) {
|
|
self::assertRegex(
|
|
'/^Cannot create dynamic property (?<classname>.*)::\\$test$/',
|
|
$e->getMessage()
|
|
);
|
|
self::assertEquals(Error::class, \get_class($e));
|
|
self::assertEquals(0, $e->getCode());
|
|
self::assertNull($e->getPrevious());
|
|
|
|
return;
|
|
}
|
|
|
|
throw new RuntimeException('Throwable expected'); // do not use expectException to test getPrevious()
|
|
}
|
|
|
|
public function testMt19937(): void
|
|
{
|
|
try {
|
|
$engine = new Mt19937();
|
|
$engine->test = 123;
|
|
} catch (Throwable $e) {
|
|
self::assertEquals(
|
|
'Cannot create dynamic property Random\Engine\Mt19937::$test',
|
|
$e->getMessage()
|
|
);
|
|
self::assertEquals(Error::class, \get_class($e));
|
|
self::assertEquals(0, $e->getCode());
|
|
self::assertNull($e->getPrevious());
|
|
|
|
return;
|
|
}
|
|
|
|
throw new RuntimeException('Throwable expected'); // do not use expectException to test getPrevious()
|
|
}
|
|
|
|
public function testPcgOneseq128XslRr64(): void
|
|
{
|
|
try {
|
|
$engine = new PcgOneseq128XslRr64();
|
|
$engine->test = 123;
|
|
} catch (Throwable $e) {
|
|
self::assertEquals(
|
|
'Cannot create dynamic property Random\Engine\PcgOneseq128XslRr64::$test',
|
|
$e->getMessage()
|
|
);
|
|
self::assertEquals(Error::class, \get_class($e));
|
|
self::assertEquals(0, $e->getCode());
|
|
self::assertNull($e->getPrevious());
|
|
|
|
return;
|
|
}
|
|
|
|
throw new RuntimeException('Throwable expected'); // do not use expectException to test getPrevious()
|
|
}
|
|
|
|
public function testXoshiro256StarStar(): void
|
|
{
|
|
try {
|
|
$engine = new Xoshiro256StarStar();
|
|
$engine->test = 123;
|
|
} catch (Throwable $e) {
|
|
self::assertEquals(
|
|
'Cannot create dynamic property Random\Engine\Xoshiro256StarStar::$test',
|
|
$e->getMessage()
|
|
);
|
|
self::assertEquals(Error::class, \get_class($e));
|
|
self::assertEquals(0, $e->getCode());
|
|
self::assertNull($e->getPrevious());
|
|
|
|
return;
|
|
}
|
|
|
|
throw new RuntimeException('Throwable expected'); // do not use expectException to test getPrevious()
|
|
}
|
|
}
|