/* * $Id$ * This file is a part of the Arakhne Foundation Classes, http://www.arakhne.org/afc * * Copyright (c) 2000-2012 Stephane GALLAND. * Copyright (c) 2005-10, Multiagent Team, Laboratoire Systemes et Transports, * Universite de Technologie de Belfort-Montbeliard. * Copyright (c) 2013-2016 The original authors, and other authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.arakhne.afc.math.graph; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * @author $Author: sgalland$ * @version $FullVersion$ * @mavengroupid $GroupId$ * @mavenartifactid $ArtifactId$ */ @SuppressWarnings("all") public class GraphPathTest { private SegmentStub s1; private SegmentStub s2; private SegmentStub s3; private SegmentStub s4; private SegmentStub s5; private SegmentStub s6; private ConnectionStub c1; private ConnectionStub c2; private ConnectionStub c3; private ConnectionStub c4; private ConnectionStub c5; private ConnectionStub c6; private ConnectionStub c7; private GraphPathStub path; /** * @throws Exception */ @Before public void setUp() throws Exception { this.path = new GraphPathStub(); this.c1 = new ConnectionStub("c1[s1,s4]"); //$NON-NLS-1$ this.c2 = new ConnectionStub("c2[s1,s2]"); //$NON-NLS-1$ this.c3 = new ConnectionStub("c3[s2,s3,s4]"); //$NON-NLS-1$ this.c4 = new ConnectionStub("c4[s3,s5]"); //$NON-NLS-1$ this.c5 = new ConnectionStub("c5[s5]"); //$NON-NLS-1$ this.c6 = new ConnectionStub("c6[s6]"); //$NON-NLS-1$ this.c7 = new ConnectionStub("c7[s6]"); //$NON-NLS-1$ this.s1 = new SegmentStub("s1", this.c1, this.c2); //$NON-NLS-1$ this.s2 = new SegmentStub("s2", this.c2, this.c3); //$NON-NLS-1$ this.s3 = new SegmentStub("s3", this.c3, this.c4); //$NON-NLS-1$ this.s4 = new SegmentStub("s4", this.c1, this.c3); //$NON-NLS-1$ this.s5 = new SegmentStub("s5", this.c4, this.c5); //$NON-NLS-1$ this.s6 = new SegmentStub("s6", this.c6, this.c7); //$NON-NLS-1$ } /** * @throws Exception */ @After public void tearDown() throws Exception { this.path = null; this.c1 = this.c2 = this.c3 = this.c4 = this.c5 = this.c6 = this.c7 = null; this.s1 = this.s2 = this.s3 = this.s4 = this.s5 = this.s6 = null; } /** */ @Test public void size() { assertEquals(0,this.path.size()); } /** */ @Test public void isEmpty() { assertTrue(this.path.isEmpty()); } /** */ @Test public void getStartingPointFor_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertSame(this.c5, this.path.getStartingPointFor(0)); assertSame(this.c4, this.path.getStartingPointFor(1)); assertSame(this.c3, this.path.getStartingPointFor(2)); assertSame(this.c1, this.path.getStartingPointFor(3)); assertSame(this.c2, this.path.getStartingPointFor(4)); assertSame(this.c3, this.path.getStartingPointFor(5)); try { this.path.getStartingPointFor(6); fail("expecting IndexOutOfBoundsException"); //$NON-NLS-1$ } catch(IndexOutOfBoundsException e) { // } } /** */ @Test public void getStartingPointFor_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertSame(this.c2, this.path.getStartingPointFor(0)); assertSame(this.c1, this.path.getStartingPointFor(1)); assertSame(this.c3, this.path.getStartingPointFor(2)); assertSame(this.c2, this.path.getStartingPointFor(3)); assertSame(this.c1, this.path.getStartingPointFor(4)); assertSame(this.c2, this.path.getStartingPointFor(5)); assertSame(this.c3, this.path.getStartingPointFor(6)); assertSame(this.c4, this.path.getStartingPointFor(7)); try { this.path.getStartingPointFor(8); fail("expecting IndexOutOfBoundsException"); //$NON-NLS-1$ } catch(IndexOutOfBoundsException e) { // } } /** */ @Test public void addST_notReversable() { this.path.setFirstSegmentReversable(false); assertTrue(this.path.isEmpty()); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(1, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.add(this.s4)); assertFalse(this.path.isEmpty()); assertEquals(2, this.path.size()); assertSame(this.s4, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s4, this.path.getAntepenulvianSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertTrue(this.path.add(this.s2)); assertFalse(this.path.isEmpty()); assertEquals(3, this.path.size()); assertSame(this.s4, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertFalse(this.path.add(this.s1)); assertTrue(this.path.add(this.s3)); assertFalse(this.path.isEmpty()); assertEquals(4, this.path.size()); assertSame(this.s4, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s2, this.path.getAntepenulvianSegment()); assertSame(this.s3, this.path.getLastSegment()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); assertTrue(this.path.add(this.s3)); assertFalse(this.path.isEmpty()); assertEquals(5, this.path.size()); assertSame(this.s4, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s3, this.path.getAntepenulvianSegment()); assertSame(this.s3, this.path.getLastSegment()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void addST_reversable() { this.path.setFirstSegmentReversable(true); assertTrue(this.path.isEmpty()); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(1, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.add(this.s4)); assertFalse(this.path.isEmpty()); assertEquals(2, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s4, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertTrue(this.path.add(this.s2)); assertFalse(this.path.isEmpty()); assertEquals(3, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s4, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(4, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s2, this.path.getAntepenulvianSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertFalse(this.path.add(this.s3)); } /** */ @Test public void addST_FirstIsReversed() { assertTrue(this.path.isEmpty()); assertTrue(this.path.add(this.s1, this.c2)); assertFalse(this.path.isEmpty()); assertEquals(1, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertTrue(this.path.add(this.s4)); assertFalse(this.path.isEmpty()); assertEquals(2, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s4, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertTrue(this.path.add(this.s2)); assertFalse(this.path.isEmpty()); assertEquals(3, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s4, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(4, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s2, this.path.getAntepenulvianSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertFalse(this.path.add(this.s3)); } /** */ @Test public void addST_AddFirst() { assertTrue(this.path.isEmpty()); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(1, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.add(this.s2)); assertFalse(this.path.isEmpty()); assertEquals(2, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s2, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.add(this.s5)); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(3, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertTrue(this.path.add(this.s3)); assertFalse(this.path.isEmpty()); assertEquals(4, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s2, this.path.getAntepenulvianSegment()); assertSame(this.s3, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); assertTrue(this.path.add(this.s1)); assertFalse(this.path.isEmpty()); assertEquals(5, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s2, this.path.getAntepenulvianSegment()); assertSame(this.s3, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); assertTrue(this.path.add(this.s5)); assertFalse(this.path.isEmpty()); assertEquals(6, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s3, this.path.getAntepenulvianSegment()); assertSame(this.s5, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void pointIterator() { assertTrue(this.path.add(this.s1)); assertTrue(this.path.add(this.s2)); assertTrue(this.path.add(this.s3)); assertTrue(this.path.add(this.s5)); assertTrue(this.path.add(this.s5)); Iterator<ConnectionStub> iterator = this.path.pointIterator(); assertTrue(iterator.hasNext()); assertSame(this.c1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.pointIterator(); assertTrue(iterator.hasNext()); assertSame(this.c1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertFalse(iterator.hasNext()); } /** */ @Test public void points() { assertTrue(this.path.add(this.s1)); assertTrue(this.path.add(this.s2)); assertTrue(this.path.add(this.s3)); assertTrue(this.path.add(this.s5)); assertTrue(this.path.add(this.s5)); Iterable<ConnectionStub> iterable = this.path.points(); Iterator<ConnectionStub> iterator = iterable.iterator(); assertTrue(iterator.hasNext()); assertSame(this.c1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertFalse(iterator.hasNext()); iterator = iterable.iterator(); assertTrue(iterator.hasNext()); assertSame(this.c1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.c4, iterator.next()); assertFalse(iterator.hasNext()); } /** */ @Test public void addSTPT() { assertTrue(this.path.isEmpty()); assertTrue(this.path.add(this.s1, this.c2)); assertFalse(this.path.isEmpty()); assertEquals(1, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertFalse(this.path.add(this.s4, this.c3)); assertTrue(this.path.add(this.s4, this.c1)); assertFalse(this.path.isEmpty()); assertEquals(2, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s4, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.add(this.s5, this.c5)); assertFalse(this.path.add(this.s5, this.c4)); assertFalse(this.path.add(this.s1, this.c1)); assertTrue(this.path.add(this.s1, this.c2)); assertFalse(this.path.isEmpty()); assertEquals(3, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s1, this.path.getAntepenulvianSegment()); assertSame(this.s4, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.add(this.s2, this.c2)); assertTrue(this.path.add(this.s2, this.c3)); assertFalse(this.path.isEmpty()); assertEquals(4, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s4, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.add(this.s5, this.c5)); assertFalse(this.path.add(this.s5, this.c4)); assertTrue(this.path.add(this.s1, this.c1)); assertFalse(this.path.isEmpty()); assertEquals(5, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s4, this.path.getAntepenulvianSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.add(this.s1, this.c2)); assertFalse(this.path.isEmpty()); assertEquals(6, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getSecondSegment()); assertSame(this.s2, this.path.getAntepenulvianSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); } /** */ @Test public void addAllCollection_notReversable() { this.path.setFirstSegmentReversable(false); List<SegmentStub> collection = new ArrayList<>(); collection.add(this.s1); collection.add(this.s4); collection.add(this.s5); collection.add(this.s1); collection.add(this.s2); collection.add(this.s5); collection.add(this.s1); collection.add(this.s1); assertTrue(this.path.addAll(collection)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); } /** */ @Test public void addAllCollection_reversable() { this.path.setFirstSegmentReversable(true); List<SegmentStub> collection = new ArrayList<>(); collection.add(this.s1); // c1 - 1 - c2 collection.add(this.s4); // c2 - 1 4 - c3 collection.add(this.s5); // c2 - 1 4 - c3 collection.add(this.s1); // c1 - 1 1 4 - c3 collection.add(this.s2); // c1 - 1 1 4 2 - c2 collection.add(this.s5); // c1 - 1 1 4 2 - c2 collection.add(this.s1); // c1 - 1 1 4 2 1 - c1 collection.add(this.s1); // c1 - 1 1 4 2 1 1 - c2 assertTrue(this.path.addAll(collection)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); } /** */ @Test public void retainAllCollection_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertTrue(this.path.retainAll(Arrays.asList(this.s2, this.s3))); // c5 - 5 3 4 1 2 2 - c2 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c4, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void retainAllCollection_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertTrue(this.path.retainAll(Arrays.asList(this.s2, this.s3))); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); } /** */ @Test public void clear() { this.path.add(this.s1); this.path.add(this.s4); this.path.add(this.s2); this.path.add(this.s1); this.path.add(this.s1); assertFalse(this.path.isEmpty()); this.path.clear(); assertTrue(this.path.isEmpty()); } /** */ @Test public void removeAllCollection_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertTrue(this.path.removeAll(Arrays.asList(this.s2, this.s3))); // c5 - 5 - c4 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); } /** */ @Test public void removeAllCollection_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertTrue(this.path.removeAll(Arrays.asList(this.s2, this.s3))); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void getInteger_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertSame(this.s5, this.path.get(0)); assertSame(this.s3, this.path.get(1)); assertSame(this.s4, this.path.get(2)); assertSame(this.s1, this.path.get(3)); assertSame(this.s2, this.path.get(4)); assertSame(this.s2, this.path.get(5)); try { this.path.get(6); fail("expecting IndexOutOfBounds"); //$NON-NLS-1$ } catch (Exception e) { // } } /** */ @Test public void getInteger_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertSame(this.s1, this.path.get(0)); assertSame(this.s4, this.path.get(1)); assertSame(this.s2, this.path.get(2)); assertSame(this.s1, this.path.get(3)); assertSame(this.s1, this.path.get(4)); assertSame(this.s2, this.path.get(5)); assertSame(this.s3, this.path.get(6)); assertSame(this.s5, this.path.get(7)); try { this.path.get(8); fail("expecting IndexOutOfBounds"); //$NON-NLS-1$ } catch (Exception e) { // } } /** */ @Test public void setIntegerST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertSame(this.s4, this.path.set(2, this.s3)); // c5 - 5 3 3 - c4 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); } /** */ @Test public void setIntegerST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertSame(this.s2, this.path.set(2, this.s3)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); } /** */ @Test public void addIntegerST() { assertTrue(this.path.isEmpty()); try { this.path.add(45, this.s1); fail("Expecting IndexOutOfBoundsException"); //$NON-NLS-1$ } catch(IndexOutOfBoundsException e ) { // Expected exception } this.path.add(0, this.s1); // c1 - 1 - c2 assertFalse(this.path.isEmpty()); assertEquals(1, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); this.path.add(0, this.s1); // c2 - 1 1 - c2 assertFalse(this.path.isEmpty()); assertEquals(2, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s1, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); try { this.path.add(1, this.s2); fail("Expecting IllegalArgumentException"); //$NON-NLS-1$ } catch(IllegalArgumentException e) { // expected exception } this.path.add(2, this.s2); assertFalse(this.path.isEmpty()); assertEquals(3, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s2, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); this.path.add(3, this.s4); assertFalse(this.path.isEmpty()); assertEquals(4, this.path.size()); assertSame(this.s1, this.path.getFirstSegment()); assertSame(this.s4, this.path.getLastSegment()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); this.path.add(0, this.s2); assertFalse(this.path.isEmpty()); assertEquals(5, this.path.size()); assertSame(this.s2, this.path.getFirstSegment()); assertSame(this.s4, this.path.getLastSegment()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); } /** */ @Test public void removeInteger_InMiddle_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertSame(this.s1, this.path.remove(3)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); } /** */ @Test public void removeInteger_InMiddle_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertSame(this.s1, this.path.remove(3)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeInteger_First_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertSame(this.s5, this.path.remove(0)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c4, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeInteger_First_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertSame(this.s1, this.path.remove(0)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeInteger_Last_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertSame(this.s2, this.path.remove(5)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void removeInteger_Last_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertSame(this.s5, this.path.remove(7)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); } /** */ @Test public void indexOfObject_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertEquals(3, this.path.indexOf(this.s1)); assertEquals(4, this.path.indexOf(this.s2)); assertEquals(1, this.path.indexOf(this.s3)); assertEquals(2, this.path.indexOf(this.s4)); assertEquals(0, this.path.indexOf(this.s5)); assertEquals(-1, this.path.indexOf(this.s6)); } /** */ @Test public void indexOfObject_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertEquals(0, this.path.indexOf(this.s1)); assertEquals(2, this.path.indexOf(this.s2)); assertEquals(6, this.path.indexOf(this.s3)); assertEquals(1, this.path.indexOf(this.s4)); assertEquals(7, this.path.indexOf(this.s5)); assertEquals(-1, this.path.indexOf(this.s6)); } /** */ @Test public void lastIndexOfObject_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertEquals(3, this.path.lastIndexOf(this.s1)); assertEquals(5, this.path.lastIndexOf(this.s2)); assertEquals(1, this.path.lastIndexOf(this.s3)); assertEquals(2, this.path.lastIndexOf(this.s4)); assertEquals(0, this.path.lastIndexOf(this.s5)); assertEquals(-1, this.path.lastIndexOf(this.s6)); } /** */ @Test public void lastIndexOfObject_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertEquals(4, this.path.lastIndexOf(this.s1)); assertEquals(5, this.path.lastIndexOf(this.s2)); assertEquals(6, this.path.lastIndexOf(this.s3)); assertEquals(1, this.path.lastIndexOf(this.s4)); assertEquals(7, this.path.lastIndexOf(this.s5)); assertEquals(-1, this.path.lastIndexOf(this.s6)); } /** */ @Test public void listIterator_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 ListIterator<SegmentStub> iterator = this.path.listIterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); } /** */ @Test public void listIterator_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 ListIterator<SegmentStub> iterator = this.path.listIterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); } /** */ @Test public void listIteratorInteger_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 ListIterator<SegmentStub> iterator = this.path.listIterator(0); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(1); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(2); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(3); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(4); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(5); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(6); assertFalse(iterator.hasNext()); } /** */ @Test public void listIteratorInteger_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 ListIterator<SegmentStub> iterator = this.path.listIterator(0); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(1); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(2); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(3); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(4); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(5); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(6); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(7); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); iterator = this.path.listIterator(8); assertFalse(iterator.hasNext()); } /** */ @Test public void subListIntegerInteger_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 List<SegmentStub> subList = this.path.subList(0, 4); Iterator<SegmentStub> iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(1, 4); iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(2, 4); iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(3, 4); iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(4, 4); iterator = subList.iterator(); assertFalse(iterator.hasNext()); } /** */ @Test public void subListIntegerInteger_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 List<SegmentStub> subList = this.path.subList(0, 4); // c2 - 1 4 2 1 - c1 Iterator<SegmentStub> iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(1, 4); // c1 - 4 2 1 - c1 iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(2, 4); // c3 - 2 1 - c1 iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(3, 4); // c2 - 1 - c1 iterator = subList.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); subList = this.path.subList(4, 4); iterator = subList.iterator(); assertFalse(iterator.hasNext()); } /** */ @Test public void removeBeforeST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeBefore(this.s6)); assertFalse(this.path.removeBefore(this.s5)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.removeBefore(this.s2)); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.removeBefore(this.s5)); assertFalse(this.path.removeBefore(this.s2)); } /** */ @Test public void removeBeforeST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeBefore(this.s6)); assertFalse(this.path.removeBefore(this.s1)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); assertTrue(this.path.removeBefore(this.s2)); // c3 - 2 1 1 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); assertFalse(this.path.removeBefore(this.s2)); assertFalse(this.path.removeBefore(this.s4)); } /** */ @Test public void removeUntilST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeUntil(this.s6)); assertTrue(this.path.removeUntil(this.s2)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.removeUntil(this.s2)); iterator = this.path.iterator(); assertFalse(iterator.hasNext()); } /** */ @Test public void removeUntilST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeUntil(this.s6)); assertTrue(this.path.removeUntil(this.s2)); // c2 - 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); assertTrue(this.path.removeUntil(this.s2)); // c3 - 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeBeforeLastST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeBeforeLast(this.s6)); assertTrue(this.path.removeBeforeLast(this.s2)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.removeBeforeLast(this.s2)); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeBeforeLastST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeBeforeLast(this.s6)); assertTrue(this.path.removeBeforeLast(this.s2)); // c2 - 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); assertFalse(this.path.removeBeforeLast(this.s2)); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeUntilLastST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeUntilLast(this.s6)); assertTrue(this.path.removeUntilLast(this.s2)); Iterator<SegmentStub> iterator = this.path.iterator(); assertFalse(iterator.hasNext()); } /** */ @Test public void removeUntilLastST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeUntilLast(this.s6)); assertTrue(this.path.removeUntilLast(this.s2)); // c3 - 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeBeforeSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeBefore(this.s6, this.c6)); assertFalse(this.path.removeBefore(this.s1, this.c2)); assertTrue(this.path.removeBefore(this.s1,this.c1)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeBeforeSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeBefore(this.s6, this.c6)); assertFalse(this.path.removeBefore(this.s4, this.c3)); assertTrue(this.path.removeBefore(this.s1,this.c1)); // c1 - 1 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeUntilSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeUntil(this.s6, this.c6)); assertFalse(this.path.removeUntil(this.s1, this.c2)); assertTrue(this.path.removeUntil(this.s1,this.c1)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeUntilSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeUntil(this.s6, this.c6)); assertFalse(this.path.removeUntil(this.s4, this.c3)); assertTrue(this.path.removeUntil(this.s1,this.c1)); // c2 - 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeBeforeLastSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeBeforeLast(this.s6, this.c6)); assertFalse(this.path.removeBeforeLast(this.s1, this.c2)); assertTrue(this.path.removeBeforeLast(this.s1,this.c1)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeBeforeLastSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeBeforeLast(this.s6, this.c6)); assertFalse(this.path.removeBeforeLast(this.s4, this.c3)); assertTrue(this.path.removeBeforeLast(this.s1,this.c1)); // c1 - 1 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void removeUntilLastSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeUntilLast(this.s6, this.c6)); assertFalse(this.path.removeUntilLast(this.s1, this.c2)); assertTrue(this.path.removeUntilLast(this.s1,this.c1)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeUntilLastSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeUntilLast(this.s6, this.c6)); assertFalse(this.path.removeUntilLast(this.s4, this.c3)); assertTrue(this.path.removeUntilLast(this.s1,this.c1)); // c2 - 2 3 5 - c5 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); } /** */ @Test public void invert_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 this.path.invert(); assertSame(this.s2, this.path.get(0)); assertSame(this.s2, this.path.get(1)); assertSame(this.s1, this.path.get(2)); assertSame(this.s4, this.path.get(3)); assertSame(this.s3, this.path.get(4)); assertSame(this.s5, this.path.get(5)); } /** */ @Test public void invert_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 this.path.invert(); assertSame(this.s5, this.path.get(0)); assertSame(this.s3, this.path.get(1)); assertSame(this.s2, this.path.get(2)); assertSame(this.s1, this.path.get(3)); assertSame(this.s1, this.path.get(4)); assertSame(this.s2, this.path.get(5)); assertSame(this.s4, this.path.get(6)); assertSame(this.s1, this.path.get(7)); } /** */ @Test public void removeAfterST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeAfter(this.s6)); assertTrue(this.path.removeAfter(this.s2)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.removeAfter(this.s2)); assertTrue(this.path.removeAfter(this.s1)); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeAfterST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeAfter(this.s6)); assertTrue(this.path.removeAfter(this.s2)); // c2 - 1 4 2 - c2 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.removeAfter(this.s2)); // c2 - 1 4 2 - c2 assertTrue(this.path.removeAfter(this.s1)); // c2 - 1 - c1 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); } /** */ @Test public void removeFromST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeFrom(this.s6)); assertTrue(this.path.removeFrom(this.s2)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertFalse(this.path.removeFrom(this.s2)); } /** */ @Test public void removeFromST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeFrom(this.s6)); assertTrue(this.path.removeFrom(this.s2)); // c2 - 1 4 - c3 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.removeFrom(this.s2)); } /** */ @Test public void removeAfterLastST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeAfterLast(this.s6)); assertFalse(this.path.removeAfterLast(this.s2)); assertTrue(this.path.removeAfterLast(this.s1)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeAfterLastST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeAfterLast(this.s6)); assertFalse(this.path.removeAfterLast(this.s5)); assertTrue(this.path.removeAfterLast(this.s1)); // c2 - 1 4 2 1 1 - c2 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeFromLastST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeFromLast(this.s6)); assertTrue(this.path.removeFromLast(this.s2)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void removeFromLastST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeFromLast(this.s6)); assertTrue(this.path.removeFromLast(this.s2)); // c2 - 1 4 2 1 1 - c2 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void removeAfterSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeAfter(this.s6, this.c6)); assertFalse(this.path.removeAfter(this.s2, this.c3)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertTrue(this.path.removeAfter(this.s2, this.c2)); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.removeAfter(this.s5,this.c4)); assertFalse(this.path.removeAfter(this.s5,this.c4)); assertTrue(this.path.removeAfter(this.s5,this.c5)); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); assertFalse(this.path.removeAfter(this.s5, this.c5)); } /** */ @Test public void removeAfterSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeAfter(this.s6, this.c6)); assertFalse(this.path.removeAfter(this.s4, this.c3)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c5, this.path.getLastPoint()); assertTrue(this.path.removeAfter(this.s2, this.c2)); // c2 - 1 4 2 1 1 2 - c3 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.removeAfter(this.s5,this.c4)); // c2 - 1 4 2 1 1 2 - c3 assertFalse(this.path.removeAfter(this.s2,this.c2)); // c2 - 1 4 2 1 1 2 - c3 } /** */ @Test public void removeFromSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeFrom(this.s6, this.c6)); assertTrue(this.path.removeFrom(this.s2, this.c3)); // c5 - 5 3 4 1 2 - c3 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertFalse(this.path.removeFrom(this.s2, this.c3)); // c5 - 5 3 4 1 2 - c3 assertFalse(this.path.removeFrom(this.s5,this.c4)); // c5 - 5 3 4 1 2 - c3 assertFalse(this.path.removeFrom(this.s5,this.c4)); // c5 - 5 3 4 1 2 - c3 assertTrue(this.path.removeFrom(this.s5,this.c5)); // c5 - 5 3 4 1 2 - c3 iterator = this.path.iterator(); assertFalse(iterator.hasNext()); assertNull(this.path.getFirstPoint()); assertNull(this.path.getLastPoint()); assertFalse(this.path.removeFrom(this.s5,this.c5)); } /** */ @Test public void removeFromSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeFrom(this.s6, this.c6)); assertTrue(this.path.removeFrom(this.s2, this.c3)); // c2 - 1 4 - c3 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void removeAfterLastSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeAfterLast(this.s6, this.c6)); assertFalse(this.path.removeAfterLast(this.s2, this.c3)); assertTrue(this.path.removeAfterLast(this.s2, this.c2)); // c5 - 5 3 4 1 2 - c3 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void removeAfterLastSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeAfterLast(this.s6, this.c6)); assertTrue(this.path.removeAfterLast(this.s1, this.c2)); // c2 - 1 4 2 1 - c1 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); } /** */ @Test public void removeFromLastSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 assertFalse(this.path.removeFromLast(this.s6, this.c6)); assertTrue(this.path.removeFromLast(this.s2, this.c3)); Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); } /** */ @Test public void removeFromLastSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertFalse(this.path.removeFromLast(this.s6, this.c6)); assertTrue(this.path.removeFromLast(this.s1, this.c2)); // c2 - 1 4 2 - c2 Iterator<SegmentStub> iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); } /** */ @Test public void splitAfterST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPath<?,SegmentStub,ConnectionStub> sp; sp = this.path.splitAfter(this.s4); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); sp = this.path.splitAfter(this.s4); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); } /** */ @Test public void splitAfterST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPath<?,SegmentStub,ConnectionStub> sp; sp = this.path.splitAfter(this.s4); // c2 - 1 4 - c3 // c3 - 2 1 1 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); sp = this.path.splitAfter(this.s4); // c2 - 1 4 - c3 // empty iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); } /** */ @Test public void splitAfterSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAfter(this.s4, this.c1); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfter(this.s5, this.c4); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfter(this.s4, this.c3); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); } /** */ @Test public void splitAfterSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAfter(this.s4, this.c1); // c2 - 1 4 - c3 // c3 - 2 1 1 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); sp = this.path.splitAfter(this.s4, this.c1); // c2 - 1 4 - c3 // empty iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); } /** */ @Test public void splitAfterLastST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAfterLast(this.s2); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfterLast(this.s4); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); } /** */ @Test public void splitAfterLastST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAfterLast(this.s2); // c2 - 1 4 2 1 1 2 - c3 // c3 - 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); sp = this.path.splitAfterLast(this.s2); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); } /** */ @Test public void splitAfterLastSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAfter(this.s6, this.c6); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfter(this.s5, this.c4); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfterLast(this.s5, this.c5); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c4, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); } /** */ @Test public void splitAfterLastSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAfter(this.s6, this.c6); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfter(this.s5, this.c4); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAfterLast(this.s1, this.c1); // c2 - 1 4 2 1 1 - c2 // c2 - 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); } /** */ @Test public void splitAtST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAt(this.s1); iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, this.path.getFirstPoint()); assertSame(this.c1, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c1, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); } /** */ @Test public void splitAtST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAt(this.s2); // c2 - 1 4 - c3 // c3 - 2 1 1 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c3, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c3, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); } /** */ @Test public void splitAtSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAt(this.s6, this.c6); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAt(this.s5, this.c4); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAt(this.s5, this.c5); iterator = this.path.iterator(); assertFalse(iterator.hasNext()); assertNull(this.path.getFirstPoint()); assertNull(this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); } /** */ @Test public void splitAtSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAt(this.s6, this.c6); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAt(this.s5, this.c5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAt(this.s5, this.c4); // c2 - 1 4 2 1 1 2 3 - c4 // c4 - 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c4, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c4, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); } /** */ @Test public void splitAtLastST_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAtLast(this.s6); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAtLast(this.s5); iterator = this.path.iterator(); assertFalse(iterator.hasNext()); assertNull(this.path.getFirstPoint()); assertNull(this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); } /** */ @Test public void splitAtLastST_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAtLast(this.s6); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAtLast(this.s2); // c2 - 1 4 2 1 1 - c2 // c2 - 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); } /** */ @Test public void splitAtLastSTPT_notReversable() { this.path.setFirstSegmentReversable(false); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c3 - 4 1 - c2 this.path.add(this.s2); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s1); // c3 - 4 1 2 - c3 this.path.add(this.s2); // c3 - 4 1 2 2 - c2 this.path.add(this.s3); // c4 - 3 4 1 2 2 - c2 this.path.add(this.s5); // c5 - 5 3 4 1 2 2 - c2 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAtLast(this.s6, this.c6); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAtLast(this.s5, this.c4); assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAtLast(this.s5, this.c5); iterator = this.path.iterator(); assertFalse(iterator.hasNext()); assertNull(this.path.getFirstPoint()); assertNull(this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c5, sp.getFirstPoint()); assertSame(this.c2, sp.getLastPoint()); } /** */ @Test public void splitAtLastSTPT_reversable() { this.path.setFirstSegmentReversable(true); this.path.add(this.s1); // c1 - 1 - c2 this.path.add(this.s4); // c2 - 1 4 - c3 this.path.add(this.s2); // c2 - 1 4 2 - c2 this.path.add(this.s1); // c2 - 1 4 2 1 - c1 this.path.add(this.s1); // c2 - 1 4 2 1 1 - c2 this.path.add(this.s2); // c2 - 1 4 2 1 1 2 - c3 this.path.add(this.s3); // c2 - 1 4 2 1 1 2 3 - c4 this.path.add(this.s5); // c2 - 1 4 2 1 1 2 3 5 - c5 Iterator<SegmentStub> iterator; GraphPathStub sp; sp = this.path.splitAtLast(this.s6, this.c6); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAtLast(this.s5, this.c5); // c2 - 1 4 2 1 1 2 3 5 - c5 assertNotNull(sp); iterator = sp.iterator(); assertFalse(iterator.hasNext()); assertNull(sp.getFirstPoint()); assertNull(sp.getLastPoint()); sp = this.path.splitAtLast(this.s1, this.c2); // c2 - 1 4 2 - c2 // c2 - 1 1 2 3 5 - c5 iterator = this.path.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s4, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, this.path.getFirstPoint()); assertSame(this.c2, this.path.getLastPoint()); assertNotNull(sp); iterator = sp.iterator(); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s1, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s2, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s3, iterator.next()); assertTrue(iterator.hasNext()); assertSame(this.s5, iterator.next()); assertFalse(iterator.hasNext()); assertSame(this.c2, sp.getFirstPoint()); assertSame(this.c5, sp.getLastPoint()); } }