From 11389e74694b010df94fe4af73a399e2cc2670a2 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Mon, 2 Aug 2021 21:08:46 -0400 Subject: [PATCH 01/16] Initial Commit --- .gitignore | 39 ++++++++++++++++++++++ CashRegister.sln | 31 +++++++++++++++++ CashRegister/CashRegister.csproj | 8 +++++ CashRegister/Program.cs | 12 +++++++ CashRegisterTests/CashRegisterTests.csproj | 16 +++++++++ CashRegisterTests/UnitTest1.cs | 13 ++++++++ 6 files changed, 119 insertions(+) create mode 100644 .gitignore create mode 100644 CashRegister.sln create mode 100644 CashRegister/CashRegister.csproj create mode 100644 CashRegister/Program.cs create mode 100644 CashRegisterTests/CashRegisterTests.csproj create mode 100644 CashRegisterTests/UnitTest1.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a98a00a3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ + +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.exe +*.pdb +*.user +*.aps +*.pch +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.tlh +*.bak +*.cache +*.ilk +*.log +*.dll +*.lib +*.sbr +bin/ +obj/ +packages/ +.vs/ + + +# .NET +obj/ +bin/ +.vs/ +*.user + +# local env files +.env.local +.env.*.local diff --git a/CashRegister.sln b/CashRegister.sln new file mode 100644 index 00000000..b7612ba6 --- /dev/null +++ b/CashRegister.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31321.278 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CashRegister", "CashRegister\CashRegister.csproj", "{0665BD27-5519-4B5D-A292-FE2FC9932ADD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CashRegisterTests", "CashRegisterTests\CashRegisterTests.csproj", "{F1439C9C-5A59-4716-9189-36A5D2F5CEFC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0665BD27-5519-4B5D-A292-FE2FC9932ADD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0665BD27-5519-4B5D-A292-FE2FC9932ADD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0665BD27-5519-4B5D-A292-FE2FC9932ADD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0665BD27-5519-4B5D-A292-FE2FC9932ADD}.Release|Any CPU.Build.0 = Release|Any CPU + {F1439C9C-5A59-4716-9189-36A5D2F5CEFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1439C9C-5A59-4716-9189-36A5D2F5CEFC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1439C9C-5A59-4716-9189-36A5D2F5CEFC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1439C9C-5A59-4716-9189-36A5D2F5CEFC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4370CBE7-F5AC-48A3-995F-3A0818052959} + EndGlobalSection +EndGlobal diff --git a/CashRegister/CashRegister.csproj b/CashRegister/CashRegister.csproj new file mode 100644 index 00000000..c73e0d16 --- /dev/null +++ b/CashRegister/CashRegister.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs new file mode 100644 index 00000000..01e56ef4 --- /dev/null +++ b/CashRegister/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace CashRegister +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/CashRegisterTests/CashRegisterTests.csproj b/CashRegisterTests/CashRegisterTests.csproj new file mode 100644 index 00000000..874f86dd --- /dev/null +++ b/CashRegisterTests/CashRegisterTests.csproj @@ -0,0 +1,16 @@ + + + + netcoreapp3.1 + + false + + + + + + + + + + diff --git a/CashRegisterTests/UnitTest1.cs b/CashRegisterTests/UnitTest1.cs new file mode 100644 index 00000000..1ebc9cc9 --- /dev/null +++ b/CashRegisterTests/UnitTest1.cs @@ -0,0 +1,13 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace CashRegisterTests +{ + [TestClass] + public class UnitTest1 + { + [TestMethod] + public void TestMethod1() + { + } + } +} From e536baf5fead213cb74c559255d9465e70598271 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Mon, 2 Aug 2021 22:24:14 -0400 Subject: [PATCH 02/16] Sample Data File --- input.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 input.txt diff --git a/input.txt b/input.txt new file mode 100644 index 00000000..fba6116f --- /dev/null +++ b/input.txt @@ -0,0 +1,3 @@ +2.12,3.00 +1.97,2.00 +3.33,5.00 \ No newline at end of file From 88c0f94225f6fddea1ccdc389818735fe5fdce75 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Mon, 2 Aug 2021 22:24:51 -0400 Subject: [PATCH 03/16] Created CashRegister Class and Unit Tests --- CashRegister/CashRegister.cs | 54 +++++++++++++++++++++ CashRegister/Program.cs | 2 + CashRegisterTests/CashRegisterTests.cs | 55 ++++++++++++++++++++++ CashRegisterTests/CashRegisterTests.csproj | 4 ++ CashRegisterTests/UnitTest1.cs | 13 ----- 5 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 CashRegister/CashRegister.cs create mode 100644 CashRegisterTests/CashRegisterTests.cs delete mode 100644 CashRegisterTests/UnitTest1.cs diff --git a/CashRegister/CashRegister.cs b/CashRegister/CashRegister.cs new file mode 100644 index 00000000..63952514 --- /dev/null +++ b/CashRegister/CashRegister.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CashRegister +{ + public class CashRegister + { + private decimal Dollar { get; } = 1.00M; + private decimal Quarter { get; } = 0.25M; + private decimal Dime { get; } = 0.10M; + private decimal Nickel { get; } = 0.05M; + private decimal Penny { get; } = 0.01M; + + private int[] Change = { 0, 0, 0, 0, 0}; + + public int[] GetChange(decimal amount) + { + //if(amount % 3 == 0) + //{ + //Return Random Change + //} else + //{ + while(amount > 0) + { + if(amount >= 1.00M) + { + Change[0]++; + amount -= 1.00M; + } else if(amount >= 0.25M) + { + Change[1]++; + amount -= 0.25M; + } else if(amount >= 0.10M) + { + Change[2]++; + amount -= 0.10M; + } else if(amount >= 0.05M) + { + Change[3]++; + amount -= 0.05M; + } else if(amount >= 0.01M) + { + Change[4]++; + amount -= 0.01M; + } + } + // Return Regular Change + //} + + return Change; + } + } +} diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs index 01e56ef4..2c403fae 100644 --- a/CashRegister/Program.cs +++ b/CashRegister/Program.cs @@ -7,6 +7,8 @@ class Program static void Main(string[] args) { Console.WriteLine("Hello World!"); + CashRegister cr = new CashRegister(); + int[] ans = cr.GetChange(1.27M); } } } diff --git a/CashRegisterTests/CashRegisterTests.cs b/CashRegisterTests/CashRegisterTests.cs new file mode 100644 index 00000000..375766b3 --- /dev/null +++ b/CashRegisterTests/CashRegisterTests.cs @@ -0,0 +1,55 @@ + +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace CashRegister +{ + [TestClass] + public class CashRegisterTests + { + [TestMethod] + public void Return1Dollar() + { + CashRegister cr = new CashRegister(); + int[] actual = cr.GetChange(1.00M); + int[] expected = { 1, 0, 0, 0, 0 }; + CollectionAssert.AreEqual(expected, actual); + } + + [TestMethod] + public void Return1Dollar1Quarter() + { + CashRegister cr = new CashRegister(); + int[] actual = cr.GetChange(1.25M); + int[] expected = { 1, 1, 0, 0, 0 }; + CollectionAssert.AreEqual(expected, actual); + } + + [TestMethod] + public void Return1Dollar1Quarter1Dime() + { + CashRegister cr = new CashRegister(); + int[] actual = cr.GetChange(1.35M); + int[] expected = { 1, 1, 1, 0, 0 }; + CollectionAssert.AreEqual(expected, actual); + } + + [TestMethod] + public void Return1Dollar1Quarter1Dime1Nickel() + { + CashRegister cr = new CashRegister(); + int[] actual = cr.GetChange(1.40M); + int[] expected = { 1, 1, 1, 1, 0 }; + CollectionAssert.AreEqual(expected, actual); + } + + [TestMethod] + public void Return1Dollar1Quater1Dime1Nickel4Pennies() + { + CashRegister cr = new CashRegister(); + int[] actual = cr.GetChange(1.44M); + int[] expected = { 1, 1, 1, 1, 4 }; + CollectionAssert.AreEqual(expected, actual); + } + + } +} diff --git a/CashRegisterTests/CashRegisterTests.csproj b/CashRegisterTests/CashRegisterTests.csproj index 874f86dd..ab4acb48 100644 --- a/CashRegisterTests/CashRegisterTests.csproj +++ b/CashRegisterTests/CashRegisterTests.csproj @@ -13,4 +13,8 @@ + + + + diff --git a/CashRegisterTests/UnitTest1.cs b/CashRegisterTests/UnitTest1.cs deleted file mode 100644 index 1ebc9cc9..00000000 --- a/CashRegisterTests/UnitTest1.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace CashRegisterTests -{ - [TestClass] - public class UnitTest1 - { - [TestMethod] - public void TestMethod1() - { - } - } -} From c5d0d00a9f80f9d26b1c5f3366c2a257a3491125 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Tue, 3 Aug 2021 21:08:26 -0400 Subject: [PATCH 04/16] Added Change Object --- CashRegister/Change.cs | 59 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 CashRegister/Change.cs diff --git a/CashRegister/Change.cs b/CashRegister/Change.cs new file mode 100644 index 00000000..3bfd90c1 --- /dev/null +++ b/CashRegister/Change.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CashRegister +{ + public class Change + { + //private decimal Dollar { get; } = 1.00M; + //private decimal Quarter { get; } = 0.25M; + //private decimal Dime { get; } = 0.10M; + //private decimal Nickel { get; } = 0.05M; + //private decimal Penny { get; } = 0.01M; + + public int Dollar { get; private set; } + + public int Quarter { get; private set; } + public int Dime { get; private set; } + public int Nickel { get; private set; } + public int Penny { get; private set; } + + public Change() + { + Dollar = 0; + Quarter = 0; + Dime = 0; + Nickel = 0; + Penny = 0; + } + + public void AddDollar() + { + Dollar++; + } + + public void AddQuarter() + { + Quarter++; + } + + public void AddDime() + { + Dime++; + } + + public void AddNickel() + { + Nickel++; + } + + public void AddPenny() + { + Penny++; + } + + + + } +} From 9f24d806892485a1be31fbf4511529631a082e67 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Tue, 3 Aug 2021 21:09:35 -0400 Subject: [PATCH 05/16] Implemented Random Change and Regular Change Methods --- CashRegister/CashRegister.cs | 135 +++++++++++++++++++++++++---------- CashRegister/Program.cs | 2 +- 2 files changed, 98 insertions(+), 39 deletions(-) diff --git a/CashRegister/CashRegister.cs b/CashRegister/CashRegister.cs index 63952514..b0aed112 100644 --- a/CashRegister/CashRegister.cs +++ b/CashRegister/CashRegister.cs @@ -6,49 +6,108 @@ namespace CashRegister { public class CashRegister { - private decimal Dollar { get; } = 1.00M; - private decimal Quarter { get; } = 0.25M; - private decimal Dime { get; } = 0.10M; - private decimal Nickel { get; } = 0.05M; - private decimal Penny { get; } = 0.01M; + private decimal RunningTotal; + public Change ChangeReturn = new Change(); - private int[] Change = { 0, 0, 0, 0, 0}; + public Change GetChange(decimal amount) + { + this.RunningTotal = amount; + if (RunningTotal % 3 == 0) + { + RandomChange(); + } + else + { + RegularChange(); + } + + return ChangeReturn; + } - public int[] GetChange(decimal amount) + private Change RandomChange() { - //if(amount % 3 == 0) - //{ - //Return Random Change - //} else - //{ - while(amount > 0) + int randomNumber; + while (RunningTotal > 0) + { + + randomNumber = new Random().Next(1, 6); + + switch (randomNumber) { - if(amount >= 1.00M) - { - Change[0]++; - amount -= 1.00M; - } else if(amount >= 0.25M) - { - Change[1]++; - amount -= 0.25M; - } else if(amount >= 0.10M) - { - Change[2]++; - amount -= 0.10M; - } else if(amount >= 0.05M) - { - Change[3]++; - amount -= 0.05M; - } else if(amount >= 0.01M) - { - Change[4]++; - amount -= 0.01M; - } + case 1: + if (RunningTotal >= 1.00M) + { + ChangeReturn.AddDollar(); + RunningTotal -= 1.00M; + } + break; + case 2: + if (RunningTotal >= 0.25M) + { + ChangeReturn.AddQuarter(); + RunningTotal -= 0.25M; + } + break; + case 3: + if (RunningTotal >= 0.10M) + { + ChangeReturn.AddDime(); + RunningTotal -= 0.10M; + } + break; + case 4: + if (RunningTotal >= 0.05M) + { + ChangeReturn.AddNickel(); + RunningTotal -= 0.05M; + } + break; + case 5: + if (RunningTotal >= 0.01M) + { + ChangeReturn.AddPenny(); + RunningTotal -= 0.01M; + } + break; + default: + break; } - // Return Regular Change - //} - - return Change; + } + + return ChangeReturn; } + + private Change RegularChange() + { + while (RunningTotal > 0) + { + if (RunningTotal >= 1.00M) + { + ChangeReturn.AddDollar(); + RunningTotal -= 1.00M; + } + else if (RunningTotal >= 0.25M) + { + ChangeReturn.AddQuarter(); + RunningTotal -= 0.25M; + } + else if (RunningTotal >= 0.10M) + { + ChangeReturn.AddDime(); + RunningTotal -= 0.10M; + } + else if (RunningTotal >= 0.05M) + { + ChangeReturn.AddNickel(); + RunningTotal -= 0.05M; + } + else if (RunningTotal >= 0.01M) + { + ChangeReturn.AddPenny(); + RunningTotal -= 0.01M; + } + } + return ChangeReturn; + } } } diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs index 2c403fae..136b382e 100644 --- a/CashRegister/Program.cs +++ b/CashRegister/Program.cs @@ -8,7 +8,7 @@ static void Main(string[] args) { Console.WriteLine("Hello World!"); CashRegister cr = new CashRegister(); - int[] ans = cr.GetChange(1.27M); + Change change = cr.GetChange(1.27M); } } } From efe9c30d2c1bc97a4705ed97d29d50ebf00fae76 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Tue, 3 Aug 2021 21:10:04 -0400 Subject: [PATCH 06/16] Added RandomChange and RegularChange Test Methods --- CashRegisterTests/CashRegisterTests.cs | 92 ++++++++++++++++++-------- 1 file changed, 63 insertions(+), 29 deletions(-) diff --git a/CashRegisterTests/CashRegisterTests.cs b/CashRegisterTests/CashRegisterTests.cs index 375766b3..22144da8 100644 --- a/CashRegisterTests/CashRegisterTests.cs +++ b/CashRegisterTests/CashRegisterTests.cs @@ -7,49 +7,83 @@ namespace CashRegister public class CashRegisterTests { [TestMethod] - public void Return1Dollar() + public void RandomChange() { CashRegister cr = new CashRegister(); - int[] actual = cr.GetChange(1.00M); - int[] expected = { 1, 0, 0, 0, 0 }; - CollectionAssert.AreEqual(expected, actual); + Change actualChange = cr.GetChange(3.33M); + decimal actualTotal = GetTotal(actualChange); + decimal expectedTotal = 3.33M; + Assert.AreEqual(expectedTotal, actualTotal, "Unequal Total"); } - [TestMethod] - public void Return1Dollar1Quarter() + private decimal GetTotal(Change change) { - CashRegister cr = new CashRegister(); - int[] actual = cr.GetChange(1.25M); - int[] expected = { 1, 1, 0, 0, 0 }; - CollectionAssert.AreEqual(expected, actual); - } + decimal total = 0; - [TestMethod] - public void Return1Dollar1Quarter1Dime() - { - CashRegister cr = new CashRegister(); - int[] actual = cr.GetChange(1.35M); - int[] expected = { 1, 1, 1, 0, 0 }; - CollectionAssert.AreEqual(expected, actual); - } + total += change.Dollar * 1.00M; + total += change.Quarter * 0.25M; + total += change.Dime * 0.10M; + total += change.Nickel * 0.05M; + total += change.Penny * 0.01M; + return total; + } + [TestMethod] - public void Return1Dollar1Quarter1Dime1Nickel() + public void Return1Dollar() { CashRegister cr = new CashRegister(); - int[] actual = cr.GetChange(1.40M); - int[] expected = { 1, 1, 1, 1, 0 }; - CollectionAssert.AreEqual(expected, actual); + Change actual = cr.GetChange(1.00M); + Change expected = new Change(); + expected.AddDollar(); + + CompareChangeObject(expected, actual); } - [TestMethod] - public void Return1Dollar1Quater1Dime1Nickel4Pennies() + private void CompareChangeObject(Change expectedChange, Change actualChange) { - CashRegister cr = new CashRegister(); - int[] actual = cr.GetChange(1.44M); - int[] expected = { 1, 1, 1, 1, 4 }; - CollectionAssert.AreEqual(expected, actual); + Assert.AreEqual(expectedChange.Dollar, actualChange.Dollar, "Unequal Dollars"); + Assert.AreEqual(expectedChange.Quarter, actualChange.Quarter, "Unequal Quarters"); + Assert.AreEqual(expectedChange.Dime, actualChange.Dime, "Unequal Dimes"); + Assert.AreEqual(expectedChange.Nickel, actualChange.Nickel, "Unequal Nickels"); + Assert.AreEqual(expectedChange.Penny, actualChange.Penny, "Unequal Pennies"); } + //[TestMethod] + //public void Return1Dollar1Quarter() + //{ + // CashRegister cr = new CashRegister(); + // int[] actual = cr.GetChange(1.25M); + // int[] expected = { 1, 1, 0, 0, 0 }; + // CollectionAssert.AreEqual(expected, actual); + //} + + //[TestMethod] + //public void Return1Dollar1Quarter1Dime() + //{ + // CashRegister cr = new CashRegister(); + // int[] actual = cr.GetChange(1.35M); + // int[] expected = { 1, 1, 1, 0, 0 }; + // CollectionAssert.AreEqual(expected, actual); + //} + + //[TestMethod] + //public void Return1Dollar1Quarter1Dime1Nickel() + //{ + // CashRegister cr = new CashRegister(); + // int[] actual = cr.GetChange(1.40M); + // int[] expected = { 1, 1, 1, 1, 0 }; + // CollectionAssert.AreEqual(expected, actual); + //} + + //[TestMethod] + //public void Return1Dollar1Quater1Dime1Nickel4Pennies() + //{ + // CashRegister cr = new CashRegister(); + // int[] actual = cr.GetChange(1.44M); + // int[] expected = { 1, 1, 1, 1, 4 }; + // CollectionAssert.AreEqual(expected, actual); + //} + } } From c5063e4d60bd3e0b859297f06b2cf1546f09c5b9 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Tue, 3 Aug 2021 22:41:10 -0400 Subject: [PATCH 07/16] Added Base Read/Write File Functionality --- CashRegister/ReadService.cs | 41 ++++++++++++++++++++++++++++++++++++ CashRegister/WriteService.cs | 30 ++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 CashRegister/ReadService.cs create mode 100644 CashRegister/WriteService.cs diff --git a/CashRegister/ReadService.cs b/CashRegister/ReadService.cs new file mode 100644 index 00000000..79055de8 --- /dev/null +++ b/CashRegister/ReadService.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace CashRegister +{ + public class ReadService + { + private static string FileName { get; } = "input.txt"; + private static string Directory { get; } = Environment.CurrentDirectory; + private readonly string FilePath = Path.Combine(Directory, FileName); + + public List ReadFile() + { + List output = new List(); + + try + { + using(StreamReader streamReader = new StreamReader(FilePath)) + { + while (!streamReader.EndOfStream) + { + string line = streamReader.ReadLine(); + string[] temp = new string[2]; + temp = line.Split(','); + + output.Add(decimal.Parse(temp[0])); + output.Add(decimal.Parse(temp[1])); + } + } + } + catch (Exception e) + { + + throw e; + } + return output; + } + } +} diff --git a/CashRegister/WriteService.cs b/CashRegister/WriteService.cs new file mode 100644 index 00000000..78e7c1cf --- /dev/null +++ b/CashRegister/WriteService.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace CashRegister +{ + public class WriteService + { + private static string FileName { get; } = "output.txt"; + private static string Directory { get; } = Environment.CurrentDirectory; + private readonly string FilePath = Path.Combine(Directory, FileName); + + public void WriteFile(Change change) + { + try + { + using(StreamWriter streamWriter = new StreamWriter(FilePath, true)) + { + streamWriter.WriteLine($"{change.Dollar } dollar {change.Quarter} quarters {change.Dime} dimes "); + } + } + catch (Exception) + { + + throw; + } + } + } +} From 33aad6e8bd0f78114e17a6d99c108afdb7ec845c Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Tue, 3 Aug 2021 22:41:32 -0400 Subject: [PATCH 08/16] Added Console Service Class --- CashRegister/ConsoleService.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 CashRegister/ConsoleService.cs diff --git a/CashRegister/ConsoleService.cs b/CashRegister/ConsoleService.cs new file mode 100644 index 00000000..a09369fc --- /dev/null +++ b/CashRegister/ConsoleService.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CashRegister +{ + public class ConsoleService + { + + } +} From 8c1b910b5707c6388b9d793f3d008d484dd7b7ff Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Tue, 3 Aug 2021 22:41:57 -0400 Subject: [PATCH 09/16] Minor Program.cs edits --- CashRegister/Program.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs index 136b382e..9e905799 100644 --- a/CashRegister/Program.cs +++ b/CashRegister/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace CashRegister { @@ -6,9 +7,16 @@ class Program { static void Main(string[] args) { - Console.WriteLine("Hello World!"); + CashRegister cr = new CashRegister(); - Change change = cr.GetChange(1.27M); + ReadService reader = new ReadService(); + WriteService writer = new WriteService(); + + List ouput = reader.ReadFile(); + + Change change = cr.GetChange(3.33M); + writer.WriteFile(change); + } } } From b62a918af4d650bf4a24978e5e9278cf0e40f87b Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 19:21:47 -0400 Subject: [PATCH 10/16] Added Write Service to create output .txt file --- CashRegister/WriteService.cs | 83 +++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/CashRegister/WriteService.cs b/CashRegister/WriteService.cs index 78e7c1cf..60659fe2 100644 --- a/CashRegister/WriteService.cs +++ b/CashRegister/WriteService.cs @@ -11,13 +11,18 @@ public class WriteService private static string Directory { get; } = Environment.CurrentDirectory; private readonly string FilePath = Path.Combine(Directory, FileName); - public void WriteFile(Change change) + public void WriteFile(List changeList) { try { using(StreamWriter streamWriter = new StreamWriter(FilePath, true)) { - streamWriter.WriteLine($"{change.Dollar } dollar {change.Quarter} quarters {change.Dime} dimes "); + foreach(Change change in changeList) + { + string message = CreateChangeMessage(change); + streamWriter.WriteLine(message); + } + } } catch (Exception) @@ -26,5 +31,79 @@ public void WriteFile(Change change) throw; } } + + private string CreateChangeMessage(Change change) + { + string message = ""; + if(change.Dollar > 0) + { + message += change.Dollar + " dollar"; + if(change.Dollar != 1) + { + message += "s"; + } + } + + if(change.Quarter > 0) + { + if (message.Length != 0) + { + message += ", "; + } + message += change.Quarter + " quarter"; + if(change.Quarter != 1) + { + message += "s"; + } + } + + if(change.Dime > 0) + { + if (message.Length != 0) + { + message += ", "; + } + message += change.Dime + " dime"; + + if(change.Dime != 1) + { + message += "s"; + } + } + + if(change.Nickel > 0) + { + if (message.Length != 0) + { + message += ", "; + } + message += change.Nickel + " nickel"; + + if (change.Nickel != 1) + { + message += "s"; + } + } + + if(change.Penny > 0) + { + if (message.Length != 0) + { + message += ", "; + } + message += change.Penny + " penn"; + if(change.Penny != 1) + { + message += "ies"; + } else + { + message += "y"; + } + } + + return message; + } } + + } From 412d36f6117b68eb36f6b812c9f9791a7f3a626a Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 19:22:21 -0400 Subject: [PATCH 11/16] Fixed Change Reference Bug --- CashRegister/CashRegister.cs | 60 ++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/CashRegister/CashRegister.cs b/CashRegister/CashRegister.cs index b0aed112..59e835ea 100644 --- a/CashRegister/CashRegister.cs +++ b/CashRegister/CashRegister.cs @@ -6,28 +6,27 @@ namespace CashRegister { public class CashRegister { - private decimal RunningTotal; - public Change ChangeReturn = new Change(); + private decimal Change; - public Change GetChange(decimal amount) + public Change GetChange(decimal price, decimal totalPaid) { - this.RunningTotal = amount; - if (RunningTotal % 3 == 0) + this.Change = totalPaid - price; + if ((price * 100) % 3 == 0) { - RandomChange(); + return RandomChange(); } else { - RegularChange(); + return RegularChange(); } - return ChangeReturn; } private Change RandomChange() { + Change ChangeReturn = new Change(); int randomNumber; - while (RunningTotal > 0) + while (Change > 0) { randomNumber = new Random().Next(1, 6); @@ -35,38 +34,38 @@ private Change RandomChange() switch (randomNumber) { case 1: - if (RunningTotal >= 1.00M) + if (Change >= 1.00M) { ChangeReturn.AddDollar(); - RunningTotal -= 1.00M; + Change -= 1.00M; } break; case 2: - if (RunningTotal >= 0.25M) + if (Change >= 0.25M) { ChangeReturn.AddQuarter(); - RunningTotal -= 0.25M; + Change -= 0.25M; } break; case 3: - if (RunningTotal >= 0.10M) + if (Change >= 0.10M) { ChangeReturn.AddDime(); - RunningTotal -= 0.10M; + Change -= 0.10M; } break; case 4: - if (RunningTotal >= 0.05M) + if (Change >= 0.05M) { ChangeReturn.AddNickel(); - RunningTotal -= 0.05M; + Change -= 0.05M; } break; case 5: - if (RunningTotal >= 0.01M) + if (Change >= 0.01M) { ChangeReturn.AddPenny(); - RunningTotal -= 0.01M; + Change -= 0.01M; } break; default: @@ -79,32 +78,33 @@ private Change RandomChange() private Change RegularChange() { - while (RunningTotal > 0) + Change ChangeReturn = new Change(); + while (Change > 0) { - if (RunningTotal >= 1.00M) + if (Change >= 1.00M) { ChangeReturn.AddDollar(); - RunningTotal -= 1.00M; + Change -= 1.00M; } - else if (RunningTotal >= 0.25M) + else if (Change >= 0.25M) { ChangeReturn.AddQuarter(); - RunningTotal -= 0.25M; + Change -= 0.25M; } - else if (RunningTotal >= 0.10M) + else if (Change >= 0.10M) { ChangeReturn.AddDime(); - RunningTotal -= 0.10M; + Change -= 0.10M; } - else if (RunningTotal >= 0.05M) + else if (Change >= 0.05M) { ChangeReturn.AddNickel(); - RunningTotal -= 0.05M; + Change -= 0.05M; } - else if (RunningTotal >= 0.01M) + else if (Change >= 0.01M) { ChangeReturn.AddPenny(); - RunningTotal -= 0.01M; + Change -= 0.01M; } } return ChangeReturn; From 1fc4b463c456b678674efccd28813aadf101e6c3 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 19:22:48 -0400 Subject: [PATCH 12/16] Connected Project Parts together --- CashRegister/Program.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs index 9e905799..0d05d590 100644 --- a/CashRegister/Program.cs +++ b/CashRegister/Program.cs @@ -12,10 +12,18 @@ static void Main(string[] args) ReadService reader = new ReadService(); WriteService writer = new WriteService(); - List ouput = reader.ReadFile(); + List output = reader.ReadFile(); + + List changeList = new List(); + + for (int i = 0; i < output.Count - 1; i += 2) + { + Change change = new Change(); + change = cr.GetChange(output[i], output[i + 1]); + changeList.Add(change); + } - Change change = cr.GetChange(3.33M); - writer.WriteFile(change); + writer.WriteFile(changeList); } } From 25c85f55e67afb5f7e557e809168ad8ea195b29b Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 21:46:06 -0400 Subject: [PATCH 13/16] Updated Unit Tests --- CashRegisterTests/CashRegisterTests.cs | 119 +++++++++++++++++-------- 1 file changed, 81 insertions(+), 38 deletions(-) diff --git a/CashRegisterTests/CashRegisterTests.cs b/CashRegisterTests/CashRegisterTests.cs index 22144da8..5d77766f 100644 --- a/CashRegisterTests/CashRegisterTests.cs +++ b/CashRegisterTests/CashRegisterTests.cs @@ -10,9 +10,9 @@ public class CashRegisterTests public void RandomChange() { CashRegister cr = new CashRegister(); - Change actualChange = cr.GetChange(3.33M); + Change actualChange = cr.GetChange(3.33M, 5.00M); decimal actualTotal = GetTotal(actualChange); - decimal expectedTotal = 3.33M; + decimal expectedTotal = 1.67M; Assert.AreEqual(expectedTotal, actualTotal, "Unequal Total"); } @@ -33,7 +33,7 @@ private decimal GetTotal(Change change) public void Return1Dollar() { CashRegister cr = new CashRegister(); - Change actual = cr.GetChange(1.00M); + Change actual = cr.GetChange(1.00M, 2.00M); Change expected = new Change(); expected.AddDollar(); @@ -49,41 +49,84 @@ private void CompareChangeObject(Change expectedChange, Change actualChange) Assert.AreEqual(expectedChange.Penny, actualChange.Penny, "Unequal Pennies"); } - //[TestMethod] - //public void Return1Dollar1Quarter() - //{ - // CashRegister cr = new CashRegister(); - // int[] actual = cr.GetChange(1.25M); - // int[] expected = { 1, 1, 0, 0, 0 }; - // CollectionAssert.AreEqual(expected, actual); - //} - - //[TestMethod] - //public void Return1Dollar1Quarter1Dime() - //{ - // CashRegister cr = new CashRegister(); - // int[] actual = cr.GetChange(1.35M); - // int[] expected = { 1, 1, 1, 0, 0 }; - // CollectionAssert.AreEqual(expected, actual); - //} - - //[TestMethod] - //public void Return1Dollar1Quarter1Dime1Nickel() - //{ - // CashRegister cr = new CashRegister(); - // int[] actual = cr.GetChange(1.40M); - // int[] expected = { 1, 1, 1, 1, 0 }; - // CollectionAssert.AreEqual(expected, actual); - //} - - //[TestMethod] - //public void Return1Dollar1Quater1Dime1Nickel4Pennies() - //{ - // CashRegister cr = new CashRegister(); - // int[] actual = cr.GetChange(1.44M); - // int[] expected = { 1, 1, 1, 1, 4 }; - // CollectionAssert.AreEqual(expected, actual); - //} + [TestMethod] + public void Return1Dollar1Quarter() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(1.25M, 2.50M); + Change expected = new Change(); + expected.AddDollar(); + expected.AddQuarter(); + CompareChangeObject(expected, actual); + } + + [TestMethod] + public void Return1Dollar1Quarter1Dime() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(1.00M, 2.35M); + Change expected = new Change(); + expected.AddDollar(); + expected.AddQuarter(); + expected.AddDime(); + CompareChangeObject(expected, actual); + } + [TestMethod] + public void Return1Dollar1Quarter1Dime1Nickel() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(1.00M, 2.40M); + Change expected = new Change(); + expected.AddDollar(); + expected.AddQuarter(); + expected.AddDime(); + expected.AddNickel(); + CompareChangeObject(expected, actual); + } + + [TestMethod] + public void Return1Dollar1Quater1Dime1Nickel4Pennies() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(1.00M, 2.44M); + Change expected = new Change(); + expected.AddDollar(); + expected.AddQuarter(); + expected.AddDime(); + expected.AddNickel(); + expected.AddPenny(); + expected.AddPenny(); + expected.AddPenny(); + expected.AddPenny(); + CompareChangeObject(expected, actual); + } + + [TestMethod] + public void NegativePriceAndNegativeTotalPaidReturnEmptyChange() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(-1.00M, -2.00M); + Change expected = new Change(); + + CompareChangeObject(expected, actual); + } + + public void NegativePriceAndPositiveTotalPaidReturnEmptyChange() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(-1.00M, 2.00M); + Change expected = new Change(); + + CompareChangeObject(expected, actual); + } + public void PositivePriceAndNegativeTotalPaidReturnEmptyChange() + { + CashRegister cr = new CashRegister(); + Change actual = cr.GetChange(1.00M, -2.00M); + Change expected = new Change(); + + CompareChangeObject(expected, actual); + } } } From d46a2289023f5183c88982198549a51ca23e550b Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 21:47:47 -0400 Subject: [PATCH 14/16] Changed Input and Output FilePaths for StreamReader and StreamWriter --- CashRegister/CashRegister.cs | 5 +++++ CashRegister/Program.cs | 10 +++++++++- CashRegister/ReadService.cs | 12 ++++++++++-- CashRegister/WriteService.cs | 5 +++-- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/CashRegister/CashRegister.cs b/CashRegister/CashRegister.cs index 59e835ea..4b711e91 100644 --- a/CashRegister/CashRegister.cs +++ b/CashRegister/CashRegister.cs @@ -10,6 +10,11 @@ public class CashRegister public Change GetChange(decimal price, decimal totalPaid) { + // Return Empty Change Object if inputs are less than 0 + if(price < 0 || totalPaid < 0) + { + return new Change(); + } this.Change = totalPaid - price; if ((price * 100) % 3 == 0) { diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs index 0d05d590..21b47ea3 100644 --- a/CashRegister/Program.cs +++ b/CashRegister/Program.cs @@ -12,7 +12,15 @@ static void Main(string[] args) ReadService reader = new ReadService(); WriteService writer = new WriteService(); - List output = reader.ReadFile(); + List output = new List(); + try + { + output = reader.ReadFile(); + } catch (Exception e) + { + Console.WriteLine(e.Message); + } + List changeList = new List(); diff --git a/CashRegister/ReadService.cs b/CashRegister/ReadService.cs index 79055de8..55ed82d0 100644 --- a/CashRegister/ReadService.cs +++ b/CashRegister/ReadService.cs @@ -2,17 +2,25 @@ using System.Collections.Generic; using System.Text; using System.IO; +using System.Reflection; namespace CashRegister { public class ReadService { private static string FileName { get; } = "input.txt"; - private static string Directory { get; } = Environment.CurrentDirectory; - private readonly string FilePath = Path.Combine(Directory, FileName); + //private static string Dir { get; } = Environment.CurrentDirectory; + //private static string outputDir { get; } = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); + private static readonly string WorkingDirectory = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName).Parent.FullName; + + private readonly string FilePath = Path.Combine(WorkingDirectory, FileName); + public List ReadFile() { + + + List output = new List(); try diff --git a/CashRegister/WriteService.cs b/CashRegister/WriteService.cs index 60659fe2..6cce2b58 100644 --- a/CashRegister/WriteService.cs +++ b/CashRegister/WriteService.cs @@ -8,8 +8,9 @@ namespace CashRegister public class WriteService { private static string FileName { get; } = "output.txt"; - private static string Directory { get; } = Environment.CurrentDirectory; - private readonly string FilePath = Path.Combine(Directory, FileName); + private static readonly string WorkingDirectory = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName).Parent.FullName; + + private readonly string FilePath = Path.Combine(WorkingDirectory, FileName); public void WriteFile(List changeList) { From 5de016ff9e08e532ec52b42608d79f744c006ab5 Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 22:27:26 -0400 Subject: [PATCH 15/16] Added User instructions to README --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 62a96fc3..12fdb9f5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,13 @@ Cash Register ============ +IMPORTANT USER INSTRUCTIONS**** +------------------------------- + +The "input.txt" file must be located in "~/CashRegister" path in order for the program to run correctly. + +The change will be output to the casher via "output.txt" and will be located in the same directory location as input.txt after the program runs for the first time. Subsequent reruns of the program will keep a log of all change dispended in "output.txt" and will not override any previous data. + The Problem ----------- Creative Cash Draw Solutions is a client who wants to provide something different for the cashiers who use their system. The function of the application is to tell the cashier how much change is owed and what denominations should be used. In most cases the app should return the minimum amount of physical change, but the client would like to add a twist. If the total due in cents is divisible by 3, the app should randomly generate the change denominations (but the math still needs to be right :)) From 9a44841b0b2ca56e3f4a8509abbf2fae1ab0706a Mon Sep 17 00:00:00 2001 From: Jon Fleet Date: Thu, 5 Aug 2021 22:28:02 -0400 Subject: [PATCH 16/16] Added Interfaces and organized file structure --- CashRegister/CashRegister.cs | 2 +- CashRegister/Program.cs | 7 ++++--- CashRegister/{ => Services}/ReadService.cs | 2 +- CashRegister/{ => Services}/WriteService.cs | 2 +- CashRegister/interfaces/ICashRegister.cs | 11 +++++++++++ .../{ConsoleService.cs => interfaces/IReadService.cs} | 4 ++-- CashRegister/interfaces/IWriteService.cs | 11 +++++++++++ CashRegister/{ => models}/Change.cs | 0 8 files changed, 31 insertions(+), 8 deletions(-) rename CashRegister/{ => Services}/ReadService.cs (97%) rename CashRegister/{ => Services}/WriteService.cs (98%) create mode 100644 CashRegister/interfaces/ICashRegister.cs rename CashRegister/{ConsoleService.cs => interfaces/IReadService.cs} (59%) create mode 100644 CashRegister/interfaces/IWriteService.cs rename CashRegister/{ => models}/Change.cs (100%) diff --git a/CashRegister/CashRegister.cs b/CashRegister/CashRegister.cs index 4b711e91..9d579a53 100644 --- a/CashRegister/CashRegister.cs +++ b/CashRegister/CashRegister.cs @@ -4,7 +4,7 @@ namespace CashRegister { - public class CashRegister + public class CashRegister : ICashRegister { private decimal Change; diff --git a/CashRegister/Program.cs b/CashRegister/Program.cs index 21b47ea3..7a22f77b 100644 --- a/CashRegister/Program.cs +++ b/CashRegister/Program.cs @@ -8,11 +8,12 @@ class Program static void Main(string[] args) { - CashRegister cr = new CashRegister(); - ReadService reader = new ReadService(); - WriteService writer = new WriteService(); + ICashRegister cr = new CashRegister(); + IReadService reader = new ReadService(); + IWriteService writer = new WriteService(); List output = new List(); + try { output = reader.ReadFile(); diff --git a/CashRegister/ReadService.cs b/CashRegister/Services/ReadService.cs similarity index 97% rename from CashRegister/ReadService.cs rename to CashRegister/Services/ReadService.cs index 55ed82d0..18851c61 100644 --- a/CashRegister/ReadService.cs +++ b/CashRegister/Services/ReadService.cs @@ -6,7 +6,7 @@ namespace CashRegister { - public class ReadService + public class ReadService : IReadService { private static string FileName { get; } = "input.txt"; //private static string Dir { get; } = Environment.CurrentDirectory; diff --git a/CashRegister/WriteService.cs b/CashRegister/Services/WriteService.cs similarity index 98% rename from CashRegister/WriteService.cs rename to CashRegister/Services/WriteService.cs index 6cce2b58..a02ec8c0 100644 --- a/CashRegister/WriteService.cs +++ b/CashRegister/Services/WriteService.cs @@ -5,7 +5,7 @@ namespace CashRegister { - public class WriteService + public class WriteService : IWriteService { private static string FileName { get; } = "output.txt"; private static readonly string WorkingDirectory = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName).Parent.FullName; diff --git a/CashRegister/interfaces/ICashRegister.cs b/CashRegister/interfaces/ICashRegister.cs new file mode 100644 index 00000000..22cfeb9f --- /dev/null +++ b/CashRegister/interfaces/ICashRegister.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CashRegister +{ + public interface ICashRegister + { + public Change GetChange(decimal price, decimal totalPaid); + } +} diff --git a/CashRegister/ConsoleService.cs b/CashRegister/interfaces/IReadService.cs similarity index 59% rename from CashRegister/ConsoleService.cs rename to CashRegister/interfaces/IReadService.cs index a09369fc..d3dc5d8e 100644 --- a/CashRegister/ConsoleService.cs +++ b/CashRegister/interfaces/IReadService.cs @@ -4,8 +4,8 @@ namespace CashRegister { - public class ConsoleService + public interface IReadService { - + public List ReadFile(); } } diff --git a/CashRegister/interfaces/IWriteService.cs b/CashRegister/interfaces/IWriteService.cs new file mode 100644 index 00000000..75aa2969 --- /dev/null +++ b/CashRegister/interfaces/IWriteService.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace CashRegister +{ + public interface IWriteService + { + public void WriteFile(List changeList); + } +} diff --git a/CashRegister/Change.cs b/CashRegister/models/Change.cs similarity index 100% rename from CashRegister/Change.cs rename to CashRegister/models/Change.cs