/*******************************************************************************
 * Copyright (c) 2010, 2012 EclipseSource 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:
 *    EclipseSource - initial API and implementation
 ******************************************************************************/
package org.eclipse.swt.events;

import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;

import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
import org.eclipse.rap.rwt.testfixture.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
import org.mockito.InOrder;


public class KeyEvent_Test extends TestCase {

  private Display display;
  private Shell shell;
  private List<Object> events;

  @Override
  protected void setUp() throws Exception {
    Fixture.setUp();
    display = new Display();
    shell = new Shell( display );
    events = new LinkedList<Object>();
    Fixture.fakeNewRequest( display );
  }

  @Override
  protected void tearDown() throws Exception {
    Fixture.tearDown();
  }

  public void testUntypedEventConstructor() throws Exception {
    Event event = new Event();
    event.display = display;
    event.widget = mock( Widget.class );
    event.time = 4325;
    event.stateMask = 23;
    event.keyCode = 42;
    event.character = 'f';
    event.doit = true;
    event.data = new Object();
    
    KeyEvent keyEvent = new KeyEvent( event );
    
    EventTestHelper.assertFieldsEqual( keyEvent, event );
  }

  public void testKeySelectionEventsOrder() {
    KeyListener keyListener = mock( KeyListener.class );
    SelectionListener selectionListener = mock( SelectionListener.class );
    Tree tree = createTreeWithKeyListener();
    Fixture.fakeNewRequest( display );
    fakeKeyDownRequest( tree, 65, 65 );
    fakeSelectionRequest( tree, tree.getItem( 1 ) );

    tree.addKeyListener( keyListener );
    tree.addSelectionListener( selectionListener );
    Fixture.readDataAndProcessAction( display );

    InOrder inOrder = inOrder( keyListener, selectionListener );
    inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
    inOrder.verify( selectionListener ).widgetSelected( any( SelectionEvent.class ) );
    inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
  }

  public void testKeyTreeEventsOrder() {
    KeyListener keyListener = mock( KeyListener.class );
    TreeListener treeListener = mock( TreeListener.class );
    Tree tree = createTreeWithKeyListener();
    Fixture.fakeNewRequest( display );
    fakeKeyDownRequest( tree, 65, 65 );
    fakeTreeRequest( tree.getItem( 1 ) );

    tree.addKeyListener( keyListener );
    tree.addTreeListener( treeListener );
    Fixture.readDataAndProcessAction( display );

    InOrder inOrder = inOrder( keyListener, treeListener );
    inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
    inOrder.verify( treeListener ).treeExpanded( any( TreeEvent.class ) );
    inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
  }

  public void testKeyHelpEventsOrder() {
    KeyListener keyListener = mock( KeyListener.class );
    HelpListener helpListener = mock( HelpListener.class );
    Tree tree = createTreeWithKeyListener();
    Fixture.fakeNewRequest( display );
    fakeKeyDownRequest( tree, 65, 65 );
    fakeHelpRequest( tree );

    tree.addKeyListener( keyListener );
    tree.addHelpListener( helpListener );
    Fixture.readDataAndProcessAction( display );

    InOrder inOrder = inOrder( keyListener, helpListener );
    inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
    inOrder.verify( helpListener ).helpRequested( any( HelpEvent.class ) );
    inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
  }

  private Tree createTreeWithKeyListener() {
    Tree result = new Tree( shell, SWT.NONE );
    result.setSize( 100, 100 );
    for( int i = 0; i < 5; i++ ) {
      TreeItem item = new TreeItem( result, SWT.NONE);
      for( int j = 0; j < 5; j++ ) {
        new TreeItem( item, SWT.NONE);
      }
    }
    result.addKeyListener( new LoggingKeyListener( events ) );
    return result;
  }

  private static void fakeSelectionRequest( Widget widget, Widget item ) {
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put( ClientMessageConst.EVENT_PARAM_ITEM, getId( item ) );
    Fixture.fakeNotifyOperation( getId( widget ),
                                 ClientMessageConst.EVENT_WIDGET_SELECTED,
                                 parameters  );
  }

  private static void fakeTreeRequest( Widget item ) {
    Fixture.fakeNotifyOperation( getId( item ), ClientMessageConst.EVENT_TREE_EXPANDED, null  );
  }

  private static void fakeHelpRequest( Widget widget ) {
    Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_HELP, null  );
  }

  private static void fakeKeyDownRequest( Widget widget, int keyCode, int charCode ) {
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put( ClientMessageConst.EVENT_PARAM_KEY_CODE, Integer.valueOf( keyCode ) );
    parameters.put( ClientMessageConst.EVENT_PARAM_CHAR_CODE, Integer.valueOf( charCode ) );
    parameters.put( ClientMessageConst.EVENT_PARAM_MODIFIER, "" );
    Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_KEY_DOWN, parameters );
  }

  private static class LoggingKeyListener implements KeyListener {
    private final List<Object> events;
    private LoggingKeyListener( List<Object> events ) {
      this.events = events;
    }
    public void keyPressed( KeyEvent event ) {
      events.add( event );
    }
    public void keyReleased( KeyEvent event ) {
      events.add( event );
    }
  }
}
