Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 16 additions & 3 deletions Refactoring/Data/Products.json
Original file line number Diff line number Diff line change
@@ -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
}
]
2 changes: 2 additions & 0 deletions Refactoring/Product.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ namespace Refactoring
[Serializable]
public class Product
{
[JsonProperty("Id")]
public string Id;
[JsonProperty("Name")]
public string Name;
[JsonProperty("Price")]
Expand Down
80 changes: 49 additions & 31 deletions Refactoring/Tusc.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class Tusc
private static List<Product> ProductList;
private static User LoggedInUser;
private static int ProductCount;
private const string EXIT_WORD = "quit";

public static void Start(List<User> users, List<Product> products)
{
Expand Down Expand Up @@ -43,34 +44,39 @@ private static void InitializeMemberVariables(List<User> usrs, List<Product> 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;
}

}
}

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
Expand All @@ -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()
Expand Down
70 changes: 45 additions & 25 deletions UnitTestProject/UnitTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@ public class UnitTests
private List<User> originalUsers;
private List<Product> products;
private List<Product> originalProducts;

private int EXIT_NUMBER = 0;
private string EXIT_WORD = "quit";

[SetUp]
public void Test_Initialize()
Expand All @@ -30,7 +29,6 @@ public void Test_Initialize()
originalProducts = JsonConvert.DeserializeObject<List<Product>>(File.ReadAllText(@"Data/Products.json"));
products = DeepCopy<List<Product>>(originalProducts);

EXIT_NUMBER = products.Count + 1;
}

[TearDown]
Expand All @@ -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);

Expand All @@ -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);

Expand Down Expand Up @@ -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);

Expand All @@ -150,6 +148,28 @@ public void Test_UserCanCancelPurchase()
}
}

[Test]
public void Test_UserCanPurchaseProductWhenOnlyOneInStock()
{
// Update data file
List<Product> tempProducts = DeepCopy<List<Product>>(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()
{
Expand All @@ -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);

Expand All @@ -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);

Expand All @@ -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>(T obj)
{
Expand Down