Skip to content
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ordestiny.tdd.designpattern.factorypattern.animal;

/**
* @author Rachit Parikh
*/
public interface Animal {
int numberOfLegs();
AnimalType typeOfAnimal();
}
Original file line number Diff line number Diff line change
@@ -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<Animal> initiator;

public Animal getInstance(){
return initiator.get();
}

AnimalEnum(Supplier<Animal> initiator){
this.initiator = initiator;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ordestiny.tdd.designpattern.factorypattern.animal;

/**
* @author Rachit Parikh
*/
public enum AnimalType {
MAMMAL, REPTILE, AMPHIBIAN,
BIRD, INVERTEBRATE, FISH;
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
Comment on lines +77 to +82
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this block can be replaced with

assertThrows(IllegalArgumentException.class, () -> AnimalFactory.getAnimal("BAT"));

}

@Test
public void checkTelevision() throws Exception{
try{
animal = AnimalFactory.getAnimal("TELEVISION");
}
catch (Exception e){
assertEquals(e.getClass(), IllegalArgumentException.class);
}
}

}