org.geoserver.web.treeview.TreeViewTest.java Source code

Java tutorial

Introduction

Here is the source code for org.geoserver.web.treeview.TreeViewTest.java

Source

/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
 * This code is licensed under the GPL 2.0 license, available at the root
 * application directory.
 */
package org.geoserver.web.treeview;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;

import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.geoserver.web.GeoServerWicketTestSupport;
import org.junit.Before;
import org.junit.Test;

/**
 * 
 * @author Niels Charlier
 *
 */
public class TreeViewTest extends GeoServerWicketTestSupport {

    private class MockNode implements TreeNode<Integer> {
        private static final long serialVersionUID = 1012858609071186910L;

        protected int data;
        protected MockNode parent;
        protected List<MockNode> children = new ArrayList<MockNode>();
        protected IModel<Boolean> expanded = new Model<Boolean>(false);

        public MockNode(int data, MockNode parent) {
            this.data = data;
            this.parent = parent;
            if (parent != null) {
                parent.children.add(this);
            }
        }

        @Override
        public Collection<? extends TreeNode<Integer>> getChildren() {
            return children;
        }

        @Override
        public TreeNode<Integer> getParent() {
            return parent;
        }

        @Override
        public Integer getObject() {
            return data;
        }

        @Override
        public IModel<Boolean> getExpanded() {
            return expanded;
        }

        @Override
        public String getUniqueId() {
            return "" + data;
        }

    }

    protected final MockNode one = new MockNode(1, null);
    protected final MockNode two = new MockNode(2, one);
    protected final MockNode three = new MockNode(3, one);
    protected final MockNode four = new MockNode(4, two);
    protected final MockNode five = new MockNode(5, one);
    protected TreeView<Integer> treeView;

    @Before
    public void initialize() {
        treeView = new TreeView<Integer>("treeView", one);
    }

    @Test
    public void testSelection() {
        //initially nothing selected
        assertTrue(treeView.getSelectedNodes().isEmpty());
        assertEquals(0, treeView.getSelectedViews().length);

        //select programmatically, without ajax
        treeView.setSelectedNode(four);
        assertArrayEquals(new Object[] { four }, treeView.getSelectedNodes().toArray());
        //automatic expand
        assertEquals(true, two.getExpanded().getObject());
        assertEquals(true, one.getExpanded().getObject());
        //view
        tester.startComponentInPage(treeView);
        assertEquals("4", treeView.getSelectedViews()[0].getId());
        assertTrue(
                tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:children:4:selectableLabel")
                        .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));

        //to test selection listening:
        final AtomicBoolean fired = new AtomicBoolean();
        treeView.addSelectionListener(target -> {
            fired.set(true);
        });

