Random: fixed nextSignedInt() not actually returning signed ints

closes #4646
closes #4645

Impact assessment by core usage search and poggit suggests that the impact of this change will be close to zero.
However, since it changes behaviour which plugins might be unknowingly relying on, it's going into 4.1 rather than a patch release.
This commit is contained in:
Dylan K. Taylor 2021-12-15 00:59:10 +00:00
parent 49a8afd126
commit 60938c8c9d
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
2 changed files with 44 additions and 1 deletions

View File

@ -94,7 +94,7 @@ class Random{
$this->z = $this->w;
$this->w = ($this->w ^ (($this->w >> 19) & 0x7fffffff) ^ ($t ^ (($t >> 8) & 0x7fffffff))) & 0xffffffff;
return $this->w;
return Binary::signInt($this->w);
}
/**

View File

@ -0,0 +1,43 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\utils;
use PHPUnit\Framework\TestCase;
class RandomTest extends TestCase{
public function testNextSignedIntReturnsSignedInts() : void{
//use a known seed which should definitely produce negatives
$random = new Random(0);
$negatives = false;
for($i = 0; $i < 100; ++$i){
if($random->nextSignedInt() < 0){
$negatives = true;
break;
}
}
self::assertTrue($negatives);
}
}