Completed
Push — master ( 10c034...2ec2dd )
by Jakub
02:06
created

TAssertions::assertTruthy()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

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