More updates to stop using dev or alpha or beta versions.
[yaffs-website] / web / core / tests / Drupal / Tests / Component / Utility / RandomTest.php
1 <?php
2
3 namespace Drupal\Tests\Component\Utility;
4
5 use Drupal\Component\Utility\Random;
6 use PHPUnit\Framework\TestCase;
7
8 /**
9  * Tests random data generation.
10  *
11  * @group Utility
12  *
13  * @coversDefaultClass \Drupal\Component\Utility\Random
14  */
15 class RandomTest extends TestCase {
16
17   /**
18    * The first random string passed to the test callback.
19    *
20    * @see \Drupal\Tests\Component\Utility\RandomTest::_RandomStringValidate()
21    *
22    * @var string
23    */
24   protected $firstStringGenerated = '';
25
26   /**
27    * Tests unique random string generation.
28    *
29    * @covers ::string
30    */
31   public function testRandomStringUniqueness() {
32     $strings = [];
33     $random = new Random();
34     for ($i = 0; $i <= 50; $i++) {
35       $str = $random->string(1, TRUE);
36       $this->assertFalse(isset($strings[$str]), 'Generated duplicate random string ' . $str);
37       $strings[$str] = TRUE;
38     }
39   }
40
41   /**
42    * Tests unique random name generation.
43    *
44    * @covers ::name
45    */
46   public function testRandomNamesUniqueness() {
47     $names = [];
48     $random = new Random();
49     for ($i = 0; $i <= 10; $i++) {
50       $str = $random->name(1, TRUE);
51       $this->assertFalse(isset($names[$str]), 'Generated duplicate random name ' . $str);
52       $names[$str] = TRUE;
53     }
54   }
55
56   /**
57    * Tests infinite loop prevention whilst generating random names.
58    *
59    * @covers ::name
60    */
61   public function testRandomNameException() {
62     // There are fewer than 100 possibilities so an exception should occur to
63     // prevent infinite loops.
64     $random = new Random();
65     if (method_exists($this, 'expectException')) {
66       $this->expectException(\RuntimeException::class);
67     }
68     else {
69       $this->setExpectedException(\RuntimeException::class);
70     }
71     for ($i = 0; $i <= 100; $i++) {
72       $str = $random->name(1, TRUE);
73       $names[$str] = TRUE;
74     }
75   }
76
77   /**
78    * Tests infinite loop prevention whilst generating random strings.
79    *
80    * @covers ::string
81    */
82   public function testRandomStringException() {
83     // There are fewer than 100 possibilities so an exception should occur to
84     // prevent infinite loops.
85     $random = new Random();
86     if (method_exists($this, 'expectException')) {
87       $this->expectException(\RuntimeException::class);
88     }
89     else {
90       $this->setExpectedException(\RuntimeException::class);
91     }
92     for ($i = 0; $i <= 100; $i++) {
93       $str = $random->string(1, TRUE);
94       $names[$str] = TRUE;
95     }
96   }
97
98   /**
99    * Tests random name generation if uniqueness is not enforced.
100    *
101    * @covers ::name
102    */
103   public function testRandomNameNonUnique() {
104     // There are fewer than 100 possibilities if we were forcing uniqueness so
105     // exception would occur.
106     $random = new Random();
107     for ($i = 0; $i <= 100; $i++) {
108       $random->name(1);
109     }
110     $this->assertTrue(TRUE, 'No exception thrown when uniqueness is not enforced.');
111   }
112
113   /**
114    * Tests random string if uniqueness is not enforced.
115    *
116    * @covers ::string
117    */
118   public function testRandomStringNonUnique() {
119     // There are fewer than 100 possibilities if we were forcing uniqueness so
120     // exception would occur.
121     $random = new Random();
122     for ($i = 0; $i <= 100; $i++) {
123       $random->string(1);
124     }
125     $this->assertTrue(TRUE, 'No exception thrown when uniqueness is not enforced.');
126   }
127
128   /**
129    * Tests random object generation to ensure the expected number of properties.
130    *
131    * @covers ::object
132    */
133   public function testRandomObject() {
134     // For values of 0 and 1 \Drupal\Component\Utility\Random::object() will
135     // have different execution paths.
136     $random = new Random();
137     for ($i = 0; $i <= 1; $i++) {
138       $obj = $random->object($i);
139       $this->assertEquals($i, count(get_object_vars($obj)), 'Generated random object has expected number of properties');
140     }
141   }
142
143   /**
144    * Tests random string validation callbacks.
145    *
146    * @covers ::string
147    */
148   public function testRandomStringValidator() {
149     $random = new Random();
150     $this->firstStringGenerated = '';
151     $str = $random->string(1, TRUE, [$this, '_RandomStringValidate']);
152     $this->assertNotEquals($this->firstStringGenerated, $str);
153   }
154
155   /**
156    * Callback for random string validation.
157    *
158    * @see \Drupal\Component\Utility\Random::name()
159    * @see \Drupal\Tests\Component\Utility\RandomTest::testRandomStringValidator()
160    *
161    * @param string $string
162    *   The random string to validate.
163    *
164    * @return bool
165    *   TRUE if the random string is valid, FALSE if not.
166    */
167   public function _RandomStringValidate($string) {
168     // Return FALSE for the first generated string and any string that is the
169     // same, as the test expects a different string to be returned.
170     if (empty($this->firstStringGenerated) || $string == $this->firstStringGenerated) {
171       $this->firstStringGenerated = $string;
172       return FALSE;
173     }
174     return TRUE;
175   }
176
177 }