/*******************************************************************************
 * 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.keys;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.keys.KeyStroke;
import org.eclipse.ui.keys.ParseException;
import org.eclipse.ui.keys.SWTKeySupport;
import org.eclipse.ui.tests.harness.util.UITestCase;

/**
 * Test for Bug 42035.
 * 
 * @since 3.0
 */
public class Bug42035Test extends UITestCase {

    /**
     * Tests the given key event to see if generates the three key strokes
     * represented by the strings.
     * 
     * @param keyEvent
     *            The key event to generate key strokes from; must not be
     *            <code>null</code>
     * @param firstMatch
     *            The text format of the first match; must not be <code>null</code>.
     * @param secondMatch
     *            The text format of the second match; must not be <code>null</code>.
     * @param thirdMatch
     *            The text format of the third match; must not be <code>null</code>.
     * @throws ParseException
     *             If anyone of the text formats provided cannot be parsed.
     */
    private static void testKeyEvent(Event keyEvent, String firstMatch,
            String secondMatch, String thirdMatch) throws ParseException {
        KeyStroke desiredKeyStroke = null;
        KeyStroke actualKeyStroke = null;

        // Test the first-level match.
        desiredKeyStroke = KeyStroke.getInstance(firstMatch); //$NON-NLS-1$
        actualKeyStroke = SWTKeySupport
                .convertAcceleratorToKeyStroke(SWTKeySupport
                        .convertEventToUnmodifiedAccelerator(keyEvent));
        assertEquals(
                "Unmodified character with all modifiers doesn't match.", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$

        // Test the second-level match.
        desiredKeyStroke = KeyStroke.getInstance(secondMatch); //$NON-NLS-1$
        actualKeyStroke = SWTKeySupport
                .convertAcceleratorToKeyStroke(SWTKeySupport
                        .convertEventToUnshiftedModifiedAccelerator(keyEvent));
        assertEquals(
                "Modified character with no shift doesn't match.", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$

        // Test the third-level match.
        desiredKeyStroke = KeyStroke.getInstance(thirdMatch); //$NON-NLS-1$
        actualKeyStroke = SWTKeySupport
                .convertAcceleratorToKeyStroke(SWTKeySupport
                        .convertEventToModifiedAccelerator(keyEvent));
        assertEquals(
                "Modified character with all modifiers doesn't match.", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$
    }

    /**
     * Constructs a new instance of this test case.
     * 
     * @param testName
     *            The name of the test
     */
    public Bug42035Test(String testName) {
        super(testName);
    }

    /**
     * Tests that "Ctrl+" generates "Ctrl+", "Ctrl+" and "Ctrl+".
     * 
     * @throws ParseException
     *             If "CTRL+" cannot be processed.
     */
    public void testCtrl() throws ParseException {
        Event keyEvent = new Event();
        keyEvent.keyCode = 0x40000;
        keyEvent.character = 0x00;
        keyEvent.stateMask = SWT.NONE;

        KeyStroke desiredKeyStroke = KeyStroke.getInstance("CTRL+"); //$NON-NLS-1$
        KeyStroke actualKeyStroke = SWTKeySupport
                .convertAcceleratorToKeyStroke(SWTKeySupport
                        .convertEventToUnmodifiedAccelerator(keyEvent));
        assertEquals(
                "Unmodified character with all modifiers doesn't match", desiredKeyStroke, actualKeyStroke); //$NON-NLS-1$
    }

    /**
     * Tests that "Ctrl+Enter" generates "Ctrl+Enter", "Ctrl+Enter" and
     * "Ctrl+Enter".
     * 
     * @throws ParseException
     *             If "CTRL+ENTER" cannot be processed.
     */
    public void testCtrlEnter() throws ParseException {
        Event keyEvent = new Event();
        keyEvent.keyCode = 0x0D;
        keyEvent.character = 0x0D;
        keyEvent.stateMask = SWT.CTRL;

        testKeyEvent(keyEvent, "CTRL+CR", "CTRL+CR", "CTRL+CR"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
    }

    /**
     * Tests that "Ctrl+J" generates "Ctrl+M", "Ctrl+M" and "Ctrl+M".
     * 
     * @throws ParseException
     *             If "CTRL+M" cannot be processed.
     */
    public void testCtrlM() throws ParseException {
        Event keyEvent = new Event();
        keyEvent.keyCode = 0x6D;
        keyEvent.character = 0x0D;
        keyEvent.stateMask = SWT.CTRL;

        testKeyEvent(keyEvent, "CTRL+M", "CTRL+M", "CTRL+M"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
    }

    /**
     * Tests that "Ctrl+Shift+2" generates "Ctrl+Shift+2", "Ctrl+@" and
     * "Ctrl+Shift+@". This simulates a U.S. keyboard layout.
     * 
     * @throws ParseException
     *             If "CTRL+SHIFT+2", "CTRL+@" or "CTRL+SHIFT+@" cannot be
     *             processed.
     */
    public void testCtrlShift2() throws ParseException {
        Event keyEvent = new Event();
        keyEvent.keyCode = '2';
        keyEvent.character = 0x00;
        keyEvent.stateMask = SWT.CTRL | SWT.SHIFT;

        testKeyEvent(keyEvent, "CTRL+SHIFT+2", "CTRL+@", "CTRL+SHIFT+@"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
    }

    /**
     * Tests that "Ctrl+Shift+7" generates "Ctrl+Shift+7", "Ctrl+/" and
     * "Ctrl+Shift+/". This simulates a Swiss-German keyboard layout.
     * 
     * @throws ParseException
     *             If "CTRL+SHIFT+7", "CTRL+/" or "CTRL+SHIFT+/" cannot be
     *             processed.
     */
    public void testCtrlShift7_SwissGerman() throws ParseException {
        Event keyEvent = new Event();
        keyEvent.keyCode = '7';
        keyEvent.character = '/';
        keyEvent.stateMask = SWT.CTRL | SWT.SHIFT;

        testKeyEvent(keyEvent, "CTRL+SHIFT+7", "CTRL+/", "CTRL+SHIFT+/"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
    }

    /**
     * Tests that "Ctrl+Shift+7" generates "Ctrl+Shift+7", "Ctrl+&" and
     * "Ctrl+Shift+&". This simulates a US keyboard layout.
     * 
     * @throws ParseException
     *             If "CTRL+SHIFT+7", "CTRL+&" or "CTRL+SHIFT+&" cannot be
     *             processed.
     */
    public void testCtrlShift7_US() throws ParseException {
        Event keyEvent = new Event();
        keyEvent.keyCode = '7';
        keyEvent.character = '&';
        keyEvent.stateMask = SWT.CTRL | SWT.SHIFT;

        testKeyEvent(keyEvent, "CTRL+SHIFT+7", "CTRL+&", "CTRL+SHIFT+&"); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
    }
}
