From 9e29122a4c577ce969fc0461f78109c8f8be8f74 Mon Sep 17 00:00:00 2001 From: yisiox Date: Sun, 18 Feb 2024 02:24:40 +0800 Subject: [PATCH] Ui: remove Earl specific behaviour Moved welcome and goodbye message definitions into the Earl class instead. Add HelpHandler A help command is invoked when the user types "help", or an invalid input, enumerating the list of available commands. --- src/main/java/earl/Earl.java | 18 ++++++++----- .../java/earl/exceptions/ParserException.java | 3 --- src/main/java/earl/logic/HandlerType.java | 6 +++++ src/main/java/earl/logic/HelpHandler.java | 27 +++++++++++++++++++ src/main/java/earl/logic/TaskHandler.java | 13 +++++---- src/main/java/earl/util/Ui.java | 26 +++--------------- .../java/earl/util/parsers/InputParser.java | 10 ++++--- .../earl/util/parsers/InputParserTest.java | 14 +++------- 8 files changed, 65 insertions(+), 52 deletions(-) create mode 100644 src/main/java/earl/logic/HelpHandler.java diff --git a/src/main/java/earl/Earl.java b/src/main/java/earl/Earl.java index 6a1d8b01d1..2ad46a9d73 100644 --- a/src/main/java/earl/Earl.java +++ b/src/main/java/earl/Earl.java @@ -1,7 +1,6 @@ package earl; import earl.exceptions.EarlException; -import earl.exceptions.ParserException; import earl.exceptions.StorageException; import earl.logic.Handler; import earl.util.Storage; @@ -15,6 +14,15 @@ */ public class Earl { + private static final String[] GREETING_MESSAGE = { + "Greetings, I, Earl, extend my esteemed salutations.", + "Pray, how may I be of service to you on this auspicious day?" + }; + private static final String[] GOODBYE_MESSAGE = { + "Farewell, dear interlocutor!", + "Until our paths intertwine again, I bid you adieu." + }; + private final Storage storage; private final TaskList tasks; private final Ui ui; @@ -25,14 +33,14 @@ public class Earl { * @param filePath a path to the text file storing past data */ public Earl(String filePath) { - ui = new Ui(); + ui = new Ui(GREETING_MESSAGE); storage = new Storage(filePath); tasks = new TaskList(storage.load(TaskStorageParser::parse)); if (!storage.wasLoadSuccessful()) { ui.buildResponse("Storage hath succumb to corruption... ", "initiating an unfortunate state of emptiness."); } - ui.showGreeting(); + ui.completeResponse(); } /** Main function for TUI mode. */ @@ -81,15 +89,13 @@ private void processUserInput(String input) { handler.handle(tasks, ui); } catch (EarlException e) { ui.makeResponse(e.getMessage()); - } catch (ParserException e) { - ui.makeResponse("Input defies parsing: " + e.getMessage()); } } private void saveAndExit() { try { storage.save(tasks.getAsStorageStringStream()); - ui.showGoodbye(); + ui.makeResponse(GOODBYE_MESSAGE); } catch (StorageException e) { ui.makeResponse("Alas, a grievous misfortune occurred " + "during the endeavour to save."); diff --git a/src/main/java/earl/exceptions/ParserException.java b/src/main/java/earl/exceptions/ParserException.java index 297f66d06f..73617c793e 100644 --- a/src/main/java/earl/exceptions/ParserException.java +++ b/src/main/java/earl/exceptions/ParserException.java @@ -8,7 +8,4 @@ public class ParserException extends Exception { public ParserException() { super(); } - public ParserException(String message) { - super(message); - } } diff --git a/src/main/java/earl/logic/HandlerType.java b/src/main/java/earl/logic/HandlerType.java index cad53b46eb..89854c3e02 100644 --- a/src/main/java/earl/logic/HandlerType.java +++ b/src/main/java/earl/logic/HandlerType.java @@ -52,6 +52,12 @@ public Handler createHandler(String args) { public Handler createHandler(String args) { return new FindHandler(args); } + }, + HELP { + @Override + public Handler createHandler(String args) { + return new HelpHandler(args); + } }; public abstract Handler createHandler(String args); diff --git a/src/main/java/earl/logic/HelpHandler.java b/src/main/java/earl/logic/HelpHandler.java new file mode 100644 index 0000000000..2cd4a727a5 --- /dev/null +++ b/src/main/java/earl/logic/HelpHandler.java @@ -0,0 +1,27 @@ +package earl.logic; + +import earl.util.TaskList; +import earl.util.Ui; + +/** + * Class responsible for displaying list of available commands. + */ +public class HelpHandler extends Handler { + + public HelpHandler(String args) { + super(args); + } + + @Override + public void handle(TaskList tasks, Ui ui) { + if (!args.isEmpty()) { + ui.buildResponse("Input defies parsing: " + args); + } + ui.buildResponse("Pray, issue a command forthwith."); + ui.buildResponse("The sanctioned commands unfold:"); + for (HandlerType type : HandlerType.values()) { + ui.buildResponse("-" + type.name().toLowerCase()); + } + ui.completeResponse(); + } +} diff --git a/src/main/java/earl/logic/TaskHandler.java b/src/main/java/earl/logic/TaskHandler.java index b5fa686120..5ade102f06 100644 --- a/src/main/java/earl/logic/TaskHandler.java +++ b/src/main/java/earl/logic/TaskHandler.java @@ -21,13 +21,12 @@ protected String[] addTask(TaskList tasks, TaskType type, String... data) try { Task newTask = type.createTask(data); tasks.add(newTask); - - String first = "A new " + type.name() + " " + newTask.toString(); - String second = "hath been appended to the " - + "roster of responsibilities."; - String third = "The ledger of tasks bears witness to " - + tasks.getSize() + " endeavour(s)."; - return new String[]{first, second, third}; + return new String[]{ + "A new " + type.name() + " " + newTask.toString(), + "hath been appended to the roster of responsibilities.", + "The ledger of tasks bears witness to " + + tasks.getSize() + " endeavour(s)." + }; } catch (IndexOutOfBoundsException e) { throw new EarlException("An error befalls."); } catch (TimeException e) { diff --git a/src/main/java/earl/util/Ui.java b/src/main/java/earl/util/Ui.java index 1980740f01..b17aca4fe2 100644 --- a/src/main/java/earl/util/Ui.java +++ b/src/main/java/earl/util/Ui.java @@ -12,24 +12,17 @@ public class Ui { private static final String PADDING = " ".repeat(4); private static final String DIVIDER = "_".repeat(60); private static final String NEWLINE = System.lineSeparator(); - private static final String GREETING_MESSAGE = - "Greetings, I, Earl, extend my esteemed salutations." + NEWLINE - + PADDING + "Pray, how may I be of service to you" - + " on this auspicious day?"; - private static final String GOODBYE_MESSAGE = - "Farewell, dear interlocutor!" + NEWLINE - + PADDING + "Until our paths intertwine again, I bid you adieu."; private final Scanner sc; private final List delayedResponse; + private String[] response; // the lines of the previous response /** Class constructor. */ - public Ui() { + public Ui(String... initialMessage) { sc = new Scanner(System.in); - response = new String[1]; - response[0] = GREETING_MESSAGE; - delayedResponse = new ArrayList<>(); + response = initialMessage; + delayedResponse = new ArrayList<>(List.of(initialMessage)); } private void setPrevResponse(String... arr) { @@ -88,17 +81,6 @@ public String appendNewline(String line) { return line + NEWLINE; } - /** Displays the initial greeting. */ - public void showGreeting() { - // response is built in case of any preceding error messages - buildResponse(GREETING_MESSAGE); - completeResponse(); - } - - public void showGoodbye() { - makeResponse(GOODBYE_MESSAGE); - } - /** * Returns the previous response made for GUI interactions. * diff --git a/src/main/java/earl/util/parsers/InputParser.java b/src/main/java/earl/util/parsers/InputParser.java index aaad00a228..d1e0eb6ae3 100644 --- a/src/main/java/earl/util/parsers/InputParser.java +++ b/src/main/java/earl/util/parsers/InputParser.java @@ -1,6 +1,5 @@ package earl.util.parsers; -import earl.exceptions.ParserException; import earl.logic.Handler; import earl.logic.HandlerType; @@ -14,19 +13,22 @@ public class InputParser implements Parser { * * @param input text input by the user * @return a {@code Handler} object of the relevant type - * @throws ParserException if user input is of unexpected format */ - public static Handler parse(String input) throws ParserException { + public static Handler parse(String input) { try { // all valid input is expected to be of the format // [, , ...] String[] data = input.split("\\s+", 2); + assert data.length > 0; String command = data[0].toUpperCase(); + if (command.isEmpty()) { + return HandlerType.HELP.createHandler(input); + } String args = (data.length > 1) ? data[1] : ""; HandlerType handlerType = HandlerType.valueOf(command); return handlerType.createHandler(args); } catch (Exception e) { - throw new ParserException(input); + return HandlerType.HELP.createHandler(input); } } } diff --git a/src/test/java/earl/util/parsers/InputParserTest.java b/src/test/java/earl/util/parsers/InputParserTest.java index bc1307c166..e30c9b24f1 100644 --- a/src/test/java/earl/util/parsers/InputParserTest.java +++ b/src/test/java/earl/util/parsers/InputParserTest.java @@ -1,14 +1,12 @@ package earl.util.parsers; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.fail; import org.junit.jupiter.api.Test; -import earl.exceptions.ParserException; import earl.logic.Handler; +import earl.logic.HelpHandler; import earl.logic.TodoHandler; class InputParserTest { @@ -21,12 +19,8 @@ void parse_normalInput_handlerReturnedSuccess() throws Exception { } @Test - void parse_invalidInput_exceptionThrown() { - try { - InputParser.parse("no ip"); - fail(); - } catch (ParserException e) { - assertEquals("no ip", e.getMessage()); - } + void parse_invalidInput_returnHelpHandler() { + Handler handler = InputParser.parse("no ip"); + assertInstanceOf(HelpHandler.class, handler); } }