org.dawnsci.common.widgets.gda.function.FunctionTreeViewerPluginTestBase.java Source code

Java tutorial

Introduction

Here is the source code for org.dawnsci.common.widgets.gda.function.FunctionTreeViewerPluginTestBase.java

Source

/*
 * Copyright (c) 2012 Diamond Light Source Ltd.
 *
 * 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
 */
package org.dawnsci.common.widgets.gda.function;

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

import java.util.ArrayList;
import java.util.List;

import org.dawnsci.common.widgets.gda.function.FunctionTreeViewer.COLUMN;
import org.dawnsci.common.widgets.gda.function.internal.ITextEditingSupport;
import org.dawnsci.common.widgets.gda.function.internal.model.AddNewFunctionModel;
import org.dawnsci.common.widgets.gda.function.internal.model.FunctionModelElement;
import org.dawnsci.common.widgets.gda.function.internal.model.FunctionModelRoot;
import org.dawnsci.common.widgets.gda.function.internal.model.ParameterModel;
import org.dawnsci.common.widgets.gda.function.internal.model.SetFunctionModel;
import org.eclipse.dawnsci.analysis.api.fitting.functions.IFunction;
import org.eclipse.dawnsci.analysis.api.fitting.functions.IOperator;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

public abstract class FunctionTreeViewerPluginTestBase extends PluginTestBase {

    /**
     * Return the FunctionTreeViewer in use, this allows the utilities in this
     * class to simulate GUI events on it
     *
     * @return
     */
    protected abstract FunctionTreeViewer getFunctionTreeViewer();

    /**
     * Use to edit an existing function in the tree
     */
    protected void editFunctionGUI(IFunction selection, String textValue) {
        setSelection(selection);
        Text text = editElement(COLUMN.FUNCTION);
        text.setText(textValue);
        finishEditElement(text);
    }

    /**
     * Finish an edit event on the given text (which was returned by editElement()
     */
    protected void finishEditElement(Text text) {
        text.notifyListeners(SWT.DefaultSelection, new Event());
    }

    /**
     * Use to edit set function
     */
    protected void setFunctionGUI(IOperator selection, String textValue, int childFunctionIndex) {
        setSelectionToSet(selection, childFunctionIndex);
        Text text = editElement(COLUMN.FUNCTION);
        text.setText(textValue);
        finishEditElement(text);
    }

    /** Add a new function by simulating the GUI operations */
    protected void addNewFunctionGUI(IOperator selection, String textValue) {
        setSelectionToAddNew(selection);
        Text text = editElement(COLUMN.FUNCTION);
        text.setText(textValue);
        finishEditElement(text);
    }

    /** Set value column by simulating the GUI operations */
    protected void setParameterTextGUI(COLUMN column, IFunction function, int parameterIndex, String textValue) {
        setSelection(function, parameterIndex);
        Text text = editElement(column);
        text.setText(textValue);
        finishEditElement(text);
    }

    /**
     * Get value column. Note that this triggers an Edit to get the editable
     * value rather than the displayed value (i.e. "Max Double" is displayed
     * value, "1.7976931348623157E308" is editable value)
     */
    protected String getParameterTextGUI(COLUMN column, IFunction function, int parameterIndex) {
        setSelection(function, parameterIndex);
        Text text = editElement(column);
        String result = text.getText();
        finishEditElement(text);
        return result;
    }

    /**
     * Get value column. This gets the displayed value (i.e. "Max Double" is
     * displayed value, "1.7976931348623157E308" is editable value)
     */
    protected String getParameterLabelGUI(COLUMN column, IFunction function, int parameterIndex) {
        setSelection(function, parameterIndex);
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        TreeViewer treeViewer = functionTreeViewer.getTreeViewer();
        TreeItem[] selection = treeViewer.getTree().getSelection();
        assertEquals(1, selection.length);
        String result = selection[0].getText(column.COLUMN_INDEX);
        return result;
    }

