Skip to content

Commit

Permalink
Merge dba5a6d into 2a531c6
Browse files Browse the repository at this point in the history
  • Loading branch information
AaronCQL authored Apr 6, 2020
2 parents 2a531c6 + dba5a6d commit 080bed5
Show file tree
Hide file tree
Showing 10 changed files with 229 additions and 16 deletions.
25 changes: 25 additions & 0 deletions src/main/java/seedu/address/commons/trie/SimilarWordsResult.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package seedu.address.commons.trie;

import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;

import java.util.ArrayList;

/**
Expand All @@ -12,7 +14,30 @@ public class SimilarWordsResult {
public final ArrayList<String> similarWords;

public SimilarWordsResult(String longestPrefixString, ArrayList<String> similarWords) {
requireAllNonNull(longestPrefixString, similarWords);
this.longestPrefixString = longestPrefixString;
this.similarWords = similarWords;
}

public boolean hasNoResult() {
return similarWords.isEmpty();
}

public boolean hasOnlyOneWord() {
return similarWords.size() == 1;
}

public String getSingleWord() {
assert hasOnlyOneWord();
return similarWords.get(0);
}

public String getLongestPrefix() {
return longestPrefixString;
}

public ArrayList<String> getSimilarWords() {
return similarWords;
}

}
117 changes: 105 additions & 12 deletions src/main/java/seedu/address/logic/autocomplete/AutoComplete.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;

import java.util.ArrayList;
import java.util.List;

import javafx.scene.control.TextField;
import seedu.address.commons.trie.SimilarWordsResult;
Expand All @@ -13,12 +13,14 @@
import seedu.address.logic.commands.DeleteCommand;
import seedu.address.logic.commands.DeleteExerciseCommand;
import seedu.address.logic.commands.EditCommand;
import seedu.address.logic.commands.EditExerciseCommand;
import seedu.address.logic.commands.ExitCommand;
import seedu.address.logic.commands.FindCommand;
import seedu.address.logic.commands.HelpCommand;
import seedu.address.logic.commands.ListCommand;
import seedu.address.logic.commands.ScheduleCommand;
import seedu.address.logic.commands.ViewCommand;
import seedu.address.logic.parser.Prefix;
import seedu.address.ui.ResultDisplay;

/**
Expand All @@ -32,7 +34,9 @@ public class AutoComplete {
public static final String FEEDBACK_NO_COMMANDS = "No commands found";

private static final int CARET_POSITION_INDEX = Integer.MAX_VALUE;
private static final String EMPTY_STRING = "";
private static final String WHITE_SPACE_STRING = " ";
private static final String PREAMBLE_WHITE_SPACE = " ";

private final Trie trie;
private final TextField commandTextField;
Expand Down Expand Up @@ -60,6 +64,7 @@ private void addAllCommands() {
trie.insert(DeleteCommand.COMMAND_WORD);
trie.insert(DeleteExerciseCommand.COMMAND_WORD);
trie.insert(EditCommand.COMMAND_WORD);
trie.insert(EditExerciseCommand.COMMAND_WORD);
trie.insert(ExitCommand.COMMAND_WORD);
trie.insert(FindCommand.COMMAND_WORD);
trie.insert(HelpCommand.COMMAND_WORD);
Expand All @@ -68,6 +73,99 @@ private void addAllCommands() {
trie.insert(ViewCommand.COMMAND_WORD);
}

/**
* Returns a string of {@code prefixes} delimited by a single empty space.
*/
public String generatePrefixesString(List<Prefix> prefixes) {
String toReturn = EMPTY_STRING;
for (Prefix p : prefixes) {
toReturn += WHITE_SPACE_STRING + p.toString();
}
return toReturn;
}

private void noCommandHandler() {
resultDisplay.setFeedbackToUser(FEEDBACK_NO_COMMANDS);
}

