Passed
Pull Request — master (#534)
by
unknown
02:54
created

NumberTest::getDifferentRuleInHandlerItems()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Validator\Tests\Rule;
6
7
use stdClass;
8
use Yiisoft\Validator\Rule\Integer;
9
use Yiisoft\Validator\Rule\Number;
10
use Yiisoft\Validator\Tests\Rule\Base\RuleTestCase;
11
use Yiisoft\Validator\Tests\Rule\Base\RuleWithOptionsTestTrait;
12
use Yiisoft\Validator\Tests\Rule\Base\SkipOnErrorTestTrait;
13
use Yiisoft\Validator\Tests\Rule\Base\WhenTestTrait;
14
15
final class NumberTest extends RuleTestCase
16
{
17
    use RuleWithOptionsTestTrait;
18
    use SkipOnErrorTestTrait;
19
    use WhenTestTrait;
20
21
    public function testGetName(): void
22
    {
23
        $rule = new Number();
24
        $this->assertSame('number', $rule->getName());
25
    }
26
27
    public function dataOptions(): array
28
    {
29
        return [
30
            [
31
                new Number(),
32
                [
33
                    'min' => null,
34
                    'max' => null,
35
                    'incorrectInputMessage' => [
36
                        'template' => 'The allowed types are integer, float and string.',
37
                        'parameters' => [],
38
                    ],
39
                    'notNumberMessage' => [
40
                        'template' => 'Value must be a number.',
41
                        'parameters' => [],
42
                    ],
43
                    'tooSmallMessage' => [
44
                        'template' => 'Value must be no less than {min}.',
45
                        'parameters' => ['min' => null],
46
                    ],
47
                    'tooBigMessage' => [
48
                        'template' => 'Value must be no greater than {max}.',
49
                        'parameters' => ['max' => null],
50
                    ],
51
                    'skipOnEmpty' => false,
52
                    'skipOnError' => false,
53
                    'pattern' => '/^\s*[-+]?\d*\.?\d+([eE][-+]?\d+)?\s*$/',
54
                ],
55
            ],
56
            [
57
                new Number(min: 1),
58
                [
59
                    'min' => 1,
60
                    'max' => null,
61
                    'incorrectInputMessage' => [
62
                        'template' => 'The allowed types are integer, float and string.',
63
                        'parameters' => [],
64
                    ],
65
                    'notNumberMessage' => [
66
                        'template' => 'Value must be a number.',
67
                        'parameters' => [],
68
                    ],
69
                    'tooSmallMessage' => [
70
                        'template' => 'Value must be no less than {min}.',
71
                        'parameters' => ['min' => 1],
72
                    ],
73
                    'tooBigMessage' => [
74
                        'template' => 'Value must be no greater than {max}.',
75
                        'parameters' => ['max' => null],
76
                    ],
77
                    'skipOnEmpty' => false,
78
                    'skipOnError' => false,
79
                    'pattern' => '/^\s*[-+]?\d*\.?\d+([eE][-+]?\d+)?\s*$/',
80
                ],
81
            ],
82
            [
83
                new Number(max: 1),
84
                [
85
                    'min' => null,
86
                    'max' => 1,
87
                    'incorrectInputMessage' => [
88
                        'template' => 'The allowed types are integer, float and string.',
89
                        'parameters' => [],
90
                    ],
91
                    'notNumberMessage' => [
92
                        'template' => 'Value must be a number.',
93
                        'parameters' => [],
94
                    ],
95
                    'tooSmallMessage' => [
96
                        'template' => 'Value must be no less than {min}.',
97
                        'parameters' => ['min' => null],
98
                    ],
99
                    'tooBigMessage' => [
100
                        'template' => 'Value must be no greater than {max}.',
101
                        'parameters' => ['max' => 1],
102
                    ],
103
                    'skipOnEmpty' => false,
104
                    'skipOnError' => false,
105
                    'pattern' => '/^\s*[-+]?\d*\.?\d+([eE][-+]?\d+)?\s*$/',
106
                ],
107
            ],
108
            [
109
                new Number(min: 2, max: 10),
110
                [
111
                    'min' => 2,
112
                    'max' => 10,
113
                    'incorrectInputMessage' => [
114
                        'template' => 'The allowed types are integer, float and string.',
115
                        'parameters' => [],
116
                    ],
117
                    'notNumberMessage' => [
118
                        'template' => 'Value must be a number.',
119
                        'parameters' => [],
120
                    ],
121
                    'tooSmallMessage' => [
122
                        'template' => 'Value must be no less than {min}.',
123
                        'parameters' => ['min' => 2],
124
                    ],
125
                    'tooBigMessage' => [
126
                        'template' => 'Value must be no greater than {max}.',
127
                        'parameters' => ['max' => 10],
128
                    ],
129
                    'skipOnEmpty' => false,
130
                    'skipOnError' => false,
131
                    'pattern' => '/^\s*[-+]?\d*\.?\d+([eE][-+]?\d+)?\s*$/',
132
                ],
133
            ],
134
            [
135
                new Integer(),
136
                [
137
                    'min' => null,
138
                    'max' => null,
139
                    'incorrectInputMessage' => [
140
                        'template' => 'The allowed types are integer, float and string.',
141
                        'parameters' => [],
142
                    ],
143
                    'notNumberMessage' => [
144
                        'template' => 'Value must be an integer.',
145
                        'parameters' => [],
146
                    ],
147
                    'tooSmallMessage' => [
148
                        'template' => 'Value must be no less than {min}.',
149
                        'parameters' => ['min' => null],
150
                    ],
151
                    'tooBigMessage' => [
152
                        'template' => 'Value must be no greater than {max}.',
153
                        'parameters' => ['max' => null],
154
                    ],
155
                    'skipOnEmpty' => false,
156
                    'skipOnError' => false,
157
                    'pattern' => '/^\s*[+-]?\d+\s*$/',
158
                ],
159
            ],
160
        ];
161
    }
162
163
    public function dataValidationPassed(): array
164
    {
165
        return [
166
            [20, [new Number()]],
167
            [0, [new Number()]],
168
            [.5, [new Number()]],
169
            [-20, [new Number()]],
170
            ['20', [new Number()]],
171
            [25.45, [new Number()]],
172
            ['25,45', [new Number()]],
173
            ['-1.23', [new Number()]],
174
            ['-4.423e-12', [new Number()]],
175
            ['12E3', [new Number()]],
176
177
            [20, [new Integer()]],
178
            [0, [new Integer()]],
179
            ['20', [new Integer()]],
180
            ['020', [new Integer()]],
181
            [0x14, [new Integer()]],
182
            ['5.5e1', [new Number()]],
183
184
            [1, [new Number(min: 1)]],
185
            [PHP_INT_MAX + 1, [new Number(min: 1)]],
186
187
            [1, [new Integer(min: 1)]],
188
189
            [1, [new Number(max: 1)]],
190
            [1, [new Number(max: 1.25)]],
191
            ['22e-12', [new Number(max: 1.25)]],
192
            ['125e-2', [new Number(max: 1.25)]],
193
            [1, [new Integer(max: 1.25)]],
194
195
            [0, [new Number(min: -10, max: 20)]],
196
            [-10, [new Number(min: -10, max: 20)]],
197
198
            [0, [new Integer(min: -10, max: 20)]],
199
        ];
200
    }
201
202
    public function dataValidationFailed(): array
203
    {
204
        $incorrectInputMessage = 'The allowed types are integer, float and string.';
205
        $notNumberMessage = 'Value must be a number.';
206
        $notIntegerMessage = 'Value must be an integer.';
207
208
        return [
209
            [false, [new Number()], ['' => [$incorrectInputMessage]]],
210
            [true, [new Number()], ['' => [$incorrectInputMessage]]],
211
            [[1, 2, 3], [new Number()], ['' => [$incorrectInputMessage]]],
212
            [new stdClass(), [new Number()], ['' => [$incorrectInputMessage]]],
213
            [fopen('php://stdin', 'rb'), [new Number()], ['' => [$incorrectInputMessage]]],
214
215
            ['12:45', [new Number()], ['' => [$notNumberMessage]]],
216
            ['e12', [new Number()], ['' => [$notNumberMessage]]],
217
            ['-e3', [new Number()], ['' => [$notNumberMessage]]],
218
            ['-4.534-e-12', [new Number()], ['' => [$notNumberMessage]]],
219
            ['12.23^4', [new Number()], ['' => [$notNumberMessage]]],
220
            ['43^32', [new Number()], ['' => [$notNumberMessage]]],
221
222
            [25.45, [new Integer()], ['' => [$notIntegerMessage]]],
223
            ['25,45', [new Integer()], ['' => [$notIntegerMessage]]],
224
            ['0x14', [new Integer()], ['' => [$notIntegerMessage]]],
225
226
            ['-1.23', [new Integer()], ['' => [$notIntegerMessage]]],
227
            ['-4.423e-12', [new Integer()], ['' => [$notIntegerMessage]]],
228
            ['12E3', [new Integer()], ['' => [$notIntegerMessage]]],
229
            ['e12', [new Integer()], ['' => [$notIntegerMessage]]],
230
            ['-e3', [new Integer()], ['' => [$notIntegerMessage]]],
231
            ['-4.534-e-12', [new Integer()], ['' => [$notIntegerMessage]]],
232
            ['12.23^4', [new Integer()], ['' => [$notIntegerMessage]]],
233
234
            [-1, [new Number(min: 1)], ['' => ['Value must be no less than 1.']]],
235
            ['22e-12', [new Number(min: 1)], ['' => ['Value must be no less than 1.']]],
236
237
            [-1, [new Integer(min: 1)], ['' => ['Value must be no less than 1.']]],
238
            ['22e-12', [new Integer(min: 1)], ['' => [$notIntegerMessage]]],
239
            [1.5, [new Number(max: 1.25)], ['' => ['Value must be no greater than 1.25.']]],
240
241
            // TODO: fix wrong message
242
            [1.5, [new Integer(max: 1.25)], ['' => [$notIntegerMessage]]],
243
            ['22e-12', [new Integer(max: 1.25)], ['' => [$notIntegerMessage]]],
244
            ['125e-2', [new Integer(max: 1.25)], ['' => [$notIntegerMessage]]],
245
246
            [-11, [new Number(min: -10, max: 20)], ['' => ['Value must be no less than -10.']]],
247
            [21, [new Number(min: -10, max: 20)], ['' => ['Value must be no greater than 20.']]],
248
            [-11, [new Integer(min: -10, max: 20)], ['' => ['Value must be no less than -10.']]],
249
            [22, [new Integer(min: -10, max: 20)], ['' => ['Value must be no greater than 20.']]],
250
            ['20e-1', [new Integer(min: -10, max: 20)], ['' => [$notIntegerMessage]]],
251
            'custom error' => [
252
                0,
253
                [new Number(min: 5, tooSmallMessage: 'Value is too small.')],
254
                ['' => ['Value is too small.']],
255
            ],
256
        ];
257
    }
258
259
    public function testSkipOnError(): void
260
    {
261
        $this->testSkipOnErrorInternal(new Number(), new Number(skipOnError: true));
262
    }
263
264
    public function testWhen(): void
265
    {
266
        $when = static fn (mixed $value): bool => $value !== null;
267
        $this->testWhenInternal(new Number(), new Number(when: $when));
268
    }
269
}
270