addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PROMOTIONAL, code: 'PROMO10', amount: 50.00 )); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PURCHASE, code: 'G1234', amount: 100.00 )); $this->assertEquals(150.0, $acceptedVouchers->getTotalDiscount()); $this->assertCount(2, $acceptedVouchers->getVouchers()); } public function testFilterVouchersByType(): void { $acceptedVouchers = new AcceptedVouchersDto(); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PROMOTIONAL, code: 'PROMO10', amount: 50.00 )); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PURCHASE, code: 'G1234', amount: 100.00 )); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_GOODWILL, code: 'K5678', amount: 75.00 )); $this->assertCount(1, $acceptedVouchers->getPromotionalVouchers()); $this->assertCount(1, $acceptedVouchers->getPurchaseVouchers()); $this->assertCount(1, $acceptedVouchers->getGoodwillVouchers()); } public function testHasVouchersReturnsFalseWhenEmpty(): void { $acceptedVouchers = new AcceptedVouchersDto(); $this->assertFalse($acceptedVouchers->hasVouchers()); $this->assertEquals(0, $acceptedVouchers->count()); } public function testHasVouchersReturnsTrueWhenNotEmpty(): void { $acceptedVouchers = new AcceptedVouchersDto(); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PROMOTIONAL, code: 'PROMO10', amount: 50.00 )); $this->assertTrue($acceptedVouchers->hasVouchers()); $this->assertEquals(1, $acceptedVouchers->count()); } public function testFloatPrecisionHandling(): void { $acceptedVouchers = new AcceptedVouchersDto(); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PROMOTIONAL, code: 'PROMO1', amount: 33.33 )); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PROMOTIONAL, code: 'PROMO2', amount: 33.33 )); $acceptedVouchers->addVoucher(new AcceptedVoucherDto( type: AcceptedVoucherDto::TYPE_PROMOTIONAL, code: 'PROMO3', amount: 33.34 )); // Should be exactly 100.00 with proper rounding $this->assertEquals(100.0, $acceptedVouchers->getTotalDiscount()); } }