Passed
Push — master ( 492f4c...0725f5 )
by Jakub
02:01
created

TAssertions::assertCount()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 4.8437

Importance

Changes 4
Bugs 0 Features 1
Metric Value
cc 4
eloc 8
c 4
b 0
f 1
nc 3
nop 2
dl 0
loc 11
ccs 5
cts 8
cp 0.625
crap 4.8437
rs 10
1
<?php
2
declare(strict_types=1);
3
4
namespace MyTester;
5
6
trait TAssertions
7
{
8
    /** @internal */
9
    protected int $taskCount = 0;
10
11
    /**
12
     * Prints result of a test
13
     *
14
     * @internal
15
     */
16
    protected function testResult(string $text, bool $success = true): void
17
    {
18 1
        $this->incCounter();
19 1
        if ($success) {
20 1
            return;
21
        }
22 1
        echo "Test $this->taskCount failed. $text\n";
23
    }
24
25
    /**
26
     * Increases task counter
27
     *
28
     * @internal
29
     */
30
    protected function incCounter(): void
31
    {
32 1
        $this->taskCount++;
33
    }
34
35
    /**
36
     * Resets task counter
37
     *
38
     * @internal
39
     */
40
    protected function resetCounter(): void
41
    {
42 1
        $this->taskCount = 0;
43
    }
44
45
    /**
46
     * @internal
47
     */
48
    protected function getCounter(): int
49
    {
50 1
        return $this->taskCount;
51
    }
52
53
    protected function showStringOrArray(string|array $variable): string
54
    {
55 1
        return (is_string($variable) ? $variable : "(array)");
56
    }
57
58
    /**
59
     * Tries an assertion
60
     */
61
    protected function assert(mixed $code, string $failureText = ""): void
62
    {
63 1
        $success = ($code == true);
64 1
        $message = "";
65 1
        if (!$code) {
66 1
            $message = ($failureText === "") ? "The assertion is not true." : $failureText;
67
        }
68 1
        $this->testResult($message, $success);
69
    }
70
71
    /**
72
     * Are both values same?
73
     */
74
    protected function assertSame(mixed $expected, mixed $actual): void
75
    {
76 1
        $success = ($expected == $actual);
77 1
        $message = ($success) ? "" : "The value is not $expected but $actual.";
78 1
        $this->testResult($message, $success);
79
    }
80
81
    /**
82
     * Are not both values same?
83
     */
84
    protected function assertNotSame(mixed $expected, mixed $actual): void
85
    {
86 1
        $success = ($expected !== $actual);
87 1
        $message = ($success) ? "" : "The value is $expected.";
88 1
        $this->testResult($message, $success);
89
    }
90
91
    /**
92
     * Is $actual greater than $expected?
93
     */
94
    protected function assertGreaterThan(int|float $expected, int|float $actual): void
95
    {
96 1
        $success = ($actual > $expected);
97 1
        $message = ($success) ? "" : "$actual is not greater than $expected.";
98 1
        $this->testResult($message, $success);
99
    }
100
101
    /**
102
     * Is $actual less than $expected?
103
     */
104
    protected function assertLessThan(int|float $expected, int|float $actual): void
105
    {
106 1
        $success = ($actual < $expected);
107 1
        $message = ($success) ? "" : "$actual is not less than $expected.";
108 1
        $this->testResult($message, $success);
109
    }
110
111
    /**
112
     * Is $actual equal to true?
113
     */
114
    protected function assertTrue(bool $actual): void
115
    {
116 1
        $success = ($actual);
117 1
        $message = ($success) ? "" : "The value is not true.";
118 1
        $this->testResult($message, $success);
119
    }
120
121
    /**
122
     * Is the expression true?
123
     */
124
    protected function assertTruthy(mixed $actual): void
125
    {
126 1
        $success = ($actual == true);
127 1
        $message = ($success) ? "" : "The expression is not true.";
128 1
        $this->testResult($message, $success);
129
    }
130
131
    /**
132
     * Is $actual equal to false?
133
     */
134
    protected function assertFalse(bool $actual): void
135
    {
136 1
        $success = (!$actual);
137 1
        $message = ($success) ? "" : "The value is not false.";
138 1
        $this->testResult($message, $success);
139
    }
140
141
    /**
142
     * Is the expression false?
143
     */
144
    protected function assertFalsey(mixed $actual): void
145
    {
146 1
        $success = ($actual == false);
147 1
        $message = ($success) ? "" : "The expression is not false.";
148 1
        $this->testResult($message, $success);
149
    }
150
151
    /**
152
     * Is the value null?
153
     */
154
    protected function assertNull(mixed $actual): void
155
    {
156 1
        $success = ($actual == null);
157 1
        $message = ($success) ? "" : "The value is not null.";
158 1
        $this->testResult($message, $success);
159
    }
160
161
    /**
162
     * Is not the value null?
163
     */
164
    protected function assertNotNull(mixed $actual): void
165
    {
166 1
        $success = ($actual !== null);
167 1
        $message = ($success) ? "" : "The value is null.";
168 1
        $this->testResult($message, $success);
169
    }
170
171
    /**
172
     * Does $actual contain $needle?
173
     */
174
    protected function assertContains(string|array $needle, string|array $actual): void
175
    {
176 1
        if (is_string($actual) && is_string($needle)) {
177 1
            $success = ($needle !== "" && str_contains($actual, $needle));
178 1
            $message = ($success) ? "" : "$needle is not in the variable.";
179 1
            $this->testResult($message, $success);
180 1
        } elseif (is_array($actual)) {
181 1
            $success = (in_array($needle, $actual));
182 1
            $message = ($success) ? "" : $this->showStringOrArray($needle) . " is not in the variable.";
183 1
            $this->testResult($message, $success);
184
        } else {
185 1
            $this->testResult($this->showStringOrArray($needle) . " is not in the variable.", false);
186
        }
187
    }
188
189
    /**
190
     * Does $actual not contain $needle?
191
     */
192
    protected function assertNotContains(string|array $needle, string|array $actual): void
193
    {
194 1
        if (is_string($actual) && is_string($needle)) {
195 1
            $success = ($needle === "" || !str_contains($actual, $needle));
196 1
            $message = ($success) ? "" : "$needle is in the variable.";
197 1
            $this->testResult($message, $success);
198 1
        } elseif (is_array($actual)) {
199 1
            $success = (!in_array($needle, $actual));
200 1
            $message = ($success) ? "" : $this->showStringOrArray($needle) . " is in the variable.";
201 1
            $this->testResult($message, $success);
202
        } else {
203 1
            $this->testResult($this->showStringOrArray($needle) . " is not in the variable.", false);
204
        }
205
    }
206
207
    /**
208
     * Does $value contain $count items?
209
     */
210
    protected function assertCount(int $count, string|array|\Countable $value): void
211
    {
212 1
        if (!is_array($value) && !$value instanceof \Countable) {
213
            trigger_error("Passing string as parameter \$value to " . __METHOD__ . " is deprecated", E_USER_DEPRECATED);
214
            $this->testResult("The variable is not array or countable object.", false);
215
            return;
216
        }
217 1
        $actual = count($value);
218 1
        $success = ($actual === $count);
219 1
        $message = ($success) ? "" : "Count of the variable is $actual.";
220 1
        $this->testResult($message, $success);
221
    }
222
223
    /**
224
     * Does $value not contain $count items?
225
     */
226
    protected function assertNotCount(int $count, string|array|\Countable $value): void
227
    {
228 1
        if (!is_array($value) && !$value instanceof \Countable) {
229
            trigger_error("Passing string as parameter \$value to " . __METHOD__ . " is deprecated", E_USER_DEPRECATED);
230
            $this->testResult("The variable is not array or countable object.", false);
231
            return;
232
        }
233 1
        $actual = count($value);
234 1
        $success = ($actual !== $count);
235 1
        $message = ($success) ? "" : "Count of the variable is $actual.";
236 1
        $this->testResult($message, $success);
237
    }
238
239
    /**
240
     * Is $value of type $type?
241
     */
242
    protected function assertType(string|object $type, mixed $value): void
243
    {
244
        if (
245 1
            in_array($type, [
246 1
            "array", "bool", "float", "int", "string", "null", "object", "resource",
247 1
            "scalar", "iterable", "callable",
248 1
            ], true)
249
        ) {
250 1
            $success = (call_user_func("is_$type", $value));
251 1
            $actual = gettype($value);
252 1
            $message = ($success) ? "" : "The variable is $actual.";
253 1
            $this->testResult($message, $success);
254 1
            return;
255
        }
256 1
        $success = ($value instanceof $type);
257 1
        $actual = get_debug_type($value);
258 1
        $message = ($success) ? "" : "The variable is instance of $actual.";
259 1
        $this->testResult($message, $success);
260
    }
261
262
    /**
263
     * Does the code throw the expected exception?
264
     *
265
     * @param class-string $className
266
     */
267
    protected function assertThrowsException(
268
        callable $callback,
269
        string $className,
270
        string $message = null,
271
        int $code = null
272
    ): void {
273 1
        $success = false;
274 1
        $errorMessage = "";
275 1
        $e = null;
276
        try {
277 1
            $callback();
278 1
        } catch (\Throwable $e) {
279 1
            if ($e instanceof $className) {
280
                if (
281 1
                    ($message === null || $e->getMessage() === $message) && ($code === null || $e->getCode() === $code)
282
                ) {
283 1
                    $success = true;
284
                }
285
            }
286
        }
287 1
        if (!$success) {
288 1
            if ($e === null) {
289 1
                $errorMessage = "The code does not throw any exception.";
290 1
            } elseif (!$e instanceof $className) {
291 1
                $errorMessage = "The code does not throw $className but " . get_class($e) . ".";
292 1
            } elseif ($message !== null && $message !== $e->getMessage()) {
293 1
                $errorMessage =
294 1
                    "The code does not throw an exception with message '$message' but '{$e->getMessage()}'.";
295 1
            } elseif ($code !== null && $code !== $e->getCode()) {
296 1
                $errorMessage = "The code does not throw an exception with code $code but {$e->getCode()}.";
297
            }
298
        }
299 1
        $this->testResult($errorMessage, $success);
300
    }
301
302
    /**
303
     * Is output of code $expected?
304
     */
305
    protected function assertOutput(callable $callback, string $expected): void
306
    {
307 1
        ob_start();
308 1
        $callback();
309
        /** @var string $output */
310 1
        $output = ob_get_clean();
311 1
        $success = ($expected == $output);
312 1
        $message = ($success) ? "" : "Output of code  is not '$expected' but '$output'.";
313 1
        $this->testResult($message, $success);
314
    }
315
}
316