public function testSplitPercentages() { $money = new Money(1200, 'USD'); list($first, $second, $third) = $money->split([60, 30, 10]); $this->assertEquals(720, $first->getAmount()); $this->assertEquals(360, $second->getAmount()); $this->assertEquals(120, $third->getAmount()); $money = new Money(1200, 'USD'); $aThird = 100 / 3; $twoThirds = 200 / 3; list($first, $second) = $money->split([$twoThirds, $aThird]); $this->assertEquals(800, $first->getAmount()); $this->assertEquals(400, $second->getAmount()); $money = new Money(100, 'USD'); list($first, $second) = $money->split([$twoThirds, $aThird]); $this->assertEquals(66.67, $first->getAmount()); $this->assertEquals(33.33, $second->getAmount()); list($first, $second, $third) = $money->split([$aThird, $aThird, $aThird]); $this->assertEquals(33.33, $first->getAmount()); $this->assertEquals(33.33, $second->getAmount()); $this->assertEquals(33.34, $third->getAmount()); $money = new Money(100, 'USD'); list($first, $second) = $money->split([$twoThirds, $aThird], false); $this->assertEquals(66.66666666666667, $first->getAmount()); $this->assertEquals(33.333333333333336, $second->getAmount()); $money = new Money(100, 'JPY'); list($first, $second) = $money->split([$twoThirds, $aThird]); $this->assertEquals(67, $first->getAmount()); $this->assertEquals(33, $second->getAmount()); list($first, $second, $third) = $money->split([$aThird, $aThird]); $this->assertEquals(33, $first->getAmount()); $this->assertEquals(33, $second->getAmount()); $this->assertEquals(34, $third->getAmount()); $money = new Money(100, 'USD'); list($first, $second, $third) = $money->split([$aThird, $aThird]); $this->assertEquals(33.33, $first->getAmount()); $this->assertEquals(33.33, $second->getAmount()); $this->assertEquals(33.34, $third->getAmount()); list($first, $second, $third) = $money->split([$aThird, $aThird], false); $this->assertEquals(33.333333333333336, $first->getAmount()); $this->assertEquals(33.333333333333336, $second->getAmount()); $this->assertEquals(33.333333333333336, $third->getAmount()); $this->expectException(InvalidArgumentException::class); $money->split([60, 30, 20]); }
/** * @param Money $money */ private function assertCurrencyMatches(Money $money) { if ($this->currency !== $money->getCurrency()) { throw new DomainException('Currencies must match'); } }