From 10b08c96b3f1cb231f929218c71f47051956c709 Mon Sep 17 00:00:00 2001 From: Wklee96 Date: Mon, 11 Feb 2019 13:43:33 +0800 Subject: [PATCH 1/5] Implemented Sort Command --- .../addressbook/commands/SortCommand.java | 23 +++++++++++++++++++ src/seedu/addressbook/data/person/Name.java | 7 +++++- src/seedu/addressbook/data/person/Person.java | 4 ++++ .../data/person/ReadOnlyPerson.java | 3 ++- src/seedu/addressbook/parser/Parser.java | 15 ++++-------- 5 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 src/seedu/addressbook/commands/SortCommand.java diff --git a/src/seedu/addressbook/commands/SortCommand.java b/src/seedu/addressbook/commands/SortCommand.java new file mode 100644 index 000000000..479688448 --- /dev/null +++ b/src/seedu/addressbook/commands/SortCommand.java @@ -0,0 +1,23 @@ +package seedu.addressbook.commands; + +import seedu.addressbook.data.person.ReadOnlyPerson; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class SortCommand extends Command{ + public static final String COMMAND_WORD = "sort"; + + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Displays all persons in the address book as a list with index numbers sorted by their name.\n" + + "Example: " + COMMAND_WORD; + + @Override + public CommandResult execute() { + List allPersons = addressBook.getAllPersons().immutableListView(); + List newList = new ArrayList<>(allPersons); + Collections.sort(newList); + return new CommandResult(getMessageForPersonListShownSummary(newList), newList); + } +} diff --git a/src/seedu/addressbook/data/person/Name.java b/src/seedu/addressbook/data/person/Name.java index d1d271414..3d4eb02fb 100644 --- a/src/seedu/addressbook/data/person/Name.java +++ b/src/seedu/addressbook/data/person/Name.java @@ -3,13 +3,14 @@ import seedu.addressbook.data.exception.IllegalValueException; import java.util.Arrays; +import java.util.Comparator; import java.util.List; /** * Represents a Person's name in the address book. * Guarantees: immutable; is valid as declared in {@link #isValidName(String)} */ -public class Name { +public class Name implements Comparable { public static final String EXAMPLE = "John Doe"; public static final String MESSAGE_NAME_CONSTRAINTS = "Person names should be spaces or alphabetic characters"; @@ -60,4 +61,8 @@ public int hashCode() { return fullName.hashCode(); } + @Override + public int compareTo(Name o) { + return this.fullName.compareTo(o.fullName); + } } diff --git a/src/seedu/addressbook/data/person/Person.java b/src/seedu/addressbook/data/person/Person.java index 64551c7fe..209adfecf 100644 --- a/src/seedu/addressbook/data/person/Person.java +++ b/src/seedu/addressbook/data/person/Person.java @@ -88,4 +88,8 @@ public String toString() { return getAsTextShowAll(); } + @Override + public int compareTo(ReadOnlyPerson o) { + return this.getName().compareTo(o.getName()); + } } diff --git a/src/seedu/addressbook/data/person/ReadOnlyPerson.java b/src/seedu/addressbook/data/person/ReadOnlyPerson.java index 1493f0a2b..a1300a1d1 100644 --- a/src/seedu/addressbook/data/person/ReadOnlyPerson.java +++ b/src/seedu/addressbook/data/person/ReadOnlyPerson.java @@ -1,5 +1,6 @@ package seedu.addressbook.data.person; +import java.util.Comparator; import java.util.Set; import seedu.addressbook.data.tag.Tag; @@ -8,7 +9,7 @@ * A read-only immutable interface for a Person in the addressbook. * Implementations should guarantee: details are present and not null, field values are validated. */ -public interface ReadOnlyPerson { +public interface ReadOnlyPerson extends Comparable { Name getName(); Phone getPhone(); diff --git a/src/seedu/addressbook/parser/Parser.java b/src/seedu/addressbook/parser/Parser.java index abddb3f45..2d3e2b472 100644 --- a/src/seedu/addressbook/parser/Parser.java +++ b/src/seedu/addressbook/parser/Parser.java @@ -11,17 +11,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import seedu.addressbook.commands.AddCommand; -import seedu.addressbook.commands.ClearCommand; -import seedu.addressbook.commands.Command; -import seedu.addressbook.commands.DeleteCommand; -import seedu.addressbook.commands.ExitCommand; -import seedu.addressbook.commands.FindCommand; -import seedu.addressbook.commands.HelpCommand; -import seedu.addressbook.commands.IncorrectCommand; -import seedu.addressbook.commands.ListCommand; -import seedu.addressbook.commands.ViewAllCommand; -import seedu.addressbook.commands.ViewCommand; +import seedu.addressbook.commands.*; import seedu.addressbook.data.exception.IllegalValueException; /** @@ -88,6 +78,9 @@ public Command parseCommand(String userInput) { case ListCommand.COMMAND_WORD: return new ListCommand(); + case SortCommand.COMMAND_WORD: + return new SortCommand(); + case ViewCommand.COMMAND_WORD: return prepareView(arguments); From 6f091de381feb056d8c67f7bd9209e104309d1cf Mon Sep 17 00:00:00 2001 From: Wklee96 Date: Mon, 11 Feb 2019 15:01:58 +0800 Subject: [PATCH 2/5] Updated user guide for sort command --- docs/UserGuide.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/UserGuide.adoc b/docs/UserGuide.adoc index 4abb17e3e..cabb0c338 100644 --- a/docs/UserGuide.adoc +++ b/docs/UserGuide.adoc @@ -72,6 +72,11 @@ Examples: Shows a list of all persons, along with their non-private details, in the address book. + Format: `list` +== Listing all persons sorted by their names : `sort` + +Shows a list of all persons sorted by their names, along with their non-private details, in the address book. + +Format: `list` + == Finding all persons containing any keyword in their name: `find` Finds persons whose names contain any of the given keywords. + From b84aed4c6c4a0dca5c25424fe744539e2b2f5df3 Mon Sep 17 00:00:00 2001 From: Wklee96 Date: Mon, 11 Feb 2019 16:02:38 +0800 Subject: [PATCH 3/5] Updated test cases --- test/expected.txt | 44 +++++++++++++++++++++++++++++++------------- test/input.txt | 10 ++++++---- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/test/expected.txt b/test/expected.txt index 56fe5fcac..d5087b136 100644 --- a/test/expected.txt +++ b/test/expected.txt @@ -112,27 +112,45 @@ || || 3 persons listed! || =================================================== -|| Enter command: || [Command entered: add Dickson Ee p/444444 pe/dickson@nus.edu.sg a/444, delta street t/friends] -|| New person added: Dickson Ee Phone: 444444 Email: (private) dickson@nus.edu.sg Address: 444, delta street Tags: [friends] +|| Enter command: || [Command entered: add Esther Potato p/555555 e/esther@not.a.real.potato pa/555, epsilon street t/tubers t/starchy] +|| New person added: Esther Potato Phone: 555555 Email: esther@not.a.real.potato Address: (private) 555, epsilon street Tags: [tubers][starchy] || =================================================== || 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] +|| 4. Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] || || 4 persons listed! || =================================================== -|| Enter command: || [Command entered: add Esther Potato p/555555 e/esther@not.a.real.potato pa/555, epsilon street t/tubers t/starchy] -|| New person added: Esther Potato Phone: 555555 Email: esther@not.a.real.potato Address: (private) 555, epsilon street Tags: [tubers][starchy] +|| Enter command: || [Command entered: add Dickson Ee p/444444 pe/dickson@nus.edu.sg a/444, delta street t/friends] +|| New person added: Dickson Ee Phone: 444444 Email: (private) dickson@nus.edu.sg Address: 444, delta street Tags: [friends] || =================================================== || 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. Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] +|| 5. Dickson Ee Phone: 444444 Address: 444, delta street Tags: [friends] +|| +|| 5 persons listed! +|| =================================================== +|| Enter command: || [Command entered: sort] +|| 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: 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. Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] +|| 5. Dickson Ee Phone: 444444 Address: 444, delta street Tags: [friends] +|| || 5 persons listed! || =================================================== || Enter command: || [Command entered: add Esther Potato p/555555 e/esther@not.a.real.potato pa/555, epsilon street t/tubers t/starchy] @@ -183,19 +201,19 @@ || Enter command: || [Command entered: view 3] || Viewing person: Charlie Dickson Email: charlie.d@nus.edu.sg Address: 333, gamma street Tags: [school][friends] || =================================================== -|| Enter command: || [Command entered: view 4] +|| Enter command: || [Command entered: view 5] || Viewing person: Dickson Ee Phone: 444444 Address: 444, delta street Tags: [friends] || =================================================== -|| Enter command: || [Command entered: view 5] +|| Enter command: || [Command entered: view 4] || Viewing person: Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] || =================================================== || Enter command: || [Command entered: viewall 3] || Viewing person: Charlie Dickson Phone: (private) 333333 Email: charlie.d@nus.edu.sg Address: 333, gamma street Tags: [school][friends] || =================================================== -|| Enter command: || [Command entered: viewall 4] +|| Enter command: || [Command entered: viewall 5] || Viewing person: Dickson Ee Phone: 444444 Email: (private) dickson@nus.edu.sg Address: 444, delta street Tags: [friends] || =================================================== -|| Enter command: || [Command entered: viewall 5] +|| Enter command: || [Command entered: viewall 4] || Viewing person: Esther Potato Phone: 555555 Email: esther@not.a.real.potato Address: (private) 555, epsilon street Tags: [tubers][starchy] || =================================================== || Enter command: || [Command entered: find] @@ -266,12 +284,12 @@ || 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. Dickson Ee Phone: 444444 Address: 444, delta street Tags: [friends] -|| 4. Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] +|| 3. Esther Potato Phone: 555555 Email: esther@not.a.real.potato Tags: [tubers][starchy] +|| 4. Dickson Ee Phone: 444444 Address: 444, delta street Tags: [friends] || || 4 persons listed! || =================================================== -|| Enter command: || [Command entered: delete 4] +|| Enter command: || [Command entered: delete 3] || Deleted Person: Esther Potato Phone: 555555 Email: esther@not.a.real.potato Address: (private) 555, epsilon street Tags: [tubers][starchy] || =================================================== || Enter command: || [Command entered: list] diff --git a/test/input.txt b/test/input.txt index eb8df81f8..243dcad87 100644 --- a/test/input.txt +++ b/test/input.txt @@ -46,9 +46,11 @@ list add Charlie Dickson pp/333333 e/charlie.d@nus.edu.sg a/333, gamma street t/friends t/school list + add Esther Potato p/555555 e/esther@not.a.real.potato pa/555, epsilon street t/tubers t/starchy + list add Dickson Ee p/444444 pe/dickson@nus.edu.sg a/444, delta street t/friends list - add Esther Potato p/555555 e/esther@not.a.real.potato pa/555, epsilon street t/tubers t/starchy + sort list # should not allow adding duplicate persons @@ -78,13 +80,13 @@ # should show only non private details for view view 3 - view 4 view 5 + view 4 # should show all details even private for viewall viewall 3 - viewall 4 viewall 5 + viewall 4 ########################################################## # test find persons command @@ -133,7 +135,7 @@ list # deletes correct person - delete 4 + delete 3 list # listing indexes get updated on next request From 8c6b8853d3e95e39e117b763e32e51b79d87dd9e Mon Sep 17 00:00:00 2001 From: Wklee96 Date: Tue, 12 Feb 2019 21:34:56 +0800 Subject: [PATCH 4/5] Added SortCommandTest file for jUnit test --- .../addressbook/commands/SortCommandTest.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 test/java/seedu/addressbook/commands/SortCommandTest.java diff --git a/test/java/seedu/addressbook/commands/SortCommandTest.java b/test/java/seedu/addressbook/commands/SortCommandTest.java new file mode 100644 index 000000000..233d843b0 --- /dev/null +++ b/test/java/seedu/addressbook/commands/SortCommandTest.java @@ -0,0 +1,50 @@ +package seedu.addressbook.commands; + +import org.junit.Test; +import seedu.addressbook.data.AddressBook; +import seedu.addressbook.data.person.ReadOnlyPerson; +import seedu.addressbook.util.TestUtil; +import seedu.addressbook.util.TypicalPersons; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class SortCommandTest { + private TypicalPersons td = new TypicalPersons(); + + private AddressBook typicalAddressBook = td.getTypicalAddressBook(); + private List listWithAllTypicalPersons = Arrays.asList(td.getTypicalPersons()); + private List listWithInorderedTypicalPersons = Arrays.asList(td.amy, td.candy, td.bill, td.dan); + + @Test + public void execute_invalidIndex_returnsInvalidIndexMessage() { + + SortCommand sortCommand = new SortCommand(); + sortCommand.setData(typicalAddressBook, listWithAllTypicalPersons); + String expectedMessage = sortCommand.execute().feedbackToUser; + + assertSortBehavior(sortCommand, typicalAddressBook, listWithAllTypicalPersons, + expectedMessage); + } + + /** + * Executes the sort command for the given addressbook data. + * Checks that SortCommand exhibits the correct command behavior, namely: + * 1. Returns a sorted list of person in the address book + */ + private static void assertSortBehavior(Command sortCommand, AddressBook addressBook, + List relevantPersons, String expectedMessage) { + AddressBook expectedAddressBook = TestUtil.clone(addressBook); + + sortCommand.setData(addressBook, relevantPersons); + CommandResult result = sortCommand.execute(); + + // feedback message is as expected and there are no relevant persons returned. + assertEquals(expectedMessage, result.feedbackToUser); + + // addressbook was not modified. + assertEquals(expectedAddressBook.getAllPersons(), addressBook.getAllPersons()); + } +} \ No newline at end of file From 5c4a43c66316992b517bd668e85210246a823f2b Mon Sep 17 00:00:00 2001 From: Wklee96 Date: Tue, 12 Feb 2019 21:40:54 +0800 Subject: [PATCH 5/5] Changed to single class import as suggested by Cai Jie --- src/seedu/addressbook/parser/Parser.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/seedu/addressbook/parser/Parser.java b/src/seedu/addressbook/parser/Parser.java index 2d3e2b472..d41d9c14c 100644 --- a/src/seedu/addressbook/parser/Parser.java +++ b/src/seedu/addressbook/parser/Parser.java @@ -11,7 +11,18 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import seedu.addressbook.commands.*; +import seedu.addressbook.commands.AddCommand; +import seedu.addressbook.commands.ClearCommand; +import seedu.addressbook.commands.Command; +import seedu.addressbook.commands.DeleteCommand; +import seedu.addressbook.commands.ExitCommand; +import seedu.addressbook.commands.FindCommand; +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; /**