diff --git a/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php b/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php index 75d478bcc..150c40390 100644 --- a/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php +++ b/src/MoneyBundle/Form/DataTransformer/ViewTransformer.php @@ -33,18 +33,18 @@ public function __construct(Currency $currency) public function transform($value) { if ($value instanceof Money) { - return $value->getAmount() / 100; + return (float) ($value->getAmount() / 100); } - return 0; + return 0.0; } public function reverseTransform($value): Money { - if (null === $value) { + if (!is_numeric($value)) { $value = 0; } - return new Money(((int) $value * 100), $this->currency); + return new Money($value * 100, $this->currency); } } diff --git a/src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php b/src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php new file mode 100644 index 000000000..cc9efd544 --- /dev/null +++ b/src/MoneyBundle/Tests/Form/DataTransformer/ViewTransformerTest.php @@ -0,0 +1,78 @@ +currency = new Currency("USD"); + $this->viewTransformer = new ViewTransformer($this->currency); + } + + /** + * @dataProvider reverseTransformDataProvider + */ + public function testReverseTransform(?float $value, int $expected): void + { + $expectedResult = new Money($expected, $this->currency); + $result = $this->viewTransformer->reverseTransform($value); + + self::assertTrue($result->equals($expectedResult)); + } + + /** + * @param Money|string|null $money + * @param int|float $expected + * + * @dataProvider transformDataProvider + */ + public function testTransformsMoneyObjectToFloat($money, $expected): void + { + $value = $this->viewTransformer->transform($money); + + self::assertSame($expected, $value); + } + + public function reverseTransformDataProvider(): iterable + { + yield [null, 0]; + yield [10, 1000]; + yield [10.00, 1000]; + yield [10.01, 1001]; + yield [10.10, 1010]; + yield [10.11, 1011]; + yield [10.99, 1099]; + yield [111, 11100]; + yield [111.11, 11111]; + yield [0.01, 1]; + yield [0.10, 10]; + yield [0.11, 11]; + yield [0.99, 99]; + } + + public function transformDataProvider(): iterable + { + yield [null, 0.0]; + yield ['something else', 0.0]; + yield [1.0, 0.0]; + yield [new Money(1500, new Currency('USD')), 15.0]; + yield [new Money(1000, new Currency('USD')), 10.0]; + yield [new Money(100, new Currency('USD')), 1.0]; + yield [new Money(10, new Currency('USD')), 0.10]; + yield [new Money(1, new Currency('USD')), 0.01]; + yield [new Money(0, new Currency('USD')), 0.0]; + } +}