/*******************************************************************************
 * Copyright (c) 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.zoom;

import org.eclipse.ui.IWorkbenchPart;

/**
 * This class contains tests that apply to both views and editors. Subclasses
 * will overload the abstract methods to determine whether editors or views
 * are being tested, and can define additional tests that only apply to editors
 * or views (or that have different results).
 */
public abstract class CloseTest extends ZoomTestCase {
    public CloseTest(String name) {
        super(name);
    }
    
    public abstract IWorkbenchPart getStackedPart1();
    public abstract IWorkbenchPart getStackedPart2();
    public abstract IWorkbenchPart getUnstackedPart();
    
    /**
     * <p>Test: Zoom a part and hide an inactive fast view</p>
     * <p>Expected result: Part remains zoomed</p>
     */
    public void testCloseInactiveFastView() {
        IWorkbenchPart zoomPart = getStackedPart1();
        
        zoom(zoomPart);
        close(fastView);
        
        assertZoomed(zoomPart);
        assertActive(zoomPart);
    }
    
    /**
     * <p>Test: Zoom a part, activate a fast view, then hide the fast view</p>
     * <p>Expected result: Part remains zoomed</p>
     */
    public void testCloseActiveFastView() {
        IWorkbenchPart zoomPart = getStackedPart1();
        
        zoom(zoomPart);
        page.activate(fastView);
        close(fastView);
        
        assertZoomed(zoomPart);
        assertActive(zoomPart);
    }
    
    /**
     * <p>Test: Activate an unstacked view, zoom and activate a stacked part, then close the active part.</p>
     * <p>Expected result: Stack remains zoomed, another part in the zoomed stack is active</p>
     * <p>Note: This ensures that when the active part is closed, it will try to activate a part that
     *    doesn't affect the zoom even if something else was activated more recently.</p>
     */
    public void testCloseZoomedStackedPartAfterActivatingView() {
        IWorkbenchPart zoomPart = getStackedPart1();
        IWorkbenchPart otherStackedPart = getStackedPart2();
        IWorkbenchPart unstackedPart = unstackedView;
        
        page.activate(unstackedPart);
        zoom(zoomPart);
        close(zoomPart);
                
        assertZoomed(otherStackedPart);
        assertActive(otherStackedPart);
    }

    /**
     * <p>Test: Activate an unstacked editor, zoom and activate a stacked part, then close the active part.</p>
     * <p>Expected result: Stack remains zoomed, another part in the zoomed stack is active</p>
     * <p>Note: This ensures that when the active part is closed, it will try to activate a part that
     *    doesn't affect the zoom even if something else was activated more recently.</p>
     */
    public void testCloseZoomedStackedPartAfterActivatingEditor() {
        IWorkbenchPart zoomPart = getStackedPart1();
        IWorkbenchPart otherStackedPart = getStackedPart2();
        IWorkbenchPart unstackedPart = editor3;
        
        page.activate(unstackedPart);
        zoom(zoomPart);
        close(zoomPart);
        
        assertZoomed(otherStackedPart);
        assertActive(otherStackedPart);
    }

    /**
     * <p>Test: Activate an unstacked editor, activate a stacked part, then close the active part.</p>
     * <p>Expected result: The unstacked part becomes active</p>
     * <p>Note: This isn't really a zoom test, but it ensures that the behavior tested by 
     *    testHideZoomedStackedPartAfterActivatingEditor does not affect activation when there is no zoom.</p>
     */
    public void testCloseUnzoomedStackedPartAfterActivatingEditor() {
        IWorkbenchPart activePart = getStackedPart1();
        IWorkbenchPart otherStackedPart = getStackedPart2();
        IWorkbenchPart unstackedPart = editor3;
        
        page.activate(unstackedPart);
        page.activate(activePart);
        close(activePart);
        
        assertZoomed(null);
        assertActive(unstackedPart);
    }
        
    /**
     * <p>Test: Zoom an unstacked part and close it.</p>
     * <p>Expected result: The page is unzoomed and the previously active part becomes active</p>
     * <p>Note: This ensures that the activation list is used if there is nothing available
     *    in the currently zoomed stack.</p>
     */
    public void testCloseZoomedUnstackedPartAfterActivatingEditor() {
        IWorkbenchPart previousActive = editor1;
        IWorkbenchPart zoomedPart = getUnstackedPart();
        
        page.activate(previousActive);
        zoom(zoomedPart);
        close(zoomedPart);

        assertZoomed(null);
        assertActive(previousActive);
    }

    /**
     * <p>Test: Zoom a stacked part and close an inactive, unstacked editor.</p>
     * <p>Expected result: No change in activation or zoom</p>
     */
    public void testCloseHiddenUnstackedEditor() {
        IWorkbenchPart zoomedPart = getStackedPart1();
        
        // Activate another editor to ensure that we aren't closing the active editor
        page.activate(editor1);
        zoom(zoomedPart);
        close(editor3);

        assertZoomed(zoomedPart);
        assertActive(zoomedPart);
    }
    
    /**
     * <p>Test: Zoom a stacked part and close an inactive, unstacked view.</p>
     * <p>Expected result: No change in activation or zoom</p>
     */
    public void testCloseHiddenUnstackedView() {
        IWorkbenchPart zoomedPart = getStackedPart1();
        
        zoom(zoomedPart);
        close(unstackedView);
        
        assertZoomed(zoomedPart);
        assertActive(zoomedPart);
    }
    
}
