Random.generate().phpt 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. /**
  3. * Test: Nette\Utils\Random::generate()
  4. */
  5. declare(strict_types=1);
  6. use Nette\Utils\Random;
  7. use Tester\Assert;
  8. require __DIR__ . '/../bootstrap.php';
  9. Assert::same(10, strlen(Random::generate()));
  10. Assert::same(5, strlen(Random::generate(5)));
  11. Assert::same(200, strlen(Random::generate(200)));
  12. Assert::truthy(preg_match('#^[0-9a-z]+$#', Random::generate()));
  13. Assert::truthy(preg_match('#^[0-9]+$#', Random::generate(1000, '0-9')));
  14. Assert::truthy(preg_match('#^[0a-z12]+$#', Random::generate(1000, '0a-z12')));
  15. Assert::truthy(preg_match('#^[-a]+$#', Random::generate(1000, '-a')));
  16. Assert::exception(
  17. fn() => Random::generate(0),
  18. Nette\InvalidArgumentException::class,
  19. 'Length must be greater than zero.',
  20. );
  21. Assert::exception(
  22. fn() => Random::generate(1, '000'),
  23. Nette\InvalidArgumentException::class,
  24. 'Character list must contain at least two chars.',
  25. );
  26. // frequency check
  27. $phpdbgLog = defined('PHPDBG_VERSION') && @phpdbg_end_oplog(); // memory leak workaround
  28. $length = (int) 1e6;
  29. $delta = 0.1;
  30. $s = Nette\Utils\Random::generate($length, "\x01-\xFF");
  31. $freq = count_chars($s);
  32. Assert::same(0, $freq[0]);
  33. for ($i = 1; $i < 255; $i++) {
  34. Assert::true($freq[$i] < $length / 255 * (1 + $delta) && $freq[$i] > $length / 255 * (1 - $delta));
  35. }
  36. if ($phpdbgLog) {
  37. phpdbg_start_oplog();
  38. }