diff --git a/src/seedu/addressbook/commands/HelpCommand.java b/src/seedu/addressbook/commands/HelpCommand.java index 9be217d89..d20a0125c 100644 --- a/src/seedu/addressbook/commands/HelpCommand.java +++ b/src/seedu/addressbook/commands/HelpCommand.java @@ -19,6 +19,7 @@ public CommandResult execute() { + "\n" + ClearCommand.MESSAGE_USAGE + "\n" + FindCommand.MESSAGE_USAGE + "\n" + ListCommand.MESSAGE_USAGE + + "\n" + SortCommand.MESSAGE_USAGE + "\n" + ViewCommand.MESSAGE_USAGE + "\n" + ViewAllCommand.MESSAGE_USAGE + "\n" + HelpCommand.MESSAGE_USAGE diff --git a/src/seedu/addressbook/commands/SortCommand.java b/src/seedu/addressbook/commands/SortCommand.java new file mode 100644 index 000000000..238390d9b --- /dev/null +++ b/src/seedu/addressbook/commands/SortCommand.java @@ -0,0 +1,19 @@ +package seedu.addressbook.commands; + +/** + * Clears the address book. + */ +public class SortCommand extends Command { + + public static final String COMMAND_WORD = "sort"; + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Sorts the address book in lexical order.\n" + + "Example: " + COMMAND_WORD; + + public static final String MESSAGE_SUCCESS = "Address book has been sorted!"; + + @Override + public CommandResult execute() { + addressBook.sort(); + return new CommandResult(MESSAGE_SUCCESS); + } +} diff --git a/src/seedu/addressbook/data/AddressBook.java b/src/seedu/addressbook/data/AddressBook.java index 537d35c89..de57c768c 100644 --- a/src/seedu/addressbook/data/AddressBook.java +++ b/src/seedu/addressbook/data/AddressBook.java @@ -61,6 +61,13 @@ public void clear() { allPersons.clear(); } + /** + * Sorts the address book in lexical order. + */ + public void sort() { + allPersons.sort(); + } + /** * Returns a new UniquePersonList of all persons in the address book at the time of the call. */ diff --git a/src/seedu/addressbook/data/person/Person.java b/src/seedu/addressbook/data/person/Person.java index 64551c7fe..b73c5f41d 100644 --- a/src/seedu/addressbook/data/person/Person.java +++ b/src/seedu/addressbook/data/person/Person.java @@ -10,7 +10,7 @@ * Represents a Person in the address book. * Guarantees: details are present and not null, field values are validated. */ -public class Person implements ReadOnlyPerson { +public class Person implements ReadOnlyPerson, Comparable { private Name name; private Phone phone; @@ -88,4 +88,9 @@ public String toString() { return getAsTextShowAll(); } + @Override + public int compareTo(Person o) { + return this.getName().toString().compareTo(o.getName().toString()); + } + } diff --git a/src/seedu/addressbook/data/person/UniquePersonList.java b/src/seedu/addressbook/data/person/UniquePersonList.java index d7acd8b4a..0783d4222 100644 --- a/src/seedu/addressbook/data/person/UniquePersonList.java +++ b/src/seedu/addressbook/data/person/UniquePersonList.java @@ -129,6 +129,13 @@ public void clear() { internalList.clear(); } + /** + * Sorts the list. + */ + public void sort() { + Collections.sort(internalList); + } + @Override public Iterator iterator() { return internalList.iterator(); diff --git a/src/seedu/addressbook/parser/Parser.java b/src/seedu/addressbook/parser/Parser.java index abddb3f45..2ebaa82c1 100644 --- a/src/seedu/addressbook/parser/Parser.java +++ b/src/seedu/addressbook/parser/Parser.java @@ -20,6 +20,7 @@ import seedu.addressbook.commands.HelpCommand; import seedu.addressbook.commands.IncorrectCommand; import seedu.addressbook.commands.ListCommand; +import seedu.addressbook.commands.SortCommand; import seedu.addressbook.commands.ViewAllCommand; import seedu.addressbook.commands.ViewCommand; import seedu.addressbook.data.exception.IllegalValueException; @@ -85,6 +86,9 @@ public Command parseCommand(String userInput) { case FindCommand.COMMAND_WORD: return prepareFind(arguments); + case SortCommand.COMMAND_WORD: + return new SortCommand(); + case ListCommand.COMMAND_WORD: return new ListCommand(); diff --git a/test/expected.txt b/test/expected.txt index 56fe5fcac..c99ed4ded 100644 --- a/test/expected.txt +++ b/test/expected.txt @@ -19,6 +19,8 @@ || Example: find alice bob charlie || list: Displays all persons in the address book as a list with index numbers. || Example: list +|| sort: Sorts the address book in lexical order. +|| Example: sort || view: Views the non-private details of the person identified by the index number in the last shown person listing. || Parameters: INDEX || Example: view 1 @@ -198,6 +200,18 @@ || Enter command: || [Command entered: viewall 5] || Viewing person: Esther Potato Phone: 555555 Email: esther@not.a.real.potato Address: (private) 555, epsilon street Tags: [tubers][starchy] || =================================================== +|| Enter command: || [Command entered: sort] +|| Address book has been sorted! +|| =================================================== +|| Enter command: || [Command entered: list] +|| 1. Adam Brown Phone: 111111 Email: adam@gmail.com Address: 111, alpha street Tags: +|| 2. Betsy Choo Tags: [secretive] +|| 3. Charlie Dickson Email: charlie.d@nus.edu.sg Address: 333, gamma street Tags: [school][friends] +|| 4. Dickson Ee Phone: 444444 Address: 444, delta street Tags: [friends] +|| 5. Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] +|| +|| 5 persons listed! +|| =================================================== || Enter command: || [Command entered: find] || Invalid command format! || find: Finds all persons whose names contain any of the specified keywords (case-sensitive) and displays them as a list with index numbers. diff --git a/test/input.txt b/test/input.txt index eb8df81f8..bb8a73eae 100644 --- a/test/input.txt +++ b/test/input.txt @@ -86,6 +86,14 @@ viewall 4 viewall 5 +########################################################## +# test sort persons command +########################################################## + + # should sort the address book in lexical order + sort + list + ########################################################## # test find persons command ########################################################## diff --git a/test/java/seedu/addressbook/commands/SortCommandTest.java b/test/java/seedu/addressbook/commands/SortCommandTest.java new file mode 100644 index 000000000..509590f7c --- /dev/null +++ b/test/java/seedu/addressbook/commands/SortCommandTest.java @@ -0,0 +1,53 @@ +package seedu.addressbook.commands; + +import static org.junit.Assert.assertTrue; + +import java.util.Collections; + +import org.junit.Test; + +import seedu.addressbook.data.AddressBook; +import seedu.addressbook.data.exception.IllegalValueException; +import seedu.addressbook.util.TypicalPersons; +import seedu.addressbook.util.TestUtil; + +public class SortCommandTest { + + private final TypicalPersons td = new TypicalPersons(); + + @Test + public void execute() throws IllegalValueException { + AddressBook sortedAddressBook; + AddressBook unsortedAddressBook; + + sortedAddressBook = TestUtil.createAddressBook(td.amy, td.bill, td.candy, td.dan); + unsortedAddressBook = TestUtil.createAddressBook(td.bill, td.dan, td.candy, td.amy); + assertSortCommandBehavior(unsortedAddressBook, sortedAddressBook); + + sortedAddressBook = TestUtil.createAddressBook(td.amy, td.bill); + unsortedAddressBook = TestUtil.createAddressBook(td.amy, td.bill); + assertSortCommandBehavior(unsortedAddressBook, sortedAddressBook); + + sortedAddressBook = TestUtil.createAddressBook(); + unsortedAddressBook = TestUtil.createAddressBook(); + assertSortCommandBehavior(unsortedAddressBook, sortedAddressBook); + } + + /** + * Executes the find command for the given keywords and verifies + * the result matches the persons in the expectedPersonList exactly. + */ + private void assertSortCommandBehavior(AddressBook input, AddressBook expected) { + SortCommand command = createSortCommand(input); + command.execute(); + + assertTrue(input.equals(expected)); + } + + private SortCommand createSortCommand(AddressBook input) { + SortCommand command = new SortCommand(); + command.setData(input, Collections.emptyList()); + return command; + } + +}