Completed
Push — master ( 4c7c5e...a326b1 )
by Christian
07:05
created

RandomString::checkInputLength()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 5
nc 1
nop 1
crap 3
1
<?php
2
3
namespace Didatus\RandomString;
4
5
/**
6
 * Class RandomString
7
 * @package Didatus\RandomString
8
 */
9
class RandomString {
10
    /**
11
     * contains the list of characters to be used for random string generation
12
     * @var string
13
     */
14
    private $character_pool = '';
15
16
    /**
17
     * contains the list of characters to be excluded from random string generation
18
     * @var string
19
     */
20
    private $except_characters = '';
21
22
    private $calculated_character_pool = '';
23
24
    /**
25
     * defines wether a character is unique in a random string or not
26
     * @var bool
27
     */
28
    private $unique_characters = false;
29
30
    /**
31
     * RandomString constructor.
32
     * @param string $character_pool
33
     * @param string $except_characters
34
     * @param bool $unique_characters
35
     */
36 10
    public function __construct(
37
        string $character_pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
38
        string $except_characters = '',
39
        bool $unique_characters = false
40
    ) {
41 10
        $this->character_pool = $character_pool;
42 10
        $this->except_characters = $except_characters;
43 10
        $this->unique_characters = $unique_characters;
44 10
    }
45
46
    /**
47
     * generates one random string of $length and returns it
48
     * @param int $length
49
     * @return string
50
     * @throws CharacterPoolTooSmallException
51
     */
52 10
    public function getString(int $length = 10):string
53
    {
54 10
        $this->checkInputLength($length);
55 8
        $string_length = 0;
56 8
        $string = '';
57 8
        while ($string_length < $length)
58
        {
59 8
            $character = $this->getRandomCharacter();
60 8
            if ($this->unique_characters && $this->containsCharacter($string, $character)) {
61 1
                continue;
62
            }
63 8
            $string .= $character;
64 8
            $string_length = strlen($string);
65
        }
66
67 8
        return $string;
68
    }
69
70
    /**
71
     * generates a list of random strings of $length and returns it
72
     * @param $length
73
     * @param $count
74
     * @return array
75
     */
76 3
    public function getListOfString(int $length, int $count):array
77
    {
78 3
        $list_count = 0;
79 3
        for ($strings = []; $list_count < $count;)
80
        {
81 3
            $strings[] = $this->getString($length);
82 2
            $list_count = count($strings);
83
        }
84
85 2
        return $strings;
86
    }
87
88
    /**
89
     * provides a random character
90
     * @return string
91
     */
92 8
    private function getRandomCharacter():string
93
    {
94 8
        return $this->getCharacterPool()[rand(0, strlen($this->getCharacterPool()) - 1)];
95
    }
96
97
    /**
98
     * generates the character pool without character exceptions
99
     * @return string
100
     */
101 10
    private function getCharacterPool():string
102
    {
103 10
        if (empty($this->calculated_character_pool)) {
104 10
            $this->calculated_character_pool = implode(
105 10
                "",
106 10
                array_diff(str_split($this->character_pool), str_split($this->except_characters))
107
            );
108
        }
109
110 10
        return $this->calculated_character_pool;
111
    }
112
113
    /**
114
     * checks if the given string contains given character
115
     * @param $string
116
     * @param $character
117
     * @return bool
118
     */
119 1
    private function containsCharacter(string $string, string $character):bool
120
    {
121 1
        if (strpos($string, $character) !== false) {
122 1
            return true;
123
        }
124
125 1
        return false;
126
    }
127
128
    /**
129
     * checks wether the character pool is big enough for unique character string with given length or not
130
     * @param int $length
131
     * @throws CharacterPoolTooSmallException
132
     */
133 10
    private function checkInputLength(int $length):void
134
    {
135 10
        $character_pool_size = strlen($this->getCharacterPool());
136 10
        if ($this->unique_characters && $length > $character_pool_size) {
137 2
            throw new CharacterPoolTooSmallException(
138 2
                "Character pool of length " . $character_pool_size .
139 2
                " is too small to generate a random unique character string with length " . $length . "!"
140
            );
141
        }
142 8
    }
143
}
144