        //select programmatically, with ajax        
        treeView.add(new AjaxEventBehavior("testSelectWithAjax") {
            private static final long serialVersionUID = 4422989219680841271L;

            @Override
            protected void onEvent(AjaxRequestTarget target) {
                treeView.setSelectedNode(three, target);
            }
        });
        fired.set(false);
        tester.executeAjaxEvent(treeView, "testSelectWithAjax");
        assertTrue(fired.get());
        assertArrayEquals(new Object[] { three }, treeView.getSelectedNodes().toArray());
        assertEquals("3", treeView.getSelectedViews()[0].getId());
        assertFalse(
                tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:children:4:selectableLabel")
                        .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));

        //select with gui 
        fired.set(false);
        tester.executeAjaxEvent("treeView:rootView:1:children:2:label:selectableLabel", "click");
        assertTrue(fired.get());
        assertArrayEquals(new Object[] { two }, treeView.getSelectedNodes().toArray());
        assertEquals("2", treeView.getSelectedViews()[0].getId());
        assertFalse(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:label:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));

        //automatic unselect when unexpanding
        tester.executeAjaxEvent("treeView:rootView:1:cbExpand", "click");
        assertEquals(false, one.getExpanded().getObject());
        assertTrue(treeView.getSelectedNodes().isEmpty());
        assertEquals(0, treeView.getSelectedViews().length);

        //multi-select toggle with ctrl
        tester.executeAjaxEvent("treeView:rootView:1:children:2:label:selectableLabel", "click");
        fired.set(false);
        tester.getRequest().addParameter("ctrl", "true");
        tester.executeAjaxEvent("treeView:rootView:1:children:3:selectableLabel", "click");
        assertTrue(fired.get());
        assertEquals(2, treeView.getSelectedNodes().size());
        assertTrue(treeView.getSelectedNodes().contains(two));
        assertTrue(treeView.getSelectedNodes().contains(three));
        assertEquals(2, treeView.getSelectedViews().length);
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:label:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        fired.set(false);
        tester.getRequest().addParameter("ctrl", "true");
        tester.executeAjaxEvent("treeView:rootView:1:children:2:label:selectableLabel", "click");
        assertTrue(fired.get());
        assertArrayEquals(new Object[] { three }, treeView.getSelectedNodes().toArray());
        assertEquals("3", treeView.getSelectedViews()[0].getId());
        assertFalse(
                tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:children:4:selectableLabel")
                        .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));

        //multi-select with shift
        tester.executeAjaxEvent("treeView:rootView:1:children:2:label:selectableLabel", "click");
        fired.set(false);
        tester.getRequest().addParameter("shift", "true");
        tester.executeAjaxEvent("treeView:rootView:1:children:5:selectableLabel", "click");
        assertTrue(fired.get());
        assertEquals(3, treeView.getSelectedNodes().size());
        assertTrue(treeView.getSelectedNodes().contains(two));
        assertTrue(treeView.getSelectedNodes().contains(three));
        assertTrue(treeView.getSelectedNodes().contains(five));
        assertEquals(3, treeView.getSelectedViews().length);
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:5:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:label:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));

        //same but upside down
        tester.executeAjaxEvent("treeView:rootView:1:children:5:selectableLabel", "click");
        fired.set(false);
        tester.getRequest().addParameter("shift", "true");
        tester.executeAjaxEvent("treeView:rootView:1:children:2:label:selectableLabel", "click");
        assertTrue(fired.get());
        assertEquals(3, treeView.getSelectedNodes().size());
        assertTrue(treeView.getSelectedNodes().contains(two));
        assertTrue(treeView.getSelectedNodes().contains(three));
        assertTrue(treeView.getSelectedNodes().contains(five));
        assertEquals(3, treeView.getSelectedViews().length);
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:5:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:label:selectableLabel")
                .getBehaviors().contains(TreeView.SELECTED_BEHAVIOR));

    }

    @Test
    public void testNearestView() {
        tester.startComponentInPage(treeView);
        MockNode five = new MockNode(5, four);
        assertEquals("4", treeView.getNearestView(five).getId());
        tester.startComponentInPage(treeView);
        assertEquals("5", treeView.getNearestView(five).getId());
    }

    @Test
    public void testMarks() {
        final String TESTMARK = "testMark";

        treeView.setSelectedNodes(Collections.emptySet());
        treeView.registerMark("testMark");
        assertNotNull(treeView.marks.get(TESTMARK));

        treeView.addMarked("testMark", two);
        treeView.addMarked("testMark", three);

        assertFalse(treeView.hasMark(TESTMARK, one));
        assertTrue(treeView.hasMark(TESTMARK, two));
        assertTrue(treeView.hasMark(TESTMARK, three));
        assertFalse(treeView.hasMark(TESTMARK, four));

        final AttributeAppender app = treeView.marks.get(TESTMARK).getBehaviour();

        tester.startComponentInPage(treeView);
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:label:selectableLabel")
                .getBehaviors().contains(app));
        assertTrue(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(app));

        treeView.clearMarked("testMark");
        assertFalse(treeView.hasMark(TESTMARK, two));
        assertFalse(treeView.hasMark(TESTMARK, three));

        tester.startComponentInPage(treeView);
        assertFalse(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:2:label:selectableLabel")
                .getBehaviors().contains(app));
        assertFalse(tester.getComponentFromLastRenderedPage("treeView:rootView:1:children:3:selectableLabel")
                .getBehaviors().contains(app));
    }

}