/*******************************************************************************
* Copyright (c) 2013 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 com.eclipsesource.tabris.internal.ui.web;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import com.eclipsesource.tabris.internal.ui.PageDescriptor;
import com.eclipsesource.tabris.test.util.TabrisEnvironment;
import com.eclipsesource.tabris.ui.PageOperator;
import com.eclipsesource.tabris.ui.UI;
public class WebUITest {
@Rule
public TabrisEnvironment environment = new TabrisEnvironment();
private Display display;
private Shell shell;
private WebUI webUI;
@Before
public void setUp() {
display = new Display();
shell = new Shell( display );
webUI = new WebUI( shell );
}
@Test
public void testCreateActionsBarParent() {
Composite actionsParent = webUI.getActionsParent();
assertSame( shell.getChildren()[ 0 ], actionsParent.getParent() );
}
@Test
public void testCreatePageParent() {
Composite pageParent = webUI.getPageParent();
assertSame( shell.getChildren()[ 1 ], pageParent );
}
@Test
public void testCreateBackButton() {
Button backButton = webUI.getBackButton();
assertNotNull( backButton );
assertFalse( backButton.isListening( SWT.Selection ) );
assertFalse( backButton.getEnabled() );
assertNull( backButton.getImage() );
}
@Test
public void testCreatePageSwitcher() {
ToolBar pageSwitcher = webUI.getPageSwitcher();
assertNotNull( pageSwitcher );
assertEquals( 1, pageSwitcher.getItemCount() );
assertTrue( pageSwitcher.getItem( 0 ).isListening( SWT.Selection ) );
}
@Test
public void testCreatePageSwitcher_pageSwitcherMenu() {
Menu pageSwitcherMenu = webUI.getPageSwitcherMenu();
assertNotNull( pageSwitcherMenu );
}
public void testCreateActionsBar() throws Exception {
Composite actionsBar = webUI.getActionsParent();
assertNotNull( actionsBar );
}
@Test
public void testPageCreated_topLevelPage_addsMenuItem() {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( Boolean.TRUE ).when( descriptor ).isTopLevel();
doReturn( "Title" ).when( descriptor ).getTitle();
when( page.getDescriptor() ).thenReturn( descriptor );
webUI.pageCreated( page );
assertEquals( 1, webUI.getPageSwitcherMenu().getItemCount() );
MenuItem item = webUI.getPageSwitcherMenu().getItem( 0 );
assertEquals( "Title", item.getText() );
assertSame( descriptor, item.getData() );
assertTrue( item.isListening( SWT.Selection ) );
}
@Test
public void testPageCreated_regularPage_ignored() {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( Boolean.FALSE ).when( descriptor ).isTopLevel();
doReturn( "Title" ).when( descriptor ).getTitle();
when( page.getDescriptor() ).thenReturn( descriptor );
webUI.pageCreated( page );
assertEquals( 0, webUI.getPageSwitcherMenu().getItemCount() );
}
@Test
public void testPageDestroyed_removesMenuItem() {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( Boolean.TRUE ).when( descriptor ).isTopLevel();
doReturn( "Title" ).when( descriptor ).getTitle();
when( page.getDescriptor() ).thenReturn( descriptor );
webUI.pageCreated( page );
webUI.pageDestroyed( page );
assertEquals( 0, webUI.getPageSwitcherMenu().getItemCount() );
}
@Test
public void testPageDestroyed_regularPage_ignored() {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( Boolean.FALSE ).when( descriptor ).isTopLevel();
doReturn( "Title" ).when( descriptor ).getTitle();
when( page.getDescriptor() ).thenReturn( descriptor );
webUI.pageCreated( page );
webUI.pageDestroyed( page );
assertEquals( 0, webUI.getPageSwitcherMenu().getItemCount() );
}
@Test( expected = IllegalArgumentException.class )
public void testActivate_failsWithNullRenderer() {
webUI.activate( null );
}
@Test
public void testActivate_topLevelPage_updatesNavigation() {
WebPage page = createWebPage( true );
webUI.activate( page );
assertTrue( webUI.getPageSwitcher().getVisible() );
assertFalse( webUI.getBackButton().isListening( SWT.Selection ) );
assertFalse( webUI.getBackButton().getEnabled() );
}
@Test
public void testActivate_regularPage_updatesNavigation() {
WebPage page = createWebPage( false );
webUI.activate( page );
assertTrue( webUI.getPageSwitcher().getVisible() );
assertTrue( webUI.getBackButton().isListening( SWT.Selection ) );
assertTrue( webUI.getBackButton().getEnabled() );
}
@Test
public void testActivate_doesNotCallOpenPage() {
UI ui = mock( UI.class );
PageOperator pageOperator = mock( PageOperator.class );
when( ui.getPageOperator() ).thenReturn( pageOperator );
webUI.setUi( ui );
WebPage page = createWebPage( true );
webUI.pageCreated( page );
webUI.activate( page );
verify( pageOperator, never() ).openPage( "foo" );
}
@Test
public void testBackButtonSelection_callsCloseCurrentPage() {
UI ui = mock( UI.class );
PageOperator pageOperator = mock( PageOperator.class );
when( ui.getPageOperator() ).thenReturn( pageOperator );
webUI.setUi( ui );
webUI.pageCreated( createWebPage( true ) );
WebPage page = createWebPage( false );
webUI.pageCreated( page );
webUI.activate( page );
webUI.getBackButton().notifyListeners( SWT.Selection, new Event() );
verify( pageOperator ).closeCurrentPage();
}
@Test
public void testMenuItemSelection_callsOpenPage() {
UI ui = mock( UI.class );
PageOperator pageOperator = mock( PageOperator.class );
when( ui.getPageOperator() ).thenReturn( pageOperator );
webUI.setUi( ui );
WebPage page = createWebPage( true );
webUI.pageCreated( page );
webUI.getPageSwitcherMenu().getItem( 0 ).notifyListeners( SWT.Selection, new Event() );
verify( pageOperator ).openPage( "foo" );
}
@Test
public void testPageSwitcherSelection_showsMenu() {
webUI.getPageSwitcher().getItem( 0 ).notifyListeners( SWT.Selection, new Event() );
assertTrue( webUI.getPageSwitcherMenu().getVisible() );
}
@Test
public void testUpdateUpdatesMenuItems() {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( Boolean.TRUE ).when( descriptor ).isTopLevel();
doReturn( "Title" ).when( descriptor ).getTitle();
when( page.getDescriptor() ).thenReturn( descriptor );
webUI.pageCreated( page );
webUI.activate( page );
webUI.updatePageSwitcher( descriptor, "foo" );
assertEquals( "foo", webUI.getPageSwitcherMenu().getItem( 0 ).getText() );
}
@Test
public void testUpdateUpdatesToolItems() {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( Boolean.TRUE ).when( descriptor ).isTopLevel();
doReturn( "Title" ).when( descriptor ).getTitle();
when( page.getDescriptor() ).thenReturn( descriptor );
webUI.pageCreated( page );
webUI.activate( page );
webUI.updatePageSwitcher( descriptor, "foo" );
assertEquals( "foo", webUI.getPageSwitcher().getItem( 0 ).getText() );
}
@Test
public void testLayoutOrder() {
List<Composite> log = new ArrayList<Composite>();
Composite actionsParent = webUI.getActionsParent();
actionsParent.setLayout( new TestLayout( log ) );
Composite uiParent = actionsParent.getParent();
uiParent.setLayout( new TestLayout( log ) );
webUI.layout();
assertSame( actionsParent, log.get( 0 ) );
assertSame( uiParent, log.get( 1 ) );
}
private WebPage createWebPage( boolean topLevel ) {
WebPage page = mock( WebPage.class );
PageDescriptor descriptor = mock( PageDescriptor.class );
doReturn( "foo" ).when( descriptor ).getId();
doReturn( Boolean.valueOf( topLevel ) ).when( descriptor ).isTopLevel();
when( page.getDescriptor() ).thenReturn( descriptor );
return page;
}
private final class TestLayout extends Layout {
private final List<Composite> log;
public TestLayout( List<Composite> log ) {
this.log = log;
}
@Override
protected void layout( Composite composite, boolean flushCache ) {
log.add( composite );
}
@Override
protected Point computeSize( Composite composite, int wHint, int hHint, boolean flushCache ) {
return null;
}
}
}