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/
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 {
//getter setter are ommited here
private int stationNumber;
private int lineChangeCost;
private int timeSpentAtStation;
public Station(int stationNumber, int timeSpentAtStation,int lineChangeCost) {
super();
this.stationNumber = stationNumber;
this.timeSpentAtStation = timeSpentAtStation;
this.lineChangeCost=lineChangeCost;
}
}
public class AssembleLine {
//getter setter are ommited here
private Station stations [];
private String name;
private int exitTime;
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;
}
}
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.