/**
  * Tests totals of items that share amount discounts
  *
  * @covers ::discountAmount
  * @covers ::taxAmount
  * @covers ::total
  * @covers ::totalAfterTax
  * @covers ::totalAfterDiscount
  * @uses Blesta\Pricing\Collection\ItemPriceCollection
  * @uses Blesta\Pricing\Type\ItemPrice
  * @uses Blesta\Pricing\Modifier\DiscountPrice
  * @uses Blesta\Pricing\Modifier\TaxPrice
  * @uses Blesta\Pricing\Type\UnitPrice
  * @uses Blesta\Pricing\Modifier\AbstractPriceModifier::__construct
  */
 public function testMultipleDiscountTotals()
 {
     // Test two items with the same discount amounts
     $collection = new ItemPriceCollection();
     $discount1 = new DiscountPrice(5, 'amount');
     $discount2 = new DiscountPrice(10, 'amount');
     $item1 = new ItemPrice(10, 2);
     $item1->setDiscount($discount1);
     $item1->setDiscount($discount2);
     $item2 = new ItemPrice(100, 1);
     $item1->setDiscount($discount1);
     $item1->setDiscount($discount2);
     $collection->append($item1)->append($item2);
     $this->assertEquals(0, $collection->taxAmount());
     $this->assertEquals(15, $collection->discountAmount());
     $this->assertEquals(105, $collection->totalAfterDiscount());
     $this->assertEquals(120, $collection->totalAfterTax());
     $this->assertEquals(105, $collection->total());
     // Test multiple items with varying taxes/discounts
     $collection->remove($item1)->remove($item2);
     $this->assertEquals(0, $collection->count());
     $discount3 = new DiscountPrice(50, 'amount');
     $tax = new TaxPrice(20, 'exclusive');
     $item3 = new ItemPrice(10, 1);
     $item3->setDiscount(new DiscountPrice(10, 'percent'));
     $item3->setDiscount($discount3);
     $item3->setTax(new TaxPrice(10, 'exclusive'));
     $item3->setTax($tax);
     $item4 = new ItemPrice(1000, 2);
     $item4->setDiscount($discount3);
     $item4->setTax($tax);
     $collection->append($item3)->append($item4);
     $this->assertEquals(391.8, $collection->taxAmount());
     $this->assertEquals(51, $collection->discountAmount());
     $this->assertEquals(1959, $collection->totalAfterDiscount());
     $this->assertEquals(2401.8, $collection->totalAfterTax());
     $this->assertEquals(2350.8, $collection->total());
 }
Example #2
0
 /**
  * @covers ::total
  * @covers ::discountAmount
  * @covers ::amountDiscount
  * @covers ::amountDiscountAll
  * @uses Blesta\Pricing\Type\ItemPrice::__construct
  * @uses Blesta\Pricing\Type\ItemPrice::resetDiscountSubtotal
  * @uses Blesta\Pricing\Type\ItemPrice::setTax
  * @uses Blesta\Pricing\Type\ItemPrice::setDiscount
  * @uses Blesta\Pricing\Type\ItemPrice::totalAfterTax
  * @uses Blesta\Pricing\Type\ItemPrice::totalAfterDiscount
  * @uses Blesta\Pricing\Type\ItemPrice::taxAmount
  * @uses Blesta\Pricing\Type\ItemPrice::amountTax
  * @uses Blesta\Pricing\Type\ItemPrice::amountTaxAll
  * @uses Blesta\Pricing\Type\ItemPrice::compoundTaxAmount
  * @uses Blesta\Pricing\Type\ItemPrice::subtotal
  * @uses Blesta\Pricing\Modifier\AbstractPriceModifier::__construct
  * @uses Blesta\Pricing\Modifier\TaxPrice::__construct
  * @uses Blesta\Pricing\Modifier\TaxPrice::on
  * @uses Blesta\Pricing\Modifier\DiscountPrice::__construct
  * @uses Blesta\Pricing\Modifier\DiscountPrice::on
  * @uses Blesta\Pricing\Modifier\DiscountPrice::off
  * @uses Blesta\Pricing\Type\UnitPrice::__construct
  * @uses Blesta\Pricing\Type\UnitPrice::setPrice
  * @uses Blesta\Pricing\Type\UnitPrice::setQty
  * @uses Blesta\Pricing\Type\UnitPrice::setKey
  * @uses Blesta\Pricing\Type\UnitPrice::total
  */
 public function testTotal()
 {
     $item = new ItemPrice(10, 2);
     // Total is the subtotal when no taxes or discounts exist
     $this->assertEquals($item->subtotal(), $item->total());
     // Total is the total after tax when no discount exists
     $item->setTax(new TaxPrice(5.25, 'exclusive'));
     $this->assertEquals($item->totalAfterTax(), $item->total());
     // Total is the total after discount and tax
     $item->setDiscount(new DiscountPrice(50, 'percent'));
     $this->assertEquals($item->totalAfterDiscount() + $item->taxAmount(), $item->total());
 }