/**
   * @author Robert Dempsey, Student Number: N5400872 Tests if firstCarriage() followed by
   *     subsequent nextCarriage() calls traverses all carriages on train
   * @throws TrainException
   */
  @Test
  public void testFirstThenNextCarriageFullTraversalOfTrain() throws TrainException {
    final Integer SEATS = 20;
    final Integer GROSS_WEIGHT = 90;
    final String CLASSIFICATION = "4S";

    final Locomotive LOCOMOTIVE = new Locomotive(GROSS_WEIGHT, CLASSIFICATION);
    final PassengerCar PASSENGERCAR_01 = new PassengerCar(GROSS_WEIGHT, SEATS);
    final PassengerCar PASSENGERCAR_02 = new PassengerCar(GROSS_WEIGHT, SEATS);
    final PassengerCar PASSENGERCAR_03 = new PassengerCar(GROSS_WEIGHT, SEATS);
    final PassengerCar PASSENGERCAR_04 = new PassengerCar(GROSS_WEIGHT, SEATS);

    DepartingTrain departingTrain = new DepartingTrain();
    departingTrain.addCarriage(LOCOMOTIVE);
    departingTrain.addCarriage(PASSENGERCAR_01);
    departingTrain.addCarriage(PASSENGERCAR_02);
    departingTrain.addCarriage(PASSENGERCAR_03);
    departingTrain.addCarriage(PASSENGERCAR_04);

    assertEquals(LOCOMOTIVE, departingTrain.firstCarriage());
    assertEquals(PASSENGERCAR_01, departingTrain.nextCarriage());
    assertEquals(PASSENGERCAR_02, departingTrain.nextCarriage());
    assertEquals(PASSENGERCAR_03, departingTrain.nextCarriage());
    assertEquals(PASSENGERCAR_04, departingTrain.nextCarriage());
  }
 /**
  * Tests Add PassengerCar to Departing Train with Loco Only
  *
  * @throws TrainException
  */
 @Test
 public void testAddPassenger() throws TrainException {
   final Locomotive LOCO = new Locomotive(90, "4S");
   final PassengerCar PASSENGER = new PassengerCar(90, 20);
   DepartingTrain departingTrain = new DepartingTrain();
   departingTrain.addCarriage(LOCO);
   departingTrain.addCarriage(PASSENGER);
   assertEquals(departingTrain.firstCarriage(), LOCO);
   assertEquals(departingTrain.nextCarriage(), PASSENGER);
 }
 /**
  * Tests Add FreightCar to Departing Train with Loco Only
  *
  * @throws TrainException
  */
 @Test
 public void testAddFreight() throws TrainException {
   final Locomotive LOCO = new Locomotive(90, "4S");
   final FreightCar FREIGHT = new FreightCar(90, "G");
   DepartingTrain departingTrain = new DepartingTrain();
   departingTrain.addCarriage(LOCO);
   departingTrain.addCarriage(FREIGHT);
   assertEquals(departingTrain.firstCarriage(), LOCO);
   assertEquals(departingTrain.nextCarriage(), FREIGHT);
 }
  /**
   * Test Get Third or higher Carriage on a Train with Multiple Carriages but doesn't exist and
   * returns null
   *
   * @throws TrainException
   */
  @Test
  public void testGetNextCarriage_Null() throws TrainException {
    final Integer GROSS_WEIGHT = 90;
    final String POWER_CLASS = "4S";
    final Integer SEATS = 20;
    final String GOODS_TYPE = "G";

    final Locomotive LOCO = new Locomotive(GROSS_WEIGHT, POWER_CLASS);
    final PassengerCar PASSENGER = new PassengerCar(GROSS_WEIGHT, SEATS);
    final FreightCar FREIGHT = new FreightCar(GROSS_WEIGHT, GOODS_TYPE);

    DepartingTrain departingTrain = new DepartingTrain();
    departingTrain.addCarriage(LOCO);
    departingTrain.addCarriage(PASSENGER);
    departingTrain.addCarriage(FREIGHT);

    assertEquals(departingTrain.firstCarriage(), LOCO);
    assertEquals(departingTrain.nextCarriage(), PASSENGER);
    assertEquals(departingTrain.nextCarriage(), FREIGHT);
    assertNull(departingTrain.nextCarriage());
  }
  /**
   * @author Robert Dempsey, Student Number: N5400872 Tests that a freight car at the end will be
   *     successfully removed
   * @throws TrainException
   */
  @Test
  public void testRemoveCarriageLastCarriageFreight() throws TrainException {
    final Integer GROSS_WEIGHT = 90;
    final String CLASSIFICATION = "4S";
    final String GOODS_TYPE = "G";
    final Locomotive LOCOMOTIVE = new Locomotive(GROSS_WEIGHT, CLASSIFICATION);
    final FreightCar FREIGHTCAR = new FreightCar(GROSS_WEIGHT, GOODS_TYPE);

    DepartingTrain departingTrain = new DepartingTrain();

    departingTrain.addCarriage(LOCOMOTIVE);
    departingTrain.addCarriage(FREIGHTCAR);
    departingTrain.removeCarriage();
    assertEquals(LOCOMOTIVE, departingTrain.firstCarriage());
    assertNull(departingTrain.nextCarriage());
  }
  /**
   * @author Robert Dempsey, Student Number: N5400872 Tests that a passenger car at the end will be
   *     successfully removed
   * @throws TrainException
   */
  @Test
  public void testRemoveCarriageLastCarriagePassenger() throws TrainException {
    final Integer SEATS = 20;
    final Integer GROSS_WEIGHT = 90;
    final String CLASSIFICATION = "4S";
    final Locomotive LOCOMOTIVE = new Locomotive(GROSS_WEIGHT, CLASSIFICATION);
    final PassengerCar PASSENGERCAR_01 = new PassengerCar(GROSS_WEIGHT, SEATS);

    DepartingTrain departingTrain = new DepartingTrain();

    departingTrain.addCarriage(LOCOMOTIVE);
    departingTrain.addCarriage(PASSENGERCAR_01);
    departingTrain.removeCarriage();
    assertEquals(LOCOMOTIVE, departingTrain.firstCarriage());
    assertNull(departingTrain.nextCarriage());
  }