/*******************************************************************************
* Copyright (c) 2008, 2017 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.widgets;
import static org.eclipse.rap.rwt.testfixture.internal.SerializationTestUtil.serializeAndDeserialize;
import static org.eclipse.swt.internal.widgets.IDateTimeAdapter.DROP_DOWN_BUTTON;
import static org.eclipse.swt.internal.widgets.IDateTimeAdapter.SPINNER;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.internal.lifecycle.WidgetLCA;
import org.eclipse.rap.rwt.testfixture.TestContext;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.internal.widgets.ControlUtil;
import org.eclipse.swt.internal.widgets.IControlAdapter;
import org.eclipse.swt.internal.widgets.IDateTimeAdapter;
import org.eclipse.swt.internal.widgets.datetimekit.DateTimeLCA;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
public class DateTime_Test {
private static long WEEK_TIME = 7 * 24 * 60 * 60 * 1000;
@Rule
public TestContext context = new TestContext();
private Shell shell;
private DateTime dateTime;
SimpleDateFormat formatter;
@Before
public void setUp() {
Display display = new Display();
shell = new Shell( display, SWT.NONE );
dateTime = new DateTime( shell, SWT.NONE );
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
@Test
public void testInvalidValues() {
dateTime.setDay( 1 );
dateTime.setMonth( 0 );
dateTime.setYear( 2008 );
dateTime.setHours( 0 );
dateTime.setMinutes( 0 );
dateTime.setSeconds( 0 );
assertEquals( 1, dateTime.getDay() );
assertEquals( 0, dateTime.getMonth() );
assertEquals( 2008, dateTime.getYear() );
assertEquals( 0, dateTime.getHours() );
assertEquals( 0, dateTime.getMinutes() );
assertEquals( 0, dateTime.getSeconds() );
// Test day
dateTime.setDay( 61 );
assertEquals( 1, dateTime.getDay() );
dateTime.setDay( 0 );
assertEquals( 1, dateTime.getDay() );
dateTime.setDay( -5 );
assertEquals( 1, dateTime.getDay() );
dateTime.setMonth( 1 );
dateTime.setDay( 29 );
assertEquals( 29, dateTime.getDay() );
dateTime.setDay( 30 );
assertEquals( 29, dateTime.getDay() );
// Test month
dateTime.setMonth( 12 );
assertEquals( 1, dateTime.getMonth() );
dateTime.setMonth( -5 );
assertEquals( 1, dateTime.getMonth() );
dateTime.setMonth( 0 );
dateTime.setDay( 31 );
dateTime.setMonth( 1 );
assertEquals( 0, dateTime.getMonth() );
// Test year
dateTime.setYear( 12345 );
assertEquals( 2008, dateTime.getYear() );
dateTime.setYear( 123 );
assertEquals( 2008, dateTime.getYear() );
dateTime.setDay( 29 );
dateTime.setMonth( 1 );
dateTime.setYear( 2007 );
assertEquals( 2008, dateTime.getYear() );
// Test hours
dateTime.setHours( 24 );
assertEquals( 0, dateTime.getHours() );
dateTime.setHours( -3 );
assertEquals( 0, dateTime.getHours() );
// Test minutes
dateTime.setMinutes( 65 );
assertEquals( 0, dateTime.getMinutes() );
dateTime.setMinutes( -7 );
assertEquals( 0, dateTime.getMinutes() );
// Test seconds
dateTime.setSeconds( 89 );
assertEquals( 0, dateTime.getSeconds() );
dateTime.setSeconds( -1 );
assertEquals( 0, dateTime.getSeconds() );
// Test date
dateTime.setDate( 2009, 5, 6 );
dateTime.setDate( 2008, 1, 30 );
assertEquals( 6, dateTime.getDay() );
assertEquals( 5, dateTime.getMonth() );
assertEquals( 2009, dateTime.getYear() );
// Test time
dateTime.setTime( 12, 14, 16 );
dateTime.setTime( 23, 76, 15 );
assertEquals( 12, dateTime.getHours() );
assertEquals( 14, dateTime.getMinutes() );
assertEquals( 16, dateTime.getSeconds() );
}
@Test
public void testSetMinimum() throws ParseException {
Date minimum = formatter.parse( "1985-10-29 11:00:00" );
dateTime.setMinimum( minimum );
assertEquals( minimum, dateTime.getMinimum() );
}
@Test
public void testSetMinimum_limitsDate() throws ParseException {
dateTime.setDate( 1984, 8, 28 );
dateTime.setMinimum( formatter.parse( "1985-10-29 11:00:00" ) );
assertEquals( 29, dateTime.getDay() );
assertEquals( 9, dateTime.getMonth() );
assertEquals( 1985, dateTime.getYear() );
}
@Test
public void testSetMinimum_limitsYear() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-29 11:00:00" ) );
dateTime.setDate( 1984, 10, 29 );
assertEquals( 29, dateTime.getDay() );
assertEquals( 9, dateTime.getMonth() );
assertEquals( 1985, dateTime.getYear() );
}
@Test
public void testSetMinimum_limitsMonth() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-29 11:00:00" ) );
dateTime.setDate( 1985, 5, 29 );
assertEquals( 29, dateTime.getDay() );
assertEquals( 9, dateTime.getMonth() );
assertEquals( 1985, dateTime.getYear() );
}
@Test
public void testSetMinimum_limitsDay() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-29 11:00:00" ) );
dateTime.setDate( 1985, 9, 28 );
assertEquals( 29, dateTime.getDay() );
assertEquals( 9, dateTime.getMonth() );
assertEquals( 1985, dateTime.getYear() );
}
@Test
public void testSetMinimum_limitsHour() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-29 11:22:33" ) );
dateTime.setDate( 1985, 9, 28 );
dateTime.setTime( 10, 22, 33 );
assertEquals( 11, dateTime.getHours() );
assertEquals( 22, dateTime.getMinutes() );
assertEquals( 33, dateTime.getSeconds() );
}
@Test
public void testSetMinimum_limitsMinute() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-29 11:22:33" ) );
dateTime.setDate( 1985, 9, 28 );
dateTime.setTime( 11, 21, 33 );
assertEquals( 11, dateTime.getHours() );
assertEquals( 22, dateTime.getMinutes() );
assertEquals( 33, dateTime.getSeconds() );
}
@Test
public void testSetMinimum_limitsSecond() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-29 11:22:33" ) );
dateTime.setDate( 1985, 9, 28 );
dateTime.setTime( 11, 22, 32 );
assertEquals( 11, dateTime.getHours() );
assertEquals( 22, dateTime.getMinutes() );
assertEquals( 33, dateTime.getSeconds() );
}
@Test
public void testSetMinimum_createsSafeCopy() throws ParseException {
Date minimum = formatter.parse( "1985-10-10 11:22:33" );
dateTime.setMinimum( minimum );
minimum.setTime( minimum.getTime() + WEEK_TIME );
assertEquals( formatter.parse( "1985-10-10 11:22:33" ), dateTime.getMinimum() );
}
@Test
public void testGetMinimum_returnsSafeCopy() throws ParseException {
dateTime.setMinimum( formatter.parse( "1985-10-10 11:22:33" ) );
Date minimum = dateTime.getMinimum();
minimum.setTime( minimum.getTime() + WEEK_TIME );
assertEquals( formatter.parse( "1985-10-10 11:22:33" ), dateTime.getMinimum() );
}
@Test
public void testSetMaximum() throws ParseException {
Date maximum = formatter.parse( "2020-03-15 11:00:00" );
dateTime.setMaximum( maximum );
assertEquals( maximum, dateTime.getMaximum() );
}
@Test
public void testSetMaximum_limitsDate() throws ParseException {
dateTime.setDate( 2021, 3, 16 );
dateTime.setMaximum( formatter.parse( "2020-03-15 11:00:00" ) );
assertEquals( 15, dateTime.getDay() );
assertEquals( 2, dateTime.getMonth() );
assertEquals( 2020, dateTime.getYear() );
}
@Test
public void testSetMaximum_limitsYear() throws ParseException {
dateTime.setMaximum( formatter.parse( "2020-03-15 11:00:00" ) );
dateTime.setDate( 2021, 2, 15 );
assertEquals( 15, dateTime.getDay() );
assertEquals( 2, dateTime.getMonth() );
assertEquals( 2020, dateTime.getYear() );
}
@Test
public void testSetMaximum_limitsMonth() throws ParseException {
dateTime.setMaximum( formatter.parse( "2020-03-15 11:00:00" ) );
dateTime.setDate( 2020, 3, 15 );
assertEquals( 15, dateTime.getDay() );
assertEquals( 2, dateTime.getMonth() );
assertEquals( 2020, dateTime.getYear() );
}
@Test
public void testSetMaximum_limitsDay() throws ParseException {
dateTime.setMaximum( formatter.parse( "2020-03-15 11:00:00" ) );
dateTime.setDate( 2020, 2, 16 );
assertEquals( 15, dateTime.getDay() );
assertEquals( 2, dateTime.getMonth() );
assertEquals( 2020, dateTime.getYear() );
}
@Test
public void testSetMaximum_limitsHour() throws ParseException {
dateTime.setMaximum( formatter.parse( "2020-03-15 11:22:33" ) );
dateTime.setDate( 2020, 2, 16 );
dateTime.setTime( 12, 22, 33 );
assertEquals( 11, dateTime.getHours() );
assertEquals( 22, dateTime.getMinutes() );
assertEquals( 33, dateTime.getSeconds() );
}
@Test
public void testSetMaximum_limitsMinute() throws ParseException {
dateTime.setMaximum( formatter.parse( "2020-03-15 11:22:33" ) );
dateTime.setDate( 2020, 2, 16 );
dateTime.setTime( 11, 23, 33 );
assertEquals( 11, dateTime.getHours() );
assertEquals( 22, dateTime.getMinutes() );
assertEquals( 33, dateTime.getSeconds() );
}
@Test
public void testSetMaximum_limitsSecond() throws ParseException {
dateTime.setMaximum( formatter.parse( "2020-03-15 11:22:33" ) );
dateTime.setDate( 2020, 2, 16 );
dateTime.setTime( 11, 23, 34 );
assertEquals( 11, dateTime.getHours() );
assertEquals( 22, dateTime.getMinutes() );
assertEquals( 33, dateTime.getSeconds() );
}
@Test
public void testSetMaximum_createsSafeCopy() throws ParseException {
Date maximum = formatter.parse( "1985-10-10 11:22:33" );
dateTime.setMaximum( maximum );
maximum.setTime( maximum.getTime() + WEEK_TIME );
assertEquals( formatter.parse( "1985-10-10 11:22:33" ), dateTime.getMaximum() );
}
@Test
public void testGetMaximum_returnsSafeCopy() throws ParseException {
dateTime.setMaximum( formatter.parse( "1985-10-10 11:22:33" ) );
Date maximum = dateTime.getMaximum();
maximum.setTime( maximum.getTime() + WEEK_TIME );
assertEquals( formatter.parse( "1985-10-10 11:22:33" ), dateTime.getMaximum() );
}
@Test
public void testSetDate() {
dateTime.setDate( 1985, 10, 29 );
assertEquals( 29, dateTime.getDay() );
assertEquals( 10, dateTime.getMonth() );
assertEquals( 1985, dateTime.getYear() );
dateTime.setDate( 2008, 1, 29 );
assertEquals( 29, dateTime.getDay() );
assertEquals( 1, dateTime.getMonth() );
assertEquals( 2008, dateTime.getYear() );
}
@Test
public void testSetTime() {
dateTime.setTime(2, 10, 30);
assertEquals( 2, dateTime.getHours() );
assertEquals( 10, dateTime.getMinutes() );
assertEquals( 30, dateTime.getSeconds() );
}
@Test
public void testStyle() {
// Test SWT.NONE
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.MEDIUM ) != 0 );
// Test SWT.BORDER
dateTime = new DateTime( shell, SWT.BORDER );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.MEDIUM ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.BORDER ) != 0 );
// Test combination of SWT.DATE | SWT.TIME | SWT.CALENDAR
dateTime = new DateTime( shell, SWT.DATE | SWT.TIME | SWT.CALENDAR );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.TIME ) == 0 );
assertTrue( ( dateTime.getStyle() & SWT.CALENDAR ) == 0 );
dateTime = new DateTime( shell, SWT.DATE | SWT.TIME );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.TIME ) == 0 );
dateTime = new DateTime( shell, SWT.DATE | SWT.CALENDAR );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.CALENDAR ) == 0 );
dateTime = new DateTime( shell, SWT.TIME | SWT.CALENDAR );
assertTrue( ( dateTime.getStyle() & SWT.TIME ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.CALENDAR ) == 0 );
dateTime = new DateTime( shell, SWT.CALENDAR );
assertTrue( ( dateTime.getStyle() & SWT.CALENDAR ) != 0 );
// Test combination of SWT.MEDIUM | SWT.SHORT | SWT.LONG
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM | SWT.SHORT | SWT.LONG );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.MEDIUM ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.SHORT ) == 0 );
assertTrue( ( dateTime.getStyle() & SWT.LONG ) == 0 );
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM | SWT.SHORT );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.MEDIUM ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.SHORT ) == 0 );
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM | SWT.LONG );
assertTrue( ( dateTime.getStyle() & SWT.DATE ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.MEDIUM ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.LONG ) == 0 );
dateTime = new DateTime( shell, SWT.TIME | SWT.SHORT | SWT.LONG );
assertTrue( ( dateTime.getStyle() & SWT.TIME ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.SHORT ) != 0 );
assertTrue( ( dateTime.getStyle() & SWT.LONG ) == 0 );
// Test SWT.DROP_DOWN
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM | SWT.DROP_DOWN );
assertTrue( ( dateTime.getStyle() & SWT.DROP_DOWN ) != 0 );
dateTime = new DateTime( shell, SWT.TIME | SWT.MEDIUM | SWT.DROP_DOWN );
assertTrue( ( dateTime.getStyle() & SWT.DROP_DOWN ) == 0 );
dateTime = new DateTime( shell, SWT.CALENDAR | SWT.MEDIUM | SWT.DROP_DOWN );
assertTrue( ( dateTime.getStyle() & SWT.DROP_DOWN ) == 0 );
}
@Test
public void testDispose() {
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM );
dateTime.dispose();
assertTrue( dateTime.isDisposed() );
}
@Test
public void testComputeSize() {
// The component computeSize depends on day/months names
// which are locale dependent
RWT.setLocale( Locale.US );
dateTime = new DateTime( shell, SWT.DATE | SWT.SHORT );
Point expected = new Point( 144, 28 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.DATE | SWT.SHORT | SWT.BORDER );
expected = new Point( 146, 30 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM );
expected = new Point( 121, 28 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.DATE | SWT.LONG );
expected = new Point( 238, 28 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.TIME | SWT.SHORT );
expected = new Point( 81, 28 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.TIME | SWT.MEDIUM );
expected = new Point( 107, 28 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.TIME | SWT.LONG );
expected = new Point( 107, 28 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
dateTime = new DateTime( shell, SWT.CALENDAR );
expected = new Point( 192, 150 );
assertEquals( expected, dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT ) );
expected = new Point( 100, 100 );
assertEquals( expected, dateTime.computeSize( 100, 100 ) );
}
@Test
public void testComputeSize_doesNotMoveButtonsOnBiggerSize_time() {
dateTime = new DateTime( shell, SWT.TIME | SWT.MEDIUM );
dateTime.setSize( 208, 28 );
dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT );
Rectangle expected = new Rectangle( 178, 0, 30, 28 );
assertEquals( expected, getAdapter( dateTime ).getBounds( SPINNER ) );
}
@Test
public void testComputeSize_doesNotMoveButtonsOnBiggerSize_date() {
dateTime = new DateTime( shell, SWT.DATE | SWT.MEDIUM );
dateTime.setSize( 208, 28 );
dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT );
Rectangle expected = new Rectangle( 178, 0, 30, 28 );
assertEquals( expected, getAdapter( dateTime ).getBounds( SPINNER ) );
}
@Test
public void testComputeSize_doesNotMoveButtonsOnBiggerSize_dropDown() {
dateTime = new DateTime( shell, SWT.DATE | SWT.DROP_DOWN );
dateTime.setSize( 208, 28 );
dateTime.computeSize( SWT.DEFAULT, SWT.DEFAULT );
Rectangle expected = new Rectangle( 178, 0, 30, 28 );
assertEquals( expected, getAdapter( dateTime ).getBounds( DROP_DOWN_BUTTON ) );
}
@Test
public void testDateIsSerializable() throws Exception {
dateTime = new DateTime( shell, SWT.DATE );
dateTime.setDate( 2000, 1, 1 );
DateTime deserializedDateTime = serializeAndDeserialize( dateTime );
assertEquals( 1, deserializedDateTime.getDay() );
assertEquals( 1, deserializedDateTime.getMonth() );
assertEquals( 2000, deserializedDateTime.getYear() );
}
@Test
public void testTimeIsSerializable() throws Exception {
dateTime = new DateTime( shell, SWT.TIME );
dateTime.setTime( 12, 12, 12 );
DateTime deserializedDateTime = serializeAndDeserialize( dateTime );
assertEquals( 12, deserializedDateTime.getHours() );
assertEquals( 12, deserializedDateTime.getMinutes() );
assertEquals( 12, deserializedDateTime.getSeconds() );
}
@Test
public void testAddSelectionListener() {
dateTime.addSelectionListener( mock( SelectionListener.class ) );
assertTrue( dateTime.isListening( SWT.Selection ) );
assertTrue( dateTime.isListening( SWT.DefaultSelection ) );
}
@Test
public void testRemoveSelectionListener() {
SelectionListener listener = mock( SelectionListener.class );
dateTime.addSelectionListener( listener );
dateTime.removeSelectionListener( listener );
assertFalse( dateTime.isListening( SWT.Selection ) );
assertFalse( dateTime.isListening( SWT.DefaultSelection ) );
}
@Test(expected = IllegalArgumentException.class)
public void testAddSelectionListenerWithNullArgument() {
dateTime.addSelectionListener( null );
}
@Test(expected = IllegalArgumentException.class)
public void testRemoveSelectionListenerWithNullArgument() {
dateTime.removeSelectionListener( null );
}
@Test
public void testBackgroundTransparency_inheritNone() {
IControlAdapter adapter = ControlUtil.getControlAdapter( dateTime );
shell.setBackgroundMode( SWT.INHERIT_NONE );
assertFalse( adapter.getBackgroundTransparency() );
}
@Test
public void testBackgroundTransparency_inheritDefault() {
IControlAdapter adapter = ControlUtil.getControlAdapter( dateTime );
shell.setBackgroundMode( SWT.INHERIT_DEFAULT );
assertFalse( adapter.getBackgroundTransparency() );
}
@Test
public void testBackgroundTransparency_inheritForce() {
IControlAdapter adapter = ControlUtil.getControlAdapter( dateTime );
shell.setBackgroundMode( SWT.INHERIT_FORCE );
assertTrue( adapter.getBackgroundTransparency() );
}
@Test
public void testGetAdapter_LCA() {
assertTrue( dateTime.getAdapter( WidgetLCA.class ) instanceof DateTimeLCA );
assertSame( dateTime.getAdapter( WidgetLCA.class ), dateTime.getAdapter( WidgetLCA.class ) );
}
private IDateTimeAdapter getAdapter( DateTime dateTime ) {
return dateTime.getAdapter( IDateTimeAdapter.class );
}
}