/******************************************************************************* * Copyright (c) 2013, 2016 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; 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.verify; import java.io.Serializable; import java.util.Locale; import org.eclipse.rap.json.JsonArray; import org.eclipse.rap.json.JsonObject; import org.junit.Rule; import org.junit.Test; import com.eclipsesource.tabris.device.ClientDevice; import com.eclipsesource.tabris.device.ClientDevice.Capability; import com.eclipsesource.tabris.device.ClientDevice.ConnectionType; import com.eclipsesource.tabris.device.ClientDevice.Orientation; import com.eclipsesource.tabris.device.ClientDevice.Platform; import com.eclipsesource.tabris.device.ClientDeviceListener; import com.eclipsesource.tabris.test.util.TabrisEnvironment; import com.eclipsesource.tabris.test.util.TabrisRequest; public class ClientDeviceImplTest { @Rule public TabrisEnvironment environment = new TabrisEnvironment(); @Test public void testIsSerializable() { assertTrue( Serializable.class.isAssignableFrom( ClientDeviceImpl.class ) ); } @Test public void testClientDeviceListenerIsSerializable() { assertTrue( Serializable.class.isAssignableFrom( ClientDeviceListener.class ) ); } @Test public void testGetPlatformIsAndroid() { TabrisRequest request = environment.getRequest(); request.setHeader( Constants.USER_AGENT, "com.eclipsesource.tabris.android" ); ClientDevice device = new ClientDeviceImpl(); Platform platform = device.getPlatform(); assertSame( Platform.ANDROID, platform ); } @Test public void testGetPlatformIsIOS() { TabrisRequest request = environment.getRequest(); request.setHeader( Constants.USER_AGENT, "com.eclipsesource.tabris.ios" ); ClientDevice device = new ClientDeviceImpl(); Platform platform = device.getPlatform(); assertSame( Platform.IOS, platform ); } @Test public void testGetPlatformIsWindows() { TabrisRequest request = environment.getRequest(); request.setHeader( Constants.USER_AGENT, "com.eclipsesource.tabris.windows" ); ClientDevice device = new ClientDeviceImpl(); Platform platform = device.getPlatform(); assertSame( Platform.WINDOWS, platform ); } @Test public void testGetPlatformIsSWT() { TabrisRequest request = environment.getRequest(); request.setHeader( Constants.USER_AGENT, "com.eclipsesource.tabris.swt" ); ClientDevice device = new ClientDeviceImpl(); Platform platform = device.getPlatform(); assertSame( Platform.SWT, platform ); } @Test public void testGetPlatformIsWebByDefault() { TabrisRequest request = environment.getRequest(); request.setHeader( Constants.USER_AGENT, "Mozilla/bla" ); ClientDevice device = new ClientDeviceImpl(); Platform platform = device.getPlatform(); assertSame( Platform.WEB, platform ); } @Test public void testGetLocaleReturnsNullWhenLocaleNotSet() { environment.newGetRequest(); ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); Locale locale = deviceImpl.getLocale(); assertNull( locale ); } @Test public void testGetLocalesReturnsEmptyArrayWhenLocaleNotSet() { environment.newGetRequest(); ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); Locale[] locales = deviceImpl.getLocales(); assertEquals( 0, locales.length ); } @Test public void testGetLocaleReadsLocaleFromRequest() { TabrisRequest request = environment.newGetRequest(); request.setHeader( "Accept-Language", "anything" ); request.setLocales( new Locale( "en-US" ) ); ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); Locale locale = deviceImpl.getLocale(); assertEquals( new Locale( "en-US" ), locale ); } @Test public void testGetLocalesReadsLocalesFromRequest() { TabrisRequest request = environment.newGetRequest(); request.setHeader( "Accept-Language", "anything" ); request.setLocales( new Locale( "en-US" ), new Locale( "de-DE" ) ); ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); Locale[] locales = deviceImpl.getLocales(); assertEquals( 2, locales.length ); assertEquals( new Locale( "en-US" ), locales[ 0 ] ); assertEquals( new Locale( "de-DE" ), locales[ 1 ] ); } @Test public void testReturnsSaveLocalesCopy() { TabrisRequest request = environment.newGetRequest(); request.setHeader( "Accept-Language", "anything" ); request.setLocales( new Locale( "en-US" ) ); ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); deviceImpl.getLocales()[ 0 ] = new Locale( "de-DE" ); Locale[] locales = deviceImpl.getLocales(); assertEquals( new Locale( "en-US" ), locales[ 0 ] ); } @Test( expected = IllegalStateException.class ) public void testGetTimezoneOffsetFailsWhenTimezoneOffsetNotSet() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); deviceImpl.getTimezoneOffset(); } @Test public void testGetTimezoneOffset_readsTimezoneOffsetFromHandler() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject parameters = new JsonObject(); parameters.add( "timezoneOffset", -90 ); environment.dispatchSetOnServiceObject( parameters ); int timezoneOffset = deviceImpl.getTimezoneOffset(); assertEquals( -90, timezoneOffset ); } @Test public void testDetectsPortraitMode() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "orientation", "PORTRAIT" ); environment.dispatchSetOnServiceObject( properties ); Orientation orientation = deviceImpl.getOrientation(); assertSame( Orientation.PORTRAIT, orientation ); } @Test public void testDetectsLandscapeMode() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "orientation", "LANDSCAPE" ); environment.dispatchSetOnServiceObject( properties ); Orientation orientation = deviceImpl.getOrientation(); assertSame( Orientation.LANDSCAPE, orientation ); } @Test( expected = IllegalStateException.class ) public void testFailsWithoutConnectionType() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); deviceImpl.getConnectionType(); } @Test public void testKnowsConnectionTypeWifi() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "connectionType", "WIFI" ); environment.dispatchSetOnServiceObject( properties ); ConnectionType connectionType = deviceImpl.getConnectionType(); assertSame( ConnectionType.WIFI, connectionType ); } @Test public void testKnowsConnectionTypeCelular() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "connectionType", "CELLULAR" ); environment.dispatchSetOnServiceObject( properties ); ConnectionType connectionType = deviceImpl.getConnectionType(); assertSame( ConnectionType.CELLULAR, connectionType ); } @Test( expected = IllegalStateException.class ) public void testFailsWithoutCapabilities() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); deviceImpl.hasCapability( Capability.LOCATION ); } @Test public void testCanFindCapabilities() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); JsonArray jsonArray = new JsonArray(); jsonArray.add( "CAMERA" ); jsonArray.add( "LOCATION" ); properties.add( "capabilities", jsonArray ); environment.dispatchSetOnServiceObject( properties ); assertTrue( deviceImpl.hasCapability( Capability.LOCATION ) ); assertTrue( deviceImpl.hasCapability( Capability.CAMERA ) ); assertFalse( deviceImpl.hasCapability( Capability.MAPS ) ); assertFalse( deviceImpl.hasCapability( Capability.MESSAGE ) ); assertFalse( deviceImpl.hasCapability( Capability.PHONE ) ); } @Test public void testCanFindAllCapabilities() { ClientDeviceImpl deviceImpl = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); JsonArray jsonArray = new JsonArray(); jsonArray.add( "CAMERA" ); jsonArray.add( "LOCATION" ); jsonArray.add( "MAPS" ); jsonArray.add( "MESSAGE" ); jsonArray.add( "PHONE" ); properties.add( "capabilities", jsonArray ); environment.dispatchSetOnServiceObject( properties ); assertTrue( deviceImpl.hasCapability( Capability.LOCATION ) ); assertTrue( deviceImpl.hasCapability( Capability.CAMERA ) ); assertTrue( deviceImpl.hasCapability( Capability.MAPS ) ); assertTrue( deviceImpl.hasCapability( Capability.MESSAGE ) ); assertTrue( deviceImpl.hasCapability( Capability.PHONE ) ); } @Test( expected = IllegalArgumentException.class ) public void testAddListenerFailsWithNull() { ClientDevice device = new ClientDeviceImpl(); device.addClientDeviceListener( null ); } @Test( expected = IllegalArgumentException.class ) public void testRemoveListenerFailsWithNull() { ClientDevice device = new ClientDeviceImpl(); device.removeClientDeviceListener( null ); } @Test public void testOrientationChangeNotifiesListener() { ClientDeviceImpl device = new ClientDeviceImpl(); ClientDeviceListener listener = mock( ClientDeviceListener.class ); device.addClientDeviceListener( listener ); JsonObject properties = new JsonObject(); properties.add( "orientation", "PORTRAIT" ); environment.dispatchSetOnServiceObject( properties ); verify( listener ).orientationChange( Orientation.PORTRAIT ); } @Test public void testConnectionTypeChangeNotifiesListener() { ClientDeviceImpl device = new ClientDeviceImpl(); ClientDeviceListener listener = mock( ClientDeviceListener.class ); device.addClientDeviceListener( listener ); JsonObject properties = new JsonObject(); properties.add( "connectionType", "WIFI" ); environment.dispatchSetOnServiceObject( properties ); verify( listener ).connectionTypeChanged( ConnectionType.WIFI ); } @Test public void testSetsVendor() { ClientDeviceImpl device = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "vendor", "fooBar" ); device.handleSet( properties ); String vendor = device.getVendor(); assertEquals( "fooBar", vendor ); } @Test public void testSetsModel() { ClientDeviceImpl device = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "model", "blub" ); device.handleSet( properties ); String model = device.getModel(); assertEquals( "blub", model ); } @Test public void testSetsOSVersion() { ClientDeviceImpl device = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "osVersion", "7.1.0" ); device.handleSet( properties ); String version = device.getOSVersion(); assertEquals( "7.1.0", version ); } @Test public void testSetsScaleFactor() { ClientDeviceImpl device = new ClientDeviceImpl(); JsonObject properties = new JsonObject(); properties.add( "scaleFactor", 2.13F ); device.handleSet( properties ); float scaleFactor = device.getScaleFactor(); assertEquals( 2.13F, scaleFactor, 0F ); } }