{"action":"created","comment":{"url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/comments/148921383","pull_request_review_id":74245206,"id":148921383,"diff_hunk":"@@ -0,0 +1,576 @@\n+# PokkaKiyo\n+###### \\java\\guitests\\guihandles\\PersonCardHandle.java\n+``` java\n+    public String getFacebookAddress() {\n+        return facebookAddressLabel.getText();\n+    }\n+```\n+###### \\java\\seedu\\address\\logic\\commands\\FindPersonsWithTagsCommandTest.java\n+``` java\n+package seedu.address.logic.commands;\n+\n+import static org.junit.Assert.assertEquals;\n+import static org.junit.Assert.assertFalse;\n+import static org.junit.Assert.assertTrue;\n+import static seedu.address.commons.core.Messages.MESSAGE_PERSONS_LISTED_OVERVIEW;\n+import static seedu.address.testutil.TypicalPersons.ALICE;\n+import static seedu.address.testutil.TypicalPersons.BENSON;\n+import static seedu.address.testutil.TypicalPersons.CARL;\n+import static seedu.address.testutil.TypicalPersons.DANIEL;\n+import static seedu.address.testutil.TypicalPersons.ELLE;\n+import static seedu.address.testutil.TypicalPersons.FIONA;\n+import static seedu.address.testutil.TypicalPersons.GEORGE;\n+import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;\n+\n+import java.util.Arrays;\n+import java.util.Collections;\n+import java.util.List;\n+\n+import org.junit.Test;\n+\n+import seedu.address.logic.CommandHistory;\n+import seedu.address.logic.UndoRedoStack;\n+import seedu.address.model.AddressBook;\n+import seedu.address.model.Model;\n+import seedu.address.model.ModelManager;\n+import seedu.address.model.UserPrefs;\n+import seedu.address.model.person.PersonContainsTagsPredicate;\n+import seedu.address.model.person.ReadOnlyPerson;\n+\n+public class FindPersonsWithTagsCommandTest {\n+    private Model model = new ModelManager(getTypicalAddressBook(), new UserPrefs());\n+\n+    @Test\n+    public void equals() {\n+        PersonContainsTagsPredicate firstPredicate =\n+                new PersonContainsTagsPredicate(Collections.singletonList(\"first\"));\n+        PersonContainsTagsPredicate secondPredicate =\n+                new PersonContainsTagsPredicate(Collections.singletonList(\"second\"));\n+\n+        FindPersonsWithTagsCommand findFirstCommand = new FindPersonsWithTagsCommand(firstPredicate);\n+        FindPersonsWithTagsCommand findSecondCommand = new FindPersonsWithTagsCommand(secondPredicate);\n+\n+        // same object -> returns true\n+        assertTrue(findFirstCommand.equals(findFirstCommand));\n+\n+        // same values -> returns true\n+        FindPersonsWithTagsCommand findFirstCommandCopy = new FindPersonsWithTagsCommand(firstPredicate);\n+        assertTrue(findFirstCommand.equals(findFirstCommandCopy));\n+\n+        // different types -> returns false\n+        assertFalse(findFirstCommand.equals(1));\n+\n+        // null -> returns false\n+        assertFalse(findFirstCommand.equals(null));\n+\n+        // different person -> returns false\n+        assertFalse(findFirstCommand.equals(findSecondCommand));\n+    }\n+\n+    @Test\n+    public void execute_zeroKeywords_noPersonFound() {\n+        String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0);\n+        FindPersonsWithTagsCommand command = prepareCommand(\" \");\n+        assertCommandSuccess(command, expectedMessage, Collections.emptyList());\n+    }\n+\n+    @Test\n+    public void execute_multipleKeywords_multiplePersonsFound() {\n+        String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 7);\n+        FindPersonsWithTagsCommand command = prepareCommand(\"friends owesMoney\");\n+        assertCommandSuccess(command, expectedMessage, Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));\n+    }\n+\n+    @Test\n+    public void execute_oneKeyword_multiplePersonsFound() {\n+        String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 7);\n+        FindPersonsWithTagsCommand command = prepareCommand(\"friends\");\n+        assertCommandSuccess(command, expectedMessage, Arrays.asList(ALICE, BENSON, CARL, DANIEL, ELLE, FIONA, GEORGE));\n+    }\n+\n+    @Test\n+    public void execute_nonexistingTag_noPersonsFound() {\n+        String expectedMessage = String.format(MESSAGE_PERSONS_LISTED_OVERVIEW, 0);\n+        FindPersonsWithTagsCommand command = prepareCommand(\"sometag\");\n+        assertCommandSuccess(command, expectedMessage, Collections.emptyList());\n+    }\n+\n+    /**\n+     * Parses {@code userInput} into a {@code FindPersonsWithTagsCommand}.\n+     */\n+    private FindPersonsWithTagsCommand prepareCommand(String userInput) {\n+        FindPersonsWithTagsCommand command =\n+                new FindPersonsWithTagsCommand(new PersonContainsTagsPredicate(Arrays.asList(userInput.split(\"\\\\s+\"))));\n+        command.setData(model, new CommandHistory(), new UndoRedoStack());\n+        return command;\n+    }\n+\n+    /**\n+     * Asserts that {@code command} is successfully executed, and<br>\n+     *     - the command feedback is equal to {@code expectedMessage}<br>\n+     *     - the {@code FilteredList<ReadOnlyPerson>} is equal to {@code expectedList}<br>\n+     *     - the {@code AddressBook} in model remains the same after executing the {@code command}\n+     */\n+    private void assertCommandSuccess(FindPersonsWithTagsCommand command, String expectedMessage,\n+                                      List<ReadOnlyPerson> expectedList) {\n+        AddressBook expectedAddressBook = new AddressBook(model.getAddressBook());\n+        CommandResult commandResult = command.execute();\n+\n+        assertEquals(expectedMessage, commandResult.feedbackToUser);\n+        assertEquals(expectedList, model.getFilteredPersonList());\n+        assertEquals(expectedAddressBook, model.getAddressBook());\n+    }\n+}\n+```\n+###### \\java\\seedu\\address\\logic\\commands\\ListTagsCommandTest.java\n+``` java\n+package seedu.address.logic.commands;\n+\n+import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_UNIQUETAG;\n+import static seedu.address.logic.commands.CommandTestUtil.VALID_TAG_UNIQUETAG2;\n+import static seedu.address.logic.commands.CommandTestUtil.assertCommandSuccess;\n+import static seedu.address.testutil.TypicalPersons.CORNIE;\n+import static seedu.address.testutil.TypicalPersons.CORNIE_NEW_NON_UNIQUE_TAG;\n+import static seedu.address.testutil.TypicalPersons.CORNIE_NEW_UNIQUE_TAG;\n+import static seedu.address.testutil.TypicalPersons.getTypicalAddressBook;\n+\n+import java.util.ArrayList;\n+import java.util.List;\n+\n+import org.junit.Before;\n+import org.junit.Test;\n+\n+import seedu.address.logic.CommandHistory;\n+import seedu.address.logic.UndoRedoStack;\n+import seedu.address.model.Model;\n+import seedu.address.model.ModelManager;\n+import seedu.address.model.UserPrefs;\n+import seedu.address.model.person.ReadOnlyPerson;\n+import seedu.address.model.person.exceptions.DuplicatePersonException;\n+import seedu.address.model.person.exceptions.PersonNotFoundException;\n+import seedu.address.model.tag.Tag;\n+\n+public class ListTagsCommandTest {\n+    private Model model;\n+    private Model expectedModel;\n+    private Model modelWithNoTags;\n+    private ListTagsCommand listTagsCommand;\n+    private List<Tag> listOfAllTags;\n+    private String expectedMessage;\n+    private String expectedMessageForNoTags;\n+\n+\n+    @Before\n+    public void setUp() {\n+        model = new ModelManager(getTypicalAddressBook(), new UserPrefs());\n+        expectedModel = new ModelManager(model.getAddressBook(), new UserPrefs());\n+        listOfAllTags = new ArrayList<Tag>();\n+\n+        listTagsCommand = new ListTagsCommand();\n+        listTagsCommand.setData(model, new CommandHistory(), new UndoRedoStack());\n+\n+        //creating the expected message for all tags in typical addressbook\n+        StringBuilder expectedMessageInStringBuilder = new StringBuilder(listTagsCommand.MESSAGE_SUCCESS);\n+        for (ReadOnlyPerson p : model.getAddressBook().getPersonList()) {\n+            for (Tag tag : p.getTags()) {\n+                if (!listOfAllTags.contains(tag)) {\n+                    listOfAllTags.add(tag);\n+                    expectedMessageInStringBuilder.append(\"[\").append(tag.getTagName()).append(\"] \");\n+                }\n+            }\n+        }\n+        expectedMessage = expectedMessageInStringBuilder.toString().trim();\n+\n+    }\n+\n+    @Test\n+    public void execute_showsCorrectTagListWhenThereAreContactsWithTags() {\n+        assertCommandSuccess(listTagsCommand, model, expectedMessage, expectedModel);\n+    }\n+\n+    @Test\n+    public void execute_addNewPersonWithNewTag_showsCorrectTagList() throws DuplicatePersonException {\n+        model.addPerson(CORNIE);\n+        expectedModel.addPerson(CORNIE);\n+        String newExpectedMessage = expectedMessage + \" [\" + VALID_TAG_UNIQUETAG + \"]\";\n+\n+        assertCommandSuccess(listTagsCommand, model, newExpectedMessage, expectedModel);\n+    }\n+\n+    @Test\n+    public void execute_removePersonWithParticularUniqueTag_showsCorrectTagList() throws\n+            PersonNotFoundException, DuplicatePersonException {\n+        model.addPerson(CORNIE);\n+        expectedModel.addPerson(CORNIE);\n+        String newExpectedMessage = expectedMessage + \" [\" + VALID_TAG_UNIQUETAG + \"]\";\n+\n+        assertCommandSuccess(listTagsCommand, model, newExpectedMessage, expectedModel);\n+\n+\n+        model.deletePerson(CORNIE);\n+        expectedModel.deletePerson(CORNIE);\n+\n+        assertCommandSuccess(listTagsCommand, model, expectedMessage, expectedModel);\n+    }\n+\n+    @Test\n+    public void execute_editPersonWithParticularTag_showsCorrectTagList() throws\n+            PersonNotFoundException, DuplicatePersonException {\n+        model.addPerson(CORNIE);\n+        expectedModel.addPerson(CORNIE);\n+        String newExpectedMessage = expectedMessage + \" [\" + VALID_TAG_UNIQUETAG + \"]\";\n+\n+        assertCommandSuccess(listTagsCommand, model, newExpectedMessage, expectedModel);\n+\n+        //editing unique tag to another unique tag\n+        model.updatePerson(CORNIE, CORNIE_NEW_UNIQUE_TAG);\n+        expectedModel.updatePerson(CORNIE, CORNIE_NEW_UNIQUE_TAG);\n+        String newExpectedMessage2 = expectedMessage + \" [\" + VALID_TAG_UNIQUETAG2 + \"]\";\n+\n+        assertCommandSuccess(listTagsCommand, model, newExpectedMessage2, expectedModel);\n+\n+        //editing unique tag to non-unique tag\n+        model.updatePerson(CORNIE_NEW_UNIQUE_TAG, CORNIE_NEW_NON_UNIQUE_TAG);\n+        expectedModel.updatePerson(CORNIE_NEW_UNIQUE_TAG, CORNIE_NEW_NON_UNIQUE_TAG);\n+\n+        assertCommandSuccess(listTagsCommand, model, expectedMessage, expectedModel);\n+\n+    }\n+\n+    @Test\n+    public void execute_noTagsShowsEmptyTagList() throws DuplicatePersonException {\n+        modelWithNoTags = new ModelManager();\n+        expectedMessageForNoTags = listTagsCommand.MESSAGE_FAILURE;\n+        ListTagsCommand listTagsCommandForNoTags = new ListTagsCommand();\n+        listTagsCommandForNoTags.setData(modelWithNoTags, new CommandHistory(), new UndoRedoStack());\n+\n+        assertCommandSuccess(listTagsCommandForNoTags, modelWithNoTags, expectedMessageForNoTags, modelWithNoTags);\n+\n+    }\n+\n+}\n+```\n+###### \\java\\seedu\\address\\logic\\parser\\AddCommandParserTest.java\n+``` java\n+        // no facebook address\n+        expectedPerson = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)\n+                .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withBirthday(VALID_BIRTHDAY_AMY)\n+                .withFacebookAddress(\"\").withTags(VALID_TAG_FRIEND).build();\n+        assertParseSuccess(parser, AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY\n+                + EMAIL_DESC_AMY + ADDRESS_DESC_AMY\n+                + BIRTHDAY_DESC_AMY + TAG_DESC_FRIEND, new AddCommand(expectedPerson));\n+\n+        //no tags and no facebook address\n+        expectedPerson = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)\n+                .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY).withFacebookAddress(\"\")\n+                .withBirthday(VALID_BIRTHDAY_AMY).withTags().build();\n+        assertParseSuccess(parser, AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY\n+                + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + BIRTHDAY_DESC_AMY, new AddCommand(expectedPerson));\n+\n+        // zero tags\n+        expectedPerson = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY)\n+                .withEmail(VALID_EMAIL_AMY).withAddress(VALID_ADDRESS_AMY)\n+                .withBirthday(VALID_BIRTHDAY_AMY).withFacebookAddress(VALID_FACEBOOKADDRESS_AMY).withTags().build();\n+        assertParseSuccess(parser, AddCommand.COMMAND_WORD + NAME_DESC_AMY + PHONE_DESC_AMY\n+                + EMAIL_DESC_AMY + ADDRESS_DESC_AMY + BIRTHDAY_DESC_AMY + FACEBOOK_ADDRESS_DESC_AMY,\n+                new AddCommand(expectedPerson));\n+\n+```\n+###### \\java\\seedu\\address\\logic\\parser\\AddressBookParserTest.java\n+``` java\n+    @Test\n+    public void parseCommand_listTags() throws Exception {\n+        assertTrue(parser.parseCommand(ListTagsCommand.COMMAND_WORD_ALIAS1) instanceof ListTagsCommand);\n+        assertTrue(parser.parseCommand(ListTagsCommand.COMMAND_WORD_ALIAS1 + \" 3\") instanceof ListTagsCommand);\n+    }\n+\n+    @Test\n+    public void parseCommand_listTags_alias1() throws Exception {\n+        assertTrue(parser.parseCommand(ListTagsCommand.COMMAND_WORD_ALIAS2) instanceof ListTagsCommand);\n+        assertTrue(parser.parseCommand(ListTagsCommand.COMMAND_WORD_ALIAS2 + \" 3\") instanceof ListTagsCommand);\n+    }\n+\n+    @Test\n+    public void parseCommand_listTags_alias2() throws Exception {\n+        assertTrue(parser.parseCommand(ListTagsCommand.COMMAND_WORD) instanceof ListTagsCommand);\n+        assertTrue(parser.parseCommand(ListTagsCommand.COMMAND_WORD + \" 3\") instanceof ListTagsCommand);\n+    }\n+```\n+###### \\java\\seedu\\address\\logic\\parser\\FindPersonsWithTagsCommandParserTest.java\n+``` java\n+package seedu.address.logic.parser;\n+\n+import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;\n+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseFailure;\n+import static seedu.address.logic.parser.CommandParserTestUtil.assertParseSuccess;\n+\n+import java.util.Arrays;\n+\n+import org.junit.Test;\n+\n+import seedu.address.logic.commands.FindPersonsWithTagsCommand;\n+import seedu.address.model.person.PersonContainsTagsPredicate;\n+\n+public class FindPersonsWithTagsCommandParserTest {\n+\n+    private FindPersonsWithTagsCommandParser parser = new FindPersonsWithTagsCommandParser();\n+\n+    @Test\n+    public void parse_emptyArg_throwsParseException() {\n+        assertParseFailure(parser, \"     \",\n+                String.format(MESSAGE_INVALID_COMMAND_FORMAT, FindPersonsWithTagsCommand.MESSAGE_USAGE));\n+    }\n+\n+    @Test\n+    public void parse_singularToPluralLeniency() {\n+        FindPersonsWithTagsCommand expectedFindPersonsWithTagsCommand =\n+                new FindPersonsWithTagsCommand(new PersonContainsTagsPredicate(\n+                        Arrays.asList(\"friend\", \"friends\")));\n+        //input of args in singular form should return command with both singular and plural form\n+        assertParseSuccess(parser, \"friend\", expectedFindPersonsWithTagsCommand);\n+    }\n+\n+    @Test\n+    public void parse_pluralToSingularLeniency() {\n+        FindPersonsWithTagsCommand expectedFindPersonsWithTagsCommand =\n+                new FindPersonsWithTagsCommand(new PersonContainsTagsPredicate(\n+                        Arrays.asList(\"friends\", \"friend\")));\n+        //input of args in plural form should return command with both singular and plural form\n+        assertParseSuccess(parser, \"friends\", expectedFindPersonsWithTagsCommand);\n+    }\n+\n+    @Test\n+    public void parse_validArgs_returnsFindCommand() {\n+        FindPersonsWithTagsCommand expectedFindPersonsWithTagsCommand =\n+                new FindPersonsWithTagsCommand(new PersonContainsTagsPredicate(\n+                        Arrays.asList(\"friend\", \"friends\", \"colleague\", \"colleagues\")));\n+\n+        // no leading and trailing whitespaces\n+        assertParseSuccess(parser, \"friend colleague\", expectedFindPersonsWithTagsCommand);\n+\n+        // multiple whitespaces between keywords\n+        assertParseSuccess(parser, \" \\n friend \\n \\t colleague  \\t\", expectedFindPersonsWithTagsCommand);\n+    }\n+}\n+```\n+###### \\java\\seedu\\address\\model\\person\\FacebookAddressTest.java\n+``` java\n+package seedu.address.model.person;\n+\n+import static org.junit.Assert.assertFalse;\n+import static org.junit.Assert.assertTrue;\n+\n+import org.junit.Test;\n+\n+public class FacebookAddressTest {\n+\n+    @Test\n+    public void equals() {\n+        FacebookAddress facebookAddress = new FacebookAddress(\"https://www.facebook.com/somefacebookaddress/\");\n+\n+        // same object -> returns true\n+        assertTrue(facebookAddress.equals(facebookAddress));\n+\n+        // same values -> returns true\n+        FacebookAddress facebookAddressCopy = new FacebookAddress(facebookAddress.value);\n+        assertTrue(facebookAddress.equals(facebookAddressCopy));\n+\n+        // different types -> returns false\n+        assertFalse(facebookAddress.equals(1));\n+\n+        // null -> returns false\n+        assertFalse(facebookAddress.equals(null));\n+\n+        // different Facebook address -> returns false\n+        FacebookAddress differentFacebookAddress =\n+                new FacebookAddress(\"https://www.facebook.com/someOTHERfacebookaddress/\");\n+        assertFalse(facebookAddress.equals(differentFacebookAddress));\n+    }\n+}\n+```\n+###### \\java\\seedu\\address\\model\\person\\PersonContainsTagsPredicateTest.java\n+``` java\n+package seedu.address.model.person;\n+\n+import static org.junit.Assert.assertFalse;\n+import static org.junit.Assert.assertTrue;\n+\n+import java.util.Arrays;\n+import java.util.Collections;\n+import java.util.List;\n+\n+import org.junit.Test;\n+\n+import seedu.address.testutil.PersonBuilder;\n+\n+public class PersonContainsTagsPredicateTest {\n+\n+    @Test\n+    public void equals() {\n+        List<String> firstPredicateKeywordList = Collections.singletonList(\"first\");\n+        List<String> secondPredicateKeywordList = Arrays.asList(\"first\", \"second\");\n+\n+        PersonContainsTagsPredicate firstPredicate = new PersonContainsTagsPredicate(firstPredicateKeywordList);\n+        PersonContainsTagsPredicate secondPredicate = new PersonContainsTagsPredicate(secondPredicateKeywordList);\n+\n+        // same object -> returns true\n+        assertTrue(firstPredicate.equals(firstPredicate));\n+\n+        // same values -> returns true\n+        PersonContainsTagsPredicate firstPredicateCopy = new PersonContainsTagsPredicate(firstPredicateKeywordList);\n+        assertTrue(firstPredicate.equals(firstPredicateCopy));\n+\n+        // different types -> returns false\n+        assertFalse(firstPredicate.equals(1));\n+\n+        // null -> returns false\n+        assertFalse(firstPredicate.equals(null));\n+\n+        // different person -> returns false\n+        assertFalse(firstPredicate.equals(secondPredicate));\n+    }\n+\n+    @Test\n+    public void test_personHasTagsMatchingKeywordsToInclude_returnsTrue() {\n+        // One keyword\n+        PersonContainsTagsPredicate predicate =\n+                new PersonContainsTagsPredicate(Collections.singletonList(\"colleagues\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags(\"colleagues\").build()));\n+\n+        // Multiple keywords\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"colleagues\", \"schoolmates\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags(\"colleagues\", \"friends\", \"schoolmates\").build()));\n+\n+        // Only one matching keyword\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"colleagues\", \"schoolmates\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags(\"colleagues\").build()));\n+\n+        // Mixed-case keywords\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"cOLLeaguEs\", \"FrIeNdS\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags(\"friends\", \"colleagues\").build()));\n+\n+    }\n+\n+    @Test\n+    public void test_personDoesNotHaveTagsContainingKeywordsToInclude_returnsFalse() {\n+        // Zero keywords\n+        PersonContainsTagsPredicate predicate = new PersonContainsTagsPredicate(Collections.emptyList());\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"whateverTag\").build()));\n+\n+        // Non-matching keyword\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"roommate\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"schoolmate\", \"classmate\").build()));\n+\n+        // Keywords match name, phone, email, address, birthday, facebook address, but does not match any tag name\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"12345\", \"alice@email.com\", \"Main\",\n+                \"Street\", \"Alice\", \"14051998\", \"https://www.facebook.com/default_address_for_testing/\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"friends\").withPhone(\"12345\")\n+                .withEmail(\"alice@email.com\").withAddress(\"Main Street\")\n+                .withName(\"Alice\").withFacebookAddress(\"https://www.facebook.com/default_address_for_testing/\")\n+                .withBirthday(\"14051998\").build()));\n+    }\n+\n+    @Test\n+    public void test_personHasNoTags() {\n+        //Person with no tags for inclusion\n+        PersonContainsTagsPredicate predicate = new PersonContainsTagsPredicate(Arrays.asList(\"roommates\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags().build()));\n+\n+        // Person with no tags for exclusion\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags().build()));\n+\n+        //Person with no tags for both exclusion and inclusion\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\", \"friends\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags().build()));\n+    }\n+\n+    @Test\n+    public void test_personHasTagsForExclusion() {\n+        // Has one tag matching tags to exclude\n+        PersonContainsTagsPredicate predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"roommates\").build()));\n+\n+        // Has at least one tag matching tags to exclude\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"roommates\", \"schoolmates\").build()));\n+\n+        // More keywords to exclude than tags of person\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\", \"-schoolmates\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"roommates\").build()));\n+\n+        // More tags on person than keywords to exclude\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\", \"-schoolmates\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"roommates\", \"schoolmates\", \"classmates\").build()));\n+\n+    }\n+\n+    @Test\n+    public void test_personDoesNotHaveTagsForExclusion() {\n+        // Does not have matching tags to exclude\n+        PersonContainsTagsPredicate predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-roommates\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags(\"classmates\").build()));\n+\n+        // Keywords to exclude match name, phone, email, address, birthday, and facebook address,\n+        // but does not match any tag name\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-12345\", \"-alice@email.com\", \"-Main\",\n+                \"-Street\", \"-Alice\", \"-14051998\", \"-https://www.facebook.com/default_address_for_testing/\"));\n+        assertTrue(predicate.test(new PersonBuilder().withTags(\"friends\").withPhone(\"12345\")\n+                .withEmail(\"alice@email.com\").withAddress(\"Main Street\")\n+                .withName(\"Alice\").withFacebookAddress(\"https://www.facebook.com/default_address_for_testing/\")\n+                .withBirthday(\"14051998\").build()));\n+    }\n+\n+    @Test\n+    public void test_personHasTagsForInclusionAndTagsForExclusion() {\n+        // Person has tags to include but also to exclude\n+        PersonContainsTagsPredicate predicate =\n+                new PersonContainsTagsPredicate(Arrays.asList(\"friends\", \"-colleagues\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"friends\", \"colleagues\").build()));\n+\n+        // Person has tags to include but also to exclude, in mixed order\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"-colleagues\", \"friends\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"friends\", \"colleagues\").build()));\n+\n+        // Person has tags to include but also to exclude, in mixed case\n+        predicate = new PersonContainsTagsPredicate(Arrays.asList(\"fRiENds\", \"-colLEaguEs\"));\n+        assertFalse(predicate.test(new PersonBuilder().withTags(\"friends\", \"colleagues\").build()));\n+    }\n+}\n+```\n+###### \\java\\seedu\\address\\testutil\\EditPersonDescriptorBuilder.java\n+``` java\n+    /**\n+     * Sets the {@code facebookAddress} of the {@code EditPersonDescriptor} that we are building.\n+     */\n+    public EditPersonDescriptorBuilder withFacebookAddress(String facebookAddress) {\n+        try {\n+            ParserUtil.parseFacebookAddress(Optional.of(facebookAddress)).ifPresent(descriptor::setFacebookAddress);\n+        } catch (IllegalValueException ive) {\n+            throw new IllegalArgumentException(\"facebookAddress is expected to be unique.\");\n+        }\n+        return this;\n+    }\n+```\n+###### \\java\\seedu\\address\\testutil\\PersonBuilder.java\n+``` java\n+    /**\n+     * Sets the {@code FacebookAddress} of the {@code Person} that we are building.\n+     */\n+    public PersonBuilder withFacebookAddress(String facebookAddress) {\n+        this.person.setFacebookAddress(new FacebookAddress(facebookAddress));\n+        return this;\n+    }\n+```\n+###### \\java\\systemtests\\AddCommandSystemTest.java\n+``` java\n+        /* Case: add a person with all fields same as another person in the address book\n+        except facebook address -> added */\n+        toAdd = new PersonBuilder().withName(VALID_NAME_AMY).withPhone(VALID_PHONE_AMY).withEmail(VALID_EMAIL_AMY)","path":"collated/test/PokkaKiyo.md","position":569,"original_position":569,"commit_id":"f585ca8b7004783f6e268f9a3353d9c772192741","original_commit_id":"f585ca8b7004783f6e268f9a3353d9c772192741","user":{"login":"eugenepeh","id":19277206,"avatar_url":"https://avatars2.githubusercontent.com/u/19277206?v=4","gravatar_id":"","url":"https://api.github.com/users/eugenepeh","html_url":"https://github.com/eugenepeh","followers_url":"https://api.github.com/users/eugenepeh/followers","following_url":"https://api.github.com/users/eugenepeh/following{/other_user}","gists_url":"https://api.github.com/users/eugenepeh/gists{/gist_id}","starred_url":"https://api.github.com/users/eugenepeh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eugenepeh/subscriptions","organizations_url":"https://api.github.com/users/eugenepeh/orgs","repos_url":"https://api.github.com/users/eugenepeh/repos","events_url":"https://api.github.com/users/eugenepeh/events{/privacy}","received_events_url":"https://api.github.com/users/eugenepeh/received_events","type":"User","site_admin":false},"body":"dont pick out lines, collate the entire method.","created_at":"2017-11-04T03:00:29Z","updated_at":"2017-11-04T03:17:24Z","html_url":"https://github.com/CS2103AUG2017-T11-B4/main/pull/76#discussion_r148921383","pull_request_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/comments/148921383"},"html":{"href":"https://github.com/CS2103AUG2017-T11-B4/main/pull/76#discussion_r148921383"},"pull_request":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76"}}},"pull_request":{"url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76","id":150040548,"html_url":"https://github.com/CS2103AUG2017-T11-B4/main/pull/76","diff_url":"https://github.com/CS2103AUG2017-T11-B4/main/pull/76.diff","patch_url":"https://github.com/CS2103AUG2017-T11-B4/main/pull/76.patch","issue_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues/76","number":76,"state":"closed","locked":false,"title":"V1.4 collate","user":{"login":"PokkaKiyo","id":31039465,"avatar_url":"https://avatars0.githubusercontent.com/u/31039465?v=4","gravatar_id":"","url":"https://api.github.com/users/PokkaKiyo","html_url":"https://github.com/PokkaKiyo","followers_url":"https://api.github.com/users/PokkaKiyo/followers","following_url":"https://api.github.com/users/PokkaKiyo/following{/other_user}","gists_url":"https://api.github.com/users/PokkaKiyo/gists{/gist_id}","starred_url":"https://api.github.com/users/PokkaKiyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PokkaKiyo/subscriptions","organizations_url":"https://api.github.com/users/PokkaKiyo/orgs","repos_url":"https://api.github.com/users/PokkaKiyo/repos","events_url":"https://api.github.com/users/PokkaKiyo/events{/privacy}","received_events_url":"https://api.github.com/users/PokkaKiyo/received_events","type":"User","site_admin":false},"body":"","created_at":"2017-11-01T13:37:17Z","updated_at":"2017-11-04T03:17:24Z","closed_at":"2017-11-01T14:44:52Z","merged_at":"2017-11-01T14:44:52Z","merge_commit_sha":"c65d963798d52f2a39d22e7ea349885d98dbe9b8","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":{"url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/milestones/3","html_url":"https://github.com/CS2103AUG2017-T11-B4/main/milestone/3","labels_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/milestones/3/labels","id":2856569,"number":3,"title":"V1.4","description":"","creator":{"login":"PokkaKiyo","id":31039465,"avatar_url":"https://avatars0.githubusercontent.com/u/31039465?v=4","gravatar_id":"","url":"https://api.github.com/users/PokkaKiyo","html_url":"https://github.com/PokkaKiyo","followers_url":"https://api.github.com/users/PokkaKiyo/followers","following_url":"https://api.github.com/users/PokkaKiyo/following{/other_user}","gists_url":"https://api.github.com/users/PokkaKiyo/gists{/gist_id}","starred_url":"https://api.github.com/users/PokkaKiyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PokkaKiyo/subscriptions","organizations_url":"https://api.github.com/users/PokkaKiyo/orgs","repos_url":"https://api.github.com/users/PokkaKiyo/repos","events_url":"https://api.github.com/users/PokkaKiyo/events{/privacy}","received_events_url":"https://api.github.com/users/PokkaKiyo/received_events","type":"User","site_admin":false},"open_issues":0,"closed_issues":6,"state":"closed","created_at":"2017-10-22T07:46:41Z","updated_at":"2017-11-01T15:22:26Z","due_on":"2017-10-31T07:00:00Z","closed_at":"2017-11-01T15:22:26Z"},"commits_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76/commits","review_comments_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76/comments","review_comment_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/comments{/number}","comments_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues/76/comments","statuses_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/statuses/f585ca8b7004783f6e268f9a3353d9c772192741","head":{"label":"PokkaKiyo:v1.4_collate","ref":"v1.4_collate","sha":"f585ca8b7004783f6e268f9a3353d9c772192741","user":{"login":"PokkaKiyo","id":31039465,"avatar_url":"https://avatars0.githubusercontent.com/u/31039465?v=4","gravatar_id":"","url":"https://api.github.com/users/PokkaKiyo","html_url":"https://github.com/PokkaKiyo","followers_url":"https://api.github.com/users/PokkaKiyo/followers","following_url":"https://api.github.com/users/PokkaKiyo/following{/other_user}","gists_url":"https://api.github.com/users/PokkaKiyo/gists{/gist_id}","starred_url":"https://api.github.com/users/PokkaKiyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PokkaKiyo/subscriptions","organizations_url":"https://api.github.com/users/PokkaKiyo/orgs","repos_url":"https://api.github.com/users/PokkaKiyo/repos","events_url":"https://api.github.com/users/PokkaKiyo/events{/privacy}","received_events_url":"https://api.github.com/users/PokkaKiyo/received_events","type":"User","site_admin":false},"repo":{"id":105527352,"name":"main","full_name":"PokkaKiyo/main","owner":{"login":"PokkaKiyo","id":31039465,"avatar_url":"https://avatars0.githubusercontent.com/u/31039465?v=4","gravatar_id":"","url":"https://api.github.com/users/PokkaKiyo","html_url":"https://github.com/PokkaKiyo","followers_url":"https://api.github.com/users/PokkaKiyo/followers","following_url":"https://api.github.com/users/PokkaKiyo/following{/other_user}","gists_url":"https://api.github.com/users/PokkaKiyo/gists{/gist_id}","starred_url":"https://api.github.com/users/PokkaKiyo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PokkaKiyo/subscriptions","organizations_url":"https://api.github.com/users/PokkaKiyo/orgs","repos_url":"https://api.github.com/users/PokkaKiyo/repos","events_url":"https://api.github.com/users/PokkaKiyo/events{/privacy}","received_events_url":"https://api.github.com/users/PokkaKiyo/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/PokkaKiyo/main","description":"Address Book sample application (Level 4)","fork":true,"url":"https://api.github.com/repos/PokkaKiyo/main","forks_url":"https://api.github.com/repos/PokkaKiyo/main/forks","keys_url":"https://api.github.com/repos/PokkaKiyo/main/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PokkaKiyo/main/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PokkaKiyo/main/teams","hooks_url":"https://api.github.com/repos/PokkaKiyo/main/hooks","issue_events_url":"https://api.github.com/repos/PokkaKiyo/main/issues/events{/number}","events_url":"https://api.github.com/repos/PokkaKiyo/main/events","assignees_url":"https://api.github.com/repos/PokkaKiyo/main/assignees{/user}","branches_url":"https://api.github.com/repos/PokkaKiyo/main/branches{/branch}","tags_url":"https://api.github.com/repos/PokkaKiyo/main/tags","blobs_url":"https://api.github.com/repos/PokkaKiyo/main/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PokkaKiyo/main/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PokkaKiyo/main/git/refs{/sha}","trees_url":"https://api.github.com/repos/PokkaKiyo/main/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PokkaKiyo/main/statuses/{sha}","languages_url":"https://api.github.com/repos/PokkaKiyo/main/languages","stargazers_url":"https://api.github.com/repos/PokkaKiyo/main/stargazers","contributors_url":"https://api.github.com/repos/PokkaKiyo/main/contributors","subscribers_url":"https://api.github.com/repos/PokkaKiyo/main/subscribers","subscription_url":"https://api.github.com/repos/PokkaKiyo/main/subscription","commits_url":"https://api.github.com/repos/PokkaKiyo/main/commits{/sha}","git_commits_url":"https://api.github.com/repos/PokkaKiyo/main/git/commits{/sha}","comments_url":"https://api.github.com/repos/PokkaKiyo/main/comments{/number}","issue_comment_url":"https://api.github.com/repos/PokkaKiyo/main/issues/comments{/number}","contents_url":"https://api.github.com/repos/PokkaKiyo/main/contents/{+path}","compare_url":"https://api.github.com/repos/PokkaKiyo/main/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PokkaKiyo/main/merges","archive_url":"https://api.github.com/repos/PokkaKiyo/main/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PokkaKiyo/main/downloads","issues_url":"https://api.github.com/repos/PokkaKiyo/main/issues{/number}","pulls_url":"https://api.github.com/repos/PokkaKiyo/main/pulls{/number}","milestones_url":"https://api.github.com/repos/PokkaKiyo/main/milestones{/number}","notifications_url":"https://api.github.com/repos/PokkaKiyo/main/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PokkaKiyo/main/labels{/name}","releases_url":"https://api.github.com/repos/PokkaKiyo/main/releases{/id}","deployments_url":"https://api.github.com/repos/PokkaKiyo/main/deployments","created_at":"2017-10-02T11:33:59Z","updated_at":"2017-10-02T11:34:01Z","pushed_at":"2017-11-02T15:55:40Z","git_url":"git://github.com/PokkaKiyo/main.git","ssh_url":"git@github.com:PokkaKiyo/main.git","clone_url":"https://github.com/PokkaKiyo/main.git","svn_url":"https://github.com/PokkaKiyo/main","homepage":"https://nus-cs2103-AY1718S1.github.io/addressbook-level4","size":11644,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"CS2103AUG2017-T11-B4:master","ref":"master","sha":"bb6b9b4ee4323cf2b352a4a92aefad603c05bdf7","user":{"login":"CS2103AUG2017-T11-B4","id":32453779,"avatar_url":"https://avatars0.githubusercontent.com/u/32453779?v=4","gravatar_id":"","url":"https://api.github.com/users/CS2103AUG2017-T11-B4","html_url":"https://github.com/CS2103AUG2017-T11-B4","followers_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/followers","following_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/following{/other_user}","gists_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/gists{/gist_id}","starred_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/subscriptions","organizations_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/orgs","repos_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/repos","events_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/events{/privacy}","received_events_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/received_events","type":"Organization","site_admin":false},"repo":{"id":105527046,"name":"main","full_name":"CS2103AUG2017-T11-B4/main","owner":{"login":"CS2103AUG2017-T11-B4","id":32453779,"avatar_url":"https://avatars0.githubusercontent.com/u/32453779?v=4","gravatar_id":"","url":"https://api.github.com/users/CS2103AUG2017-T11-B4","html_url":"https://github.com/CS2103AUG2017-T11-B4","followers_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/followers","following_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/following{/other_user}","gists_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/gists{/gist_id}","starred_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/subscriptions","organizations_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/orgs","repos_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/repos","events_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/events{/privacy}","received_events_url":"https://api.github.com/users/CS2103AUG2017-T11-B4/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/CS2103AUG2017-T11-B4/main","description":"Address Book sample application (Level 4)","fork":true,"url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main","forks_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/forks","keys_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/keys{/key_id}","collaborators_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/teams","hooks_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/hooks","issue_events_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues/events{/number}","events_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/events","assignees_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/assignees{/user}","branches_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/branches{/branch}","tags_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/tags","blobs_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/git/refs{/sha}","trees_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/git/trees{/sha}","statuses_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/statuses/{sha}","languages_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/languages","stargazers_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/stargazers","contributors_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/contributors","subscribers_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/subscribers","subscription_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/subscription","commits_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/commits{/sha}","git_commits_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/git/commits{/sha}","comments_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/comments{/number}","issue_comment_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues/comments{/number}","contents_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/contents/{+path}","compare_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/compare/{base}...{head}","merges_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/merges","archive_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/downloads","issues_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues{/number}","pulls_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls{/number}","milestones_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/milestones{/number}","notifications_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/labels{/name}","releases_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/releases{/id}","deployments_url":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/deployments","created_at":"2017-10-02T11:29:36Z","updated_at":"2017-10-08T06:28:22Z","pushed_at":"2017-11-02T16:05:19Z","git_url":"git://github.com/CS2103AUG2017-T11-B4/main.git","ssh_url":"git@github.com:CS2103AUG2017-T11-B4/main.git","clone_url":"https://github.com/CS2103AUG2017-T11-B4/main.git","svn_url":"https://github.com/CS2103AUG2017-T11-B4/main","homepage":"https://nus-cs2103-AY1718S1.github.io/addressbook-level4","size":11655,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":9,"forks":3,"open_issues":9,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76"},"html":{"href":"https://github.com/CS2103AUG2017-T11-B4/main/pull/76"},"issue":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues/76"},"comments":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/issues/76/comments"},"review_comments":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76/comments"},"review_comment":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/pulls/76/commits"},"statuses":{"href":"https://api.github.com/repos/CS2103AUG2017-T11-B4/main/statuses/f585ca8b7004783f6e268f9a3353d9c772192741"}},"author_association":"NONE"}}
{"actor":{"display_login":"eugenepeh"}}