--- /dev/null
+<?php
+
+namespace Drupal\Component\Utility;
+
+/**
+ * Defines a utility class for creating random data.
+ */
+class Random {
+
+ /**
+ * The maximum number of times name() and string() can loop.
+ *
+ * This prevents infinite loops if the length of the random value is very
+ * small.
+ *
+ * @see \Drupal\Tests\Component\Utility\RandomTest
+ */
+ const MAXIMUM_TRIES = 100;
+
+ /**
+ * A list of unique strings generated by string().
+ *
+ * @var array
+ */
+ protected $strings = array();
+
+ /**
+ * A list of unique names generated by name().
+ *
+ * @var array
+ */
+ protected $names = array();
+
+ /**
+ * Generates a random string of ASCII characters of codes 32 to 126.
+ *
+ * The generated string includes alpha-numeric characters and common
+ * miscellaneous characters. Use this method when testing general input
+ * where the content is not restricted.
+ *
+ * @param int $length
+ * Length of random string to generate.
+ * @param bool $unique
+ * (optional) If TRUE ensures that the random string returned is unique.
+ * Defaults to FALSE.
+ * @param callable $validator
+ * (optional) A callable to validate the the string. Defaults to NULL.
+ *
+ * @return string
+ * Randomly generated string.
+ *
+ * @see \Drupal\Component\Utility\Random::name()
+ */
+ public function string($length = 8, $unique = FALSE, callable $validator = NULL) {
+ $counter = 0;
+
+ // Continue to loop if $unique is TRUE and the generated string is not
+ // unique or if $validator is a callable that returns FALSE. To generate a
+ // random string this loop must be carried out at least once.
+ do {
+ if ($counter == static::MAXIMUM_TRIES) {
+ throw new \RuntimeException('Unable to generate a unique random name');
+ }
+ $str = '';
+ for ($i = 0; $i < $length; $i++) {
+ $str .= chr(mt_rand(32, 126));
+ }
+ $counter++;
+
+ $continue = FALSE;
+ if ($unique) {
+ $continue = isset($this->strings[$str]);
+ }
+ if (!$continue && is_callable($validator)) {
+ // If the validator callback returns FALSE generate another random
+ // string.
+ $continue = !call_user_func($validator, $str);
+ }
+ } while ($continue);
+
+ if ($unique) {
+ $this->strings[$str] = TRUE;
+ }
+
+ return $str;
+ }
+
+ /**
+ * Generates a random string containing letters and numbers.
+ *
+ * The string will always start with a letter. The letters may be upper or
+ * lower case. This method is better for restricted inputs that do not
+ * accept certain characters. For example, when testing input fields that
+ * require machine readable values (i.e. without spaces and non-standard
+ * characters) this method is best.
+ *
+ * @param int $length
+ * Length of random string to generate.
+ * @param bool $unique
+ * (optional) If TRUE ensures that the random string returned is unique.
+ * Defaults to FALSE.
+ *
+ * @return string
+ * Randomly generated string.
+ *
+ * @see \Drupal\Component\Utility\Random::string()
+ */
+ public function name($length = 8, $unique = FALSE) {
+ $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
+ $max = count($values) - 1;
+ $counter = 0;
+
+ do {
+ if ($counter == static::MAXIMUM_TRIES) {
+ throw new \RuntimeException('Unable to generate a unique random name');
+ }
+ $str = chr(mt_rand(97, 122));
+ for ($i = 1; $i < $length; $i++) {
+ $str .= chr($values[mt_rand(0, $max)]);
+ }
+ $counter++;
+ } while ($unique && isset($this->names[$str]));
+
+ if ($unique) {
+ $this->names[$str] = TRUE;
+ }
+
+ return $str;
+ }
+
+ /**
+ * Generates a random PHP object.
+ *
+ * @param int $size
+ * The number of random keys to add to the object.
+ *
+ * @return \stdClass
+ * The generated object, with the specified number of random keys. Each key
+ * has a random string value.
+ */
+ public function object($size = 4) {
+ $object = new \stdClass();
+ for ($i = 0; $i < $size; $i++) {
+ $random_key = $this->name();
+ $random_value = $this->string();
+ $object->{$random_key} = $random_value;
+ }
+ return $object;
+ }
+
+}