Supermarket Pricing

Level: Advanced 60–90 min

Concepts: Business LogicDesign PatternsIncremental DesignEdge Cases

Solutions: C# | TypeScript | Python


Build a checkout system for a supermarket that handles multiple pricing strategies.

Requirements

Step 1: Simple Pricing

Items have a unit price. Scanning items adds them to the total.

ItemUnit Price
A$50
B$30
C$20
D$15

Scanning A, B, A → total $130.

Step 2: Multi-Buy Discounts

Some items have special pricing when bought in bulk:

ItemUnit PriceSpecial
A$503 for $130
B$302 for $45
C$20
D$15

Examples:

  • A, A, A → $130 (not $150)
  • A, A, A, A → $180 ($130 + $50)
  • B, B, B → $75 ($45 + $30)
  • A, B, A, B, A → $175 ($130 + $45) — order doesn’t matter

Step 3: Buy One Get One Free

Add a BOGOF rule: buy one item, get a second of the same item free.

ItemRule
CBuy one get one free

Examples:

  • C, C → $20 (second one free)
  • C, C, C → $40 ($20 + $20 + free)
  • C → $20 (single item, no discount)

Step 4: Weighted Items

Some items are priced by weight rather than unit:

ItemPrice
Bananas$1.99/kg
Apples$3.49/kg

Bananas (0.5kg) → $1.00 (rounded)

Step 5: Combo Deals

Buy a combination of items for a special price:

ComboPrice
D + C together$25 (instead of $35)

The combo should only apply once per qualifying set.

Test Cases

Items ScannedExpected Total
(nothing)$0
A$50
A, B$80
A, A, A$130
A, A, A, A$180
B, B$45
C, C$20
C, C, C$40
A, B, A, B, A$175
D, C$25 (combo)
D, C, D$40 ($25 combo + $15)

Bonus

  • Add percentage discounts (e.g. 10% off item E)
  • Add a loyalty card modifier — loyalty members get an additional 5% off the total
  • Add receipt printing with itemized lines showing original and discounted prices
  • Make pricing rules configurable at runtime (not hardcoded)

Hint

Start with simple unit pricing. Get the checkout working for one item, then multiple items. Only then add the first pricing rule. Each new pricing strategy is a separate concern — don’t try to build a generic rule engine upfront. Let the design emerge from the tests.

(Bonus features — percentage discounts, loyalty cards, receipt printing, runtime-configurable rules — are deliberately out of scope for the reference implementations below. Each would warrant its own collaborator or aggregate; the reference focuses on the core Checkout + PricingRule vocabulary.)

Reference Walkthrough

This kata ships as a Mode F (Agent Full-Bake) reference: one commit per language, with a design-rationale walkthrough explaining why the domain came out the shape it did (Money as integer cents, Weight as validated non-negative, PricingRule as a strategy hierarchy, ComboDeal as a checkout-level cross-product rule, ProductBuilder and CheckoutBuilder for scenario setup).

All three implementations satisfy the same twenty scenarios in SCENARIOS.md.