/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.rcp.layermanager;
import com.bc.ceres.glayer.CollectionLayer;
import com.bc.ceres.glayer.Layer;
import com.bc.ceres.glayer.support.LayerUtils;
import org.junit.Test;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
public class LayerTreeModelTest {
@Test
public void testIt() {
Layer layer0 = new CollectionLayer();
Layer layer1 = new CollectionLayer();
Layer layer2 = new CollectionLayer();
Layer layer3 = new CollectionLayer();
layer0.getChildren().add(layer1);
layer0.getChildren().add(layer2);
layer0.getChildren().add(layer3);
Layer layer4 = new CollectionLayer();
Layer layer5 = new CollectionLayer();
layer3.getChildren().add(layer4);
layer3.getChildren().add(layer5);
LayerTreeModel treeModel = new LayerTreeModel(layer0);
assertSame(layer0, treeModel.getRoot());
Layer[] path = LayerUtils.getLayerPath(layer0, layer0);
assertNotNull(path);
assertEquals(1, path.length);
assertSame(layer0, path[0]);
path = LayerUtils.getLayerPath(layer3, layer4);
assertNotNull(path);
assertEquals(2, path.length);
assertSame(layer3, path[0]);
assertSame(layer4, path[1]);
path = LayerUtils.getLayerPath(layer0, layer4);
assertNotNull(path);
assertEquals(3, path.length);
assertSame(layer0, path[0]);
assertSame(layer3, path[1]);
assertSame(layer4, path[2]);
path = LayerUtils.getLayerPath(layer4, layer3);
assertNotNull(path);
assertEquals(0, path.length);
assertEquals(3, treeModel.getChildCount(layer0));
assertSame(layer1, treeModel.getChild(layer0, 0));
assertSame(layer2, treeModel.getChild(layer0, 1));
assertSame(layer3, treeModel.getChild(layer0, 2));
assertEquals(0, treeModel.getChildCount(layer1));
assertEquals(0, treeModel.getChildCount(layer2));
assertEquals(2, treeModel.getChildCount(layer3));
assertSame(layer4, treeModel.getChild(layer3, 0));
assertSame(layer5, treeModel.getChild(layer3, 1));
final MyTreeModelListener listener = new MyTreeModelListener();
treeModel.addTreeModelListener(listener);
final List<Layer> children = layer3.getChildren();
children.remove(layer4);
try {
SwingUtilities.invokeAndWait(() -> {
assertEquals("treeStructureChanged;", listener.trace);
});
} catch (InterruptedException | InvocationTargetException e) {
// ok
}
}
private static class MyTreeModelListener implements TreeModelListener {
String trace = "";
TreeModelEvent e;
public void treeNodesChanged(TreeModelEvent e) {
trace += "treeNodesChanged;";
this.e = e;
}
public void treeNodesInserted(TreeModelEvent e) {
trace += "treeNodesInserted;";
this.e = e;
}
public void treeNodesRemoved(TreeModelEvent e) {
trace += "treeNodesRemoved;";
this.e = e;
}
public void treeStructureChanged(TreeModelEvent e) {
trace += "treeStructureChanged;";
this.e = e;
}
}
}