/**
* Handles the instance when the autocomplete can uniquely identify a single
* command.
*/
private void singleCommandHandler(String command) {
String textToSet = command;
String textToFeedback = FEEDBACK_EMPTY_STRING;
int caretPositionToSet = CARET_POSITION_INDEX;

switch (command) {
case AddCommand.COMMAND_WORD:
textToSet += generatePrefixesString(AddCommand.PREFIXES);
textToFeedback = AddCommand.MESSAGE_USAGE;
break;
case AddExerciseCommand.COMMAND_WORD:
textToSet += generatePrefixesString(AddExerciseCommand.PREFIXES);
textToFeedback = AddExerciseCommand.MESSAGE_USAGE;
break;
case ClearCommand.COMMAND_WORD:
textToFeedback = ClearCommand.MESSAGE_USAGE;
break;
case DeleteCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE;
textToFeedback = DeleteCommand.MESSAGE_USAGE;
break;
case DeleteExerciseCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE;
textToFeedback = DeleteExerciseCommand.MESSAGE_USAGE;
break;
case EditCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE;
textToFeedback = EditCommand.MESSAGE_USAGE;
break;
case ExitCommand.COMMAND_WORD:
textToFeedback = ExitCommand.MESSAGE_USAGE;
break;
case EditExerciseCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE;
textToFeedback = EditExerciseCommand.MESSAGE_USAGE;
break;
case FindCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE;
textToFeedback = FindCommand.MESSAGE_USAGE;
break;
case HelpCommand.COMMAND_WORD:
textToFeedback = HelpCommand.MESSAGE_USAGE;
break;
case ListCommand.COMMAND_WORD:
textToFeedback = ListCommand.MESSAGE_USAGE;
break;
case ScheduleCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE + generatePrefixesString(ScheduleCommand.PREFIXES);
textToFeedback = ScheduleCommand.MESSAGE_USAGE;
caretPositionToSet = textToSet.indexOf(PREAMBLE_WHITE_SPACE) + 1;
break;
case ViewCommand.COMMAND_WORD:
textToSet += PREAMBLE_WHITE_SPACE;
textToFeedback = ViewCommand.MESSAGE_USAGE;
break;
default:
break;
}

commandTextField.setText(textToSet);
commandTextField.positionCaret(caretPositionToSet);
resultDisplay.setFeedbackToUser(textToFeedback);
}

/**
* Handles the instance when the autocomplete cannot uniquely identify a single
* command.
*/
private void multipleCommandsHandler(SimilarWordsResult result) {
commandTextField.setText(result.getLongestPrefix());
commandTextField.positionCaret(CARET_POSITION_INDEX);
resultDisplay.setFeedbackToUser(FEEDBACK_MULTIPLE_COMMANDS + result.getSimilarWords().toString());
}

