package jmri.jmrit.operations.trains.trainbuilder; import org.junit.Assert; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import jmri.InstanceManager; import jmri.jmrit.operations.OperationsTestCase; import jmri.jmrit.operations.locations.*; import jmri.jmrit.operations.rollingstock.cars.Car; import jmri.jmrit.operations.rollingstock.cars.CarManager; /** * Tests for the TrainBuilderBase class * * @author Daniel Boudreau Copyright (C) 2021 */ public class TrainBuilderBaseTest extends OperationsTestCase { private LocationManager lmanager; private CarManager cmanager; TrainBuilderBase tbb; // NOTE: this test uses reflection to test a protected method. java.lang.reflect.Method sortCarsOnFifoLifoTracks = null; @Test public void testCtor() { TrainBuilderBase tb = new TrainBuilderBase(); Assert.assertNotNull("Train Builder Constructor", tb); } // test protected method sortCarsOnFifoLifoTracks @Test public void testCarOrderNORMAL() { String carTypes[] = Bundle.getMessage("carTypeNames").split(","); // start by creating a track Location A = lmanager.newLocation("A"); Track interchangeTrack = A.addTrack("track", Track.INTERCHANGE); interchangeTrack.setLength(1000); interchangeTrack.setServiceOrder(Track.NORMAL); java.util.Calendar cal = java.util.Calendar.getInstance(); java.util.Date date = cal.getTime(); // place 3 cars on the track. Car a = cmanager.newRS("ABC", "123"); a.setTypeName(carTypes[1]); a.setLength("50"); a.setLastDate(date); a.setLocation(A, interchangeTrack); cal.add(java.util.Calendar.MINUTE, 2); date = cal.getTime(); Car b = cmanager.newRS("ABC", "321"); b.setTypeName(carTypes[1]); b.setLength("50"); b.setLastDate(date); b.setLocation(A, interchangeTrack); cal.add(java.util.Calendar.MINUTE, 2); date = cal.getTime(); Car c = cmanager.newRS("ABC", "111"); c.setTypeName(carTypes[1]); c.setLength("50"); c.setLastDate(date); c.setLocation(A, interchangeTrack); // and set the car list up. tbb.setCarList(new java.util.ArrayList<>()); tbb.getCarList().add(a); tbb.getCarList().add(b); tbb.getCarList().add(c); try { // with Track.NORMAL order, the car you ask for is the // car you get. sortCarsOnFifoLifoTracks.invoke(tbb); Assert.assertEquals("NORMAL Order, 123 first", a, tbb.getCarList().get(0)); Assert.assertEquals("NORMAL Order, 321 second", b, tbb.getCarList().get(1)); Assert.assertEquals("NORMAL Order, 111 last", c, tbb.getCarList().get(2)); } catch (java.lang.IllegalAccessException iae) { Assert.fail("Could not access method getCarOrder in TrackBuilder class"); } catch (java.lang.reflect.InvocationTargetException ite) { Throwable cause = ite.getCause(); Assert.fail("getCarOrder executon failed reason: " + cause.getMessage()); } } @Test public void testCarOrderFIFO() { String carTypes[] = Bundle.getMessage("carTypeNames").split(","); // start by creating a track Location A = lmanager.newLocation("A"); Track interchangeTrack = A.addTrack("track", Track.INTERCHANGE); interchangeTrack.setLength(1000); interchangeTrack.setServiceOrder(Track.FIFO); java.util.Calendar cal = java.util.Calendar.getInstance(); java.util.Date date = cal.getTime(); // and placing 3 cars on the track. Car a = cmanager.newRS("ABC", "123"); a.setTypeName(carTypes[1]); a.setLength("50"); a.setLastDate(date); a.setLocation(A, interchangeTrack); cal.add(java.util.Calendar.MINUTE, 2); date = cal.getTime(); Car b = cmanager.newRS("ABC", "321"); b.setTypeName(carTypes[1]); b.setLength("50"); b.setLastDate(date); b.setLocation(A, interchangeTrack); cal.add(java.util.Calendar.MINUTE, 2); date = cal.getTime(); Car c = cmanager.newRS("ABC", "111"); c.setTypeName(carTypes[1]); c.setLength("50"); c.setLastDate(date); c.setLocation(A, interchangeTrack); // and set the car list up. tbb.setCarList(new java.util.ArrayList<>()); tbb.getCarList().add(c); tbb.getCarList().add(a); tbb.getCarList().add(b); try { // FIFO sortCarsOnFifoLifoTracks.invoke(tbb); Assert.assertEquals("FIFO Order, 123 first", a, tbb.getCarList().get(0)); Assert.assertEquals("FIFO Order, 321 second", b, tbb.getCarList().get(1)); Assert.assertEquals("FIFO Order, 111 last", c, tbb.getCarList().get(2)); } catch (java.lang.IllegalAccessException iae) { Assert.fail("Could not access method getCarOrder in TrackBuilder class"); } catch (java.lang.reflect.InvocationTargetException ite) { Throwable cause = ite.getCause(); Assert.fail("getCarOrder executon failed reason: " + cause.getMessage()); } } @Test public void testCarOrderLIFO() { String carTypes[] = Bundle.getMessage("carTypeNames").split(","); // start by creating a track Location A = lmanager.newLocation("A"); Track interchangeTrack = A.addTrack("track", Track.INTERCHANGE); interchangeTrack.setLength(1000); interchangeTrack.setServiceOrder(Track.LIFO); java.util.Calendar cal = java.util.Calendar.getInstance(); java.util.Date date = cal.getTime(); // and placing 3 cars on the track. Car a = cmanager.newRS("ABC", "123"); a.setTypeName(carTypes[1]); a.setLength("50"); a.setLastDate(date); a.setLocation(A, interchangeTrack); cal.add(java.util.Calendar.MINUTE, 2); date = cal.getTime(); Car b = cmanager.newRS("ABC", "321"); b.setTypeName(carTypes[1]); b.setLength("50"); b.setLastDate(date); b.setLocation(A, interchangeTrack); cal.add(java.util.Calendar.MINUTE, 2); date = cal.getTime(); Car c = cmanager.newRS("ABC", "111"); c.setTypeName(carTypes[1]); c.setLength("50"); c.setLastDate(date); c.setLocation(A, interchangeTrack); // and set the car list up. tbb.setCarList(new java.util.ArrayList<>()); tbb.getCarList().add(c); tbb.getCarList().add(a); tbb.getCarList().add(b); try { // LIFO sortCarsOnFifoLifoTracks.invoke(tbb); Assert.assertEquals("LIFO Order, 123 first", c, tbb.getCarList().get(0)); Assert.assertEquals("LIFO Order, 321 second", b, tbb.getCarList().get(1)); Assert.assertEquals("LIFO Order, 111 last", a, tbb.getCarList().get(2)); } catch (java.lang.IllegalAccessException iae) { Assert.fail("Could not access method getCarOrder in TrackBuilder class"); } catch (java.lang.reflect.InvocationTargetException ite) { Throwable cause = ite.getCause(); Assert.fail("getCarOrder executon failed reason: " + cause.getMessage()); } } @Override @BeforeEach public void setUp() { super.setUp(); // setup managers lmanager = InstanceManager.getDefault(LocationManager.class); cmanager = InstanceManager.getDefault(CarManager.class); tbb = new TrainBuilderBase(); try { sortCarsOnFifoLifoTracks = tbb.getClass().getDeclaredMethod("sortCarsOnFifoLifoTracks"); } catch (java.lang.NoSuchMethodException nsm) { Assert.fail("Could not find method sortCarsOnFifoLifoTracks in TrackBuilder class: "); } // override the default permissions. Assert.assertNotNull(sortCarsOnFifoLifoTracks); sortCarsOnFifoLifoTracks.setAccessible(true); } }