/*******************************************************************************
 * Copyright (c) 2002, 2011 Innoopract Informationssysteme GmbH 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:
 *    Innoopract Informationssysteme GmbH - initial API and implementation
 *    EclipseSource - ongoing development
 ******************************************************************************/
package org.eclipse.swt.events;

import static org.eclipse.rap.rwt.internal.lifecycle.DisplayUtil.getId;
import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
import static org.mockito.Mockito.mock;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import junit.framework.TestCase;

import org.eclipse.rap.rwt.internal.application.RWTFactory;
import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
import org.eclipse.rap.rwt.lifecycle.ILifeCycle;
import org.eclipse.rap.rwt.lifecycle.PhaseEvent;
import org.eclipse.rap.rwt.lifecycle.PhaseId;
import org.eclipse.rap.rwt.lifecycle.PhaseListener;
import org.eclipse.rap.rwt.testfixture.Fixture;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;


public class TypedEvent_Test extends TestCase {

  private static final String EVENT_FIRED
    = "eventFired|";
  private static final String AFTER_RENDER
    = "after" + PhaseId.RENDER + "|";
  private static final String BEFORE_RENDER
    = "before" + PhaseId.RENDER + "|";
  private static final String AFTER_PROCESS_ACTION
    = "after" + PhaseId.PROCESS_ACTION + "|";
  private static final String BEFORE_PROCESS_ACTION
    = "before" + PhaseId.PROCESS_ACTION + "|";
  private static final String AFTER_READ_DATA
    = "after" + PhaseId.READ_DATA + "|";
  private static final String BEFORE_READ_DATA
    = "before" + PhaseId.READ_DATA + "|";
  private static final String AFTER_PREPARE_UI_ROOT
    = "after" + PhaseId.PREPARE_UI_ROOT + "|";
  private static final String BEFORE_PREPARE_UI_ROOT
    = "before" + PhaseId.PREPARE_UI_ROOT + "|";

  private Display display;
  private Shell shell;

  @Override
  protected void setUp() throws Exception {
    Fixture.setUp();
    display = new Display();
    shell = new Shell( 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 = 9;
    event.data = new Object();
    
    TestTypedEvent typedEvent = new TestTypedEvent( event );
    
    assertSame( event.widget, typedEvent.getSource() );
    EventTestHelper.assertFieldsEqual( typedEvent, event );
  }

  public void testPhase() {
    final StringBuilder log = new StringBuilder();
    Button button = new Button( shell, SWT.PUSH );
    button.addSelectionListener( new SelectionAdapter() {
      @Override
      public void widgetSelected( SelectionEvent event ) {
        log.append( EVENT_FIRED );
      }
    } );
    Fixture.fakeNewRequest( display );
    Fixture.fakeNotifyOperation( getId( button ), ClientMessageConst.EVENT_WIDGET_SELECTED, null );
    ILifeCycle lifeCycle = RWTFactory.getLifeCycleFactory().getLifeCycle();
    lifeCycle.addPhaseListener( new PhaseListener() {
      private static final long serialVersionUID = 1L;
      public void beforePhase( PhaseEvent event ) {
        log.append( "before" + event.getPhaseId() + "|" );
      }
      public void afterPhase( PhaseEvent event ) {
        log.append( "after" + event.getPhaseId() + "|" );
      }
      public PhaseId getPhaseId() {
        return PhaseId.ANY;
      }
    } );

    Fixture.executeLifeCycleFromServerThread( );

    String expected
      = BEFORE_PREPARE_UI_ROOT
      + AFTER_PREPARE_UI_ROOT
      + BEFORE_READ_DATA
      + AFTER_READ_DATA
      + BEFORE_PROCESS_ACTION
      + EVENT_FIRED
      + AFTER_PROCESS_ACTION
      + BEFORE_RENDER
      + AFTER_RENDER;
    assertEquals( expected, log.toString() );
  }

  public void testFireFocusEventBeforeMouseEvent() {
    final java.util.List<TypedEvent> eventLog = new ArrayList<TypedEvent>();
    Button button = new Button( shell, SWT.PUSH );
    button.addMouseListener( new MouseAdapter() {
      @Override
      public void mouseDown( MouseEvent event ) {
        eventLog.add( event );
      }
    } );
    button.addFocusListener( new FocusAdapter() {
      @Override
      public void focusGained( FocusEvent event ) {
        eventLog.add( event );
      }
    } );
    Fixture.fakeNewRequest( display );
    fakeMouseDownRequest( button, 1, 2 );
    Fixture.fakeSetParameter( getId( display ), "focusControl", getId( button ) );

    Fixture.executeLifeCycleFromServerThread( );

    assertEquals( FocusEvent.class, eventLog.get( 0 ).getClass() );
    assertEquals( MouseEvent.class, eventLog.get( 1 ).getClass() );
  }

  public void testSourceConstructor() {
    TypedEvent event = new TypedEvent( shell );
    
    assertSame( shell, event.getSource() );
    assertNull( event.widget );
    assertNull( event.display );
  }

  public void testEventConstructorWithNullWidget() {
    Event event = new Event();
    try {
      new TypedEvent( event );
      fail();
    } catch( IllegalArgumentException expected ) {
    }
  }

  public void testSourceConstructorWithNullWidget() {
    try {
      new TypedEvent( ( Object )null );
      fail();
    } catch( IllegalArgumentException expected ) {
    }
  }

  private static void fakeMouseDownRequest( Widget widget, int x, int y ) {
    Map<String, Object> parameters = new HashMap<String, Object>();
    parameters.put( ClientMessageConst.EVENT_PARAM_BUTTON, Integer.valueOf( 1 ) );
    parameters.put( ClientMessageConst.EVENT_PARAM_X, Integer.valueOf( x ) );
    parameters.put( ClientMessageConst.EVENT_PARAM_Y, Integer.valueOf( y ) );
    parameters.put( ClientMessageConst.EVENT_PARAM_TIME, Integer.valueOf( 0 ) );
    Fixture.fakeNotifyOperation( getId( widget ), ClientMessageConst.EVENT_MOUSE_DOWN, parameters );
  }

  private static class TestTypedEvent extends TypedEvent {

    public TestTypedEvent( Event event ) {
      super( event );
    }
    
  }

}
