Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package serenitylabs.tutorials.vetclinic.domain;

public abstract class Animal {
public abstract String complaint();
}
20 changes: 19 additions & 1 deletion src/main/java/serenitylabs/tutorials/vetclinic/domain/Cat.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@

import com.google.common.collect.ImmutableList;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

public class Cat {
public class Cat extends Animal implements NeedsVaccinations {
private final String name;
private final String breed;
private final List<String> colour;
private LocalDate lastVaccinationDate;

public Cat(String name, String breed, List<String> colour) {

Expand Down Expand Up @@ -38,6 +41,21 @@ public static CatBuilder called(String name) {
return new CatBuilder(name);
}

@Override
public String complaint() {
return "Meow";
}

@Override
public void wasVaccinatedOn(LocalDate vaccinationDate) {
this.lastVaccinationDate = vaccinationDate;
}

@Override
public LocalDate nextVaccinationDue() {
return lastVaccinationDate.plusYears(1);
}

public static class CatBuilder {
private final String name;
private String breed;
Expand Down
19 changes: 18 additions & 1 deletion src/main/java/serenitylabs/tutorials/vetclinic/domain/Dog.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class Dog {
public class Dog extends Animal implements NeedsVaccinations {
private final String name;
private final String breed;
private final List<String> colour;
private LocalDate lastVaccinationDate;

public Dog(String name, String breed, List<String> colour) {

Expand Down Expand Up @@ -39,6 +41,21 @@ public static DogBuilder called(String name) {
return new DogBuilder(name);
}

@Override
public String complaint() {
return "Grrrr";
}

@Override
public void wasVaccinatedOn(LocalDate lastVaccinationDate) {
this.lastVaccinationDate = lastVaccinationDate;
}

@Override
public LocalDate nextVaccinationDue() {
return lastVaccinationDate.plusMonths(6);
}

public static class DogBuilder {
private final String name;
private String breed;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package serenitylabs.tutorials.vetclinic.domain;

import java.time.LocalDate;

public interface NeedsVaccinations {
void wasVaccinatedOn(LocalDate lastVaccinationDate);

LocalDate nextVaccinationDue();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package serenitylabs.tutorials.vetclinic.domain;

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

public class ComplaintRegister {
private final List<String> complaints = new ArrayList<>();

public List<String> getComplaints() {
return new ArrayList(complaints);
}

public void recordComplaint(String complaint) {
complaints.add(complaint);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package serenitylabs.tutorials.vetclinic.domain;

public class VetAssistant {
private ComplaintRegister complaintRegister;

public VetAssistant(ComplaintRegister complaintRegister) {
this.complaintRegister = complaintRegister;
}

public void recordComplaintFrom(Animal animal) {
complaintRegister.recordComplaint(animal.complaint());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package serenitylabs.tutorials.vetclinic.domain;

import org.assertj.core.api.Assertions;
import org.junit.Test;

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

import static org.assertj.core.api.Assertions.assertThat;

public class WhenCollectingAnimals {

@Test
public void a_list_of_animals_can_contain_cats_and_dogs() {
Dog fido = Dog.called("Fido").ofBreed("Labrador").andOfColour("Black");
Cat felix = Cat.called("Felix").ofBreed("Siamese").andOfColour("White");

List<Animal> animals = new ArrayList<>();

animals.add(fido);
animals.add(felix);

assertThat(animals).containsExactly(fido, felix);
}

@Test
public void a_dog_complains_by_growling() {
Dog fido = Dog.called("Fido").ofBreed("Labrador").andOfColour("Black");

assertThat(fido.complaint()).isEqualTo("Grrrr");
}

@Test
public void a_cat_complains_by_meowing() {
Cat felix = Cat.called("Felix").ofBreed("Siamese").andOfColour("White");

assertThat(felix.complaint()).isEqualTo("Meow");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package serenitylabs.tutorials.vetclinic.domain;

import org.junit.Test;

import java.time.LocalDate;
import java.time.LocalDateTime;

import static org.assertj.core.api.Assertions.assertThat;

public class WhenVisitingTheClinic {

@Test
public void cats_and_dogs_complain_to_the_assistant() {
Dog fido = Dog.called("Fido").ofBreed("Labrador").andOfColour("Black");
Cat felix = Cat.called("Felix").ofBreed("Siamese").andOfColour("White");

ComplaintRegister complaintRegister = new ComplaintRegister();
VetAssistant assistant = new VetAssistant(complaintRegister);

assistant.recordComplaintFrom(fido);
assistant.recordComplaintFrom(felix);

assertThat(complaintRegister.getComplaints()).containsExactly("Grrrr", "Meow");
}

@Test
public void the_vet_should_know_when_a_pet_vaccination_is_due() {
NeedsVaccinations felix = Cat.called("Felix").ofBreed("Siamese").andOfColour("White");

LocalDate today = LocalDate.now();
LocalDate nextYear = today.plusYears(1);

felix.wasVaccinatedOn(today);

assertThat(felix.nextVaccinationDue()).isEqualTo(nextYear);
}

@Test
public void dogs_need_to_be_vaccinated_every_six_months() {
NeedsVaccinations fido = Dog.called("Fido").ofBreed("Labrador").andOfColour("Black");

LocalDate today = LocalDate.now();
LocalDate inSixMonthsTime = today.plusMonths(6);

fido.wasVaccinatedOn(today);

assertThat(fido.nextVaccinationDue()).isEqualTo(inSixMonthsTime);
}
}