From a117798660cf949ddc12f335fc547141a0f3d53f Mon Sep 17 00:00:00 2001 From: mo khan Date: Sun, 11 Aug 2019 15:59:50 -0600 Subject: add some error handling --- src/Q1/README.md | 15 ++++------ src/Q10/README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++ src/Q10/TrainTimeTable.java | 63 ++++++++++++++++++++++++++------------- 3 files changed, 121 insertions(+), 29 deletions(-) diff --git a/src/Q1/README.md b/src/Q1/README.md index 5af887b..abc3fe0 100644 --- a/src/Q1/README.md +++ b/src/Q1/README.md @@ -94,9 +94,8 @@ Tests run: 7, Failures: 0, Errors: 0, Skipped: 0 * - Manually running the program with valid input. ```bash -モ bundle exec rake run1 -javac ReversedSentence.java -java ReversedSentence +モ mvn package +モ java -cp target/assignment2*.jar ca.mokhan.comp268.App 1 Enter sentence 1: (max 80 characters) mary had a little lamb Enter sentence 2: (max 80 characters) @@ -116,9 +115,8 @@ Bye * - Manually running the program with input greater than 80 characters. ```bash -モ bundle exec rake run1 -javac ReversedSentence.java -java ReversedSentence +モ mvn package +モ java -cp target/assignment2*.jar ca.mokhan.comp268.App 1 Enter sentence 1: (max 80 characters) 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 Enter sentence 2: (max 80 characters) @@ -138,9 +136,8 @@ Bye * - Manually running the program with no input ```bash -モ bundle exec rake run1 -javac ReversedSentence.java -java ReversedSentence +モ mvn package +モ java -cp target/assignment2*.jar ca.mokhan.comp268.App 1 Enter sentence 1: (max 80 characters) Enter sentence 2: (max 80 characters) diff --git a/src/Q10/README.md b/src/Q10/README.md index 1cc52b1..4e31e37 100644 --- a/src/Q10/README.md +++ b/src/Q10/README.md @@ -51,6 +51,78 @@ 1. Quit - stop the program from accepting any more commands. 1. Description of the Code + There are two classes. `TrainTimeTable` is responsible for add a delay in + minutes starting for a specific station. `Station` is responsible for managing + the arrival and departure time to/from a specific train station. + + When a delay is added to the time table the code will add the delay to the + station, then to each station after it. + + It would have been easier to represent dates as a unix timestamp, which is the + number of seconds since the UNIX epoch. + The Java Date class prefers to use millisecond precision. + + All dates are represented using the UTC timezone. + + I chose to add a method/constructor overloads to make the API of each of the + classes easier to unit test. + This also helped the class design to better adhere to the open/closed principle. + 1. Errors and Warnings + + When an unknown command is entered, the prompt is shown again. + + ```bash + モ mvn package + モ java -cp target/assignment2*.jar ca.mokhan.comp268.App 10 + === Question 10 === + + Enter command (Show, Delay, Quit): + invalid + Unknown command + + Enter command (Show, Delay, Quit): + ``` + + When an unknown city is entered, an error is displayed. + + ```bash + モ mvn package + モ java -cp target/assignment2*.jar ca.mokhan.comp268.App 10 + === Question 10 === + + Enter command (Show, Delay, Quit): + Delay Calgary 25 + `Calgary` is not on the schedule + + Enter command (Show, Delay, Quit): + ``` + + When a non-numeric value is entered for minutes, an error is displayed. + + ```bash + java -cp target/assignment2*.jar ca.mokhan.comp268.App 10 + === Question 10 === + + Enter command (Show, Delay, Quit): + Delay Edmonton blah + Invalid minutes entered + + Enter command (Show, Delay, Quit): + ``` + + When a delay of greater than 48 hours is entered, an error is displayed. + + ```bash + java -cp target/assignment2*.jar ca.mokhan.comp268.App 10 + === Question 10 === + + Enter command (Show, Delay, Quit): + Delay Edmonton 9999 + Invalid minutes entered + + Enter command (Show, Delay, Quit): + ``` + 1. Sample Input and Output 1. Discussion diff --git a/src/Q10/TrainTimeTable.java b/src/Q10/TrainTimeTable.java index 52992e4..a28952b 100644 --- a/src/Q10/TrainTimeTable.java +++ b/src/Q10/TrainTimeTable.java @@ -16,11 +16,12 @@ public class TrainTimeTable { public void delay(String city, int minutes) { Station station = stationIn(city); - if (station != null) { - station.delayBy(minutes); - for (int i = schedule.indexOf(station) + 1; i < schedule.size(); i++) { - schedule.get(i).delayBy(minutes); - } + if (station == null) + throw new IllegalArgumentException(String.format("`%s` is not on the schedule", city)); + + station.delayBy(minutes); + for (int i = schedule.indexOf(station) + 1; i < schedule.size(); i++) { + schedule.get(i).delayBy(minutes); } } @@ -68,23 +69,45 @@ public class TrainTimeTable { if (selection == null) { System.out.println(); System.out.println("Enter command (Show, Delay, Quit):"); - selection = in.nextLine().toLowerCase(); + selection = in.nextLine(); } - - if (selection.equals("quit")) return; - - if (selection.equals("show")) { - schedule.displaySchedule(System.out); - } else { - String[] tokens = selection.split(" "); - - if (tokens.length < 3) continue; - - String city = ""; - for (int i = 1; i < tokens.length - 1; i++) city += tokens[i]; - schedule.delay(city, Integer.parseInt(tokens[tokens.length - 1])); + String[] tokens = selection.split(" "); + switch (tokens[0].toLowerCase()) { + case "quit": + System.exit(0); + return; + case "show": + schedule.displaySchedule(System.out); + break; + case "delay": + if (tokens.length < 3) break; + + String city = ""; + for (int i = 1; i < tokens.length - 1; i++) city += tokens[i]; + + try { + String enteredMinutes = tokens[tokens.length - 1]; + + if (!enteredMinutes.matches("\\d+")) { + System.out.println("Invalid minutes entered"); + break; + } + + int minutes = Integer.parseInt(enteredMinutes); + if (minutes > (48 * 60)) { + System.out.println("Invalid minutes entered"); + break; + } + schedule.delay(city, minutes); + } catch (IllegalArgumentException error) { + System.out.println(error.getMessage()); + } + + break; + default: + System.out.println("Unknown command"); + break; } - selection = null; } } -- cgit v1.2.3