Skip to content

Commit 30bc0da

Browse files
eaborodkinЕвгений Бородкин
and
Евгений Бородкин
authoredNov 27, 2024··
Fix incorrect Number ValueObject behavior (#53)
* Number ValueObject didn't work with negative numbers due to incorrect regex in the SanitizesNumbers::sanitize(). Now is fixed. * Tests for cases with various negative values of the Number ValueObjects were created. * Pint failure was fixed. --------- Co-authored-by: Евгений Бородкин <[email protected]>
1 parent d0a5370 commit 30bc0da

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed
 

‎src/Concerns/SanitizesNumbers.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ protected function sanitize(int|string|float|null $number): string
3131
}
3232

3333
return $number
34-
->replaceMatches('/[^0-9.]/', '')
34+
->replaceMatches('/(?!^-)[^0-9.]/', '')
3535
->toString();
3636
}
3737

‎tests/Unit/Primitive/NumberTest.php

+80
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,86 @@ class_uses_recursive(Number::class)
335335
$this->assertSame('1230.12', $number->value());
336336
});
337337

338+
test('number can accept negative integer', function () {
339+
$valueObject = new Number(-1);
340+
$this->assertSame('-1.00', $valueObject->value());
341+
$valueObject = new Number(-2);
342+
$this->assertSame('-2.00', $valueObject->value());
343+
});
344+
345+
test('number can cast negative value to integer', function () {
346+
$valueObject = new Number('-100');
347+
$this->assertSame(-100, $valueObject->asInteger());
348+
});
349+
350+
test('number can cast negative value to float', function () {
351+
$valueObject = new Number('-36000.50');
352+
$this->assertSame(-36000.50, $valueObject->asFloat());
353+
});
354+
355+
test('negative number as a big number', function () {
356+
$number = new Number('-20000.793', 3);
357+
$this->assertEquals(new BigNumber('-20000.793', 3, false), $number->asBigNumber());
358+
});
359+
360+
test('negative number can be divided using magic call', function () {
361+
$number = new Number('-20000.793', 4);
362+
$this->assertSame('-10000.3965', $number->divide(2));
363+
});
364+
365+
test('negative number can be multiplied using magic call', function () {
366+
$number = new Number('-20000.793', 3);
367+
$this->assertSame('-40001.586', $number->multiply(2));
368+
});
369+
370+
test('negative number strips zeros when the value starts from zero', function ($input, $result) {
371+
$valueObject = new Number($input);
372+
$this->assertSame($result, $valueObject->value());
373+
})->with([
374+
['-0000123.987', '-123.98'],
375+
['-0000123', '-123.00'],
376+
]);
377+
378+
test('negative number accepts formatted value', function ($input, $scale, $result) {
379+
$valueObject = new Number($input, $scale);
380+
$this->assertSame($result, $valueObject->value());
381+
})->with([
382+
['-1,230,00', 2, '-1230.00'],
383+
['-123.123.123,556', 3, '-123123123.556'],
384+
['-1 230,00', 2, '-1230.00'],
385+
['-777.7', 3, '-777.700'],
386+
]);
387+
388+
test('negative number fails when invalid text provided', function () {
389+
$this->expectException(\InvalidArgumentException::class);
390+
391+
new Number('-asd');
392+
});
393+
394+
test('negative number fails when empty string passed', function () {
395+
$this->expectException(\InvalidArgumentException::class);
396+
397+
new Number('-');
398+
});
399+
400+
test('negative number can change decimals as a string input', function ($input, $scale, $result) {
401+
$valueObject = new Number($input, $scale);
402+
$this->assertSame($result, $valueObject->value());
403+
})->with([
404+
['-111777999.97', 2, '-111777999.97'],
405+
['-111777999,97', 2, '-111777999.97'],
406+
['-7.99', 3, '-7.990'],
407+
['-71.1', 5, '-71.10000'],
408+
]);
409+
410+
test('negative number can handle huge numbers', function ($input, $scale, $result) {
411+
$valueObject = new Number($input, $scale);
412+
$this->assertSame($result, $valueObject->value());
413+
})->with([
414+
['-9876543210111777999.9087', 2, '-9876543210111777999.90'],
415+
['-98765432101117779990000.9087', 1, '-98765432101117779990000.9'],
416+
]);
417+
338418
class TestNumber extends Number
339419
{
340420
public function __construct(int|string|float $number, protected int $scale = 2)

0 commit comments

Comments
 (0)
Please sign in to comment.