From 9946920dc0c895b04c8aba0a3211eefb2aa72f10 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 14:13:48 -0400 Subject: [PATCH 01/18] add gitignore --- .gitignore | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..60e67366 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/target/ +metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders \ No newline at end of file From 79dae9dec0dd02d9cb3bd38757c851edcfbbfc22 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 14:21:38 -0400 Subject: [PATCH 02/18] Add pom.xml --- pom.xml | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..c6216d09 --- /dev/null +++ b/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.4 + + + com.softwriters + cashregister + 0.0.1-SNAPSHOT + cashregister + Softwriters Code Assessment + + 1.8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + From 1faa014268b497ac5e62bf64b47e41600f2d10f2 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 14:21:55 -0400 Subject: [PATCH 03/18] Create sample input file --- src/main/resources/sampleinput.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/main/resources/sampleinput.txt diff --git a/src/main/resources/sampleinput.txt b/src/main/resources/sampleinput.txt new file mode 100644 index 00000000..785408c5 --- /dev/null +++ b/src/main/resources/sampleinput.txt @@ -0,0 +1,3 @@ +2.12,3.01 +1.97,2.00 +3.33,5.00 \ No newline at end of file From 35900a1c46bdcc5dc62374e477459e06b1391c99 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 14:22:59 -0400 Subject: [PATCH 04/18] Add project generated files --- .classpath | 33 +++++++++++++++++++ .project | 23 +++++++++++++ .../cashregister/CashregisterApplication.java | 13 ++++++++ src/main/resources/application.properties | 1 + 4 files changed, 70 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 src/main/java/com/softwriters/cashregister/CashregisterApplication.java create mode 100644 src/main/resources/application.properties diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..8743e3b1 --- /dev/null +++ b/.classpath @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..b177a606 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + cashregister + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/src/main/java/com/softwriters/cashregister/CashregisterApplication.java b/src/main/java/com/softwriters/cashregister/CashregisterApplication.java new file mode 100644 index 00000000..3a04b8e0 --- /dev/null +++ b/src/main/java/com/softwriters/cashregister/CashregisterApplication.java @@ -0,0 +1,13 @@ +package com.softwriters.cashregister; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CashregisterApplication { + + public static void main(String[] args) { + SpringApplication.run(CashregisterApplication.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + From c08e05455c9a409fd6a2bd6fa81773fe82c5c6f3 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 14:23:41 -0400 Subject: [PATCH 05/18] Create file parser and change processor --- .../service/ChangeProcessingService.java | 8 +++ .../service/FlatFileParserService.java | 51 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java create mode 100644 src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java diff --git a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java new file mode 100644 index 00000000..6cd103ca --- /dev/null +++ b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java @@ -0,0 +1,8 @@ +package com.softwriters.cashregister.service; + +public class ChangeProcessingService { + + public String calculateChange(double totalDue, double amountGiven) { + return "test"; + } +} diff --git a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java new file mode 100644 index 00000000..7ed0dc9f --- /dev/null +++ b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java @@ -0,0 +1,51 @@ +package com.softwriters.cashregister.service; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Scanner; + +public class FlatFileParserService { + + public File processFile(File inputFile) throws IOException { + + //Create Change Processing Service + ChangeProcessingService changeProcessor = new ChangeProcessingService(); + + //Scan in the input file + Scanner readFile = new Scanner(inputFile); + + //Create an output file + File output = new File("output.txt"); + output.createNewFile(); + + //Create a file writer to write to output file + FileWriter fileWriter = new FileWriter("output.txt"); + + //While the scanner sees new tokens + while(readFile.hasNext()) { + + //Grab the next String token and split using a delimiter + String currentString = readFile.next(); + String[] values = currentString.split(","); + + //Convert two numbers to double values + Double totalDue = Double.parseDouble(values[0]); + Double paid = Double.parseDouble(values[1]); + + //Write change due strings to the file + fileWriter.write("\n"+changeProcessor.calculateChange(totalDue, paid)); + + //If more input in file, go to next line + if(readFile.hasNextLine()) { + readFile.nextLine(); + } + } + + //close scanner and writer + fileWriter.close(); + readFile.close(); + + return output; + } +} From 5edec0b4ea20e190737c1cee0079ada95f3caf5e Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 20:44:57 -0400 Subject: [PATCH 06/18] Add divisible by three method to file parser service --- .../service/FlatFileParserService.java | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java index 7ed0dc9f..9f64fbc8 100644 --- a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java +++ b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.math.BigDecimal; import java.util.Scanner; public class FlatFileParserService { @@ -21,7 +22,6 @@ public File processFile(File inputFile) throws IOException { //Create a file writer to write to output file FileWriter fileWriter = new FileWriter("output.txt"); - //While the scanner sees new tokens while(readFile.hasNext()) { @@ -30,11 +30,16 @@ public File processFile(File inputFile) throws IOException { String[] values = currentString.split(","); //Convert two numbers to double values - Double totalDue = Double.parseDouble(values[0]); - Double paid = Double.parseDouble(values[1]); + BigDecimal totalDue = new BigDecimal(values[0]); + BigDecimal paid = new BigDecimal(values[1]); //Write change due strings to the file - fileWriter.write("\n"+changeProcessor.calculateChange(totalDue, paid)); + if(isDivisibleByThree(values[0])) { + fileWriter.write("\n"+changeProcessor.calculateRandomChange(totalDue, paid)); + } + else { + fileWriter.write("\n"+changeProcessor.calculateChange(totalDue, paid)); + } //If more input in file, go to next line if(readFile.hasNextLine()) { @@ -48,4 +53,25 @@ public File processFile(File inputFile) throws IOException { return output; } + + + private boolean isDivisibleByThree(String totalDue) { + + int sumOfDigits = 0; + + for(int i = 0;i Date: Sun, 19 Sep 2021 20:45:35 -0400 Subject: [PATCH 07/18] Add processing for random and regular in change processor --- .../service/ChangeProcessingService.java | 84 ++++++++++++++++++- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java index 6cd103ca..06008ba5 100644 --- a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java +++ b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java @@ -1,8 +1,88 @@ package com.softwriters.cashregister.service; +import java.math.BigDecimal; +import java.util.HashSet; + public class ChangeProcessingService { - public String calculateChange(double totalDue, double amountGiven) { - return "test"; + private final BigDecimal[] changeValues = {new BigDecimal("1.00"),new BigDecimal("0.25"), + new BigDecimal("0.10"), new BigDecimal("0.05"), new BigDecimal("0.01")}; + + private final String[] changeStringSingle = {"dollar", "quarter","dime", "nickel","penny"}; + private final String[] changeStringPlural = {"dollars", "quarters","dimes", "nickels","pennies"}; + + private final BigDecimal zero = new BigDecimal("0.00"); + + public String calculateChange(BigDecimal totalDue, BigDecimal amountGiven) { + + String change = ""; + + BigDecimal changeNeeded = amountGiven.subtract(totalDue); + + for(int i=0;i1) { + change += numberOfChange + " " + changeStringPlural[i] + ","; + } + + } + + return change; + } + + public String calculateRandomChange(BigDecimal totalDue, BigDecimal amountGiven) { + + String change = ""; + + BigDecimal changeNeeded = amountGiven.subtract(totalDue); + + HashSet indexSet = new HashSet<>(); + + while(indexSet.size()!=changeValues.length && changeNeeded.compareTo(zero)!= 0) { + + int randomIndex = generateRandomIndex(); + + while(indexSet.contains(randomIndex)) { + randomIndex = generateRandomIndex(); + } + + int numberOfChange = 0; + + while((changeNeeded.subtract(changeValues[randomIndex]).compareTo(zero)==1)|| + (changeNeeded.subtract(changeValues[randomIndex]).compareTo(zero)==0)) { + + numberOfChange++; + changeNeeded = changeNeeded.subtract(changeValues[randomIndex]); + } + + if(numberOfChange == 1) { + change += numberOfChange + " " + changeStringSingle[randomIndex] + ","; + } + else if (numberOfChange>1) { + change += numberOfChange + " " + changeStringPlural[randomIndex] + ","; + } + + indexSet.add(randomIndex); + } + + + return change; + } + + private int generateRandomIndex() { + int random = (int)(Math.random() * changeValues.length); + return random; } } From 57b35f2f279b090b47a6d6cf0b2f1fe29109eb38 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 21:12:44 -0400 Subject: [PATCH 08/18] Add required dependencies --- pom.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pom.xml b/pom.xml index c6216d09..6c197231 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,12 @@ spring-boot-starter-test test + + + org.junit.jupiter + junit-jupiter-engine + test + @@ -41,6 +47,20 @@ org.springframework.boot spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + From 67635680a7dbf7de729c2969567e2470c432f46b Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 21:35:17 -0400 Subject: [PATCH 09/18] Add unit tests for file parser service --- src/main/resources/sampleinput.txt | 3 -- .../service/FileParserServiceTest.java | 33 +++++++++++++++++++ src/test/resources/DivisibleByThree.txt | 2 ++ src/test/resources/NormalChange.txt | 2 ++ 4 files changed, 37 insertions(+), 3 deletions(-) delete mode 100644 src/main/resources/sampleinput.txt create mode 100644 src/test/java/com/softwriters/cashregister/service/FileParserServiceTest.java create mode 100644 src/test/resources/DivisibleByThree.txt create mode 100644 src/test/resources/NormalChange.txt diff --git a/src/main/resources/sampleinput.txt b/src/main/resources/sampleinput.txt deleted file mode 100644 index 785408c5..00000000 --- a/src/main/resources/sampleinput.txt +++ /dev/null @@ -1,3 +0,0 @@ -2.12,3.01 -1.97,2.00 -3.33,5.00 \ No newline at end of file diff --git a/src/test/java/com/softwriters/cashregister/service/FileParserServiceTest.java b/src/test/java/com/softwriters/cashregister/service/FileParserServiceTest.java new file mode 100644 index 00000000..9f55b90a --- /dev/null +++ b/src/test/java/com/softwriters/cashregister/service/FileParserServiceTest.java @@ -0,0 +1,33 @@ +package com.softwriters.cashregister.service; + +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +import java.io.File; +import java.io.IOException; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class FileParserServiceTest { + + private FlatFileParserService service; + + @BeforeEach + public void initialize() { + service = new FlatFileParserService(); + } + + @Test + public void testDivisibleByThree() throws IOException { + service = new FlatFileParserService(); + File file = service.processFile(new File("src/test/resources/DivisibleByThree.txt")); + assertNotEquals(0, file.length()); + } + + @Test + public void testNormalChange() throws IOException { + service = new FlatFileParserService(); + File file = service.processFile(new File("src/test/resources/NormalChange.txt")); + assertNotEquals(0, file.length()); + } +} diff --git a/src/test/resources/DivisibleByThree.txt b/src/test/resources/DivisibleByThree.txt new file mode 100644 index 00000000..ada041e9 --- /dev/null +++ b/src/test/resources/DivisibleByThree.txt @@ -0,0 +1,2 @@ +3.33,5.00 +3.33,6.00 \ No newline at end of file diff --git a/src/test/resources/NormalChange.txt b/src/test/resources/NormalChange.txt new file mode 100644 index 00000000..3bf15f2f --- /dev/null +++ b/src/test/resources/NormalChange.txt @@ -0,0 +1,2 @@ +4.25,5.00 +2.28,5.00 \ No newline at end of file From 179cd89ae014107109b2389492e1e5be438f7e94 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 21:36:37 -0400 Subject: [PATCH 10/18] add default constructor --- .../cashregister/service/ChangeProcessingService.java | 4 ++++ .../cashregister/service/FlatFileParserService.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java index 06008ba5..58920f53 100644 --- a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java +++ b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java @@ -13,6 +13,10 @@ public class ChangeProcessingService { private final BigDecimal zero = new BigDecimal("0.00"); + public ChangeProcessingService() { + + } + public String calculateChange(BigDecimal totalDue, BigDecimal amountGiven) { String change = ""; diff --git a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java index 9f64fbc8..6db157b3 100644 --- a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java +++ b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java @@ -8,6 +8,10 @@ public class FlatFileParserService { + public FlatFileParserService() { + + } + public File processFile(File inputFile) throws IOException { //Create Change Processing Service From 91f37861ad7872ab463b82148f96e506c16ff876 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 21:46:50 -0400 Subject: [PATCH 11/18] add unit tests for change processor service --- .../service/ChangeProcessorTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java diff --git a/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java b/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java new file mode 100644 index 00000000..e352d1f4 --- /dev/null +++ b/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java @@ -0,0 +1,29 @@ +package com.softwriters.cashregister.service; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.math.BigDecimal; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class ChangeProcessorTest { + + private ChangeProcessingService changeProcessingService; + + @BeforeEach + public void initialize() { + changeProcessingService = new ChangeProcessingService(); + } + + @Test + public void randomChangeTest() { + assertNotNull(changeProcessingService.calculateRandomChange(new BigDecimal("3.33"), new BigDecimal("5.00"))); + } + + @Test + public void normalChangeTest() { + assertEquals("1 dollar,3 quarters,2 pennies,", changeProcessingService.calculateChange(new BigDecimal("3.23"), new BigDecimal("5.00"))); + } +} From 4eb15ab245c83a958ffca81e6b16a1f51e97aecd Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Sun, 19 Sep 2021 22:08:33 -0400 Subject: [PATCH 12/18] add comments on flat file parser service --- .../cashregister/service/FlatFileParserService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java index 6db157b3..652709fc 100644 --- a/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java +++ b/src/main/java/com/softwriters/cashregister/service/FlatFileParserService.java @@ -62,7 +62,7 @@ public File processFile(File inputFile) throws IOException { private boolean isDivisibleByThree(String totalDue) { int sumOfDigits = 0; - + //Add each digit in the string for(int i = 0;i Date: Sun, 19 Sep 2021 22:14:53 -0400 Subject: [PATCH 13/18] Add comments to change processing service --- .../service/ChangeProcessingService.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java index 58920f53..e1710982 100644 --- a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java +++ b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java @@ -20,20 +20,22 @@ public ChangeProcessingService() { public String calculateChange(BigDecimal totalDue, BigDecimal amountGiven) { String change = ""; - + //Determine change needed BigDecimal changeNeeded = amountGiven.subtract(totalDue); for(int i=0;i indexSet = new HashSet<>(); + //While all denominations haven't been used and change needed isn't zero while(indexSet.size()!=changeValues.length && changeNeeded.compareTo(zero)!= 0) { + //generate random index int randomIndex = generateRandomIndex(); + //check to see if random index already used; if so re-calculate till find one while(indexSet.contains(randomIndex)) { randomIndex = generateRandomIndex(); } int numberOfChange = 0; + //subtract change till at zero or less than zero while((changeNeeded.subtract(changeValues[randomIndex]).compareTo(zero)==1)|| (changeNeeded.subtract(changeValues[randomIndex]).compareTo(zero)==0)) { @@ -71,6 +79,7 @@ public String calculateRandomChange(BigDecimal totalDue, BigDecimal amountGiven) changeNeeded = changeNeeded.subtract(changeValues[randomIndex]); } + //create change strings if(numberOfChange == 1) { change += numberOfChange + " " + changeStringSingle[randomIndex] + ","; } @@ -78,6 +87,7 @@ else if (numberOfChange>1) { change += numberOfChange + " " + changeStringPlural[randomIndex] + ","; } + //Add index to set indexSet.add(randomIndex); } From 61bb6d2dcb5c79267f5b20e63a3b40cc8095c32a Mon Sep 17 00:00:00 2001 From: Rob Murano <90995453+rmurano13@users.noreply.github.com> Date: Sun, 19 Sep 2021 22:18:06 -0400 Subject: [PATCH 14/18] Create SOLUTION.md --- SOLUTION.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 SOLUTION.md diff --git a/SOLUTION.md b/SOLUTION.md new file mode 100644 index 00000000..98ea654d --- /dev/null +++ b/SOLUTION.md @@ -0,0 +1,2 @@ +To test the solution, go to the tests for the file parser service and run. Check the output.txt file to see the output. +Feel free to add files for testing. Just make sure to update the file paths in the tests. From d3aaa0c272e184cfdcf03e2147f24cde9fd81f64 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Mon, 20 Sep 2021 17:34:45 -0400 Subject: [PATCH 15/18] Add change model and util class --- .../cashregister/model/ChangeModel.java | 52 +++++++++++++++++++ .../cashregister/util/ChangeUtil.java | 18 +++++++ 2 files changed, 70 insertions(+) create mode 100644 src/main/java/com/softwriters/cashregister/model/ChangeModel.java create mode 100644 src/main/java/com/softwriters/cashregister/util/ChangeUtil.java diff --git a/src/main/java/com/softwriters/cashregister/model/ChangeModel.java b/src/main/java/com/softwriters/cashregister/model/ChangeModel.java new file mode 100644 index 00000000..1df1fe3f --- /dev/null +++ b/src/main/java/com/softwriters/cashregister/model/ChangeModel.java @@ -0,0 +1,52 @@ +package com.softwriters.cashregister.model; + +import java.math.BigDecimal; + +public class ChangeModel { + + private BigDecimal value; + + private String currencyNameSingular; + + private String currencyNamePlural; + + public ChangeModel(String value, String currencyNameSingular, String currencyNamePlural) { + this.value = new BigDecimal(value); + this.currencyNameSingular = currencyNameSingular; + this.currencyNamePlural = currencyNamePlural; + } + + public BigDecimal getValue() { + return value; + } + + public void setValue(BigDecimal value) { + this.value = value; + } + + public String getCurrencyNameSingular() { + return currencyNameSingular; + } + + public void setCurrencyNameSingular(String currencyNameSingular) { + this.currencyNameSingular = currencyNameSingular; + } + + public String getCurrencyNamePlural() { + return currencyNamePlural; + } + + public void setCurrencyNamePlural(String currencyNamePlural) { + this.currencyNamePlural = currencyNamePlural; + } + + public String getCurrencyName(int numberOfDenominations) { + if(numberOfDenominations>1) { + return this.currencyNamePlural; + } + else { + return this.currencyNameSingular; + } + } + +} diff --git a/src/main/java/com/softwriters/cashregister/util/ChangeUtil.java b/src/main/java/com/softwriters/cashregister/util/ChangeUtil.java new file mode 100644 index 00000000..acc6ecb9 --- /dev/null +++ b/src/main/java/com/softwriters/cashregister/util/ChangeUtil.java @@ -0,0 +1,18 @@ +package com.softwriters.cashregister.util; + +import java.math.BigDecimal; + +import com.softwriters.cashregister.model.ChangeModel; + +public class ChangeUtil { + + public static ChangeModel[] change= {new ChangeModel("100.00","one-hundred dollar bill", "one-hundred dollar bills"), + new ChangeModel("50.00","fifty dollar bill", "fifty dollar bills"), + new ChangeModel("20.00","twenty dollar bill", "twenty dollar bills"), + new ChangeModel("10.00","ten dollar bill", "ten dollar bills"), + new ChangeModel("5.00","five dollar bill", "five dollar bills"), + new ChangeModel("1.00","dollar", "dollars"), new ChangeModel("0.25","quarter", "quarters"), new ChangeModel("0.10","dime", "dimes"), + new ChangeModel("0.05","nickel", "nickels"), new ChangeModel("0.01","penny", "pennies")}; + + public static BigDecimal zero = new BigDecimal("0.00"); +} From 6cc8b8a6da1ee3219a4ca529312878e414130a8c Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Mon, 20 Sep 2021 17:35:51 -0400 Subject: [PATCH 16/18] Refactor change processing service --- .../service/ChangeProcessingService.java | 50 +++++++------------ .../service/ChangeProcessorTest.java | 10 ++++ 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java index e1710982..d3d7588e 100644 --- a/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java +++ b/src/main/java/com/softwriters/cashregister/service/ChangeProcessingService.java @@ -3,15 +3,9 @@ import java.math.BigDecimal; import java.util.HashSet; -public class ChangeProcessingService { +import com.softwriters.cashregister.util.ChangeUtil; - private final BigDecimal[] changeValues = {new BigDecimal("1.00"),new BigDecimal("0.25"), - new BigDecimal("0.10"), new BigDecimal("0.05"), new BigDecimal("0.01")}; - - private final String[] changeStringSingle = {"dollar", "quarter","dime", "nickel","penny"}; - private final String[] changeStringPlural = {"dollars", "quarters","dimes", "nickels","pennies"}; - - private final BigDecimal zero = new BigDecimal("0.00"); +public class ChangeProcessingService { public ChangeProcessingService() { @@ -23,29 +17,26 @@ public String calculateChange(BigDecimal totalDue, BigDecimal amountGiven) { //Determine change needed BigDecimal changeNeeded = amountGiven.subtract(totalDue); - for(int i=0;i1) { - change += numberOfChange + " " + changeStringPlural[i] + ","; - } + if(numberOfChange>0) + change += numberOfChange + " " + ChangeUtil.change[i].getCurrencyName(numberOfChange) + ","; + } - return change; + return change.substring(0, change.length()-1); } public String calculateRandomChange(BigDecimal totalDue, BigDecimal amountGiven) { @@ -59,7 +50,7 @@ public String calculateRandomChange(BigDecimal totalDue, BigDecimal amountGiven) HashSet indexSet = new HashSet<>(); //While all denominations haven't been used and change needed isn't zero - while(indexSet.size()!=changeValues.length && changeNeeded.compareTo(zero)!= 0) { + while(indexSet.size()!=ChangeUtil.change.length && changeNeeded.compareTo(ChangeUtil.zero)!= 0) { //generate random index int randomIndex = generateRandomIndex(); @@ -72,31 +63,26 @@ public String calculateRandomChange(BigDecimal totalDue, BigDecimal amountGiven) int numberOfChange = 0; //subtract change till at zero or less than zero - while((changeNeeded.subtract(changeValues[randomIndex]).compareTo(zero)==1)|| - (changeNeeded.subtract(changeValues[randomIndex]).compareTo(zero)==0)) { + while((changeNeeded.subtract(ChangeUtil.change[randomIndex].getValue()).compareTo(ChangeUtil.zero)==1)|| + (changeNeeded.subtract(ChangeUtil.change[randomIndex].getValue()).compareTo(ChangeUtil.zero)==0)) { numberOfChange++; - changeNeeded = changeNeeded.subtract(changeValues[randomIndex]); + changeNeeded = changeNeeded.subtract(ChangeUtil.change[randomIndex].getValue()); } - //create change strings - if(numberOfChange == 1) { - change += numberOfChange + " " + changeStringSingle[randomIndex] + ","; - } - else if (numberOfChange>1) { - change += numberOfChange + " " + changeStringPlural[randomIndex] + ","; - } + if(numberOfChange>0) + change += numberOfChange + " " + ChangeUtil.change[randomIndex].getCurrencyName(numberOfChange) + ","; //Add index to set indexSet.add(randomIndex); } - return change; + return change.substring(0, change.length()-1); } private int generateRandomIndex() { - int random = (int)(Math.random() * changeValues.length); + int random = (int)(Math.random() * ChangeUtil.change.length); return random; } } diff --git a/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java b/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java index e352d1f4..520a3d10 100644 --- a/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java +++ b/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java @@ -26,4 +26,14 @@ public void randomChangeTest() { public void normalChangeTest() { assertEquals("1 dollar,3 quarters,2 pennies,", changeProcessingService.calculateChange(new BigDecimal("3.23"), new BigDecimal("5.00"))); } + + @Test + public void normalLargeChangeTest() { + assertEquals("1 fifty dollar bill,1 ten dollar bill", changeProcessingService.calculateChange(new BigDecimal("40.00"), new BigDecimal("100.00"))); + } + + @Test + public void randomLargeChangeTest() { + assertNotNull(changeProcessingService.calculateRandomChange(new BigDecimal("333"), new BigDecimal("400"))); + } } From 36d5a2a8a01c90a8401fb904246e59ad48a812ac Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Mon, 20 Sep 2021 17:40:35 -0400 Subject: [PATCH 17/18] update classpath --- .classpath | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.classpath b/.classpath index 8743e3b1..68a6cf82 100644 --- a/.classpath +++ b/.classpath @@ -18,6 +18,12 @@ + + + + + + From f725f5bc0e4836b41046fe5708eeecabbc018901 Mon Sep 17 00:00:00 2001 From: rmurano13 Date: Mon, 20 Sep 2021 17:44:33 -0400 Subject: [PATCH 18/18] Fix unit test --- .../softwriters/cashregister/service/ChangeProcessorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java b/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java index 520a3d10..93ee0c00 100644 --- a/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java +++ b/src/test/java/com/softwriters/cashregister/service/ChangeProcessorTest.java @@ -24,7 +24,7 @@ public void randomChangeTest() { @Test public void normalChangeTest() { - assertEquals("1 dollar,3 quarters,2 pennies,", changeProcessingService.calculateChange(new BigDecimal("3.23"), new BigDecimal("5.00"))); + assertEquals("1 dollar,3 quarters,2 pennies", changeProcessingService.calculateChange(new BigDecimal("3.23"), new BigDecimal("5.00"))); } @Test