1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
|
Learning Profile for Assignment #1, And Question #2
Name: Mo Khan
Student ID: 3431709
1. Problem Statement:
Modify the following program to the specifications given below:
* I. Add a new status `SingleParent` where the tax is computed as a SINGLE but with a further reduction of $5000 per child.
* II. Add a new tax condition - if the income is greater than $249,999 for SINGLE, then add a tax of 25% on income amount above $150,000; if the income is greater than $349,999 for MARRIED, then add a tax of 35% on income amount above $200,000.
* III. Unknown status - if the status doesn't belong to `SINGLE` or `MARRIED` or `SINGLE_PARENT`, then compute a 33% tax on the income.
```java
import java.util.Scanner;
public class TaxReturn {
public TaxReturn(double anIncome, int aStatus) {
income = anIncome;
status = aStatus;
}
public double getTax() {
double tax = 0;
if (status == SINGLE) {
if (income <= SINGLE_BRACKET1) tax = RATE1 * income;
else if (income <= SINGLE_BRACKET2)
tax = RATE1 * SINGLE_BRACKET1 + RATE2 * (income - SINGLE_BRACKET1);
else
tax =
RATE1 * SINGLE_BRACKET1
+ RATE2 * (SINGLE_BRACKET2 - SINGLE_BRACKET1)
+ RATE3 * (income - SINGLE_BRACKET2);
} else {
if (income <= MARRIED_BRACKET1) tax = RATE1 * income;
else if (income <= MARRIED_BRACKET2)
tax = RATE1 * MARRIED_BRACKET1 + RATE2 * (income - MARRIED_BRACKET1);
else
tax =
RATE1 * MARRIED_BRACKET1
+ RATE2 * (MARRIED_BRACKET2 - MARRIED_BRACKET1)
+ RATE3 * (income - MARRIED_BRACKET2);
}
return tax;
}
public static final int SINGLE = 1;
public static final int MARRIED = 2;
private static final double RATE1 = 0.15;
private static final double RATE2 = 0.28;
private static final double RATE3 = 0.31;
private static final double SINGLE_BRACKET1 = 21450;
private static final double SINGLE_BRACKET2 = 51900;
private static final double MARRIED_BRACKET1 = 35800;
private static final double MARRIED_BRACKET2 = 86500;
private double income;
private int status;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Please enter your income: ");
double income = in.nextDouble();
System.out.print("Enter S (single) or M (married): ");
String input = in.next();
int status = 0;
if (input.equalsIgnoreCase("S")) status = TaxReturn.SINGLE;
else if (input.equalsIgnoreCase("M")) status = TaxReturn.MARRIED;
else {
System.out.println("Bad input.");
return;
}
TaxReturn aTaxReturn = new TaxReturn(income, status);
System.out.println("The tax is " + aTaxReturn.getTax());
}
}
```
2. Description of the Code:
I started by adding tests for the existing code. By adding test coverage
for the existing code, this makes it possible to add new features
without breaking old features.
I chose to decrease the taxable income in the constructor if the person
is single.
3. Errors and Warnings:
```bash
モ mvn test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< ca.mokhan.comp268:assignment1 >--------------------
[INFO] Building assignment1 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- fmt-maven-plugin:2.8:format (default) @ assignment1 ---
[INFO] Processed 48 files (0 reformatted).
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ assignment1 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ assignment1 ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ assignment1 ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/mokha/development/gh/comp-268/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ assignment1 ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 24 source files to /Users/mokha/development/gh/comp-268/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ assignment1 ---
[INFO] Surefire report directory: /Users/mokha/development/gh/comp-268/target/surefire-reports
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running ca.mokhan.comp268.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.007 sec
Running ca.mokhan.test.CandidateTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 sec
Running ca.mokhan.test.NumberTest
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 sec
Running ca.mokhan.test.EmployeeSavingsTest
Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.008 sec
Running ca.mokhan.test.CartesianCoordinateSystemTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running ca.mokhan.test.CommunicationTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running ca.mokhan.test.TaxReturnTest
Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
Running ca.mokhan.test.BanffMarathonRunnerTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 sec
Running ca.mokhan.test.AddressBookTest
Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running ca.mokhan.test.TriangleTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running ca.mokhan.test.BonusOnSavingsTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running ca.mokhan.test.HailstoneSequenceTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Results :
Tests run: 52, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.871 s
[INFO] Finished at: 2019-05-13T20:07:42-06:00
[INFO] ------------------------------------------------------------------------
```
4. Sample Input and Output:
Test cases are defined in `TaxReturnTest.java`.
5. Discussion:
There is a lot of conditional logic in `getTax()`. I considered
[Refactor conditional with polymorphism](https://refactoring.com/catalog/replaceConditionalWithPolymorphism.html)
but decided not to make this change.
|