Mercurial > hg > cmmr2012-drupal-site
diff core/tests/Drupal/Tests/Component/Utility/RandomTest.php @ 0:c75dbcec494b
Initial commit from drush-created site
author | Chris Cannam |
---|---|
date | Thu, 05 Jul 2018 14:24:15 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/tests/Drupal/Tests/Component/Utility/RandomTest.php Thu Jul 05 14:24:15 2018 +0000 @@ -0,0 +1,177 @@ +<?php + +namespace Drupal\Tests\Component\Utility; + +use Drupal\Component\Utility\Random; +use PHPUnit\Framework\TestCase; + +/** + * Tests random data generation. + * + * @group Utility + * + * @coversDefaultClass \Drupal\Component\Utility\Random + */ +class RandomTest extends TestCase { + + /** + * The first random string passed to the test callback. + * + * @see \Drupal\Tests\Component\Utility\RandomTest::_RandomStringValidate() + * + * @var string + */ + protected $firstStringGenerated = ''; + + /** + * Tests unique random string generation. + * + * @covers ::string + */ + public function testRandomStringUniqueness() { + $strings = []; + $random = new Random(); + for ($i = 0; $i <= 50; $i++) { + $str = $random->string(1, TRUE); + $this->assertFalse(isset($strings[$str]), 'Generated duplicate random string ' . $str); + $strings[$str] = TRUE; + } + } + + /** + * Tests unique random name generation. + * + * @covers ::name + */ + public function testRandomNamesUniqueness() { + $names = []; + $random = new Random(); + for ($i = 0; $i <= 10; $i++) { + $str = $random->name(1, TRUE); + $this->assertFalse(isset($names[$str]), 'Generated duplicate random name ' . $str); + $names[$str] = TRUE; + } + } + + /** + * Tests infinite loop prevention whilst generating random names. + * + * @covers ::name + */ + public function testRandomNameException() { + // There are fewer than 100 possibilities so an exception should occur to + // prevent infinite loops. + $random = new Random(); + if (method_exists($this, 'expectException')) { + $this->expectException(\RuntimeException::class); + } + else { + $this->setExpectedException(\RuntimeException::class); + } + for ($i = 0; $i <= 100; $i++) { + $str = $random->name(1, TRUE); + $names[$str] = TRUE; + } + } + + /** + * Tests infinite loop prevention whilst generating random strings. + * + * @covers ::string + */ + public function testRandomStringException() { + // There are fewer than 100 possibilities so an exception should occur to + // prevent infinite loops. + $random = new Random(); + if (method_exists($this, 'expectException')) { + $this->expectException(\RuntimeException::class); + } + else { + $this->setExpectedException(\RuntimeException::class); + } + for ($i = 0; $i <= 100; $i++) { + $str = $random->string(1, TRUE); + $names[$str] = TRUE; + } + } + + /** + * Tests random name generation if uniqueness is not enforced. + * + * @covers ::name + */ + public function testRandomNameNonUnique() { + // There are fewer than 100 possibilities if we were forcing uniqueness so + // exception would occur. + $random = new Random(); + for ($i = 0; $i <= 100; $i++) { + $random->name(1); + } + $this->assertTrue(TRUE, 'No exception thrown when uniqueness is not enforced.'); + } + + /** + * Tests random string if uniqueness is not enforced. + * + * @covers ::string + */ + public function testRandomStringNonUnique() { + // There are fewer than 100 possibilities if we were forcing uniqueness so + // exception would occur. + $random = new Random(); + for ($i = 0; $i <= 100; $i++) { + $random->string(1); + } + $this->assertTrue(TRUE, 'No exception thrown when uniqueness is not enforced.'); + } + + /** + * Tests random object generation to ensure the expected number of properties. + * + * @covers ::object + */ + public function testRandomObject() { + // For values of 0 and 1 \Drupal\Component\Utility\Random::object() will + // have different execution paths. + $random = new Random(); + for ($i = 0; $i <= 1; $i++) { + $obj = $random->object($i); + $this->assertEquals($i, count(get_object_vars($obj)), 'Generated random object has expected number of properties'); + } + } + + /** + * Tests random string validation callbacks. + * + * @covers ::string + */ + public function testRandomStringValidator() { + $random = new Random(); + $this->firstStringGenerated = ''; + $str = $random->string(1, TRUE, [$this, '_RandomStringValidate']); + $this->assertNotEquals($this->firstStringGenerated, $str); + } + + /** + * Callback for random string validation. + * + * @see \Drupal\Component\Utility\Random::name() + * @see \Drupal\Tests\Component\Utility\RandomTest::testRandomStringValidator() + * + * @param string $string + * The random string to validate. + * + * @return bool + * TRUE if the random string is valid, FALSE if not. + */ + public function _RandomStringValidate($string) { + // Return FALSE for the first generated string and any string that is the + // same, as the test expects a different string to be returned. + if (empty($this->firstStringGenerated) || $string == $this->firstStringGenerated) { + $this->firstStringGenerated = $string; + return FALSE; + } + return TRUE; + } + +}