    /** Trigger edit on currently selected row for the given column */
    protected Text editElement(COLUMN column) {
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        TreeViewer treeViewer = functionTreeViewer.getTreeViewer();
        ISelection selection = treeViewer.getSelection();
        assertTrue("Row must already be selected!", selection instanceof StructuredSelection);
        StructuredSelection structuredSelection = (StructuredSelection) selection;
        Object element = structuredSelection.getFirstElement();
        assertTrue("Selection is of unexpected type", element instanceof FunctionModelElement);
        treeViewer.editElement(element, column.COLUMN_INDEX);

        ITextEditingSupport support = functionTreeViewer.getColumnEditingSupport(column);
        Text text = (Text) support.getTextCellEditor().getControl();
        return text;
    }

    /** Simulate the user setting the selection to function */
    protected void setSelection(IFunction function) {
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        FunctionModelElement[] elementModel = functionTreeViewer.getModelRoot().getModelElement(function);
        assertEquals(1, elementModel.length);
        setSelection(elementModel[0]);
    }

    /**
     * Simulate the user setting the selection to the AddNewFunction child of
     * operator
     */
    protected void setSelectionToAddNew(IOperator operator) {
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        AddNewFunctionModel[] addNewFunctionModel = functionTreeViewer.getModelRoot()
                .getAddNewFunctionModel(operator);
        assertEquals(1, addNewFunctionModel.length);
        setSelection(addNewFunctionModel[0]);
    }

    /**
     * Simulate the user setting the selection to the SetFunction child of
     * operator at index
     */
    protected void setSelectionToSet(IOperator operator, int index) {
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        FunctionModelRoot modelRoot = functionTreeViewer.getModelRoot();
        SetFunctionModel[] setFunctionModel = modelRoot.getSetFunctionModel(operator, index);
        assertEquals(1, setFunctionModel.length);
        setSelection(setFunctionModel[0]);
    }

    /** Simulate the user setting the selection to parameter index on function */
    protected void setSelection(IFunction function, int parameterIndex) {
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        ParameterModel[] paramModel = functionTreeViewer.getModelRoot().getParameterModel(function, parameterIndex);
        assertEquals(1, paramModel.length);
        setSelection(paramModel[0]);
    }

    /**
     * Simulate setting the selection to the given element in the tree
     */
    protected void setSelection(FunctionModelElement element) {
        FunctionTreeViewer functionTreeViewer = getFunctionTreeViewer();
        expandAll();
        TreeViewer treeViewer = functionTreeViewer.getTreeViewer();
        treeViewer.setSelection(new StructuredSelection(element));
    }

    protected String toString(Node... nodes) {
        StringBuilder builder = new StringBuilder();
        for (Node node : nodes) {
            builder.append(node.toString());
            builder.append("\n");
        }
        return builder.toString();
    }

    protected void assertTreeLooksLike(Node... nodes) {
        Node[] treeLooksLike = getTreeLooksLike();
        try {
            assertArrayEquals(nodes, treeLooksLike);
        } catch (Throwable e) {
            // Only print on error
            System.out.println("expect: ");
            System.out.print(toString(nodes));
            System.out.println("actual: ");
            System.out.print(toString(treeLooksLike));
            throw e;
        }
    }

    protected void expandAll() {
        getFunctionTreeViewer().getTreeViewer().expandAll();
    }

    protected Node[] getTreeLooksLike() {
        expandAll();
        List<Node> children = new ArrayList<>();
        Tree tree = (Tree) getFunctionTreeViewer().getControl();
        for (TreeItem treeItem : tree.getItems()) {
            children.add(getTreeLooksLike(treeItem));
        }
        return children.toArray(new Node[children.size()]);
    }

    protected Node getTreeLooksLike(TreeItem ti) {
        List<Node> children = new ArrayList<>();
        for (TreeItem treeItem : ti.getItems()) {
            children.add(getTreeLooksLike(treeItem));
        }
        return new Node(ti.getText(), children.toArray(new Node[children.size()]));
    }

}