diff --git a/build.gradle b/build.gradle index 9f6d810..7544685 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,7 @@ repositories { } dependencies { + // https://mvnrepository.com/artifact/org.mockito/mockito-core testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.5.13' diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/AnimalFactory.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/AnimalFactory.java new file mode 100644 index 0000000..bcbb448 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/AnimalFactory.java @@ -0,0 +1,20 @@ +package com.ordestiny.tdd.designpattern.factorypattern; + +import com.ordestiny.tdd.designpattern.factorypattern.animal.Animal; +import com.ordestiny.tdd.designpattern.factorypattern.animal.AnimalEnum; + +import java.security.InvalidParameterException; +import java.text.MessageFormat; + +/** + * @author Rachit Parikh + */ +public class AnimalFactory { + public static Animal getAnimal(String animal) { + AnimalEnum animalEnum = AnimalEnum.valueOf(animal); + if(animalEnum.getInstance() == null){ + throw new InvalidParameterException(); + } + return animalEnum.getInstance(); + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Animal.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Animal.java new file mode 100644 index 0000000..07f9f2b --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Animal.java @@ -0,0 +1,9 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public interface Animal { + int numberOfLegs(); + AnimalType typeOfAnimal(); +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/AnimalEnum.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/AnimalEnum.java new file mode 100644 index 0000000..911f611 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/AnimalEnum.java @@ -0,0 +1,23 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +import java.security.InvalidParameterException; +import java.text.MessageFormat; +import java.util.function.Supplier; + +/** + * @author Rachit Parikh + */ +public enum AnimalEnum { + DOG(Dog::new), HUMAN(Human::new), SNAKE(Snake::new), FROG(Frog::new), + EAGLE(Eagle::new), SALMON(Salmon::new), EARTHWORM(Earthworm::new); + + private Supplier initiator; + + public Animal getInstance(){ + return initiator.get(); + } + + AnimalEnum(Supplier initiator){ + this.initiator = initiator; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/AnimalType.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/AnimalType.java new file mode 100644 index 0000000..d6bcf6a --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/AnimalType.java @@ -0,0 +1,9 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public enum AnimalType { + MAMMAL, REPTILE, AMPHIBIAN, + BIRD, INVERTEBRATE, FISH; +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Dog.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Dog.java new file mode 100644 index 0000000..432a1b0 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Dog.java @@ -0,0 +1,17 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Dog implements Animal { + + @Override + public int numberOfLegs() { + return 4; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.MAMMAL; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Eagle.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Eagle.java new file mode 100644 index 0000000..d6ed6b8 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Eagle.java @@ -0,0 +1,16 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Eagle implements Animal{ + @Override + public int numberOfLegs() { + return 2; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.BIRD; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Earthworm.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Earthworm.java new file mode 100644 index 0000000..8379582 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Earthworm.java @@ -0,0 +1,16 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Earthworm implements Animal{ + @Override + public int numberOfLegs() { + return 0; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.INVERTEBRATE; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Frog.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Frog.java new file mode 100644 index 0000000..563be17 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Frog.java @@ -0,0 +1,16 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Frog implements Animal { + @Override + public int numberOfLegs() { + return 2; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.AMPHIBIAN; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Human.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Human.java new file mode 100644 index 0000000..8910077 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Human.java @@ -0,0 +1,16 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Human implements Animal{ + @Override + public int numberOfLegs() { + return 2; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.MAMMAL; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Salmon.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Salmon.java new file mode 100644 index 0000000..e6021e0 --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Salmon.java @@ -0,0 +1,17 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Salmon implements Animal { + + @Override + public int numberOfLegs() { + return 0; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.FISH; + } +} diff --git a/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Snake.java b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Snake.java new file mode 100644 index 0000000..dbaec7b --- /dev/null +++ b/src/main/java/com/ordestiny/tdd/designpattern/factorypattern/animal/Snake.java @@ -0,0 +1,17 @@ +package com.ordestiny.tdd.designpattern.factorypattern.animal; + +/** + * @author Rachit Parikh + */ +public class Snake implements Animal { + + @Override + public int numberOfLegs() { + return 0; + } + + @Override + public AnimalType typeOfAnimal() { + return AnimalType.REPTILE; + } +} diff --git a/src/test/java/com/ordestiny/tdd/designpattern/factorypattern/AnimalFactoryTest.java b/src/test/java/com/ordestiny/tdd/designpattern/factorypattern/AnimalFactoryTest.java new file mode 100644 index 0000000..7c0aeb4 --- /dev/null +++ b/src/test/java/com/ordestiny/tdd/designpattern/factorypattern/AnimalFactoryTest.java @@ -0,0 +1,95 @@ +package com.ordestiny.tdd.designpattern.factorypattern; + +import com.ordestiny.tdd.designpattern.factorypattern.animal.*; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * @author Rachit Parikh + */ + +public class AnimalFactoryTest { + + Animal animal; + + // CheckX test classes will check whether the factory method is able to create X + // It will also test if it working correctly, i.e whether the data returned by the class is correct or not + + @Test + public void checkDog() throws Exception{ + animal = AnimalFactory.getAnimal("DOG"); + assertEquals(animal.getClass(), Dog.class); + assertEquals(animal.numberOfLegs(), 4); + assertEquals(animal.typeOfAnimal(), AnimalType.MAMMAL); + } + + @Test + public void checkHuman() throws Exception{ + animal = AnimalFactory.getAnimal("HUMAN"); + assertEquals(animal.getClass(), Human.class); + assertEquals(animal.numberOfLegs(), 2); + assertEquals(animal.typeOfAnimal(), AnimalType.MAMMAL); + } + + @Test + public void checkSalmon() throws Exception{ + animal = AnimalFactory.getAnimal("SALMON"); + assertEquals(animal.getClass(), Salmon.class); + assertEquals(animal.numberOfLegs(), 0); + assertEquals(animal.typeOfAnimal(), AnimalType.FISH); + } + + @Test + public void checkSnake() throws Exception{ + animal = AnimalFactory.getAnimal("SNAKE"); + assertEquals(animal.getClass(), Snake.class); + assertEquals(animal.numberOfLegs(), 0); + assertEquals(animal.typeOfAnimal(), AnimalType.REPTILE); + } + + @Test + public void checkEarthworm() throws Exception{ + animal = AnimalFactory.getAnimal("EARTHWORM"); + assertEquals(animal.getClass(), Earthworm.class); + assertEquals(animal.numberOfLegs(), 0); + assertEquals(animal.typeOfAnimal(), AnimalType.INVERTEBRATE); + } + + @Test + public void checkEagle() throws Exception{ + animal = AnimalFactory.getAnimal("EAGLE"); + assertEquals(animal.getClass(), Eagle.class); + assertEquals(animal.numberOfLegs(), 2); + assertEquals(animal.typeOfAnimal(), AnimalType.BIRD); + } + + @Test + public void checkFrog() throws Exception{ + animal = AnimalFactory.getAnimal("FROG"); + assertEquals(animal.getClass(), Frog.class); + assertEquals(animal.numberOfLegs(), 2); + assertEquals(animal.typeOfAnimal(), AnimalType.AMPHIBIAN); + } + + @Test + public void checkBat() throws Exception{ + try { + animal = AnimalFactory.getAnimal("BAT"); + } + catch (Exception e) { + assertEquals(e.getClass(), IllegalArgumentException.class); + } + } + + @Test + public void checkTelevision() throws Exception{ + try{ + animal = AnimalFactory.getAnimal("TELEVISION"); + } + catch (Exception e){ + assertEquals(e.getClass(), IllegalArgumentException.class); + } + } + +}