/******************************************************************************* * Copyright (c) 2016 itemis AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Alexander Nyßen (itemis AG) - initial API and implementation *******************************************************************************/ package org.eclipse.gef.mvc.tests.fx; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.eclipse.gef.mvc.fx.parts.AbstractVisualPart; import org.eclipse.gef.mvc.fx.parts.IVisualPart; import org.junit.Assert; import org.junit.Test; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.scene.Node; public class AbstractVisualPartTests { public class AbstractVisualPartStub extends AbstractVisualPart<Node> { @Override protected void doAddChildVisual(IVisualPart<? extends Node> child, int index) { } @Override protected Node doCreateVisual() { return null; } @Override protected void doRefreshVisual(Node visual) { } @Override protected void doRemoveChildVisual(IVisualPart<? extends Node> child, int index) { } } private class ListChangeExpector<E> implements ListChangeListener<E> { private ObservableList<? extends E> source; private LinkedList<List<E>> removedValuesQueue = new LinkedList<>(); private LinkedList<List<E>> addedValuesQueue = new LinkedList<>(); public ListChangeExpector(ObservableList<? extends E> source) { this.source = source; } public void addExpectation(List<E> removedValues, List<E> addedValues) { // We check that the reference to the observable value is correct, // thus do not copy the passed in values. removedValuesQueue.addFirst(removedValues); addedValuesQueue.addFirst(addedValues); } public void check() { if (removedValuesQueue.size() > 0) { fail("Did not receive " + removedValuesQueue.size() + " expected changes."); } } @Override public void onChanged(javafx.collections.ListChangeListener.Change<? extends E> c) { if (removedValuesQueue.size() <= 0) { fail("Received unexpected change."); } while (c.next()) { assertEquals(source, c.getList()); assertEquals(removedValuesQueue.pollLast(), c.getRemoved()); assertEquals(addedValuesQueue.pollLast(), c.getAddedSubList()); } } } @Test public void testAddChild() { AbstractVisualPart<? extends Object> parent = new AbstractVisualPartStub(); ListChangeExpector<IVisualPart<? extends Object>> listChangeListener = new ListChangeExpector<>( parent.getChildrenUnmodifiable()); parent.getChildrenUnmodifiable().addListener(listChangeListener); AbstractVisualPartStub child1 = new AbstractVisualPartStub(); AbstractVisualPartStub child2 = new AbstractVisualPartStub(); Assert.assertEquals(0, parent.getChildrenUnmodifiable().size()); // check that first child is properly added and that a valid // property change event is fired. listChangeListener.addExpectation(Collections.<IVisualPart<? extends Object>>emptyList(), Collections.<IVisualPart<? extends Object>>singletonList(child1)); parent.addChild(child1); Assert.assertEquals(1, parent.getChildrenUnmodifiable().size()); listChangeListener.check(); // check that second child is properly added and that a valid // property change event is fired. listChangeListener.addExpectation(Collections.<IVisualPart<? extends Object>>emptyList(), Collections.<IVisualPart<? extends Object>>singletonList(child2)); parent.addChild(child2); listChangeListener.check(); Assert.assertEquals(2, parent.getChildrenUnmodifiable().size()); } @Test public void testRemoveChild() { AbstractVisualPartStub parent = new AbstractVisualPartStub(); AbstractVisualPartStub child1 = new AbstractVisualPartStub(); AbstractVisualPartStub child2 = new AbstractVisualPartStub(); parent.addChild(child1); parent.addChild(child2); Assert.assertEquals(2, parent.getChildrenUnmodifiable().size()); ListChangeExpector<IVisualPart<? extends Object>> listChangeListener = new ListChangeExpector<>( parent.getChildrenUnmodifiable()); parent.getChildrenUnmodifiable().addListener(listChangeListener); // check that second child is properly removed and a valid property // change event is fired. listChangeListener.addExpectation(Collections.<IVisualPart<? extends Object>>singletonList(child2), Collections.<IVisualPart<? extends Object>>emptyList()); parent.removeChild(child2); listChangeListener.check(); Assert.assertEquals(1, parent.getChildrenUnmodifiable().size()); // check that first child is properly removed and a valid property // change event is fired. listChangeListener.addExpectation(Collections.<IVisualPart<? extends Object>>singletonList(child1), Collections.<IVisualPart<? extends Object>>emptyList()); parent.removeChild(child1); listChangeListener.check(); Assert.assertEquals(0, parent.getChildrenUnmodifiable().size()); } @Test public void testReorderChild() { AbstractVisualPartStub parent = new AbstractVisualPartStub(); AbstractVisualPartStub child1 = new AbstractVisualPartStub(); AbstractVisualPartStub child2 = new AbstractVisualPartStub(); AbstractVisualPartStub child3 = new AbstractVisualPartStub(); parent.addChild(child1); parent.addChild(child2); parent.addChild(child3); Assert.assertEquals(3, parent.getChildrenUnmodifiable().size()); // check that second child is properly removed and a valid property // change event is fired. ListChangeExpector<IVisualPart<? extends Object>> listChangeListener = new ListChangeExpector<>( parent.getChildrenUnmodifiable()); parent.getChildrenUnmodifiable().addListener(listChangeListener); listChangeListener.addExpectation(Collections.<IVisualPart<? extends Object>>singletonList(child2), Collections.<IVisualPart<? extends Object>>emptyList()); listChangeListener.addExpectation(Collections.<IVisualPart<? extends Object>>emptyList(), Collections.<IVisualPart<? extends Object>>singletonList(child2)); parent.reorderChild(child2, 2); listChangeListener.check(); Assert.assertEquals(3, parent.getChildrenUnmodifiable().size()); } }