From e05a15eca718754ae6bb50872862809a3f466d53 Mon Sep 17 00:00:00 2001 From: AlexBeyd Date: Fri, 4 Mar 2016 14:35:57 -0600 Subject: [PATCH 1/5] Task 1 --- Refactoring/Tusc.cs | 2 +- UnitTestProject/UnitTests.cs | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Refactoring/Tusc.cs b/Refactoring/Tusc.cs index 79d2289..5deb2fe 100644 --- a/Refactoring/Tusc.cs +++ b/Refactoring/Tusc.cs @@ -111,7 +111,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 (QuantityOrdered > 0 && ProductList[SelectedProductNumber - 1].Qty < QuantityOrdered) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; diff --git a/UnitTestProject/UnitTests.cs b/UnitTestProject/UnitTests.cs index 141b588..2066d7a 100644 --- a/UnitTestProject/UnitTests.cs +++ b/UnitTestProject/UnitTests.cs @@ -194,6 +194,29 @@ public void Test_ErrorOccursWhenProductOutOfStock() } } + [Test] + public void Test_UserCanPurchaseProductWhenOnlyOneInStock() + { + //setup + 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_NUMBER + "\r\n\r\n")) + { + Console.SetIn(reader); + + Tusc.Start(users, tempProducts); + } + + Assert.IsTrue(writer.ToString().Contains("You bought 1 Chips")); + } + + } + [Test] public void Test_ProductListContainsExitItem() { From 0df5daf561e1c88bf06863c179ed7bb179064123 Mon Sep 17 00:00:00 2001 From: AlexBeyd Date: Fri, 4 Mar 2016 15:13:49 -0600 Subject: [PATCH 2/5] Task 2 --- Refactoring/Data/Products.json | 76 ++++++++++++++++++---------------- UnitTestProject/UnitTests.cs | 4 +- 2 files changed, 43 insertions(+), 37 deletions(-) diff --git a/Refactoring/Data/Products.json b/Refactoring/Data/Products.json index 66d190f..735f377 100644 --- a/Refactoring/Data/Products.json +++ b/Refactoring/Data/Products.json @@ -1,37 +1,43 @@ [ - { - "Name": "Chips", - "Price": 1.49, - "Quantity": 50 - }, - { - "Name": "Cookies", - "Price": 1.0, - "Quantity": 100 - }, - { - "Name": "Gum", - "Price": 0.85, - "Quantity": 50 - }, - { - "Name": "Pop", - "Price": 0.75, - "Quantity": 75 - }, - { - "Name": "Candy", - "Price": 0.85, - "Quantity": 30 - }, - { - "Name": "Chocolate Bars", - "Price": 1.25, - "Quantity": 25 - }, - { - "Name": "Nuts", - "Price": 1.0, - "Quantity": 1 - } + { + "Name": "Soup", + "Price": 1.25, + "Quantity": 50 + }, + { + "Name": "Chips", + "Price": 1.49, + "Quantity": 50 + }, + { + "Name": "Cookies", + "Price": 1.0, + "Quantity": 100 + }, + { + "Name": "Gum", + "Price": 0.85, + "Quantity": 50 + }, + { + "Name": "Pop", + "Price": 0.75, + "Quantity": 75 + }, + { + "Name": "Candy", + "Price": 0.85, + "Quantity": 30 + }, + { + "Name": "Chocolate Bars", + "Price": 1.25, + "Quantity": 25 + }, + { + "Name": "Nuts", + "Price": 1.0, + "Quantity": 1 + } + ] \ No newline at end of file diff --git a/UnitTestProject/UnitTests.cs b/UnitTestProject/UnitTests.cs index 2066d7a..c25d24c 100644 --- a/UnitTestProject/UnitTests.cs +++ b/UnitTestProject/UnitTests.cs @@ -183,7 +183,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\n2\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) { Console.SetIn(reader); @@ -205,7 +205,7 @@ public void Test_UserCanPurchaseProductWhenOnlyOneInStock() { 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\n2\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) { Console.SetIn(reader); From 79a41cb6422bec9b9a9f3d1670003e4d376c4239 Mon Sep 17 00:00:00 2001 From: AlexBeyd Date: Fri, 4 Mar 2016 15:38:03 -0600 Subject: [PATCH 3/5] Task 3 - some cosmetic spaces were added (sorry) --- Refactoring/Tusc.cs | 57 +++++++++++++++++++++++------------- UnitTestProject/UnitTests.cs | 50 +++++++++++++++---------------- 2 files changed, 61 insertions(+), 46 deletions(-) diff --git a/Refactoring/Tusc.cs b/Refactoring/Tusc.cs index 5deb2fe..50b27be 100644 --- a/Refactoring/Tusc.cs +++ b/Refactoring/Tusc.cs @@ -15,6 +15,9 @@ public class Tusc private static User LoggedInUser; private static int ProductCount; + public static string QuitCode { get { return "quit"; } } + public static string QuitMenuMessage { get { return "Type quit to exit the application"; } } + public static void Start(List users, List products) { InitializeMemberVariables(users, products); @@ -50,7 +53,7 @@ private static void OrderProducts() { ShowProductList(); SelectedProductNumber = GetValidUserProductSelection(); - if (SelectedProductNumber == ProductList.Count + 1) + if (SelectedProductNumber == -1) { UpdateCurrentUsersBalance(); break; @@ -58,7 +61,7 @@ private static void OrderProducts() else { Console.WriteLine(); - Console.WriteLine("You want to buy: " + ProductList[SelectedProductNumber-1].Name); + Console.WriteLine("You want to buy: " + ProductList[SelectedProductNumber - 1].Name); Console.WriteLine("Your balance is " + LoggedInUser.Balance.ToString("C")); QuantityOrdered = GetValidUserProductQuantity(); @@ -91,19 +94,19 @@ private static void OrderProduct(int SelectedProductNumber, int QuantityOrdered) private static void UpdateBalance(int SelectedProductNumber, int QuantityOrdered) { - LoggedInUser.Balance = LoggedInUser.Balance - (ProductList[SelectedProductNumber-1].Price * QuantityOrdered); + LoggedInUser.Balance = LoggedInUser.Balance - (ProductList[SelectedProductNumber - 1].Price * QuantityOrdered); } private static void RemoveItemsFromInventory(int SelectedProductNumber, int QuantityOrdered) { - ProductList[SelectedProductNumber-1].Qty = ProductList[SelectedProductNumber-1].Qty - QuantityOrdered; + ProductList[SelectedProductNumber - 1].Qty = ProductList[SelectedProductNumber - 1].Qty - QuantityOrdered; } private static void ShowOrderConfirmationMessage(int SelectedProductNumber, int QuantityOrdered) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine("You bought " + QuantityOrdered + " " + ProductList[SelectedProductNumber-1].Name); + Console.WriteLine("You bought " + QuantityOrdered + " " + ProductList[SelectedProductNumber - 1].Name); Console.WriteLine("Your new balance is " + LoggedInUser.Balance.ToString("C")); Console.ResetColor(); } @@ -116,7 +119,7 @@ private static bool VerifyStockOnHand(int SelectedProductNumber, int QuantityOrd Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(); - Console.WriteLine("Sorry, " + ProductList[SelectedProductNumber-1].Name + " is out of stock"); + Console.WriteLine("Sorry, " + ProductList[SelectedProductNumber - 1].Name + " is out of stock"); Console.ResetColor(); stockOnHand = false; } @@ -126,7 +129,7 @@ private static bool VerifyStockOnHand(int SelectedProductNumber, int QuantityOrd private static bool VerifyUserFundsForSelectedPurchase(int SelectedProductNumber, int QuantityOrdered) { bool fundsAvailable = true; - if ((LoggedInUser.Balance - (ProductList[SelectedProductNumber-1].Price * QuantityOrdered)) < 0) + if ((LoggedInUser.Balance - (ProductList[SelectedProductNumber - 1].Price * QuantityOrdered)) < 0) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Red; @@ -194,29 +197,39 @@ private static int GetValidUserProductSelection() { int productNumber; while (true) - { - Console.WriteLine("Enter the product number:"); + { + Console.WriteLine("Enter the product number:"); string ProductNumberEntered = Console.ReadLine(); if (validateProduct(ProductNumberEntered, out productNumber)) { - break; + break; } - } + } return productNumber; } - private static bool validateProduct(string ProductNumberEntered, out int productNumber ) + private static bool validateProduct(string ProductNumberEntered, out int productNumber) { bool validProductSelected = false; - - if (Int32.TryParse(ProductNumberEntered, out productNumber) && (productNumber <= ProductCount + 1)) + + if (ProductNumberEntered.Equals(QuitCode)) { + productNumber = -1; validProductSelected = true; } + else { - ShowProductNumberInvalidMessage(); + if (Int32.TryParse(ProductNumberEntered, out productNumber) && (productNumber <= ProductCount + 1)) + { + validProductSelected = true; + } + else + { + ShowProductNumberInvalidMessage(); + } } + return validProductSelected; } @@ -238,7 +251,8 @@ private static void ShowProductList() Product prod = ProductList[i]; Console.WriteLine(i + 1 + ": " + prod.Name + " (" + prod.Price.ToString("C") + ")"); } - Console.WriteLine(ProductList.Count + 1 + ": Exit"); + + Console.WriteLine(QuitMenuMessage); } private static void ShowRemainingBalance() @@ -265,7 +279,7 @@ private static bool LoginUser() User user = new User(); GetUserCredentials(ref userName, ref userPassword); - if (ValidateUserCredentials(userName, userPassword, ref user)) + if (ValidateUserCredentials(userName, userPassword, ref user)) { LoggedInUser = user; ShowSuccessfulLoginMessage(); @@ -276,7 +290,7 @@ private static bool LoginUser() ShowFailedCredentialsMessage(); } return validatedUser; - } + } private static void GetUserCredentials(ref string userName, ref string userPassword) { @@ -298,7 +312,7 @@ private static bool ValidateUserPassword(User userName, string password) { bool passwordValid = false; if (userName.Password == password) - { + { passwordValid = true; } return passwordValid; @@ -321,7 +335,7 @@ private static bool ValidateUserCredentials(string userName, string userPassword { bool validCredentials = false; - if(FindUserInUserList(userName, ref user) && ValidateUserPassword(user, userPassword)) + if (FindUserInUserList(userName, ref user) && ValidateUserPassword(user, userPassword)) { validCredentials = true; } @@ -346,12 +360,13 @@ private static bool FindUserInUserList(string name, ref User foundUser) return UserIsFound; } - + private static void ShowWelcomeMessage() { Console.WriteLine("Welcome to TUSC"); Console.WriteLine("---------------"); } + } } diff --git a/UnitTestProject/UnitTests.cs b/UnitTestProject/UnitTests.cs index c25d24c..28c9649 100644 --- a/UnitTestProject/UnitTests.cs +++ b/UnitTestProject/UnitTests.cs @@ -17,7 +17,7 @@ public class UnitTests private List products; private List originalProducts; - private int EXIT_NUMBER = 0; + private string EXIT_CODE = ""; [SetUp] public void Test_Initialize() @@ -30,7 +30,7 @@ public void Test_Initialize() originalProducts = JsonConvert.DeserializeObject>(File.ReadAllText(@"Data/Products.json")); products = DeepCopy>(originalProducts); - EXIT_NUMBER = products.Count + 1; + EXIT_CODE = Tusc.QuitCode; } [TearDown] @@ -54,7 +54,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_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -70,7 +70,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_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -138,7 +138,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_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -161,7 +161,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_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -183,7 +183,7 @@ public void Test_ErrorOccursWhenProductOutOfStock() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n2\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n2\r\n1\r\n" + EXIT_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -205,7 +205,7 @@ public void Test_UserCanPurchaseProductWhenOnlyOneInStock() { Console.SetOut(writer); - using (var reader = new StringReader("Jason\r\nsfa\r\n2\r\n1\r\n" + EXIT_NUMBER + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n2\r\n1\r\n" + EXIT_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -224,35 +224,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_CODE + "\r\n\r\n")) { Console.SetIn(reader); Tusc.Start(users, products); } - Assert.IsTrue(writer.ToString().Contains("" + EXIT_NUMBER + ": Exit")); + Assert.IsTrue(writer.ToString().Contains(Tusc.QuitMenuMessage)); } } - //[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_CODE + "\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 quit to exit the application")); + Assert.IsTrue(writer.ToString().Contains("Press Enter key to exit")); + } + } private static T DeepCopy(T obj) { From 626bebfb69c3efbe162302daeee83a1bc77a0f03 Mon Sep 17 00:00:00 2001 From: AlexBeyd Date: Fri, 4 Mar 2016 15:54:51 -0600 Subject: [PATCH 4/5] Task 4 --- Refactoring/Data/Products.json | 28 ++++++++++++++++++---------- Refactoring/Product.cs | 2 ++ Refactoring/Tusc.cs | 6 ++++-- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Refactoring/Data/Products.json b/Refactoring/Data/Products.json index 735f377..f3b17ef 100644 --- a/Refactoring/Data/Products.json +++ b/Refactoring/Data/Products.json @@ -1,43 +1,51 @@ [ - { + { "Name": "Soup", "Price": 1.25, - "Quantity": 50 + "Quantity": 50, + "Id": 1 }, { "Name": "Chips", "Price": 1.49, - "Quantity": 50 + "Quantity": 50, + "Id": 2 }, { "Name": "Cookies", "Price": 1.0, - "Quantity": 100 + "Quantity": 100, + "Id": 3 }, { "Name": "Gum", "Price": 0.85, - "Quantity": 50 + "Quantity": 50, + "Id": 4 }, { "Name": "Pop", "Price": 0.75, - "Quantity": 75 + "Quantity": 75, + "Id": 5 }, { "Name": "Candy", "Price": 0.85, - "Quantity": 30 + "Quantity": 30, + "Id": 6 }, { "Name": "Chocolate Bars", "Price": 1.25, - "Quantity": 25 + "Quantity": 25, + "Id": 7 }, { "Name": "Nuts", "Price": 1.0, - "Quantity": 1 + "Quantity": 1, + "Id": 8 } - + ] \ No newline at end of file diff --git a/Refactoring/Product.cs b/Refactoring/Product.cs index c9ceee5..bae0d59 100644 --- a/Refactoring/Product.cs +++ b/Refactoring/Product.cs @@ -16,5 +16,7 @@ public class Product public double Price; [JsonProperty("Quantity")] public int Qty; + [JsonProperty("Id")] + public int Id; } } diff --git a/Refactoring/Tusc.cs b/Refactoring/Tusc.cs index 50b27be..f3fbbf2 100644 --- a/Refactoring/Tusc.cs +++ b/Refactoring/Tusc.cs @@ -220,7 +220,9 @@ private static bool validateProduct(string ProductNumberEntered, out int product else { - if (Int32.TryParse(ProductNumberEntered, out productNumber) && (productNumber <= ProductCount + 1)) + var parseResult = Int32.TryParse(ProductNumberEntered, out productNumber); + var selectedId = productNumber; + if (parseResult && ProductList.Any(p => p.Id == selectedId)) { validProductSelected = true; } @@ -249,7 +251,7 @@ 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(QuitMenuMessage); From 2a302496a1ffad720787451b4b36714b3a7a2674 Mon Sep 17 00:00:00 2001 From: AlexBeyd Date: Fri, 4 Mar 2016 16:20:17 -0600 Subject: [PATCH 5/5] Task 5 --- Refactoring/Tusc.cs | 12 ++++++++---- UnitTestProject/UnitTests.cs | 26 ++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Refactoring/Tusc.cs b/Refactoring/Tusc.cs index f3fbbf2..af36ada 100644 --- a/Refactoring/Tusc.cs +++ b/Refactoring/Tusc.cs @@ -222,7 +222,7 @@ private static bool validateProduct(string ProductNumberEntered, out int product { var parseResult = Int32.TryParse(ProductNumberEntered, out productNumber); var selectedId = productNumber; - if (parseResult && ProductList.Any(p => p.Id == selectedId)) + if (parseResult && ProductList.Any(p => p.Id == selectedId && p.Qty > 0)) { validProductSelected = true; } @@ -239,7 +239,7 @@ private static void ShowProductNumberInvalidMessage() { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(""); - Console.WriteLine("Product numbers must be numeric in the range of 1 - " + (ProductCount + 1).ToString()); + Console.WriteLine("You must select only products that appear in the menu!"); Console.WriteLine(""); Console.ResetColor(); } @@ -249,9 +249,13 @@ private static void ShowProductList() Console.WriteLine(); Console.WriteLine("What would you like to buy?"); for (int i = 0; i < ProductCount; i++) - { + { Product prod = ProductList[i]; - Console.WriteLine(prod.Id + ": " + prod.Name + " (" + prod.Price.ToString("C") + ")"); + if (prod.Qty > 0) + { + Console.WriteLine(prod.Id + ": " + prod.Name + " (" + prod.Price.ToString("C") + ")"); + } + } Console.WriteLine(QuitMenuMessage); diff --git a/UnitTestProject/UnitTests.cs b/UnitTestProject/UnitTests.cs index 28c9649..7de6a36 100644 --- a/UnitTestProject/UnitTests.cs +++ b/UnitTestProject/UnitTests.cs @@ -177,13 +177,13 @@ public void Test_ErrorOccursWhenProductOutOfStock() { // Update data file List tempProducts = DeepCopy>(originalProducts); - tempProducts.Where(u => u.Name == "Chips").Single().Qty = 0; + 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\n2\r\n1\r\n" + EXIT_CODE + "\r\n\r\n")) + using (var reader = new StringReader("Jason\r\nsfa\r\n2\r\n2\r\n" + EXIT_CODE + "\r\n\r\n")) { Console.SetIn(reader); @@ -254,6 +254,28 @@ public void Test_UserCanExitByEnteringQuit() } } + [Test] + public void Test_ProductsWithZeroQuantityDoNotAppearInMenu() + { + // Update data file + List tempProducts = DeepCopy>(originalProducts); + tempProducts.Where(u => u.Name == "Chips").Single().Qty = 0; + + using (var writer = new StringWriter()) + { + Console.SetOut(writer); + + using (var reader = new StringReader("Jason\r\nsfa\r\n1\r\n1\r\n" + EXIT_CODE + "\r\n\r\n")) + { + Console.SetIn(reader); + + Tusc.Start(users, tempProducts); + } + + Assert.IsFalse(writer.ToString().Contains(": Chips")); + } + } + private static T DeepCopy(T obj) { using (MemoryStream stream = new MemoryStream())