1)
Description
For this Homework, you will be writing two classes: Loan and LendingCalculator. These classes will help a user determine their repayment options for potential loans.
Note: This assignment greatly simplifies the calculations and analysis required for these situations. Do not use your solution for real-world financial decisions!
Note: 5 points of your Challenge grade is based on Coding Style. You will need to follow the standards described on Brightspace.Use the "Run" button to check your Coding Style without using a submission.
Instructions
The implementation instructions are documented below.Note: Functionality descriptions are exact. That is, if a method performs some calculation, your program must implement that calculation within the method. If you implement it elsewhere, such as in the main method or a different class, you will not receive credit.
Loan
This class contains attributes associated with a specific loan.
Fields
Name |
Type |
Modifiers |
Description |
---|
duration
|
int
|
private
|
The length of the loan in months. |
rate
|
double
|
private
|
The annual percentage interest of the loan. |
amount
|
double
|
private
|
The total amount of the loan. |
monthlyPayment
|
double
|
private
|
The monthly payment of the loan. |
Constructor
Parameters |
Modifier |
Description |
---|
int duration, double rate, double amount
|
public
|
Instantiate the class fields to their associated parameters.
Call the
calculateMonthlyPayment
method to instantiate the
monthlyPayment field. The implementation details are below. |
Methods
Name |
Return Type |
Parameters |
Modifier |
Description |
---|
getDuration
|
int
|
None |
public
|
Returns the duration of the loan. |
getRate
|
double
|
None |
public
|
Returns the rate of the loan. |
getAmount
|
double
|
None |
public
|
Returns the amount of the loan. |
setDuration
|
void
|
int duration
|
public
|
Sets the duration of a loan. |
setRate
|
void
|
double rate
|
public
|
Sets the rate of a loan. |
setAmount
|
void
|
double amount
|
public
|
Sets the amount of a loan. |
calculateMonthlyPayment
|
double
|
None |
public
|
Calculate and return the monthly payment using the formula in the next section. |
calculateTotalInterest
|
double
|
boolean output
|
public
|
Calculate and return the total interest paid using the formula in the next section.
Ifoutput is true, print the amortization table as part of the calculation. Ifoutput is false, only return the calculated value.
|
toString
|
String
|
None |
public
|
Return a String formatted according to the specification in the next section. |
Monthly Payment Calculation
Monthly Payment =amount
*((rate
/ 12)* (1 +
rate
/ 12)
duration
) / ((1 +
rate
/ 12)
duration
- 1 )
Hint: You'll need to find a way to do exponential calculations. Math.pow() will be useful!
Total Interest Calculation
Calculating the total loan interest may seem complex at first, but the actual math is quite simple. We will generate an amortization table to help us track the individual values. This is a formatted statement that tracks the amount of principal and interest paid with each loan payment, along with the current balance.
Interest is calculated on a monthly basis. We can find the interest charged each month by multiplying the current balance by the monthly interest rate (annual rate / 12). To find the amount of the monthly payment that is applied to the balance of the loan, just substract the monthly interest from the payment amount.
Thus, for the total Interest calculation, we have the following values:
- Monthly Payment: (calculated in the previous section).
- Payment Number: Incremented by one with every iteration.
- Principal: (calculated by subtracting the monthly interest from the monthly payment).
- Interest: (calculated by multiplying the current balance by the monthly rate).
- Remaining: (calculated by subtracting the principal from the current balance).
Here's an example:
Assume the loan has an initial balance of 1,000, interest rate of 12%, and duration of 12.This will result in a monthly payment of 88.85.
Payment: 1 - Principal: 78.85 - Interest: 10.00 - Remaining: 921.15
Payment: 2 - Principal: 79.64 - Interest: 9.21 - Remaining: 841.51
Payment: 3 - Principal: 80.43 - Interest: 8.42 - Remaining: 761.08
Payment: 4 - Principal: 81.24 - Interest: 7.61 - Remaining: 679.84
Payment: 5 - Principal: 82.05 - Interest: 6.80 - Remaining: 597.79
Payment: 6 - Principal: 82.87 - Interest: 5.98 - Remaining: 514.92
Payment: 7 - Principal: 83.70 - Interest: 5.15 - Remaining: 431.22
Payment: 8 - Principal: 84.54 - Interest: 4.31 - Remaining: 346.68
Payment: 9 - Principal: 85.38 - Interest: 3.47 - Remaining: 261.30
Payment: 10 - Principal: 86.24 - Interest: 2.61 - Remaining: 175.07
Payment: 11 - Principal: 87.10 - Interest: 1.75 - Remaining: 87.97
Payment: 12 - Principal: 87.97 - Interest: 0.88 - Remaining: 0.00
The total interest paid in this case would be 66.19.
toString Format
Include the following information in your toString implementation: Amount, Rate, Duration, and Payment.
For example, given the following fields values:
- amount = 1000.00
- rate = 0.12
- duration = 12
- monthlyPayment = 88.85
The corresponding toString output would be as follows:
"Amount: 1000.00 - Rate: 0.12 - Duration: 12 - Payment: 88.85".
Be sure to follow this formatting exactly! All doubles should be formatted to two decimal places.
LendingCalculator
This class includes a menu for the user to interact with various loan options. The menu should loop until the user decides to quit. This menu should be in a main method, but we encourage you to utilize additional methods to simplify processing.
Menu
There are two stages to the menu operations: Initial and Ongoing.
In the initial stage, the user can select to either quit or add a loan. If they add a loan, the program prompts them to enter the details and prints a summary. After doing so, the menu switches to the ongoing interface. If the user selects to quit, the program prints a farewell message and exits.
In the ongoing stage, the user can select to quit, modify a loan, and calculate total interest. If the user modifies a loan, the same processing for adding a loan will take place. If the user selects to calculate total interest, they will choose whether or not they would like the amortization table printed before receiving the output. If the user selects to quit, the program prints a farewell message and exits.
Output
Each of the potential selections is included as sample output below.
Sample 1
Welcome to the Lending Calculator!
Menu
0. Quit
1. Add a loan
[0]
Thank you!
Sample 2
Welcome to the Lending Calculator!
Menu
0. Quit
1. Add a loan
[1]
Enter the duration:
[12]
Enter the rate:
[0.12]
Enter the amount:
[1000]
Amount: 1000.00 - Rate: 0.12 - Duration: 12 - Payment: 88.85
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[0]
Thank you!
Sample 3
Welcome to the Lending Calculator!
Menu
0. Quit
1. Add a loan
[1]
Enter the duration:
[12]
Enter the rate:
[0.12]
Enter the amount:
[1000]
Amount: 1000.00 - Rate: 0.12 - Duration: 12 - Payment: 88.85
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[1]
Enter the duration:
[24]
Enter the rate:
[0.06]
Enter the amount:
[2000]
Amount: 2000.00 - Rate: 0.06 - Duration: 24 - Payment: 88.64
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[0]
Thank you!
Sample 4
Welcome to the Lending Calculator!
Menu
0. Quit
1. Add a loan
[1]
Enter the duration:
[12]
Enter the rate:
[0.12]
Enter the amount:
[1000]
Amount: 1000.00 - Rate: 0.12 - Duration: 12 - Payment: 88.85
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[2]
Would you like to print the amortization schedule?
1. Yes
2. No
[1]
Payment: 1 - Principal: 78.85 - Interest: 10.00 - Remaining: 921.15
Payment: 2 - Principal: 79.64 - Interest: 9.21 - Remaining: 841.51
Payment: 3 - Principal: 80.43 - Interest: 8.42 - Remaining: 761.08
Payment: 4 - Principal: 81.24 - Interest: 7.61 - Remaining: 679.84
Payment: 5 - Principal: 82.05 - Interest: 6.80 - Remaining: 597.79
Payment: 6 - Principal: 82.87 - Interest: 5.98 - Remaining: 514.92
Payment: 7 - Principal: 83.70 - Interest: 5.15 - Remaining: 431.22
Payment: 8 - Principal: 84.54 - Interest: 4.31 - Remaining: 346.68
Payment: 9 - Principal: 85.38 - Interest: 3.47 - Remaining: 261.30
Payment: 10 - Principal: 86.24 - Interest: 2.61 - Remaining: 175.07
Payment: 11 - Principal: 87.10 - Interest: 1.75 - Remaining: 87.97
Payment: 12 - Principal: 87.97 - Interest: 0.88 - Remaining: 0.00
Total Interest: 66.19
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[0]
Thank you!
Sample 5
Welcome to the Lending Calculator!
Menu
0. Quit
1. Add a loan
[1]
Enter the duration:
[12]
Enter the rate:
[0.12]
Enter the amount:
[1000]
Amount: 1000.00 - Rate: 0.12 - Duration: 12 - Payment: 88.85
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[2]
Would you like to print the amortization schedule?
1. Yes
2. No
[2]
Total Interest: 66.19
Menu
0. Quit
1. Modify Loan
2. Calculate Total Interest
[0]
Thank you!
Note: Brackets [] indicate input.
Note: All print statements involving doubles should be formatted to two decimal places.
Testing
We have included a program that will allow you to create and run output tests automatically in the Starter Code. This will make it easier for you to verify that each possible progression through your solution is correct. Take a look atRunLocalTest.java
. There are many utility features and tools that you do not need to worry about at the moment, instead, focus on the test case. It is included in the Starter Code. Read through it.
You can modify the test to test any method you like by following the same format. You can either download the program and run the main method or use the "Run" button on Vocareum to run the test. You can repeat this process for each path.
You can also use the testing strategy from the walkthrough.
Public Test Cases Note
For many homeworks and projects, we will give you test cases that correspond to several of the ways we will be testing your program. But, we will not give you test cases for ALL of the ways we will be testing your program. You should think of other test cases to use that will fully test every aspect of every feature of your program. Just because your program passes all the test cases we give you does not mean that it is fully correct and will receive a score of 100.
Submit
After testing your solution and verifying that it meets the requirements described in this document, you can submit on Vocareum. You have 10 submission attempts to achieve full points.
Starter code-
public class LendingCalculator {
private static String welcomeMessage = "Welcome to the Lending Calculator!";
private static String menu = "Menu";
private static String initialMenu = "0. Quit\n1. Add a loan";
private static String ongoingMenu = "0. Quit\n1. Modify Loan\n2. Calculate Total Interest";
private static String exitMessage = "Thank you!";
private static String durationMessage = "Enter the duration:";
private static String rateMessage = "Enter the rate:";
private static String amountMessage = "Enter the amount:";
private static String amortizationPrompt = "Would you like to print the amortization schedule?";
private static String amortizationMenu = "1. Yes\n2. No";
private static String totalInterestMessage = "Total Interest: ";
private static String errorMessage = "Error! Invalid input.";
}
2)
Description
For this project, you will be writing a lab management application. You will track lab reservations for three labs to help the CS department allocate space effectively.
This project is worth 7% of your final grade. We recommend that you take it, along with the other projects in the class, very seriously.
You will be implementing four classes:Session
,Lab
,LabManager
, andTimeKeeper
.
Note: 5 points of your grade is based on Coding Style. You will need to update the Starter Code to follow the standards described on Brightspace. Use the "Run" button to check your Coding Style without using a submission.
Instructions
Follow the instructions for each class.
Session.java
This class represents an individual session in a lab.
Fields
Field Name
|
Type
|
Access Modifier
|
Description
|
name
|
String
|
private
|
The name of the session.
|
enrollment
|
int
|
private
|
The number of attendees enrolled in this session.
|
Constructor
Access Modifier
|
Constructor Name
|
Input Parameters
|
Description
|
public
|
Session
|
String name, int enrollment
|
Construct a newly allocatedSessionobject and instantiate the fields to their respective parameters.
|
public
|
Session
|
None
|
Construct a newly allocatedSessionobject and instantiate the fields to the following:
|
Methods
Method Name
|
Return Type
|
Access Modifier
|
Input Parameters
|
Description
|
getName
|
String
|
public
|
|
Returns thenameof thisSession.
|
getEnrollment
|
int
|
public
|
|
Returns theenrollmentof thisSession.
|
setName
|
void
|
public
|
String name
|
Sets thenameof thisSession.
|
setEnrollment
|
void
|
public
|
int enrollment
|
Sets theenrollmentof thisSession.
|
toString
|
String
|
public
|
None
|
Returns the String representation of thisSession.
For Example, given the following fields:
name= "CS 18000"
enrollment= 21
The result of callingtoString()would be:
- Session{Name - CS 18000, Enrollment - 21}
|
Lab.java
This class represents the lab.
Fields
Field Name
|
Type
|
Access Modifier
|
Description
|
morning
|
Session
|
private
|
The morning session associated with this lab.
|
afternoon
|
Session
|
private
|
The afternoon session associated with this lab.
|
capacity
|
int
|
private
|
The room capacity of this lab.
|
location
|
String
|
private
|
The location of this lab.
|
Constructors:
Access Modifier
|
Constructor Name
|
Input Parameters
|
Description
|
public
|
Lab
|
Session morning,
Session afternoon,
int capacity,
String location
|
Construct a newly allocatedLabobject and instantiate the fields to the specified parameters.
|
public
|
Lab
|
int capacity,
String location
|
Construct a newly allocatedLabobject and instantiate the fields to the specified parameters.
Instantiate the two Session fields by calling the Session constructor with no parameters.
|
Methods:
Method Name
|
Return Type
|
Access Modifier
|
Input
Parameters
|
Description
|
getMorning |
Session
|
public
|
None
|
Returns themorningsession of thisLab.
|
getAfternoon |
Session
|
public
|
None
|
Returns theafternoonsession of thisLab.
|
getCapacity
|
int
|
public
|
None
|
Returns thecapacityof thisLab.
|
getLocation
|
String
|
public
|
None
|
Returns thelocationof thisLab.
|
setMorning |
void
|
public
|
Session morning
|
Sets themorningsession of thisLab.
|
setAfternoon |
void
|
public
|
Session afternoon
|
Sets theafternoonsession of thisLab.
|
setCapacity
|
void
|
public
|
int capacity
|
Sets thecapacityof thisLab.
|
setLocation
|
void
|
public
|
String location
|
Sets thelocationof thisLab.
|
listAvailabilities
|
String
|
public
|
None
|
Returns a String that documents the available sessions for this lab.
If the morning is available, add "Morning: Available\n" to the String.
If the afternoon is available, add "Afternoon: Available\n" to the String.
If no session is available, return "No Availabilities".
Note: If both sessions are available, be sure to include each in the returned String.
Note: A session is considered available if the enrollment is 0.
|
listReservations
|
String
|
public
|
None
|
Returns a String that documents the reserved sessions for this lab.
If the morning is reserved, add "Morning: Reserved\n" to the String.
If the afternoon is reserved, add "Afternoon: Reserved\n" to the String.
If no session is reserved, return "No Reservations".
Note: If both sessions are reserved, be sure to include each in the returned String.
Note: A session is considered reserved if the enrollment is greater than 0.
|
toString
|
String
|
public
|
None
|
Returns the String representation of thisLab.
For Example, given the following fields:
capacity= 25
location= "LWSN B148"
morning= Session{Name - CS 18000, Enrollment - 21}
afternoon= Session{Name - "", Enrollment - 0}
The result of callingtoString()would be:
- Lab{Capacity - 25, Location - LWSN B148, Morning: Session{Name - CS 18000, Enrollment - 21}, Afternoon: Available}
Note: If a session is not reserved for either of the available times, do not include the toString for that session. Instead, add "Available".
|
LabManager.java
LabManager includes the three labs that you will need to manage. Additionally, it will have several methods that will be useful for the user interface.
Note: You must create each of the classes and implement them as described in their respective sections. Failure to do so will negatively impact your score.
Fields
Field Name
|
Type
|
Access Modifier
|
Description
|
labOne
|
Lab
|
private
|
The first lab of thisLabManager.
|
labTwo
|
Lab
|
private
|
The second lab of thisLabManager.
|
labThree
|
Lab
|
private
|
The third lab of thisLabManager.
|
Constructor
Access Modifier
|
Constructor Name
|
Input Parameters
|
Description
|
public
|
LabManager
|
Lab labOne,
Lab labTwo,
Lab labThree
|
Construct a newly allocatedLabManagerobject and instantiate the fields to their respective parameters.
|
Methods
Method Name
|
Return Type
|
Access Modifier
|
Input Parameters
|
Description
|
getLabOne
|
Lab
|
public
|
None
|
Returns the first lab of thisLabManager.
|
getLabTwo
|
Lab
|
public
|
None
|
Returns the second lab of thisLabManager.
|
getLabThree
|
Lab
|
public
|
None
|
Returns the third lab of thisLabManager.
|
setLabOne
|
void
|
public
|
Lab labOne
|
Sets the first lab of thisLabManager.
|
setLabTwo
|
void
|
public
|
Lab labTwo
|
Sets the second lab of thisLabManager.
|
setLabThree
|
void
|
public
|
Lab labThree
|
Sets the third lab of thisLabManager.
|
calculateTotalCapacity
|
int
|
public
|
None
|
Returns the total capacity for all three labs. The total capacity is the maximum number of seats occupied if every session for all three labs is booked at full capacity.
For the following three labs:
- labOne
- Capacity: 25
- Morning: 20
- Afternoon: 14
- labTwo
- Capacity: 20
- Morning: 20
- Afternoon: 15
- labThree
- Capacity: 36
- Morning: 31
- Afternoon: 32
The result of calling calculateTotalCapacity would be 162.
|
calculateTotalUtilization
|
double
|
public
|
None
|
Returns the average percentage utilization for all three labs. This is the percentage of seats occupied overall out of the total seats available.
For example, if labOne has an enrollment of 20 in the morning and 14 in the afternoon, with a capacity of 25, the average utilization for the lab is 0.68 (68%). This method calculates the total average utilization for all three labs combined.
For the following three labs:
- labOne
- Capacity: 25
- Morning: 20
- Afternoon: 14
- labTwo
- Capacity: 20
- Morning: 20
- Afternoon: 15
- labThree
- Capacity: 36
- Morning: 31
- Afternoon: 32
The result of calling calculateTotalUtilization would be 0.81.
|
calculateAvailableSeats
|
int
|
public
|
None
|
Returns the total number of available seats for all three labs.
If a session is not reserved, the available seats for that session are the lab capacity. If a session is reserved, the available seats would be the lab capacity minus the enrollment.
For the following three labs:
- labOne
- Capacity: 25
- Morning: 20
- Afternoon: 14
- labTwo
- Capacity: 20
- Morning: 20
- Afternoon: 15
- labThree
- Capacity: 36
- Morning: 31
- Afternoon: 32
The result of calling calculateAvailableSeats would be 30.
|
listReservedLabs
|
String
|
public
|
None
|
List the reservations for each lab.
For example, if each of the morning sessions are reserved, the output would be as follows:
Lab One Morning: Reserved
Lab Two Morning: Reserved
Lab Three Morning: Reserved
If a lab has no reservations, the "No Reservations" message should be used instead. For example, if no lab has any reservations, the output would be as follows:
Lab One No Reservations
Lab Two No Reservations
Lab Three No Reservations
|
listAvailableLabs
|
String
|
public
|
None
|
List the availabilities for each lab.
For example, if each of the morning sessions are reserved, the output would be as follows:
Lab One Afternoon: Available
Lab Two Afternoon: Available
Lab Three Afternoon: Available
If a lab has no availabilities, the "No Availabilities" message should be used instead. For example, if no lab has any availabilities, the output would be as follows:
Lab One No Availabilities
Lab Two No Availabilities
Lab Three No Availabilities
|
addReservation
|
String
|
public
|
String location,
String time,
String name,
int enrollment
|
Adds a reservation for the lab at the specified location and time. Returns a message depending on the outcome of the operation.
Potential returns:
- Success - "Reservation added!"
- Enrollment is greater than capacity - "Error. Capacity exceeded"
- Time is invalid or already reserved - "Error. Invalid time."
- Location is invalid - "Error. Invalid location"
A successful operation updates the session at the specified time and location with the name and enrollment provided. No changes occur if there is an error.
|
removeReservation
|
String
|
public
|
String location,
String time
|
Removes a reservation for the lab at the specified location and time. Returns a message depending on the outcome of the operation.
Potential returns:
- Success - "Reservation removed!"
- Time is invalid or was not reserved - "Error. Invalid time."
- Location is invalid - "Error. Invalid location"
A successful operation removes the session at the specified time and location by changing the name to "" and enrollment to 0. No changes occur if there is an error.
|
modifyReservation
|
String
|
public
|
String location,
String time,
String name,
int enrollment
|
Modifies a reservation for the lab at the specified location and time. Returns a message depending on the outcome of the operation.
Potential returns:
- Success - "Reservation modified!"
- Enrollment is greater than capacity - "Error. Capacity exceeded"
- Time is invalid or was not reserved - "Error. Invalid time."
- Location is invalid - "Error. Invalid location"
A successful operation updates the session at the specified time and location with the name and enrollment provided. No changes occur if there is an error.
|
toString
|
String
|
public
|
None
|
Returns the String representation of thisLabManager.
For Example, given the following fields:
labOne= Lab{Capacity - 25, Location - LWSN B146, Morning: Session{Name - CS 18000, Enrollment - 21}, Afternoon: Available}
labTwo= Lab{Capacity - 22, Location - LWSN B148, Morning: Session{Name - CS 24000, Enrollment - 19}, Afternoon: Available}
labThree= Lab{Capacity - 24, Location - LWSN B158, Morning: Session{Name - CS 25100, Enrollment - 23}, Afternoon: Available}
The result of callingtoString()would be:
- LabManager{Lab{Capacity - 25, Location - LWSN B146, Morning: Session{Name - CS 18000, Enrollment - 21}, Afternoon: Available}, Lab{Capacity - 22, Location - LWSN B148, Morning: Session{Name - CS 24000, Enrollment - 19}, Afternoon: Available}, Lab{Capacity - 24, Location - LWSN B158, Morning: Session{Name - CS 25100, Enrollment - 23}, Afternoon: Available}}
|
TimeKeeper.java
TimeKeeper includes the several menus for the user to navigate as they manage the labs. The implementation details are up to you, but we recommend that you utilize the methods we require for the other classes. You are also welcome to add additional methods, provided your solution still meets the specifications provided above.
There are three menus in the TimeKeeper application: initialization, ongoing, and statistics. Each will be discussed separately below.
Note: Brackets [] indicate input.
Initialization Menu
This menu runs immediately following the program welcome message. It prompts the user to enter the lab details. This information should be used to initialize the labs in LabManager.
Sample Output 1
Welcome to the TimeKeeper application!
1. Initialize Application
2. Exit
[1] Enter the capacity for Lab 1: [25] Enter the location for Lab 1: [LWSN B158] Enter the capacity for Lab 2: [24] Enter the location for Lab 2: [LWSN B148] Enter the capacity for Lab 3: [22] Enter the location for Lab 3: [HAAS G040]
Is the user elects to exit, print the exit message and end the program.
Sample Output 2
Welcome to the TimeKeeper application! 1. Initialize Application 2. Exit [2] Thank you for using TimeKeeper!
If the user enters an invalid input, print the error message and reprint the menu.
Sample Output 3
Welcome to the TimeKeeper application! 1. Initialize Application 2. Exit [3] Invalid input. Please try again. 1. Initialize Application 2. Exit [2] Thank you for using TimeKeeper!
Ongoing Menu & Statistics Menu
The Ongoing Menu controls the main application features after initialization. Each option corresponds to functionality in the other classes. We recommend that you consider ways to optimize your code while developing the solution. We've included the expected output for each menu option as samples below.
Note: Sample Output in this section is truncated to remove the initialization menu portion. You may assume that it immediately precedes any sample. You may also assume that the output is all from the same run (modifications persist between sections).
Sample Output 1
1. View Current Lab Schedule
2. List Labs by Availability
3. List Labs by Reservation
4. Add a Reservation
5. Remove a Reservation
6. Modify a Reservation
7. Calculate Statistics
8. Exit
[1]
Lab{Capacity - 22, Location - LWSN B158, Morning: Available, Afternoon: Available} Lab{Capacity - 22, Location - LWSN B148, Morning: Available, Afternoon: Available} Lab{Capacity - 16, Location - HAAS G040, Morning: Available, Afternoon: Available} 1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit
Sample Output 2
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [2] Lab One Morning: Available Afternoon: Available Lab Two Morning: Available Afternoon: Available Lab Three Morning: Available Afternoon: Available
Sample Output 3
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [3] Lab One No Reservations Lab Two No Reservations Lab Three No Reservations
Sample Output 4
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [4] Enter the location of the lab: [LWSN B158] Enter the time of the reservation: [morning] Enter the name of the reservation: [CS 18000] Enter the expected enrollment: [18] Reservation added!
1. View Current Lab Schedule
2. List Labs by Availability
3. List Labs by Reservation
4. Add a Reservation
5. Remove a Reservation
6. Modify a Reservation
7. Calculate Statistics
8. Exit
[4]
Enter the location of the lab:
[LWSN B158]
Enter the time of the reservation:
[afternoon]
Enter the name of the reservation:
[CS 24000]
Enter the expected enrollment:
[20]
Reservation added!
Sample Output 5
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [5] Enter the location of the lab: [LWSN B158] Enter the time of the reservation: [afternoon] Reservation removed!
Sample Output 6
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [6] Enter the location of the lab: [LWSN B158] Enter the time of the reservation: [morning] Enter the updated name of the reservation: [CS 25100] Enter the updated enrollment: [12] Reservation updated!
Sample Output 7
Sample Output 7 includes the statistics menu. Each of the options prints the results of a different calculation.
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [7] 1. Total Capacity 2. Total Utilization 3. Available seats 4. Return to main menu [1] Total Capacity: 120 1. Total Capacity 2. Total Utilization 3. Available seats 4. Return to main menu [2] Total Utilization: 0.10 1. Total Capacity 2. Total Utilization 3. Available seats 4. Return to main menu [3] Available seats: 108 1. Total Capacity 2. Total Utilization 3. Available seats 4. Return to main menu [4]
Sample Output 8
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [8] Thank you for using TimeKeeper!
Sample Output 9
1. View Current Lab Schedule 2. List Labs by Availability 3. List Labs by Reservation 4. Add a Reservation 5. Remove a Reservation 6. Modify a Reservation 7. Calculate Statistics 8. Exit [12] Invalid input. Please try again.
Additional Notes:
Testing
We have included a program that will allow you to create and run output tests automatically in the Starter Code. This will make it easier for you to verify that each possible progression through your solution is correct. Take a look atRunLocalTest.java
. There are many utility features and tools that you do not need to worry about at the moment, instead, focus on the test case. It is included in the Starter Code. Read through it.
You can modify the test to test any method you like by following the same format. You can either download the program and run the main method or use the "Run" button on Vocareum to run the test. You can repeat this process for each path.
Public Test Cases Note
For many homeworks and projects, we will give you test cases that correspond to several of the ways we will be testing your program. But, we will not give you test cases for ALL of the ways we will be testing your program. You should think of other test cases to use that will fully test every aspect of every feature of your program. Just because your program passes all the test cases we give you does not mean that it is fully correct and will receive a score of 100.
Submit
After testing your solution and verifying that it meets the requirements described in this document, you can submit on Vocareum. You have 10 submission attempts to achieve full points.
Starter code-
import org.junit.Test;
import org.junit.After;
import java.lang.reflect.Field;
import org.junit.Assert;
import org.junit.Before;
import org.junit.rules.Timeout;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
import javax.swing.*;
import java.io.*;
import java.lang.reflect.*;
import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;
import java.lang.reflect.InvocationTargetException;
import java.util.UUID;
import static org.junit.Assert.*;
/**
* A framework to run public test cases.
*
*
Purdue University -- CS18000 -- Summer 2021
*
* @author Purdue CS
* @version June 14, 2021
*/
public class RunLocalTest {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestCase.class);
if (result.wasSuccessful()) {
System.out.println("Excellent - Test ran successfully");
} else {
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
}
}
/**
* A set of public test cases.
*
*
Purdue University -- CS18000 -- Summer 2021
*
* @author Purdue CS
* @version June 14, 2021
*/
public static class TestCase {
private final PrintStream originalOutput = System.out;
private final InputStream originalSysin = System.in;
@SuppressWarnings("FieldCanBeLocal")
private ByteArrayInputStream testIn;
@SuppressWarnings("FieldCanBeLocal")
private ByteArrayOutputStream testOut;
@Before
public void outputStart() {
testOut = new ByteArrayOutputStream();
System.setOut(new PrintStream(testOut));
}
@After
public void restoreInputAndOutput() {
System.setIn(originalSysin);
System.setOut(originalOutput);
}
private String getOutput() {
return testOut.toString();
}
@SuppressWarnings("SameParameterValue")
private void receiveInput(String str) {
testIn = new ByteArrayInputStream(str.getBytes());
System.setIn(testIn);
}
@Test(timeout = 1000)
public void classDeclarationTestOne() {
Class clazz = Session.class;
int modifiers = clazz.getModifiers();
Class[] superinterfaces = clazz.getInterfaces();
assertTrue("Ensure that `Session` is `public`!", Modifier.isPublic(modifiers));
assertFalse("Ensure that `Session` is NOT `abstract`!", Modifier.isAbstract(modifiers));
Assert.assertEquals("Ensure that `Session` implements no interfaces!", 0, superinterfaces.length);
}
@Test(timeout = 1000)
public void classDeclarationTestTwo() {
Class clazz = Lab.class;
int modifiers = clazz.getModifiers();
Class[] superinterfaces = clazz.getInterfaces();
assertTrue("Ensure that `Lab` is `public`!", Modifier.isPublic(modifiers));
assertFalse("Ensure that `Lab` is NOT `abstract`!", Modifier.isAbstract(modifiers));
Assert.assertEquals("Ensure that `Lab` implements no interfaces!", 0, superinterfaces.length);
}
@Test(timeout = 1000)
public void classDeclarationTestThree() {
Class clazz = LabManager.class;
int modifiers = clazz.getModifiers();
Class[] superinterfaces = clazz.getInterfaces();
assertTrue("Ensure that `LabManager` is `public`!", Modifier.isPublic(modifiers));
assertFalse("Ensure that `LabManager` is NOT `abstract`!", Modifier.isAbstract(modifiers));
Assert.assertEquals("Ensure that `LabManager` implements no interfaces!", 0, superinterfaces.length);
}
@Test(timeout = 1000)
public void classDeclarationTestFour() {
Class clazz = TimeKeeper.class;
int modifiers = clazz.getModifiers();
Class[] superinterfaces = clazz.getInterfaces();
assertTrue("Ensure that `TimeKeeper` is `public`!", Modifier.isPublic(modifiers));
assertFalse("Ensure that `TimeKeeper` is NOT `abstract`!", Modifier.isAbstract(modifiers));
Assert.assertEquals("Ensure that `TimeKeeper` implements no interfaces!", 0, superinterfaces.length);
}
@Test(timeout = 1000)
public void fullOutputTestOne() {
try {
String expected = "Welcome to the TimeKeeper application!\n" +
"1. Initialize Application\n" +
"2. Exit\n" +
"Thank you for using TimeKeeper!\n";
String input = "2\n";
receiveInput(input);
TimeKeeper.main(new String[0]);
String actual = getOutput();
Assert.assertEquals("Ensure TimeKeeper functions as described in the handout!", expected, actual);
} catch (Exception e){
e.printStackTrace();
fail();
}
}
@Test(timeout = 1000)
public void fullOutputTestTwo() {
try {
String expected = "Welcome to the TimeKeeper application!\n" +
"1. Initialize Application\n" +
"2. Exit\n" +
"Invalid input. Please try again.\n" +
"1. Initialize Application\n" +
"2. Exit\n" +
"Invalid input. Please try again.\n" +
"1. Initialize Application\n" +
"2. Exit\n" +
"Thank you for using TimeKeeper!\n";
String input = "12\n99\n2\n";
receiveInput(input);
TimeKeeper.main(new String[0]);
String actual = getOutput();
Assert.assertEquals("Ensure TimeKeeper functions as described in the handout!", expected, actual);
} catch (Exception e){
e.printStackTrace();
fail();
}
}
}
}