/*******************************************************************************
 * Copyright (c) 2000, 2004 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.tests.api;

import org.eclipse.jface.action.MenuManager;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.tests.harness.util.ActionUtil;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * Test the lifecycle of an action filter.
 * 
 * From Javadoc: "An IActionFilter returns whether the specific attribute
 * 		matches the state of the target object."
 * 
 * Setup: The plugin.xml contains a number of popup menu action 
 * targetted to ListElements 
 * 
 * 		redAction -> (name = red)
 * 		blueAction -> (name = blue)
 * 		trueAction -> (flag = true)
 * 		falseAction -> (flag = false)
 * 		redTrueAction -> (name = red) (flag = true)
 */
public class IActionFilterTest extends UITestCase {

    protected IWorkbenchWindow fWindow;

    protected IWorkbenchPage fPage;

    protected String STATIC_MENU_VIEW_ID = "org.eclipse.ui.tests.api.IActionFilterTest1";

    protected String DYNAMIC_MENU_VIEW_ID = "org.eclipse.ui.tests.api.IActionFilterTest2";

    public IActionFilterTest(String testName) {
        super(testName);
    }

    protected void doSetUp() throws Exception {
        super.doSetUp();
        fWindow = openTestWindow();
        fPage = fWindow.getActivePage();
    }

    public void testStaticLifecycle() throws Throwable {
        testLifecycle(STATIC_MENU_VIEW_ID);
    }

    public void testDynamicLifecycle() throws Throwable {
        testLifecycle(DYNAMIC_MENU_VIEW_ID);
    }

    /**
     * Select a list element, popup the menu, and verify that the 
     * action filter is called.
     * 
     * See Setup above.
     */
    private void testLifecycle(String viewId) throws Throwable {
        // Create a list view.  
        ListView view = (ListView) fPage.showView(viewId);

        // Create the test objects.
        ListElement red = new ListElement("red");
        view.addElement(red);
        view.selectElement(red);

        // Get action filter.
        ListElementActionFilter filter = ListElementActionFilter.getSingleton();

        // Open menu.  Verify that action filter is called.			
        MenuManager menuMgr = view.getMenuManager();
        ActionUtil.fireAboutToShow(menuMgr);
        assertTrue(filter.getCalled());
    }

    public void testDynamicMenuContribution() throws Throwable {
        testMenu(DYNAMIC_MENU_VIEW_ID);
    }

    public void testStaticMenuContribution() throws Throwable {
        testMenu(STATIC_MENU_VIEW_ID);
    }

    /**
     * Select a ListElement, popup a menu and verify that the 
     * ListElementActionFilter.testAttribute method is invoked.  
     * Then verify that the correct actions are added to the
     * popup menu.
     * 
     * See Setup above.
     */
    private void testMenu(String viewId) throws Throwable {
        // Create the test objects.
        ListElement red = new ListElement("red");
        ListElement blue = new ListElement("blue");
        ListElement green = new ListElement("green");
        ListElement redTrue = new ListElement("red", true);

        // Create a list view.  
        ListView view = (ListView) fPage.showView(viewId);
        MenuManager menuMgr = view.getMenuManager();
        view.addElement(red);
        view.addElement(blue);
        view.addElement(green);
        view.addElement(redTrue);

        // Get action filter.
        ListElementActionFilter filter = ListElementActionFilter.getSingleton();

        // Select red, verify popup.
        view.selectElement(red);
        ActionUtil.fireAboutToShow(menuMgr);
        assertTrue(filter.getCalled());
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
        view.verifyActions(this, menuMgr);

        // Select blue, verify popup.
        filter.clearCalled();
        view.selectElement(blue);
        ActionUtil.fireAboutToShow(menuMgr);
        assertTrue(filter.getCalled());
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
        view.verifyActions(this, menuMgr);

        // Select green, verify popup.
        filter.clearCalled();
        view.selectElement(green);
        ActionUtil.fireAboutToShow(menuMgr);
        assertTrue(filter.getCalled());
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
        view.verifyActions(this, menuMgr);

        // Select redTrue, verify popup.
        filter.clearCalled();
        view.selectElement(redTrue);
        ActionUtil.fireAboutToShow(menuMgr);
        assertTrue(filter.getCalled());
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
        assertNotNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
        assertNotNull(ActionUtil
                .getActionWithLabel(menuMgr, "redTrueAction_v1"));
        view.verifyActions(this, menuMgr);

        // Select nothing, verify popup.
        filter.clearCalled();
        view.selectElement(null);
        ActionUtil.fireAboutToShow(menuMgr);
        assertTrue(!filter.getCalled());
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "blueAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "trueAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "falseAction_v1"));
        assertNull(ActionUtil.getActionWithLabel(menuMgr, "redTrueAction_v1"));
        view.verifyActions(this, menuMgr);
    }
}