/**
* Executes the main logic behind the autocomplete. Should be called when the
* user presses "tab".
Expand All @@ -81,18 +179,13 @@ public void execute() {
}

SimilarWordsResult similarWords = trie.listAllSimilarWords(currCommand);
String longestPrefix = similarWords.longestPrefixString;
ArrayList<String> similarCommands = similarWords.similarWords;
if (similarCommands.isEmpty()) {
resultDisplay.setFeedbackToUser(FEEDBACK_NO_COMMANDS);
} else if (similarCommands.size() == 1) {
resultDisplay.setFeedbackToUser(FEEDBACK_EMPTY_STRING);
commandTextField.setText(similarCommands.get(0));
commandTextField.positionCaret(CARET_POSITION_INDEX);

if (similarWords.hasNoResult()) {
noCommandHandler();
} else if (similarWords.hasOnlyOneWord()) {
singleCommandHandler(similarWords.getSingleWord());
} else {
commandTextField.setText(longestPrefix);
commandTextField.positionCaret(CARET_POSITION_INDEX);
resultDisplay.setFeedbackToUser(FEEDBACK_MULTIPLE_COMMANDS + similarCommands.toString());
multipleCommandsHandler(similarWords);
}
}
}
8 changes: 8 additions & 0 deletions src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TARGET_WEIGHT;

import java.util.List;

import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.logic.parser.Prefix;
import seedu.address.model.Model;
import seedu.address.model.client.Client;

Expand All @@ -23,6 +26,11 @@
*/
public class AddCommand extends Command {

public static final List<Prefix> PREFIXES = List.of(PREFIX_NAME,
PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_GENDER,
PREFIX_BIRTHDAY, PREFIX_CURRENT_WEIGHT, PREFIX_TARGET_WEIGHT,
PREFIX_HEIGHT, PREFIX_REMARK, PREFIX_SPORT, PREFIX_TAG);

public static final String COMMAND_WORD = "add-c";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a client to FitBiz. "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_REPS;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SETS;

import java.util.List;

import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.logic.parser.Prefix;
import seedu.address.logic.statistics.PersonalBestFinder;
import seedu.address.model.Model;
import seedu.address.model.client.Client;
Expand All @@ -20,6 +23,9 @@
*/
public class AddExerciseCommand extends Command {

public static final List<Prefix> PREFIXES = List.of(PREFIX_NAME,
PREFIX_DATE, PREFIX_REPS, PREFIX_EXERCISE_WEIGHT, PREFIX_SETS);

public static final String COMMAND_WORD = "add-e";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds an exercise done by a client in FitBiz. "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
public class ClearCommand extends Command {

public static final String COMMAND_WORD = "clear";
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Deletes all data from FitBiz";
public static final String MESSAGE_SUCCESS = "FitBiz has been cleared!";


@Override
public CommandResult execute(Model model) {
requireNonNull(model);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
public class ExitCommand extends Command {

public static final String COMMAND_WORD = "exit";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": exits FitBiz";
public static final String MESSAGE_EXIT_ACKNOWLEDGEMENT = "Exiting FitBiz as requested ...";

@Override
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/seedu/address/logic/commands/HelpCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ public class HelpCommand extends Command {

public static final String COMMAND_WORD = "help";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Shows program usage instructions.\n"
+ "Example: " + COMMAND_WORD;
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Redirects to FitBiz user guide";

public static final String SHOWING_HELP_MESSAGE = "You should have been redirected to the FitBiz user guide"
+ " website. If not, please visit the following URL:\n"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class ListCommand extends Command {

public static final String MESSAGE_SUCCESS = "Listed all clients";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Lists all clients in FitBiz";

@Override
public CommandResult execute(Model model) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.logic.parser.CliSyntax.PREFIX_SCHEDULE;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_CLIENTS;

import java.util.ArrayList;
Expand All @@ -9,6 +10,7 @@
import seedu.address.commons.core.Messages;
import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.logic.parser.Prefix;
import seedu.address.model.Model;
import seedu.address.model.client.Client;
import seedu.address.model.schedule.Schedule;
Expand All @@ -19,6 +21,8 @@
*/
public class ScheduleCommand extends Command {

public static final List<Prefix> PREFIXES = List.of(PREFIX_SCHEDULE);

public static final String COMMAND_WORD = "schedule";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds the training schedule of the client, identified "
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package seedu.address.commons.trie;

import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.junit.jupiter.api.Test;

public class SimilarWordsResultTest {

public static final String EMPTY_WORD = "";
public static final ArrayList<String> EMPTY_WORD_LIST = new ArrayList<>();
public static final SimilarWordsResult EMPTY_WORD_RESULT = new SimilarWordsResult(EMPTY_WORD, EMPTY_WORD_LIST);

public static final String SINGLE_WORD = "help";
public static final ArrayList<String> SINGLE_WORD_LIST = new ArrayList<>(List.of(SINGLE_WORD));
public static final SimilarWordsResult SINGLE_WORD_RESULT = new SimilarWordsResult(SINGLE_WORD, SINGLE_WORD_LIST);

public static final String WORD_1 = "exit";
public static final String WORD_2 = "edit-e";
public static final String WORD_3 = "edit-c";
public static final String LONGEST_COMMON_PREFIX = "e";
public static final ArrayList<String> MULTIPLE_WORD_LIST = new ArrayList<>(List.of(WORD_1, WORD_2, WORD_3));
public static final SimilarWordsResult MULTIPLE_WORD_RESULT = new SimilarWordsResult(LONGEST_COMMON_PREFIX,
MULTIPLE_WORD_LIST);

@Test
public void constructor() {
String nullString = null;
ArrayList<String> nullList = null;
String validString = "";
ArrayList<String> validList = new ArrayList<>();

assertThrows(NullPointerException.class, () -> new SimilarWordsResult(nullString, validList));
assertThrows(NullPointerException.class, () -> new SimilarWordsResult(validString, nullList));
assertDoesNotThrow(() -> new SimilarWordsResult(validString, validList));
}

@Test
public void hasNoResult_onEmptyResult_returnsTrue() {
assertTrue(EMPTY_WORD_RESULT.hasNoResult());
}

@Test
public void hasNoResult_onNonEmptyResult_returnsFalse() {
assertFalse(SINGLE_WORD_RESULT.hasNoResult());
assertFalse(MULTIPLE_WORD_RESULT.hasNoResult());
}

@Test
public void hasOnlyOneWord_onSingleWordResult_returnsTrue() {
assertTrue(SINGLE_WORD_RESULT.hasOnlyOneWord());
}

@Test
public void hasOnlyOneWord_onNonSingleWordResult_returnsFalse() {
assertFalse(EMPTY_WORD_RESULT.hasOnlyOneWord());
assertFalse(MULTIPLE_WORD_RESULT.hasOnlyOneWord());
}

@Test
public void getSingleWord_onSingleWordResult_returnsCorrectString() {
assertEquals(SINGLE_WORD_RESULT.getSingleWord(), SINGLE_WORD);
}

@Test
public void getSingleWord_onNonSingleWordResult_throwsAssertionError() {
assertThrows(AssertionError.class, () -> EMPTY_WORD_RESULT.getSingleWord());
assertThrows(AssertionError.class, () -> MULTIPLE_WORD_RESULT.getSingleWord());
}

}

0 comments on commit 080bed5

Please sign in to comment.