Fixed CLI to allow for full testing by using State Machines for everything, test for editing passes now
This commit is contained in:
@@ -6,8 +6,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
public class UserCommands implements Runnable {
|
||||
private Scanner scanner;
|
||||
private AssignmentManager manager;
|
||||
private boolean inTaskSelection = false;
|
||||
private boolean inWorkerSelection = false;
|
||||
private Integer selectedTaskId = null;
|
||||
private Integer selectedWorkerId = null;
|
||||
private AtomicBoolean running = new AtomicBoolean(false);
|
||||
@@ -21,7 +19,8 @@ public class UserCommands implements Runnable {
|
||||
AWAITING_CREATE_TASK_WORKER,
|
||||
AWAITING_CREATE_TASK_NAME,
|
||||
AWAITING_CREATE_TASK_DESC,
|
||||
AWAITING_CREATE_WORKER_NAME
|
||||
AWAITING_CREATE_WORKER_NAME,
|
||||
AWAITING_TASK_SELECTION
|
||||
}
|
||||
|
||||
private InputState currentState = InputState.MAIN_MENU;
|
||||
@@ -68,12 +67,35 @@ public class UserCommands implements Runnable {
|
||||
private void printPrompt() {
|
||||
if (!running.get()) return;
|
||||
|
||||
if (inTaskSelection && selectedTaskId != null) {
|
||||
System.out.println("Task " + selectedTaskId + " selected. Commands: finish, unfinish, remove, edit, back");
|
||||
} else if (inWorkerSelection && selectedWorkerId != null) {
|
||||
System.out.println("Worker " + selectedWorkerId + " selected. Commands: remove, back");
|
||||
} else {
|
||||
System.out.println("Type '?' or 'help' for a list of commands");
|
||||
switch (currentState) {
|
||||
case MAIN_MENU:
|
||||
System.out.println("Type '?' or 'help' for a list of commands");
|
||||
break;
|
||||
case TASK_SELECTED:
|
||||
System.out.println("Task " + selectedTaskId + " selected. Commands: finish, unfinish, remove, edit, back");
|
||||
break;
|
||||
case WORKER_SELECTED:
|
||||
if (selectedWorkerId != null) {
|
||||
System.out.println("Worker " + selectedWorkerId + " selected. Commands: remove, back");
|
||||
} else {
|
||||
System.out.println("Enter worker ID to select (or 'back'):");
|
||||
}
|
||||
break;
|
||||
case AWAITING_EDIT_INPUT:
|
||||
System.out.println("Enter new name;description:");
|
||||
break;
|
||||
case AWAITING_CREATE_WORKER_NAME:
|
||||
System.out.println("Enter worker name:");
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_WORKER:
|
||||
System.out.println("Enter worker ID:");
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_NAME:
|
||||
System.out.println("Enter task name:");
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_DESC:
|
||||
System.out.println("Enter task description:");
|
||||
break;
|
||||
}
|
||||
System.out.print("> ");
|
||||
}
|
||||
@@ -89,73 +111,90 @@ public class UserCommands implements Runnable {
|
||||
}
|
||||
|
||||
try {
|
||||
if (inTaskSelection) {
|
||||
handleTaskSelectionInput(input);
|
||||
} else if (inWorkerSelection) {
|
||||
handleWorkerSelectionInput(input);
|
||||
} else {
|
||||
handleMainMenuInput(input);
|
||||
switch (currentState) {
|
||||
case MAIN_MENU:
|
||||
handleMainMenuInput(input);
|
||||
break;
|
||||
case TASK_SELECTED:
|
||||
handleTaskSelectionInput(input);
|
||||
break;
|
||||
case WORKER_SELECTED:
|
||||
handleWorkerSelectionInput(input);
|
||||
break;
|
||||
case AWAITING_EDIT_INPUT:
|
||||
handleEditInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_WORKER:
|
||||
handleCreateTaskWorkerInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_NAME:
|
||||
handleCreateTaskNameInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_TASK_DESC:
|
||||
handleCreateTaskDescInput(input);
|
||||
break;
|
||||
case AWAITING_CREATE_WORKER_NAME:
|
||||
handleCreateWorkerNameInput(input);
|
||||
break;
|
||||
case AWAITING_TASK_SELECTION:
|
||||
handleTaskIdInput(input);
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("Error: " + e.getMessage());
|
||||
resetToMainMenu();
|
||||
}
|
||||
}
|
||||
|
||||
private void showHelp() {
|
||||
if (inTaskSelection && selectedTaskId != null) {
|
||||
System.out.println("Task commands:");
|
||||
System.out.println(" finish - Mark task as finished");
|
||||
System.out.println(" unfinish - Mark task as unfinished");
|
||||
System.out.println(" remove - Remove this task");
|
||||
System.out.println(" edit - Edit task (prompts for name;description)");
|
||||
System.out.println(" back - Return to main menu");
|
||||
} else if (inWorkerSelection && selectedWorkerId != null) {
|
||||
System.out.println("Worker commands:");
|
||||
System.out.println(" remove - Remove this worker");
|
||||
System.out.println(" back - Return to main menu");
|
||||
} else {
|
||||
System.out.println("Available commands:");
|
||||
System.out.println(" createWorker - Create a new worker");
|
||||
System.out.println(" createTask - Create a new task");
|
||||
System.out.println(" selectTask - Select a task to work with");
|
||||
System.out.println(" listWorkers - List all workers");
|
||||
System.out.println(" help/? - Show this help");
|
||||
System.out.println(" exit - Exit the program");
|
||||
}
|
||||
System.out.println("=== Available Commands ===");
|
||||
System.out.println("General:");
|
||||
System.out.println(" help, ? - Show this help");
|
||||
System.out.println(" exit - Exit the program");
|
||||
System.out.println(" listworkers - List all workers and select one");
|
||||
System.out.println(" selecttask - Select a task by ID");
|
||||
System.out.println(" createtask - Create a new task");
|
||||
System.out.println(" createworker - Create a new worker");
|
||||
System.out.println(" listtasks - List all tasks");
|
||||
System.out.println(" listunfinished - List unfinished tasks");
|
||||
System.out.println(" listfinished - List finished tasks");
|
||||
|
||||
System.out.println("\nWhen a task is selected:");
|
||||
System.out.println(" finish - Mark task as finished");
|
||||
System.out.println(" unfinish - Mark task as unfinished");
|
||||
System.out.println(" remove - Remove the task");
|
||||
System.out.println(" edit - Edit task name and description");
|
||||
System.out.println(" back - Return to main menu");
|
||||
|
||||
System.out.println("\nWhen a worker is selected:");
|
||||
System.out.println(" remove - Remove the worker");
|
||||
System.out.println(" back - Return to main menu");
|
||||
}
|
||||
|
||||
private void handleMainMenuInput(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "createworker":
|
||||
System.out.print("Enter worker name: ");
|
||||
String workerName = scanner.nextLine().trim();
|
||||
int workerId = manager.createWorker(workerName);
|
||||
System.out.println("Created worker with ID: " + workerId);
|
||||
System.out.println("Enter worker name:");
|
||||
currentState = InputState.AWAITING_CREATE_WORKER_NAME;
|
||||
break;
|
||||
|
||||
case "createtask":
|
||||
System.out.print("Enter worker ID: ");
|
||||
int workerIdForTask = Integer.parseInt(scanner.nextLine().trim());
|
||||
System.out.print("Enter task name: ");
|
||||
String taskName = scanner.nextLine().trim();
|
||||
System.out.print("Enter task description: ");
|
||||
String taskDesc = scanner.nextLine().trim();
|
||||
int taskId = manager.addTask(workerIdForTask, taskName, taskDesc);
|
||||
System.out.println("Created task with ID: " + taskId);
|
||||
System.out.println("Enter worker ID:");
|
||||
currentState = InputState.AWAITING_CREATE_TASK_WORKER;
|
||||
break;
|
||||
|
||||
case "selecttask":
|
||||
inTaskSelection = true;
|
||||
System.out.print("Enter task ID: ");
|
||||
String taskIdInput = scanner.nextLine().trim();
|
||||
selectedTaskId = Integer.parseInt(taskIdInput);
|
||||
System.out.println("Enter task ID:");
|
||||
currentState = InputState.AWAITING_TASK_SELECTION; // Change to new state
|
||||
break;
|
||||
|
||||
case "listworkers":
|
||||
inWorkerSelection = true;
|
||||
System.out.print("Enter worker ID: ");
|
||||
String workerIdInput = scanner.nextLine().trim();
|
||||
selectedWorkerId = Integer.parseInt(workerIdInput);
|
||||
System.out.println("Available workers:");
|
||||
for (Worker w : manager.getWorkerMap().values()) {
|
||||
System.out.println(" " + w.getId() + ": " + w.getName());
|
||||
}
|
||||
System.out.println("Enter worker ID to select (or 'back'):");
|
||||
currentState = InputState.WORKER_SELECTED;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -163,86 +202,187 @@ public class UserCommands implements Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
private void handleWorkerSelectionInput(String input) {
|
||||
if ("back".equalsIgnoreCase(input)) {
|
||||
resetToMainMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
int workerId = Integer.parseInt(input.trim());
|
||||
Worker worker = manager.getWorker(workerId);
|
||||
if (worker != null) {
|
||||
selectedWorkerId = workerId;
|
||||
System.out.println("Worker " + workerId + " (" + worker.getName() + ") selected");
|
||||
System.out.println("Commands: remove, back");
|
||||
} else {
|
||||
System.out.println("Worker not found. Please enter a valid worker ID:");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
if (selectedWorkerId != null) {
|
||||
handleWorkerCommand(input);
|
||||
} else {
|
||||
System.out.println("Invalid input. Please enter a worker ID or 'back':");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleWorkerCommand(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "remove":
|
||||
manager.removeWorker(selectedWorkerId);
|
||||
System.out.println("Worker removed");
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
case "back":
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
default:
|
||||
System.out.println("Unknown command. Available commands: remove, back");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleCreateWorkerNameInput(String input) {
|
||||
int workerId = manager.createWorker(input.trim());
|
||||
System.out.println("Created worker with ID: " + workerId);
|
||||
resetToMainMenu();
|
||||
}
|
||||
private void handleTaskIdInput(String input) {
|
||||
if ("back".equalsIgnoreCase(input)) {
|
||||
resetToMainMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
int taskId = Integer.parseInt(input.trim());
|
||||
Task task = manager.getTask(taskId);
|
||||
if (task != null) {
|
||||
selectedTaskId = taskId;
|
||||
currentState = InputState.TASK_SELECTED;
|
||||
System.out.println("Task " + taskId + " (" + task.getName() + ") selected");
|
||||
System.out.println("Commands: finish, unfinish, remove, edit, back");
|
||||
} else {
|
||||
System.out.println("Task not found. Please enter a valid task ID:");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Invalid input. Please enter a task ID or 'back':");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void handleCreateTaskWorkerInput(String input) {
|
||||
try {
|
||||
tempWorkerId = Integer.parseInt(input.trim());
|
||||
System.out.println("Enter task name:");
|
||||
currentState = InputState.AWAITING_CREATE_TASK_NAME;
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Invalid worker ID. Please enter a number:");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleCreateTaskNameInput(String input) {
|
||||
tempTaskName = input.trim();
|
||||
System.out.println("Enter task description:");
|
||||
currentState = InputState.AWAITING_CREATE_TASK_DESC;
|
||||
}
|
||||
|
||||
private void handleCreateTaskDescInput(String input) {
|
||||
int taskId = manager.addTask(tempWorkerId, tempTaskName, input.trim());
|
||||
System.out.println("Created task with ID: " + taskId);
|
||||
resetToMainMenu();
|
||||
}
|
||||
|
||||
private void resetToMainMenu() {
|
||||
currentState = InputState.MAIN_MENU;
|
||||
selectedTaskId = null;
|
||||
selectedWorkerId = null;
|
||||
tempWorkerId = null;
|
||||
tempTaskName = null;
|
||||
}
|
||||
|
||||
private void handleTaskSelectionInput(String input) {
|
||||
if ("back".equalsIgnoreCase(input)) {
|
||||
resetToMainMenu();
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
int taskId = Integer.parseInt(input.trim());
|
||||
Task task = manager.getTask(taskId);
|
||||
if (task != null) {
|
||||
selectedTaskId = taskId;
|
||||
currentState = InputState.TASK_SELECTED;
|
||||
System.out.println("Task " + taskId + " (" + task.getName() + ") selected");
|
||||
System.out.println("Commands: finish, unfinish, remove, edit, back");
|
||||
} else {
|
||||
System.out.println("Task not found. Please enter a valid task ID:");
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
if (selectedTaskId != null) {
|
||||
handleTaskCommand(input);
|
||||
} else {
|
||||
System.out.println("Invalid input. Please enter a task ID or 'back':");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void handleTaskCommand(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "finish":
|
||||
manager.finishTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId);
|
||||
manager.finishTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId);
|
||||
System.out.println("Task marked as finished");
|
||||
break;
|
||||
|
||||
case "unfinish":
|
||||
manager.unfinishTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId);
|
||||
manager.unfinishTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId);
|
||||
System.out.println("Task marked as unfinished");
|
||||
break;
|
||||
|
||||
case "remove":
|
||||
manager.removeTask(selectedTaskId);
|
||||
System.out.println("Task removed");
|
||||
resetSelection();
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
case "edit":
|
||||
System.out.print("Enter new name;description: ");
|
||||
String editInput = scanner.nextLine().trim();
|
||||
String[] parts = editInput.split(";", 2);
|
||||
if (parts.length == 2) {
|
||||
manager.editTask(manager.getTask(selectedTaskId).getWorkerId(),selectedTaskId,parts[0],parts[1]);
|
||||
System.out.println("Task edited");
|
||||
} else {
|
||||
System.out.println("Invalid format. Use: name;description");
|
||||
}
|
||||
System.out.println("Enter new name;description:");
|
||||
currentState = InputState.AWAITING_EDIT_INPUT;
|
||||
break;
|
||||
|
||||
case "back":
|
||||
resetSelection();
|
||||
resetToMainMenu();
|
||||
break;
|
||||
|
||||
default:
|
||||
try {
|
||||
selectedTaskId = Integer.parseInt(input);
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Unknown command. Type 'help' for available commands.");
|
||||
}
|
||||
System.out.println("Unknown command. Type 'help' for available commands.");
|
||||
}
|
||||
}
|
||||
|
||||
private void handleWorkerSelectionInput(String input) {
|
||||
switch (input.toLowerCase()) {
|
||||
case "remove":
|
||||
manager.removeWorker(selectedWorkerId);
|
||||
System.out.println("Worker removed");
|
||||
resetSelection();
|
||||
break;
|
||||
|
||||
case "back":
|
||||
resetSelection();
|
||||
break;
|
||||
|
||||
default:
|
||||
try {
|
||||
selectedWorkerId = Integer.parseInt(input);
|
||||
} catch (NumberFormatException e) {
|
||||
System.out.println("Unknown command. Type 'help' for available commands.");
|
||||
}
|
||||
private void handleEditInput(String input) {
|
||||
String[] parts = input.split(";", 2);
|
||||
if (parts.length == 2) {
|
||||
manager.editTask(manager.getTask(selectedTaskId).getWorkerId(), selectedTaskId, parts[0], parts[1]);
|
||||
System.out.println("Task edited");
|
||||
} else {
|
||||
System.out.println("Invalid format. Use: name;description");
|
||||
System.out.println("Please try again:");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void resetSelection() {
|
||||
inTaskSelection = false;
|
||||
inWorkerSelection = false;
|
||||
selectedTaskId = null;
|
||||
selectedWorkerId = null;
|
||||
currentState = InputState.TASK_SELECTED;
|
||||
}
|
||||
|
||||
public Scanner getScanner() {
|
||||
return scanner;
|
||||
}
|
||||
|
||||
// For testing - allows setting scanner
|
||||
//only for testing
|
||||
public void setScanner(Scanner scanner) {
|
||||
this.scanner = scanner;
|
||||
}
|
||||
|
||||
//only for testing
|
||||
public boolean isRunning() {
|
||||
return running.get();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user