diff --git a/docs/diagrams/StatsAvailSelfInvDiagram.puml b/docs/diagrams/StatsAvailSelfInvDiagram.puml index 5a00aab9209..70789e3b6fe 100644 --- a/docs/diagrams/StatsAvailSelfInvDiagram.puml +++ b/docs/diagrams/StatsAvailSelfInvDiagram.puml @@ -12,6 +12,11 @@ activate StatsAvailCommand StatsAvailCommand --> StatsAvailCommand : availableFosterers deactivate StatsAvailCommand +StatsAvailCommand -> StatsAvailCommand : calculatePercentage(availableCount, total) +activate StatsAvailCommand +StatsAvailCommand --> StatsAvailCommand +deactivate StatsAvailCommand + StatsAvailCommand -> StatsAvailCommand : getAbleDogCount(availableFosterers) activate StatsAvailCommand StatsAvailCommand --> StatsAvailCommand : ableDogCount @@ -22,11 +27,6 @@ activate StatsAvailCommand StatsAvailCommand --> StatsAvailCommand : ableCatCount deactivate StatsAvailCommand -StatsAvailCommand -> StatsAvailCommand : calculatePercentage(availableCount, total) -activate StatsAvailCommand -StatsAvailCommand --> StatsAvailCommand -deactivate StatsAvailCommand - StatsAvailCommand -> StatsAvailCommand : calculatePercentage(ableDogCount, availableCount) activate StatsAvailCommand StatsAvailCommand --> StatsAvailCommand diff --git a/docs/images/StatsAvailSelfInvDiagram.png b/docs/images/StatsAvailSelfInvDiagram.png index 1a46c8dcfb0..eb01d7f1939 100644 Binary files a/docs/images/StatsAvailSelfInvDiagram.png and b/docs/images/StatsAvailSelfInvDiagram.png differ diff --git a/src/main/java/seedu/address/commons/core/index/Indices.java b/src/main/java/seedu/address/commons/core/index/Indices.java index 861be6ca0fd..80b2abbcbe1 100644 --- a/src/main/java/seedu/address/commons/core/index/Indices.java +++ b/src/main/java/seedu/address/commons/core/index/Indices.java @@ -30,7 +30,7 @@ private Indices(SortedSet zeroBasedIndices) { * Creates a new {@code Indices} using zero-based indices. */ public static Indices fromZeroBased(int[] zeroBasedIndices) { - assert(zeroBasedIndices != null); + assert (zeroBasedIndices != null); SortedSet result = new TreeSet<>(); for (int index : zeroBasedIndices) { @@ -44,7 +44,7 @@ public static Indices fromZeroBased(int[] zeroBasedIndices) { * Creates a new {@code Indices} using one-based indices. */ public static Indices fromOneBased(int[] oneBasedIndices) { - assert(oneBasedIndices != null); + assert (oneBasedIndices != null); SortedSet result = new TreeSet<>(); for (int index : oneBasedIndices) { diff --git a/src/main/java/seedu/address/logic/commands/StatsAvailCommand.java b/src/main/java/seedu/address/logic/commands/StatsAvailCommand.java index b1d7acba0ed..1fb969dc11a 100644 --- a/src/main/java/seedu/address/logic/commands/StatsAvailCommand.java +++ b/src/main/java/seedu/address/logic/commands/StatsAvailCommand.java @@ -8,7 +8,6 @@ import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; import seedu.address.model.person.AnimalType; -import seedu.address.model.person.Availability; import seedu.address.model.person.Person; /** @@ -28,9 +27,7 @@ public class StatsAvailCommand extends StatsCommand { */ protected List getAvailableFosterers(List fosterers) { return fosterers.stream() - .filter(fosterer -> - fosterer.getAvailability() - .equals(Availability.AVAILABLE)) + .filter(Person::isAvailableFosterer) .collect(Collectors.toList()); } @@ -44,6 +41,7 @@ protected int getAbleDogCount(List fosterers) { .equals(AnimalType.ABLE_DOG)) .count(); } + /** * Returns the number of fosterers from the given list who can foster cats. */ diff --git a/src/main/java/seedu/address/logic/commands/StatsCommand.java b/src/main/java/seedu/address/logic/commands/StatsCommand.java index 6da32fb4e4d..05480cf6d57 100644 --- a/src/main/java/seedu/address/logic/commands/StatsCommand.java +++ b/src/main/java/seedu/address/logic/commands/StatsCommand.java @@ -19,7 +19,8 @@ public abstract class StatsCommand extends Command { + "Please add some fosterers!"; /** - * Calculates the percentage of a numerator and denominator. + * Calculates percentage using a numerator and denominator. + * Denominator must be a non-zero value. */ protected static double calculatePercentage(int num, int denom) { assert(denom != 0); diff --git a/src/main/java/seedu/address/logic/commands/StatsCurrentCommand.java b/src/main/java/seedu/address/logic/commands/StatsCurrentCommand.java index 66260d8534f..92e47c04afa 100644 --- a/src/main/java/seedu/address/logic/commands/StatsCurrentCommand.java +++ b/src/main/java/seedu/address/logic/commands/StatsCurrentCommand.java @@ -8,7 +8,6 @@ import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; import seedu.address.model.person.AnimalType; -import seedu.address.model.person.Availability; import seedu.address.model.person.Person; /** @@ -24,17 +23,10 @@ public class StatsCurrentCommand extends StatsCommand { /** * Returns a list of fosterers who are currently fostering. - * A fosterer is considered currently fostering if and only if they are not available, and - * currently has a dog or has a cat in their care, and animal name is not nil. */ protected List getCurrentFosterers(List fosterers) { return fosterers.stream() - .filter(fosterer -> - fosterer.getAvailability() - .equals(Availability.NOT_AVAILABLE) - && !fosterer.getAnimalName().fullName.equals(Person.NIL_WORD) - && fosterer.getAnimalType().equals(AnimalType.CURRENT_DOG) - || fosterer.getAnimalType().equals(AnimalType.CURRENT_CAT)) + .filter(Person::isCurrentFosterer) .collect(Collectors.toList()); } diff --git a/src/main/java/seedu/address/logic/commands/StatsHousingCommand.java b/src/main/java/seedu/address/logic/commands/StatsHousingCommand.java index b55f33043c5..840d441c6ff 100644 --- a/src/main/java/seedu/address/logic/commands/StatsHousingCommand.java +++ b/src/main/java/seedu/address/logic/commands/StatsHousingCommand.java @@ -26,7 +26,8 @@ public class StatsHousingCommand extends StatsCommand { protected int getHdbCount(List fosterers) { return (int) fosterers.stream() .filter(fosterer -> - fosterer.getHousing().equals(Housing.HDB)) + fosterer.getHousing() + .equals(Housing.HDB)) .count(); } @@ -34,10 +35,10 @@ protected int getHdbCount(List fosterers) { * Returns the number of fosterers who stay in Condos. */ protected int getCondoCount(List fosterers) { - Housing condo = new Housing("Condo"); return (int) fosterers.stream() .filter(fosterer -> - fosterer.getHousing().equals(Housing.CONDO)) + fosterer.getHousing() + .equals(Housing.CONDO)) .count(); } @@ -45,10 +46,10 @@ protected int getCondoCount(List fosterers) { * Returns the number of fosterers who stay in Landed. */ protected int getLandedCount(List fosterers) { - Housing landed = new Housing("Landed"); return (int) fosterers.stream() .filter(fosterer -> - fosterer.getHousing().equals(Housing.LANDED)) + fosterer.getHousing() + .equals(Housing.LANDED)) .count(); } diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index 445258f83ea..c55906ade75 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -152,7 +152,7 @@ public void setNote(String note) { * Intended for use with predicates generated through the find command. * * @return a Map; keys include all publicly gettable fields as well as all tags, - * and values are values of the respective fields, or {@code null} for tags. + * and values are values of the respective fields, or {@code null} for tags. */ public Map getFieldsAndAttributes() { HashMap map = new HashMap<>(); @@ -169,7 +169,7 @@ public Map getFieldsAndAttributes() { return map; } - private void tryPut(Map map, String key, Object value) { + protected void tryPut(Map map, String key, Object value) { if (Objects.isNull(value)) { return; } @@ -185,6 +185,27 @@ public Set getTags() { } + /** + * Returns true if person is an available fosterer. + */ + public boolean isAvailableFosterer() { + return availability.equals(Availability.AVAILABLE); + } + + /** + * Returns true if person is a current fosterer. + * Person is a current fosterer if and only if they are not available, and is + * currently fostering an animal. + */ + public boolean isCurrentFosterer() { + boolean isNotAvailable = this.availability.equals(Availability.NOT_AVAILABLE); + boolean isAnimalNameNil = this.animalName.fullName.equals(Person.NIL_WORD); + boolean isAnimalCurrentCatOrDog = this.animalType.equals(AnimalType.CURRENT_DOG) + || this.animalType.equals(AnimalType.CURRENT_CAT); + + return isNotAvailable && !isAnimalNameNil && isAnimalCurrentCatOrDog; + } + /** * Returns true if both persons have the same name. * This defines a weaker notion of equality between two persons. diff --git a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java index 0a0feac6555..f570662b779 100644 --- a/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/DeleteCommandTest.java @@ -40,8 +40,10 @@ public class DeleteCommandTest { @Test public void isValidIndex() throws CommandException { assertTrue(DeleteCommand.isValidIndex(0, 1)); - assertThrows(CommandException.class, () -> DeleteCommand.isValidIndex(1, 1)); + assertTrue(DeleteCommand.isValidIndex(0, 2)); assertThrows(CommandException.class, () -> DeleteCommand.isValidIndex(-1, 1)); + assertThrows(CommandException.class, () -> DeleteCommand.isValidIndex(1, -1)); + assertThrows(CommandException.class, () -> DeleteCommand.isValidIndex(1, 1)); } @Test diff --git a/src/test/java/seedu/address/logic/commands/StatsAvailCommandTest.java b/src/test/java/seedu/address/logic/commands/StatsAvailCommandTest.java index 0ace53f234e..2b7103bad58 100644 --- a/src/test/java/seedu/address/logic/commands/StatsAvailCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/StatsAvailCommandTest.java @@ -122,7 +122,6 @@ public void execute_noFosterers_throwsCommandException() { @Test public void execute_filteredList_expectZero() throws CommandException { - //should model.updateFilteredPersonList(fosterer -> !TypicalPersons.getAvailableFosterers().contains(fosterer)); List fosterers = model.getFilteredPersonList(); int total = fosterers.size(); diff --git a/src/test/java/seedu/address/logic/commands/StatsCommandTest.java b/src/test/java/seedu/address/logic/commands/StatsCommandTest.java index 9f32f85ba6e..97331e68118 100644 --- a/src/test/java/seedu/address/logic/commands/StatsCommandTest.java +++ b/src/test/java/seedu/address/logic/commands/StatsCommandTest.java @@ -8,10 +8,14 @@ public class StatsCommandTest { @Test - public void calculatePercentage() { + public void calculatePercentage_demomZero() { assertThrows(AssertionError.class, () -> { StatsCommand.calculatePercentage(1, 0); }); + } + + @Test + public void calculatePercentage() { assertEquals(0.0, StatsCommand.calculatePercentage(0, 10)); assertEquals(3 / (double) 10 * 100, StatsCommand.calculatePercentage(3, 10)); diff --git a/src/test/java/seedu/address/model/person/PersonTest.java b/src/test/java/seedu/address/model/person/PersonTest.java index c510fde5ad5..b7b3fe09afc 100644 --- a/src/test/java/seedu/address/model/person/PersonTest.java +++ b/src/test/java/seedu/address/model/person/PersonTest.java @@ -1,5 +1,6 @@ package seedu.address.model.person; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -16,6 +17,9 @@ import static seedu.address.testutil.TypicalPersons.ALICE; import static seedu.address.testutil.TypicalPersons.BOB; +import java.util.HashMap; +import java.util.Map; + import org.junit.jupiter.api.Test; import seedu.address.testutil.PersonBuilder; @@ -85,7 +89,7 @@ public void equals() { editedAlice = new PersonBuilder(ALICE).withEmail(VALID_EMAIL_BOB).build(); assertFalse(ALICE.equals(editedAlice)); - // different address -> returns false + // different address -> retucrns false editedAlice = new PersonBuilder(ALICE).withAddress(VALID_ADDRESS_BOB).build(); assertFalse(ALICE.equals(editedAlice)); @@ -159,6 +163,10 @@ public void constructor_invalidArguments() { .withAnimalName("Star") .withAnimalType("nil", new Availability("NotAvailable")) .build()); + + assertThrows(IllegalArgumentException.class, () -> new PersonBuilder(ALICE) + .withName(Person.NIL_WORD) + .build()); } @Test @@ -175,4 +183,149 @@ public void toStringMethod() { + ", animalType=" + ALICE.getAnimalType() + ", housing=" + ALICE.getHousing() + "}"; assertEquals(expected, ALICE.toString()); } + + @Test + public void setNote_newNote() { + Person person = new PersonBuilder(ALICE) + .build(); + + String newNote = "animal needs to company 24/7"; + person.setNote(newNote); + assertEquals(newNote, person.getNote()); + } + + @Test + public void setNote_newEmptyString() { + Person person = new PersonBuilder(ALICE) + .build(); + + String newNote = ""; + person.setNote(newNote); + assertEquals(newNote, person.getNote()); + } + + @Test + public void tryPut_unsuccessful() { + Person person = new PersonBuilder(ALICE) + .build(); + + Map map = new HashMap<>(); + person.tryPut(map, "note", null); + assertEquals(null, map.get("note")); + } + + @Test + public void tryPut_successful() { + Person person = new PersonBuilder(ALICE) + .build(); + + String note = "animal needs urgent care"; + Map map = new HashMap<>(); + person.tryPut(map, "note", note); + assertEquals(note, map.get("note")); + } + + @Test + public void isAvailableFosterer_allNil() { + //note: person constructor already checks for conflicting entries + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Person.NIL_WORD) + .withAnimalType(Person.NIL_WORD, Availability.NIL_AVAILABILITY) + .withAnimalName(Person.NIL_WORD) + .build(); + assertFalse(fosterer.isCurrentFosterer()); + } + + @Test + public void isAvailableFosterer_notAvailable_restNil() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.NOT_AVAILABLE_WORD) + .withAnimalType(Person.NIL_WORD, Availability.NOT_AVAILABLE) + .withAnimalName(Person.NIL_WORD) + .build(); + assertFalse(fosterer.isAvailableFosterer()); + } + + @Test + public void isAvailableFosterer_notAvailable_animalTypeKnown() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.NOT_AVAILABLE_WORD) + .withAnimalType(AnimalType.CURRENT_CAT_WORD, Availability.NOT_AVAILABLE) + .withAnimalName("miu") + .build(); + assertFalse(fosterer.isAvailableFosterer()); + } + + @Test + public void isAvailableFosterer_available_restNil() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.AVAILABLE_WORD) + .withAnimalType(Person.NIL_WORD, Availability.AVAILABLE) + .withAnimalName(Person.NIL_WORD) + .build(); + assertTrue(fosterer.isAvailableFosterer()); + } + + @Test + public void isAvailableFosterer_available_animalTypeKnown() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.AVAILABLE_WORD) + .withAnimalType(AnimalType.ABLE_DOG_WORD, Availability.AVAILABLE) + .withAnimalName(Person.NIL_WORD) + .build(); + assertTrue(fosterer.isAvailableFosterer()); + } + + @Test + public void isCurrentFosterer_allNil() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Person.NIL_WORD) + .withAnimalType(Person.NIL_WORD, Availability.NIL_AVAILABILITY) + .withAnimalName(Person.NIL_WORD) + .build(); + assertFalse(fosterer.isCurrentFosterer()); + } + + @Test + public void isCurrentFosterer_available_restNil() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.AVAILABLE_WORD) + .withAnimalType(Person.NIL_WORD, Availability.AVAILABLE) + .withAnimalName(Person.NIL_WORD) + .build(); + assertFalse(fosterer.isCurrentFosterer()); + } + + @Test + public void isCurrentFosterer_available_animalTypeKnown() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.AVAILABLE_WORD) + .withAnimalType(AnimalType.ABLE_DOG_WORD, Availability.AVAILABLE) + .withAnimalName(Person.NIL_WORD) + .build(); + + assertFalse(fosterer.isCurrentFosterer()); + } + + @Test + public void isCurrentFosterer_notAvailable_restNil() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.NOT_AVAILABLE_WORD) + .withAnimalType(Person.NIL_WORD, Availability.NOT_AVAILABLE) + .withAnimalName(Person.NIL_WORD) + .build(); + + assertFalse(fosterer.isCurrentFosterer()); + } + + @Test + public void isCurrentFosterer_notAvailable_animalTypeKnown() { + Person fosterer = new PersonBuilder(ALICE) + .withAvailability(Availability.NOT_AVAILABLE_WORD) + .withAnimalType(AnimalType.CURRENT_CAT_WORD, Availability.NOT_AVAILABLE) + .withAnimalName("miu") + .build(); + + assertTrue(fosterer.isCurrentFosterer()); + } }