I am new to Test Driven Development and currently practicing it with some problem statement. Following is an Assembly Line Problem statement I solved using TDD approach in java. Please provide me some guideline on improving it, also if I am doing it the correct way?
Orignal Problem Statement is : http://www.geeksforgeeks.org/dynamic-programming-set-34-assembly-line-scheduling/ . In summary, a car factory has two assembly lines (\$i \in \{1,2\}\$), each with \$n\$ stations (\$j \in \{1,2,\ldots,n\}\$). The time taken per station is \$a_{i,j}\$. The car chassis can move one station forward in the same line, or one station diagonally in the other line (incurring an extra delay \$t_{i, j}\$ to move to station \$j\$ from line \$i\$). Compute the minimum time it will take to build a car chassis.
My Git Hub Link To Solution is : https://github.com/sarangshinde/TDD/tree/master/AssemblyLineProblem
Here I am adding just glimpse of what I tried. test class is as follows:
public class TestCarAssemblyTest {
CarChassisBuilder carAssemble;
@Before
public void setUp() throws Exception {
carAssemble= new CarChassisBuilder();
}
@Test
public void shouldReturn_MinimumTimeSpentInCarChassisBuild_whenNoStationsOnBothAsemblyLine() {
Station line1Stations [] = null;
Station line2Stations [] = null;
AssembleLine line1 = new AssembleLine("Line1",15,25,line1Stations);
AssembleLine line2= new AssembleLine("Line2",10,20,line2Stations);
int assembleTime = carAssemble.buildCarChassis(line1,line2);
assertEquals(30, assembleTime);
}
@Test
public void shouldReturn_MinimumTimeSpentInCarChassisBuild_whenOneStationOnAsemblyLine1() {
Station line2Stations [] = {new Station(1,10,5)};
Station line1Stations [] = null;
AssembleLine line1 = new AssembleLine("Line1",25,25,line1Stations);
AssembleLine line2= new AssembleLine("Line2",10,20,line2Stations);
int assembleTime = carAssemble.buildCarChassis(line1,line2);
assertEquals(40, assembleTime);
}
@Test
public void shouldReturn_MinimumTimeSpentInCarChassisBuild_whenOneStationOnBothAsemblyLine() {
Station line2Stations [] = {new Station(1,50,5)};
Station line1Stations [] = {new Station(1,10,5)};
AssembleLine line1 = new AssembleLine("Line1",25,25,line1Stations);
AssembleLine line2= new AssembleLine("Line2",10,20,line2Stations);
int assembleTime = carAssemble.buildCarChassis(line1,line2);
assertEquals(60, assembleTime);
}
@Test
public void shouldReturn_MinimumTimeSpentInCarChassisBuild_whenTwoStationsOnAsemblyLine2() {
Station line2Stations [] = {new Station(1,30,5),new Station(2,20,5)};
Station line1Stations [] = {new Station(1,10,5)};
AssembleLine line1 = new AssembleLine("Line1",10,20,line1Stations);
AssembleLine line2= new AssembleLine("Line2",10,20,line2Stations);
int assembleTime = carAssemble.buildCarChassis(line1,line2);
assertEquals(40, assembleTime);
}
@Test
public void shouldReturn_MinimumTimeSpentInCarChassisBuild_whenTwoStationsOnBothAsemblyLine() {
Station line2Stations [] = {new Station(1,30,5),new Station(2,10,-10)};
Station line1Stations [] = {new Station(1,45,5),new Station(2,5,2)};
AssembleLine line1 = new AssembleLine("Line1",10,20,line1Stations);
AssembleLine line2= new AssembleLine("Line2",10,20,line2Stations);
int assembleTime = carAssemble.buildCarChassis(line1,line2);
assertEquals(60, assembleTime);
}
}
src classes as follows:
public class Station {
public int getStationNumber() {
return stationNumber;
}
public void setStationNumber(int stationNumber) {
this.stationNumber = stationNumber;
}
public int getTimeSpentAtStation() {
return timeSpentAtStation;
}
public void setTimeSpentAtStation(int timeSpentAtStation) {
this.timeSpentAtStation = timeSpentAtStation;
}
private int stationNumber;
private int lineChangeCost;
public int getLineChangeCost() {
return lineChangeCost;
}
public void setLineChangeCost(int lineChangeCost) {
this.lineChangeCost = lineChangeCost;
}
public Station(int stationNumber, int timeSpentAtStation,int lineChangeCost) {
super();
this.stationNumber = stationNumber;
this.timeSpentAtStation = timeSpentAtStation;
this.lineChangeCost=lineChangeCost;
}
private int timeSpentAtStation;}
public class AssembleLine {
public Station[] getStations() {
return stations;
}
public void setStations(Station[] stations) {
this.stations = stations;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private Station stations [];
private String name;
private int entryTime;
public AssembleLine(String name,int entryTime, int exitTime,Station [] stations) {
this.name=name;
this.entryTime = entryTime;
this.exitTime = exitTime;
this.stations=stations;
}
private int exitTime;
public int getEntryTime() {
return entryTime;
}
public void setEntryTime(int entryTime) {
this.entryTime = entryTime;
}
public int getExitTime() {
return exitTime;
}
public void setExitTime(int exitTime) {
this.exitTime = exitTime;
}
}
public class CarChassisBuilder {
private int buildCarChassisTime(AssembleLine line) {
Station[] stations = line.getStations();
int assembleTime= line.getEntryTime() + line.getExitTime();
if(stations==null || stations.length==0)
return assembleTime;
else if( stations.length==1){
return assembleTime+Arrays.stream(stations)
.mapToInt(station -> station.getTimeSpentAtStation())
.sum();
}
else {
int timeSpentAtAllStations = IntStream.range(1, stations.length)
.map(station -> CarChassisBuilder.min(CarChassisBuilder.timeSpentBetweenTwoStations(stations[station-1],stations[station],false),
CarChassisBuilder.timeSpentBetweenTwoStations(stations[station-1],stations[station],true)))
.sum();
return assembleTime+timeSpentAtAllStations;
}
}
private static int timeSpentBetweenTwoStations(Station prevStation, Station nextStation, boolean changeLineFlag) {
return changeLineFlag ?
prevStation.getTimeSpentAtStation()+nextStation.getLineChangeCost()+nextStation.getTimeSpentAtStation():
prevStation.getTimeSpentAtStation()+nextStation.getTimeSpentAtStation();
}
public int buildCarChassis(AssembleLine line1, AssembleLine line2) {
return min(buildCarChassisTime(line1),buildCarChassisTime(line2));
}
private static int min(int assembleLine1Time, int assembleLine2Time) {
return assembleLine1Time < assembleLine2Time ? assembleLine1Time : assembleLine2Time;
}
}
public class MainClass {
public static void main(String []args){
CarChassisBuilder carAssemble= new CarChassisBuilder();
Station line2Stations [] = {new Station(1,30,5),new Station(2,10,-10),new Station(3,5,5)};
Station line1Stations [] = {new Station(1,45,5),new Station(2,5,2)};
AssembleLine line1 = new AssembleLine("Line1",10,20,line1Stations);
AssembleLine line2= new AssembleLine("Line2",10,20,line2Stations);
int carChassisBuilTime = carAssemble.buildCarChassis(line1,line2);
System.out.println("Minimum Time To Buil Car Chassis Is :" + carChassisBuilTime);
}
}
Please feel free to provide review comments on it. Also provide guidance on if my code is following SOLID principles,if modeling of problem statement is right and how to improve its design.