Files
2026-06-17 14:00:51 +02:00

382 lines
14 KiB
Java

package jmri.jmrit.operations.locations;
import java.util.List;
import org.junit.Assert;
import org.junit.jupiter.api.*;
import jmri.InstanceManager;
import jmri.jmrit.operations.OperationsTestCase;
import jmri.jmrit.operations.OpsPropertyChangeListener;
import jmri.jmrit.operations.rollingstock.cars.Car;
/**
* Tests for the Operations Pool class Last manually cross-checked on ?????
* <p>
* Still to do: ?????????????? Nees to be updated for Pool class ScheduleItem:
* XML read/write Schedule: Register, List, XML read/write Track:
* AcceptsDropTrain, AcceptsDropRoute Track: AcceptsPickupTrain,
* AcceptsPickupRoute Track: CheckScheduleValid Track: XML read/write Location:
* Track support <-- I am here Location: XML read/write
*
* @author Gregory Madsen Copyright (C) 2012, based on OperationsLocationTest
* class
*/
public class OperationsPoolTest extends OperationsTestCase {
Pool p = null;
Track t1 = null;
Track t2 = null;
// test Pool Class (part one)
// test Pool creation in different ways
// public void testCreateDefault()
// {
// // There is currently no default constructor...
// }
@Test
public void testCreateNormal() {
p = new Pool("Id1", "Name1");
Assert.assertEquals("Pool Id", "Id1", p.getId());
Assert.assertEquals("Pool Name", "Name1", p.getName());
Assert.assertEquals("Pool Size", 0, p.getSize());
}
// test property set
@Test
public void testProperties() {
p = new Pool("Id2", "Name2");
p.setName("NewName");
Assert.assertEquals("setName", "NewName", p.getName());
}
// test PropertyChanged event
@Test
public void testPropertyChangedEvent() {
p = new Pool("Id3", "Name3");
// Boolean fired = false;
OpsPropertyChangeListener opcl = new OpsPropertyChangeListener();
p.addPropertyChangeListener(opcl);
// Set with different name, should fire
p.setName("NewName");
Assert.assertTrue("Name changed event fired", opcl.isFired());
Assert.assertEquals("Name changed name", "Name", opcl.getEvent().getPropertyName());
opcl.reset();
// Set with same name, should NOT fire.
p.setName("NewName");
Assert.assertFalse("Name changed event not fired", opcl.isFired());
Assert.assertNull("No event", opcl.getEvent());
}
// test methods
@Test
public void testToString() {
p = new Pool("Id4", "Name4");
Assert.assertEquals("ToString()", "Name4", p.toString());
}
@Test
public void testAddTrack() {
t1 = new Track("Id1", "Track1", "Type1", null);
p = new Pool("P1", "Pool1");
OpsPropertyChangeListener opcl = new OpsPropertyChangeListener();
p.addPropertyChangeListener(opcl);
p.add(t1);
Assert.assertEquals("Added one track", 1, p.getSize());
Assert.assertTrue("Was fired", opcl.isFired());
Assert.assertEquals("List changed", "poolListChange", opcl.getEvent().getPropertyName());
// Try to add it again
opcl.reset();
p.add(t1);
Assert.assertEquals("Added same track", 1, p.getSize());
Assert.assertFalse("Was not fired", opcl.isFired());
Assert.assertNull("No event", opcl.getEvent());
}
@Test
public void testRemoveTrack() {
t1 = new Track("Id1", "Track1", "Type1", null);
p = new Pool("P1", "Pool1");
OpsPropertyChangeListener opcl = new OpsPropertyChangeListener();
p.addPropertyChangeListener(opcl);
p.add(t1);
opcl.reset();
p.remove(t1);
Assert.assertEquals("Removed one track", 0, p.getSize());
Assert.assertTrue("Was fired", opcl.isFired());
Assert.assertEquals("List changed", "poolListChange", opcl.getEvent().getPropertyName());
// Try to remove it when it is not there.
opcl.reset();
p.remove(t1);
Assert.assertEquals("Removed same track", 0, p.getSize());
Assert.assertFalse("Was not fired", opcl.isFired());
Assert.assertNull("No event", opcl.getEvent());
}
private Pool Create2TrackPool() {
// Helper method to avoid duplicate code.
// This could be generalized if need be.
t1 = new Track("Id1", "Track1", "Type1", null);
t1.setLength(100);
t1.setPoolMinimumLength(50);
t2 = new Track("Id2", "Track2", "Type2", null);
t2.setLength(120);
t2.setPoolMinimumLength(40);
p = new Pool("P1", "Pool1");
p.add(t1);
p.add(t2);
return p;
}
@Test
public void testGetTracks() {
Create2TrackPool();
Assert.assertEquals("Added two tracks", 2, p.getTracks().size());
Assert.assertEquals("First track", t1, p.getTracks().get(0));
Assert.assertEquals("Second track", t2, p.getTracks().get(1));
}
@Test
public void testTrackListIsCopy() {
// Make sure the collection is not the internal one.
Create2TrackPool();
List<Track> lt = p.getTracks();
Assert.assertEquals("Returned size", 2, lt.size());
// Clear the returned list
lt.clear();
Assert.assertEquals("Original list size is unchanged", 2, p.getTracks().size());
}
@Test
public void testLengthenTrack1() {
// Track 1 is 100 feet, minimum 50, available 50
// Track 2 is 120 feet, minimum 40, available 80
// Request Track 1 to be 120 feet, which will take 20 feet from Track 2
Create2TrackPool();
Boolean ok = p.requestTrackLength(t1, 120);
Assert.assertTrue("Requested Track 1 120", ok);
Assert.assertEquals("Length 1", 120, t1.getLength());
Assert.assertEquals("Length 2", 100, t2.getLength());
}
@Test
public void testLengthenTrack1Maximum() {
// Track 1 is 100 feet, minimum 50, available 50
// Track 2 is 120 feet, minimum 40, available 80
// Request Track 1 to be 180 feet, which will take all available 80 feet
// from Track 2
Create2TrackPool();
Boolean ok = p.requestTrackLength(t1, 180);
Assert.assertTrue("Requested Track 1 180", ok);
Assert.assertEquals("Length 1", 180, t1.getLength());
Assert.assertEquals("Length 2", 40, t2.getLength());
}
@Test
public void testLengthenTrack1TooLong() {
// Track 1 is 100 feet, minimum 50, available 50
// Track 2 is 120 feet, minimum 40, available 80
// Request Track 1 to be 181 feet, which will fail as there is only 80
// feet available from Track 2
Create2TrackPool();
Boolean ok = p.requestTrackLength(t1, 181);
Assert.assertFalse("Requested Track 1 181", ok);
// Assert.assertEquals("Length 1", 180, t1.getLength());
// Assert.assertEquals("Length 2", 40, t2.getLength());
}
@Test
public void testShortenTrack1() {
// Track 1 is 100 feet, minimum 50, available 50
// Track 2 is 120 feet, minimum 40, available 80
// Request Track 1 to be 80 feet, which will give 20 feet to Track 2
Create2TrackPool();
Boolean ok = p.requestTrackLength(t1, 80);
Assert.assertTrue("Requested Track 1 80", ok);
Assert.assertEquals("Length 1", 80, t1.getLength());
Assert.assertEquals("Length 2", 140, t2.getLength());
}
@Test
public void testShortenTrack1BelowMinimum() {
// Track 1 is 100 feet, minimum 50, available 50
// Track 2 is 120 feet, minimum 40, available 80
// Request Track 1 to be 20 feet, which will give 80 feet to Track 2
Create2TrackPool();
Boolean ok = p.requestTrackLength(t1, 20);
Assert.assertTrue("Requested Track 1 20", ok);
Assert.assertEquals("Length 1", 20, t1.getLength());
Assert.assertEquals("Length 2", 200, t2.getLength());
}
@Test
public void testTrackPools() {
LocationManager locMan = new LocationManager();
Location l = locMan.newLocation("TestTrackPoolsLocation");
Track t1 = l.addTrack("Yard 1", Track.YARD);
Track t2 = l.addTrack("Yard 2", Track.YARD);
Track t3 = l.addTrack("Spur 1", Track.SPUR);
Track t4 = l.addTrack("Spur 2", Track.SPUR);
Track t5 = l.addTrack("Interchange 1", Track.INTERCHANGE);
Track t6 = l.addTrack("Interchange 2", Track.INTERCHANGE);
Track t7 = l.addTrack("Interchange 3", Track.INTERCHANGE);
// create two pools
Pool pool1 = l.addPool("Pool One");
Pool pool2 = l.addPool("Pool Two");
t1.setPool(pool1);
t3.setPool(pool1);
t7.setPool(pool1);
t2.setPool(pool2);
t4.setPool(pool2);
t5.setPool(pool2);
t6.setPool(pool2);
// only give one track in the pool some length
t3.setLength(100);
t5.setLength(200);
// set minimums
t2.setPoolMinimumLength(50);
t5.setPoolMinimumLength(100);
Car c1 = new Car("C", "1");
c1.setLength("40");
c1.setTypeName("Boxcar"); // location and track defaults should support type Boxcar
Car c2 = new Car("C", "2");
c2.setLength("25");
c2.setTypeName("Boxcar"); // location and track defaults should support type Boxcar
Car c3 = new Car("C", "3");
c3.setLength("32");
c3.setTypeName("Boxcar"); // location and track defaults should support type Boxcar
// now place cars and see if track lengths adjust correctly
Assert.assertEquals("Place c1", Track.OKAY, c1.setLocation(l, t1));
Assert.assertEquals("track length", 40 + Car.COUPLERS, t1.getLength());
Assert.assertEquals("track length", 100 - (40 + Car.COUPLERS), t3.getLength());
Assert.assertEquals("track length", 0, t7.getLength());
Assert.assertEquals("Place c2", Track.OKAY, c2.setLocation(l, t7));
Assert.assertEquals("track length", 40 + Car.COUPLERS, t1.getLength());
Assert.assertEquals("track length", 25 + Car.COUPLERS, t7.getLength());
Assert.assertEquals("track length", 100 - (40 + Car.COUPLERS) - (25 + Car.COUPLERS), t3.getLength());
// not able to place c3, not enough available track length
String status = c3.setLocation(l, t1);
// Assert.assertEquals("Place c3", Track.LENGTH + " "+(32+Car.COUPLER)+" " +
// Setup.getLengthUnit().toLowerCase(), c3.setLocation(l, t1));
Assert.assertTrue("Length issue", status.startsWith(Track.LENGTH));
Assert.assertEquals("track length", 40 + Car.COUPLERS + 100 - (40 + Car.COUPLERS) - (25 + Car.COUPLERS), t1
.getLength());
Assert.assertEquals("track length", 25 + Car.COUPLERS, t7.getLength());
Assert.assertEquals("track length", 0, t3.getLength());
// now test the minimum track length pool feature
// tracks t2 t4 t5 and t6 in the same pool
Assert.assertEquals("Place c1", Track.OKAY, c1.setLocation(l, t2));
Assert.assertEquals("track length", 40 + Car.COUPLERS, t2.getLength());
Assert.assertEquals("track length", 200 - (40 + Car.COUPLERS), t5.getLength());
Assert.assertEquals("track length", 0, t4.getLength());
Assert.assertEquals("track length", 0, t6.getLength());
Assert.assertEquals("Place c2", Track.OKAY, c2.setLocation(l, t2));
Assert.assertEquals("track length", 40 + Car.COUPLERS + 25 + Car.COUPLERS, t2.getLength());
Assert.assertEquals("track length", 200 - (40 + Car.COUPLERS + 25 + Car.COUPLERS), t5.getLength());
Assert.assertEquals("track length", 0, t4.getLength());
Assert.assertEquals("track length", 0, t6.getLength());
// not able to place c3, not enough available track length because of minimum for t5
status = c3.setLocation(l, t2);
// Assert.assertEquals("Place c3", Track.LENGTH + " "+(32+Car.COUPLER)+" " +
// Setup.getLengthUnit().toLowerCase(), c3.setLocation(l, t2));
Assert.assertTrue("Length issue", status.startsWith(Track.LENGTH));
Assert.assertEquals("track length", 100, t2.getLength());
Assert.assertEquals("track length", 100, t5.getLength()); // minimum track length
Assert.assertEquals("track length", 0, t4.getLength());
Assert.assertEquals("track length", 0, t6.getLength());
// now give t6 some length so the set location will work
t6.setLength(50);
Assert.assertEquals("Place c3", Track.OKAY, c3.setLocation(l, t2));
Assert.assertEquals("track length", 40 + Car.COUPLERS + 25 + Car.COUPLERS + 32 + Car.COUPLERS, t2.getLength());
Assert.assertEquals("track length", 100, t5.getLength()); // minimum track length
Assert.assertEquals("track length", 0, t4.getLength());
Assert.assertEquals("track length", 150 - (40 + Car.COUPLERS + 25 + Car.COUPLERS + 32 + Car.COUPLERS), t6
.getLength());
// now move the cars on t2 to t4 to test the minimum for t2
c1.setLocation(null, null); // release the used track. TODO requestTrackLength() should have checked
// to see if car's track was part of pool
Assert.assertEquals("Place c1", Track.OKAY, c1.setLocation(l, t4));
Assert.assertEquals("track length", 25 + Car.COUPLERS + 32 + Car.COUPLERS, t2.getLength());
Assert.assertEquals("track length", 100, t5.getLength()); // minimum track length
Assert.assertEquals("track length", 40 + Car.COUPLERS, t4.getLength());
// 250 feet total track length in pool, 100 minimum
Assert.assertEquals("track length", (250 - 100) - (40 + Car.COUPLERS + 25 + Car.COUPLERS + 32 + Car.COUPLERS), t6
.getLength());
c2.setLocation(null, null);
// latest code change 4/4/2013 provides enough track length for c2
Assert.assertEquals("Place c2", Track.OKAY, c2.setLocation(l, t4));
Assert.assertEquals("track length", 50, t2.getLength()); // minimum track length
Assert.assertEquals("track length", 100, t5.getLength()); // minimum track length
Assert.assertEquals("track length", 25 + Car.COUPLERS + 40 + Car.COUPLERS, t4.getLength());
// 250 feet total track length in pool, 150 minimum
Assert.assertEquals("track length", (250 - 150) - (40 + Car.COUPLERS + 25 + Car.COUPLERS), t6.getLength());
}
@Override
@BeforeEach
public void setUp() {
super.setUp();
InstanceManager.getDefault(jmri.jmrit.operations.rollingstock.cars.CarTypes.class).addName("Boxcar");
}
}