/*******************************************************************************
* Copyright (c) 2015 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.internal.widgets;
import static org.eclipse.rap.rwt.testfixture.internal.Fixture.getProtocolMessage;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.eclipse.rap.json.JsonArray;
import org.eclipse.rap.rwt.testfixture.TestContext;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
public class ControlRemoteAdapter_Test {
private ControlRemoteAdapter adapter;
@Rule
public TestContext context = new TestContext();
@Before
public void setUp() {
adapter = new ControlRemoteAdapter( "id" );
}
@Test
public void testPreserveActiveKeys() {
String[] keys = new String[] { "foo" };
adapter.preserveActiveKeys( keys );
assertTrue( adapter.hasPreservedActiveKeys() );
assertSame( keys, adapter.getPreservedActiveKeys() );
}
@Test
public void testPreserveCancelKeys() {
String[] keys = new String[] { "foo" };
adapter.preserveCancelKeys( keys );
assertTrue( adapter.hasPreservedCancelKeys() );
assertSame( keys, adapter.getPreservedCancelKeys() );
}
// TODO: renderChildren is tested by ControlLCAUtil
@Test
public void testRenderBounds_initial() {
adapter.renderBounds( mockControlAdapterWithBounds( new Rectangle( 0, 0, 0, 0 ) ) );
JsonArray expected = JsonArray.readFrom( "[ 0, 0, 0, 0 ]" );
assertEquals( expected, getProtocolMessage().findSetProperty( adapter.getId(), "bounds" ) );
}
@Test
public void testRenderBounds_initial_withNonZeroBounds() {
adapter.renderBounds( mockControlAdapterWithBounds( new Rectangle( 1, 2, 3, 4 ) ) );
JsonArray expected = JsonArray.readFrom( "[ 1, 2, 3, 4 ]" );
assertEquals( expected, getProtocolMessage().findSetProperty( adapter.getId(), "bounds" ) );
}
@Test
public void testRenderBounds_unpreserved() {
adapter.setInitialized( true );
adapter.renderBounds( mockControlAdapterWithBounds( new Rectangle( 0, 1, 2, 3 ) ) );
assertNull( getProtocolMessage().findSetOperation( adapter.getId(), "bounds" ) );
}
@Test
public void testRenderBounds_preserved_unchanged() {
adapter.setInitialized( true );
adapter.preserveBounds( new Rectangle( 0, 0, 0, 0 ) );
adapter.renderBounds( mockControlAdapterWithBounds( new Rectangle( 0, 0, 0, 0 ) ) );
assertNull( getProtocolMessage().findSetOperation( adapter.getId(), "bounds" ) );
}
@Test
public void testRenderBounds_preserved_changed() {
adapter.setInitialized( true );
adapter.preserveBounds( new Rectangle( 0, 0, 0, 0 ) );
adapter.renderBounds( mockControlAdapterWithBounds( new Rectangle( 1, 2, 3, 4 ) ) );
JsonArray expected = JsonArray.readFrom( "[ 1, 2, 3, 4 ]" );
assertEquals( expected, getProtocolMessage().findSetProperty( adapter.getId(), "bounds" ) );
}
@Test
public void testRenderBounds_preservedTwice_unchanged() {
adapter.setInitialized( true );
adapter.preserveBounds( new Rectangle( 0, 0, 0, 0 ) );
adapter.preserveBounds( new Rectangle( 1, 2, 3, 4 ) );
adapter.renderBounds( mockControlAdapterWithBounds( new Rectangle( 0, 0, 0, 0 ) ) );
assertNull( getProtocolMessage().findSetOperation( adapter.getId(), "bounds" ) );
}
@Test
public void testDefaults() {
checkDefaults();
}
@Test
public void testClearPreserved() {
preserveEverything();
adapter.clearPreserved();
checkDefaults();
}
@Test
public void testSerializeableFieldsAreRestored() throws Exception {
ControlRemoteAdapter deserializedAdapter = serializeAndDeserialize( adapter );
// fails if the transient fields in superclass aren't restored
deserializedAdapter.preserve( "foo", new Object() );
}
@Test
public void testTransientFields() throws Exception {
preserveEverything();
adapter = serializeAndDeserialize( adapter );
checkDefaults();
}
private void preserveEverything() {
adapter.markPreserved( 1 );
adapter.preserveParent( mock( Composite.class ) );
adapter.preserveChildren( new Control[] { mock( Control.class ) } );
adapter.preserveBounds( new Rectangle( 1, 2, 3, 4 ) );
adapter.preserveTabIndex( 3 );
adapter.preserveToolTipText( "foo" );
adapter.preserveMenu( mock( Menu.class ) );
adapter.preserveVisible( true );
adapter.preserveEnabled( true );
adapter.preserveForeground( mock( Color.class ) );
adapter.preserveBackground( mock( Color.class ), true );
adapter.preserveBackgroundImage( mock( Image.class ) );
adapter.preserveFont( mock( Font.class ) );
adapter.preserveCursor( mock( Cursor.class ) );
adapter.preserveActiveKeys( new String[] { "foo" } );
adapter.preserveCancelKeys( new String[] { "foo" } );
}
private void checkDefaults() {
assertFalse( adapter.hasPreserved( 1 ) );
assertFalse( adapter.hasPreservedActiveKeys() );
assertNull( adapter.getPreservedActiveKeys() );
assertFalse( adapter.hasPreservedCancelKeys() );
assertNull( adapter.getPreservedCancelKeys() );
}
private static IControlAdapter mockControlAdapterWithBounds( Rectangle value ) {
IControlAdapter controlAdapter = mock( IControlAdapter.class );
when( controlAdapter.getBounds() ).thenReturn( value );
return controlAdapter;
}
}