public decimal PurchaseValue { get; set; }
public int AgeInMonths { get; set; }
public int NumberOfMiles { get; set; }
public int NumberOfPreviousOwners { get; set; }
public int NumberOfCollisions { get; set; }
public class PriceDeterminator
public decimal DetermineCarPrice(Car car)
var agediscount=DetermineAgeDiscount(car.AgeInMonths);
var priceWithAgeDiscount=35000m-(car.PurchaseValue*agediscount);
var milesDiscount=priceWithAgeDiscount*DetermineMilesDiscount(car.NumberOfMiles);
var priceWithMilesdiscount= priceWithAgeDiscount-milesDiscount;
if (car.NumberOfPreviousOwners>0)
var ownerDiscount=priceWithMilesdiscount*DetermineOwnerDiscount(car.NumberOfPreviousOwners);
var priceWithOwnerDiscount=priceWithMilesdiscount-ownerDiscount;
var collisionDiscount=priceWithOwnerDiscount*(DetermineCollisionsDiscount(car.NumberOfCollisions));
var PriceWithCollisionDiscount=priceWithOwnerDiscount-collisionDiscount;
carFinalPrice= PriceWithCollisionDiscount;
var collisionDiscount=priceWithMilesdiscount*DetermineCollisionsDiscount(car.NumberOfCollisions);
var PriceWithCollisionDiscount=priceWithMilesdiscount-collisionDiscount;
var ownerDiscount=PriceWithCollisionDiscount*DetermineOwnerDiscount(car.NumberOfPreviousOwners);
carFinalPrice= PriceWithCollisionDiscount+ownerDiscount;
private decimal DetermineMilesDiscount(Int32 miles)
return (150000/1000)*0.002m;
return (miles/1000)*0.002m;;
private decimal DetermineOwnerDiscount(Int32 owners)
private decimal DetermineAgeDiscount (Int32 ageInMonths){
var yearsInMonths=ageInMonths/12;
return ageInMonths*0.005m;
private decimal DetermineCollisionsDiscount (Int32 collisions)
return collisions>5?5*0.02m:collisions*0.02m;
public void CalculateCarValue()
AssertCarValue(25313.40m, 35000m, 3 * 12, 50000, 1, 1);
AssertCarValue(19688.20m, 35000m, 3 * 12, 150000, 1, 1);
AssertCarValue(19688.20m, 35000m, 3 * 12, 250000, 1, 1);
AssertCarValue(20090.00m, 35000m, 3 * 12, 250000, 1, 0);
AssertCarValue(21657.02m, 35000m, 3 * 12, 250000, 0, 1);
private static void AssertCarValue(decimal expectValue, decimal purchaseValue,
int ageInMonths, int numberOfMiles, int numberOfPreviousOwners, int
AgeInMonths = ageInMonths,
NumberOfCollisions = numberOfCollisions,
NumberOfMiles = numberOfMiles,
NumberOfPreviousOwners = numberOfPreviousOwners,
PurchaseValue = purchaseValue
PriceDeterminator priceDeterminator = new PriceDeterminator();
var carPrice = priceDeterminator.DetermineCarPrice(car);
Assert.AreEqual(expectValue, carPrice);