static TestCasesSet()
        {
            List <TestData> testDataList = new List <TestData>();

            MoneyValue salesValue = MoneyValue.Of(1000);
            SalesData  salesData  = new SalesData(salesValue, "Standard", false);

            testDataList.Add(new TestData(salesData, Points.Of(10)));

            MoneyValue salesValueIsWithdrawn = MoneyValue.Of(1000);
            SalesData  salesDataIsWithdrawn  = new SalesData(salesValueIsWithdrawn, "Standard", true);

            testDataList.Add(new TestData(salesDataIsWithdrawn, Points.Of(0)));

            MoneyValue salesValuePremium = MoneyValue.Of(1000);
            SalesData  salesDataPremium  = new SalesData(salesValuePremium, "Premium", false);

            testDataList.Add(new TestData(salesDataPremium, Points.Of(20)));

            MoneyValue salesValueProductWithoutPrice = MoneyValue.Of(1000);
            SalesData  salesDataProductWithoutPrice  =
                new SalesData(salesValueProductWithoutPrice, "Undefined", false);

            testDataList.Add(new TestData(salesDataProductWithoutPrice, Points.Of(0)));

            TestCases = testDataList.Select(x => new TestCaseData(x.SalesData, x.ExpectedPoints));
        }
        private static PriceList CreatePriceList()
        {
            List <PriceListItem> priceListItems = new List <PriceListItem>();

            priceListItems.Add(new PriceListItem("Standard", MoneyValue.Of(100)));
            priceListItems.Add(new PriceListItem("Premium", MoneyValue.Of(50)));
            PriceList priceList = new PriceList(priceListItems);

            return(priceList);
        }
        public static Points Calculate(SalesData salesData, PriceList priceList)
        {
            if (salesData.IsWithdrawn)
            {
                return(Points.Of(0));
            }

            MoneyValue moneyForOnePoint = priceList.GetValueForPointForProductCategory(salesData.ProductCategory);

            if (moneyForOnePoint != MoneyValue.Of(0))
            {
                return(Points.Of(salesData.Value / moneyForOnePoint));
            }

            return(Points.Of(0));
        }
 public bool Equals(MoneyValue other)
 {
     return(_value == other._value);
 }
 public SalesData(MoneyValue value, string productCategory, bool isWithdrawn)
 {
     this.Value           = value;
     this.ProductCategory = productCategory;
     this.IsWithdrawn     = isWithdrawn;
 }
 public PriceListItem(string productCategory, MoneyValue valueForPoint)
 {
     ProductCategory = productCategory;
     ValueForPoint   = valueForPoint;
 }