diff --git a/Refactoring/Data/Products.json b/Refactoring/Data/Products.json index 66d190f..9f7571d 100644 --- a/Refactoring/Data/Products.json +++ b/Refactoring/Data/Products.json @@ -1,37 +1,50 @@ -[ +[ { - "Name": "Chips", + "Id": "1", + "Name": "Chips", "Price": 1.49, "Quantity": 50 }, { + "Id": "2", "Name": "Cookies", "Price": 1.0, "Quantity": 100 }, { + "Id": "3", "Name": "Gum", "Price": 0.85, "Quantity": 50 }, { + "Id": "4", "Name": "Pop", "Price": 0.75, "Quantity": 75 }, { + "Id": "5", "Name": "Candy", "Price": 0.85, "Quantity": 30 }, { - "Name": "Chocolate Bars", + "Id": "6", + "Name": "Chocolate Bars", "Price": 1.25, "Quantity": 25 }, { + "Id": "7", "Name": "Nuts", "Price": 1.0, "Quantity": 1 + }, + { + "Id": "8", + "Name": "Soup", + "Price": 1.25, + "Quantity": 50 } ] \ No newline at end of file diff --git a/Refactoring/Product.cs b/Refactoring/Product.cs index c9ceee5..0a06695 100644 --- a/Refactoring/Product.cs +++ b/Refactoring/Product.cs @@ -10,6 +10,8 @@ namespace Refactoring [Serializable] public class Product { + [JsonProperty("Id")] + public string Id; [JsonProperty("Name")] public string Name; [JsonProperty("Price")] diff --git a/Refactoring/Tusc.cs b/Refactoring/Tusc.cs index 79d2289..09277cb 100644 --- a/Refactoring/Tusc.cs +++ b/Refactoring/Tusc.cs @@ -14,6 +14,7 @@ public class Tusc private static List ProductList; private static User LoggedInUser; private static int ProductCount; + private const string EXIT_WORD = "quit"; public static void Start(List users, List products) { @@ -43,34 +44,39 @@ private static void InitializeMemberVariables(List usrs, List pro private static void OrderProducts() { - int SelectedProductNumber; + int SelectedProductID; int QuantityOrdered; + while (true) { ShowProductList(); - SelectedProductNumber = GetValidUserProductSelection(); - if (SelectedProductNumber == ProductList.Count + 1) - { - UpdateCurrentUsersBalance(); - break; - } - else + SelectedProductID = GetValidUserProductSelection(); + + + if (SelectedProductID > 0) { Console.WriteLine(); - Console.WriteLine("You want to buy: " + ProductList[SelectedProductNumber-1].Name); + Console.WriteLine("You want to buy: " + ProductList[SelectedProductID - 1].Name); Console.WriteLine("Your balance is " + LoggedInUser.Balance.ToString("C")); QuantityOrdered = GetValidUserProductQuantity(); - if (QuantityOrdered > 0 && VerifyUserFundsForSelectedPurchase(SelectedProductNumber, QuantityOrdered) && VerifyStockOnHand(SelectedProductNumber, QuantityOrdered)) + if (QuantityOrdered > 0 && VerifyUserFundsForSelectedPurchase(SelectedProductID, QuantityOrdered) && + VerifyStockOnHand(SelectedProductID, QuantityOrdered)) { - OrderProduct(SelectedProductNumber, QuantityOrdered); + OrderProduct(SelectedProductID, QuantityOrdered); } else { ShowPurchaseCancelledMessage(); } } + else + { + UpdateCurrentUsersBalance(); + break; + } + } } @@ -111,7 +117,7 @@ private static void ShowOrderConfirmationMessage(int SelectedProductNumber, int private static bool VerifyStockOnHand(int SelectedProductNumber, int QuantityOrdered) { bool stockOnHand = true; - if (ProductList[SelectedProductNumber-1].Qty <= QuantityOrdered) + if (ProductList[SelectedProductNumber-1].Qty < QuantityOrdered) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; @@ -192,39 +198,51 @@ private static void UpdateCurrentUsersBalance() private static int GetValidUserProductSelection() { - int productNumber; + int productID; + + while (true) { - Console.WriteLine("Enter the product number:"); - string ProductNumberEntered = Console.ReadLine(); - if (validateProduct(ProductNumberEntered, out productNumber)) - { - break; - } + Console.WriteLine("Enter the product ID:"); + string ProductIDEntered = Console.ReadLine(); + + if (ProductIDEntered == EXIT_WORD) + { + productID = 0; + break; + } + else + { + if (validateProduct(ProductIDEntered, out productID)) + { + break; + } + } } - return productNumber; + return productID; } - private static bool validateProduct(string ProductNumberEntered, out int productNumber ) + private static bool validateProduct(string ProductIDEntered, out int productID ) { bool validProductSelected = false; - - if (Int32.TryParse(ProductNumberEntered, out productNumber) && (productNumber <= ProductCount + 1)) - { - validProductSelected = true; - } + + if (Int32.TryParse(ProductIDEntered, out productID) && (productID <= ProductCount ) && productID > 0) + { + validProductSelected = true; + } else { - ShowProductNumberInvalidMessage(); + ShowProductidInvalidMessage(); } + return validProductSelected; } - private static void ShowProductNumberInvalidMessage() + private static void ShowProductidInvalidMessage() { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(""); - Console.WriteLine("Product numbers must be numeric in the range of 1 - " + (ProductCount + 1).ToString()); + Console.WriteLine("Product ID must be in the range of 1 - " + ProductCount.ToString()); Console.WriteLine(""); Console.ResetColor(); } @@ -236,9 +254,9 @@ private static void ShowProductList() for (int i = 0; i < ProductCount; i++) { Product prod = ProductList[i]; - Console.WriteLine(i + 1 + ": " + prod.Name + " (" + prod.Price.ToString("C") + ")"); + Console.WriteLine(prod.Id + ": " + prod.Name + " (" + prod.Price.ToString("C") + ")"); } - Console.WriteLine(ProductList.Count + 1 + ": Exit"); + Console.WriteLine("Type " + EXIT_WORD + " to exit the application"); } private static void ShowRemainingBalance() diff --git a/UnitTestProject/UnitTests.cs b/UnitTestProject/UnitTests.cs index 141b588..64426a7 100644 --- a/UnitTestProject/UnitTests.cs +++ b/UnitTestProject/UnitTests.cs @@ -16,8 +16,7 @@ public class UnitTests private List originalUsers; private List products; private List originalProducts; - - private int EXIT_NUMBER = 0; + private string EXIT_WORD = "quit"; [SetUp] public void Test_Initialize() @@ -30,7 +29,6 @@ public void Test_Initialize() originalProducts = JsonConvert.DeserializeObject>(File.ReadAllText(@"Data/Products.json")); products = DeepCopy>(originalProducts); - EXIT_NUMBER = products.Count + 1; } [TearDown] @@ -54,7 +52,7 @@ public void Test_StartingTuscFromMainDoesNotThrowAnException() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_WORD + "\r\n\r\n")) { Console.SetIn(reader); @@ -70,7 +68,7 @@ public void Test_TuscDoesNotThrowAnException() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_WORD + "\r\n\r\n")) { Console.SetIn(reader); @@ -138,7 +136,7 @@ public void Test_UserCanCancelPurchase() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n0\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n0\r\n" + EXIT_WORD + "\r\n\r\n")) { Console.SetIn(reader); @@ -150,6 +148,28 @@ public void Test_UserCanCancelPurchase() } } + [Test] + public void Test_UserCanPurchaseProductWhenOnlyOneInStock() + { + // Update data file + List tempProducts = DeepCopy>(originalProducts); + tempProducts.Where(u => u.Name == "Chips").Single().Qty = 1; + + using (var writer = new StringWriter()) + { + Console.SetOut(writer); + + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_WORD + "\r\n\r\n")) + { + Console.SetIn(reader); + + Tusc.Start(users, tempProducts); + } + + Assert.IsTrue(writer.ToString().Contains("You bought 1 Chips")); + } + } + [Test] public void Test_ErrorOccursWhenBalanceLessThanPrice() { @@ -161,7 +181,7 @@ public void Test_ErrorOccursWhenBalanceLessThanPrice() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_WORD + "\r\n\r\n")) { Console.SetIn(reader); @@ -183,7 +203,7 @@ public void Test_ErrorOccursWhenProductOutOfStock() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_WORD + "\r\n\r\n")) { Console.SetIn(reader); @@ -201,35 +221,35 @@ public void Test_ProductListContainsExitItem() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_WORD + "\r\n\r\n")) { Console.SetIn(reader); Tusc.Start(users, products); } - Assert.IsTrue(writer.ToString().Contains("" + EXIT_NUMBER + ": Exit")); + Assert.IsTrue(writer.ToString().Contains( EXIT_WORD )); } } - //[Test] - //public void Test_UserCanExitByEnteringQuit() - //{ - // using (var writer = new StringWriter()) - // { - // Console.SetOut(writer); + [Test] + public void Test_UserCanExitByEnteringQuit() + { + using (var writer = new StringWriter()) + { + Console.SetOut(writer); - // using (var reader = new StringReader("Jason\r\nsfa\r\nquit\r\n\r\n")) - // { - // Console.SetIn(reader); + using (var reader = new StringReader("Jason\r\nsfa\r\n"+EXIT_WORD+"\r\n\r\n")) + { + Console.SetIn(reader); - // Tusc.Start(users, products); - // } + Tusc.Start(users, products); + } - // Assert.IsTrue(writer.ToString().Contains("Type quit to exit the application")); - // Assert.IsTrue(writer.ToString().Contains("Press Enter key to exit")); - // } - //} + Assert.IsTrue(writer.ToString().Contains("Type " + EXIT_WORD + " to exit the application")); + Assert.IsTrue(writer.ToString().Contains("Press Enter key to exit")); + } + } private static T DeepCopy(T obj) {