-
Notifications
You must be signed in to change notification settings - Fork 590
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[yu-sutong] iP #644
base: master
Are you sure you want to change the base?
[yu-sutong] iP #644
Conversation
In build.gradle, the dependencies on distZip and/or distTar causes the shadowJar task to generate a second JAR file for which the mainClass.set("seedu.duke.Duke") does not take effect. Hence, this additional JAR file cannot be run. For this product, there is no need to generate a second JAR file to begin with. Let's remove this dependency from the build.gradle to prevent the shadowJar task from generating the extra JAR file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, just have some nitpicks with regards to the coding standards. Have highlighted them for your consideration. Thanks!
src/main/java/mysutong/Parser.java
Outdated
switch (command) { | ||
case "bye": | ||
ui.showGoodbye(); | ||
System.exit(0); | ||
break; | ||
|
||
case "list": | ||
ui.showTaskList(tasks); | ||
break; | ||
|
||
case "mark": | ||
int markIndex = Integer.parseInt(inputs[1]) - 1; | ||
tasks.getTask(markIndex).markAsDone(); | ||
ui.showLine(); | ||
ui.showMessage("Nice! I've marked this task as done:"); | ||
ui.showMessage(tasks.getTask(markIndex).toString()); | ||
ui.showLine(); | ||
storage.save(tasks); | ||
break; | ||
|
||
case "unmark": | ||
int unmarkIndex = Integer.parseInt(inputs[1]) - 1; | ||
tasks.getTask(unmarkIndex).unmark(); | ||
ui.showLine(); | ||
ui.showMessage("OK, I've marked this task as not done yet:"); | ||
ui.showMessage(tasks.getTask(unmarkIndex).toString()); | ||
ui.showLine(); | ||
storage.save(tasks); | ||
break; | ||
|
||
case "todo": | ||
tasks.addTask(new Todo(inputs[1])); | ||
ui.showLine(); | ||
ui.showMessage("Got it. I've added this task:"); | ||
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | ||
ui.showLine(); | ||
storage.save(tasks); | ||
break; | ||
|
||
case "deadline": | ||
String[] deadlineDetails = inputs[1].split("/by"); | ||
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | ||
ui.showLine(); | ||
ui.showMessage("Got it. I've added this task:"); | ||
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | ||
ui.showLine(); | ||
storage.save(tasks); | ||
break; | ||
|
||
case "event": | ||
String[] eventDetails = inputs[1].split("/from|/to"); | ||
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | ||
ui.showLine(); | ||
ui.showMessage("Got it. I've added this task:"); | ||
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | ||
ui.showLine(); | ||
storage.save(tasks); | ||
break; | ||
|
||
case "delete": | ||
int deleteIndex = Integer.parseInt(inputs[1]) - 1; | ||
Task removedTask = tasks.getTask(deleteIndex); | ||
tasks.removeTask(deleteIndex); | ||
ui.showLine(); | ||
ui.showMessage("Noted. I've removed this task:"); | ||
ui.showMessage(removedTask.toString()); | ||
ui.showLine(); | ||
storage.save(tasks); | ||
break; | ||
|
||
default: | ||
throw new UnknownCommandException("I'm sorry, but I don't know what that means."); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
switch (command) { | |
case "bye": | |
ui.showGoodbye(); | |
System.exit(0); | |
break; | |
case "list": | |
ui.showTaskList(tasks); | |
break; | |
case "mark": | |
int markIndex = Integer.parseInt(inputs[1]) - 1; | |
tasks.getTask(markIndex).markAsDone(); | |
ui.showLine(); | |
ui.showMessage("Nice! I've marked this task as done:"); | |
ui.showMessage(tasks.getTask(markIndex).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "unmark": | |
int unmarkIndex = Integer.parseInt(inputs[1]) - 1; | |
tasks.getTask(unmarkIndex).unmark(); | |
ui.showLine(); | |
ui.showMessage("OK, I've marked this task as not done yet:"); | |
ui.showMessage(tasks.getTask(unmarkIndex).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "todo": | |
tasks.addTask(new Todo(inputs[1])); | |
ui.showLine(); | |
ui.showMessage("Got it. I've added this task:"); | |
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "deadline": | |
String[] deadlineDetails = inputs[1].split("/by"); | |
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | |
ui.showLine(); | |
ui.showMessage("Got it. I've added this task:"); | |
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "event": | |
String[] eventDetails = inputs[1].split("/from|/to"); | |
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | |
ui.showLine(); | |
ui.showMessage("Got it. I've added this task:"); | |
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "delete": | |
int deleteIndex = Integer.parseInt(inputs[1]) - 1; | |
Task removedTask = tasks.getTask(deleteIndex); | |
tasks.removeTask(deleteIndex); | |
ui.showLine(); | |
ui.showMessage("Noted. I've removed this task:"); | |
ui.showMessage(removedTask.toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
default: | |
throw new UnknownCommandException("I'm sorry, but I don't know what that means."); | |
} | |
switch (command) { | |
case "bye": | |
ui.showGoodbye(); | |
System.exit(0); | |
break; | |
case "list": | |
ui.showTaskList(tasks); | |
break; | |
case "mark": | |
int markIndex = Integer.parseInt(inputs[1]) - 1; | |
tasks.getTask(markIndex).markAsDone(); | |
ui.showLine(); | |
ui.showMessage("Nice! I've marked this task as done:"); | |
ui.showMessage(tasks.getTask(markIndex).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "unmark": | |
int unmarkIndex = Integer.parseInt(inputs[1]) - 1; | |
tasks.getTask(unmarkIndex).unmark(); | |
ui.showLine(); | |
ui.showMessage("OK, I've marked this task as not done yet:"); | |
ui.showMessage(tasks.getTask(unmarkIndex).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "todo": | |
tasks.addTask(new Todo(inputs[1])); | |
ui.showLine(); | |
ui.showMessage("Got it. I've added this task:"); | |
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "deadline": | |
String[] deadlineDetails = inputs[1].split("/by"); | |
tasks.addTask(new Deadline(deadlineDetails[0].trim(), LocalDateTime.parse(deadlineDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | |
ui.showLine(); | |
ui.showMessage("Got it. I've added this task:"); | |
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "event": | |
String[] eventDetails = inputs[1].split("/from|/to"); | |
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | |
ui.showLine(); | |
ui.showMessage("Got it. I've added this task:"); | |
ui.showMessage(tasks.getTask(tasks.getTasks().size() - 1).toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
case "delete": | |
int deleteIndex = Integer.parseInt(inputs[1]) - 1; | |
Task removedTask = tasks.getTask(deleteIndex); | |
tasks.removeTask(deleteIndex); | |
ui.showLine(); | |
ui.showMessage("Noted. I've removed this task:"); | |
ui.showMessage(removedTask.toString()); | |
ui.showLine(); | |
storage.save(tasks); | |
break; | |
default: | |
throw new UnknownCommandException("I'm sorry, but I don't know what that means."); | |
} |
The coding standard mentions that switch
statements should not have indentation for case
clauses. Default formatting for your IDE may have conflicted with this.
src/main/java/mysutong/Storage.java
Outdated
switch (taskType) { | ||
case "T": | ||
task = new Todo(description); | ||
break; | ||
case "D": | ||
LocalDateTime deadlineDate = LocalDateTime.parse(parts[3], DateTimeFormatter.ofPattern("d/M/yyyy HHmm")); | ||
task = new Deadline(description, deadlineDate); | ||
break; | ||
case "E": | ||
LocalDateTime eventStart = LocalDateTime.parse(parts[3], DateTimeFormatter.ofPattern("d/M/yyyy HHmm")); | ||
LocalDateTime eventEnd = LocalDateTime.parse(parts[4], DateTimeFormatter.ofPattern("d/M/yyyy HHmm")); | ||
task = new Event(description, eventStart, eventEnd); | ||
break; | ||
default: | ||
throw new IllegalStateException("Unknown task type: " + taskType); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same issue with switch formatting.
src/main/java/mysutong/Storage.java
Outdated
import mysutong.Deadline; | ||
import mysutong.Event; | ||
|
||
import java.io.*; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Imports should be made explicit according to the coding standard.
import java.io.*; | |
import java.io.File; | |
import java.io.FileNotFoundException; | |
import java.io.BufferedWriter; | |
import java.io.IOException; |
src/main/java/mysutong/Parser.java
Outdated
|
||
case "event": | ||
String[] eventDetails = inputs[1].split("/from|/to"); | ||
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This line is past the 120 character line limit for the coding standards. It would be good to consider doing line wrapping. Alternatively you might want to separate the logic into multiple lines instead.
tasks.addTask(new Event(eventDetails[0].trim(), LocalDateTime.parse(eventDetails[1].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), LocalDateTime.parse(eventDetails[2].trim(), DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); | |
tasks.addTask(new Event(eventDetails[0].trim(), | |
LocalDateTime.parse(eventDetails[1].trim(), | |
DateTimeFormatter.ofPattern("d/M/yyyy HHmm")), | |
LocalDateTime.parse(eventDetails[2].trim(), | |
DateTimeFormatter.ofPattern("d/M/yyyy HHmm")))); |
# Conflicts: # src/main/java/mysutong/Storage.java
# Conflicts: # src/main/java/mysutong/Parser.java # src/main/java/mysutong/Ui.java
The executeCommand method in Parser handles user commands by splitting the input string into two parts: the command itself and any additional arguments. Currently, the split operation does not validate that the input string contains at least one element, which could potentially lead to unexpected behaviour or bugs if empty input is passed. To mitigate this, let's add an assert statement to ensure that the inputs array has at least one element. This ensures that the code always receives a valid command to process. In situations where assertions are enabled, this will help catch empty or invalid commands during development and testing. While this doesn't address user input validation directly (since assert can be disabled in production), it adds an extra layer of safety during development. This change also avoids unnecessary array access errors and improves the stability of the command handling logic.
This commit refactors the code to conform to the Checkstyle configuration, ensuring consistency and compliance with coding standards. Changes made: - Replaced wildcard imports (e.g., import static org.junit.jupiter.api.Assertions.*) with explicit imports for better clarity and to avoid unnecessary imports. - Corrected import order to follow the standard conventions, ensuring that java.* imports are grouped together and listed alphabetically. - Fixed spacing issues, such as ensuring a single space between comments and code, and after operators (e.g., =, +). - Improved overall code readability and conformance to Checkstyle rules by addressing minor formatting inconsistencies. These changes are intended to improve the maintainability of the codebase by ensuring that it follows consistent styling rules as enforced by Checkstyle. By doing this, we minimize the chances of formatting-related errors and enhance code readability across the project. All changes are purely stylistic and do not alter the functionality of the code.
Add assertion to ensure valid command input
Refactor code style to adhere to Checkstyle guidelines
MySutong frees your mind of having to remember things you need to do. It's,
All you need to do is,
And it is FREE!
Features: