/******************************************************************************* * Copyright (c) 2009 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.custom; import java.util.ArrayList; import junit.framework.TestCase; import org.eclipse.rwt.Fixture; import org.eclipse.rwt.graphics.Graphics; import org.eclipse.rwt.lifecycle.PhaseId; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.*; /* * Note: * As long as CCombo uses a ListModel to maintain its items and selection, * most of the add/remove/getItem.../selection test cases can be omitted. * They are covered in List_Test */ public class CCombo_Test extends TestCase { private boolean listenerCalled; public void testDeselect() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "item1" ); combo.add( "item2" ); combo.add( "item3" ); // deselect the currently selected index/item combo.select( 1 ); combo.deselect( 1 ); assertEquals( -1, combo.getSelectionIndex() ); // deselect works only if the argument matches the currently selected index // (as far as I understand SWT doc/implementation...) combo.select( 1 ); combo.deselect( 0 ); assertEquals( 1, combo.getSelectionIndex() ); } public void testGetText() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.READ_ONLY ); combo.add( "item1" ); combo.add( "item2" ); combo.add( "item3" ); // test get text without setting an explicit selection assertEquals( combo.getText(), "" ); // test after selection combo.select( 2 ); assertEquals( combo.getText(), "item3" ); // test after deselection combo.deselectAll(); assertEquals( combo.getText(), "" ); // testing editable CCombo combo = new CCombo( shell, SWT.NONE ); String[] cases = { "", "fred", "fredfred" }; for( int i = 0; i < cases.length; i++ ) { combo.setText( cases[ i ] ); assertTrue( ":a:" + String.valueOf( i ), cases[ i ].equals( combo.getText() ) ); } } public void testTextLimit() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.setTextLimit( -1 ); assertEquals( Combo.LIMIT, combo.getTextLimit() ); combo.setTextLimit( -20 ); assertEquals( Combo.LIMIT, combo.getTextLimit() ); combo.setTextLimit( -12345 ); assertEquals( Combo.LIMIT, combo.getTextLimit() ); combo.setTextLimit( 20 ); assertEquals( 20, combo.getTextLimit() ); try { combo.setTextLimit( 0 ); fail( "Must not allow to set textLimit to zero" ); } catch( IllegalArgumentException e ) { // as expected } combo.setText( "Sample_text" ); combo.setTextLimit( 6 ); assertEquals( "Sample_text", combo.getText() ); combo.setText( "Other_text" ); assertEquals( "Other_", combo.getText() ); } public void testListVisible() { Display display = new Display(); Composite shell = new Shell( display ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.setListVisible( true ); assertTrue( combo.getListVisible() ); combo.setListVisible( false ); assertFalse( combo.getListVisible() ); } public void testSelection() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); // test clearSelection combo.setText( "abc" ); combo.setSelection( new Point( 1, 3 ) ); combo.clearSelection(); assertEquals( new Point( 0, 0 ), combo.getSelection() ); // test setSelection( a, b ), a < b combo.clearSelection(); combo.setText( "test text" ); combo.setSelection( new Point( 3, 6 ) ); assertEquals( new Point( 3, 6 ), combo.getSelection() ); // test setSelection( a, b ), a > b combo.clearSelection(); combo.setSelection( new Point( 5, 2 ) ); assertEquals( new Point( 2, 5 ), combo.getSelection() ); } public void testIndexOf() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.READ_ONLY ); combo.add( "string0" ); try { combo.indexOf( null ); fail( "No exception thrown for string == null" ); } catch( IllegalArgumentException e ) { } combo.removeAll(); int number = 5; for( int i = 0; i < number; i++ ) { combo.add( "fred" + i ); } for( int i = 0; i < number; i++ ) { assertEquals( i, combo.indexOf( "fred" + i ) ); } for( int i = 0; i < number; i++ ) { combo.add( "fred" + i ); } combo.removeAll(); for( int i = 0; i < number; i++ ) { assertEquals( -1, combo.indexOf( "fred" + i ) ); } for( int i = 0; i < number; i++ ) { combo.add( "fred" + i ); } combo.remove( "fred3" ); for( int i = 0; i < 3; i++ ) { assertEquals( i, combo.indexOf( "fred" + i ) ); } assertEquals( -1, combo.indexOf( "fred3" ) ); for( int i = 4; i < number; i++ ) { assertEquals( i - 1, combo.indexOf( "fred" + i ) ); } combo.removeAll(); for( int i = 0; i < number; i++ ) { combo.add( "fred" + i ); } combo.remove( 2 ); for( int i = 0; i < 2; i++ ) { assertEquals( i, combo.indexOf( "fred" + i ) ); } assertEquals( -1, combo.indexOf( "fred2" ) ); for( int i = 3; i < number; i++ ) { assertEquals( i - 1, combo.indexOf( "fred" + i ) ); } } public void testIndexOfI() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.READ_ONLY ); combo.add( "string0" ); try { combo.indexOf( null ); fail( "No exception thrown for string == null" ); } catch( IllegalArgumentException e ) { } assertEquals( -1, combo.indexOf( "string0", -1 ) ); combo.removeAll(); int number = 5; for( int i = 0; i < number; i++ ) { combo.add( "fred" + i ); } for( int i = 0; i < number; i++ ) { assertTrue( ":a:" + i, combo.indexOf( "fred" + i, 0 ) == i ); } for( int i = 0; i < number; i++ ) { assertTrue( ":b:" + i, combo.indexOf( "fred" + i, i + 1 ) == -1 ); } for( int i = 0; i < number; i++ ) { combo.add( "fred" + i ); } for( int i = 0; i < 3; i++ ) { assertTrue( ":a:" + i, combo.indexOf( "fred" + i, 0 ) == i ); } for( int i = 3; i < number; i++ ) { assertTrue( ":b:" + i, combo.indexOf( "fred" + i, 3 ) == i ); } for( int i = 0; i < number; i++ ) { assertTrue( ":b:" + i, combo.indexOf( "fred" + i, i ) == i ); } } public void testSetText() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); try { combo.setText( null ); fail( "No exception thrown for text == null" ); } catch( IllegalArgumentException e ) { } String[] cases = { "", "fred", "fred0" }; for( int i = 0; i < cases.length; i++ ) { combo.setText( cases[ i ] ); assertTrue( ":a:" + i, combo.getText().equals( cases[ i ] ) ); } for( int i = 0; i < 5; i++ ) { combo.add( "fred" ); } for( int i = 0; i < cases.length; i++ ) { combo.setText( cases[ i ] ); assertTrue( ":b:" + i, combo.getText().equals( cases[ i ] ) ); } for( int i = 0; i < 5; i++ ) { combo.add( "fred" + i ); } for( int i = 0; i < cases.length; i++ ) { combo.setText( cases[ i ] ); assertTrue( ":c:" + i, combo.getText().equals( cases[ i ] ) ); } } public void testSelect() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.select( 0 ); assertEquals( "test", combo.getText() ); combo.removeAll(); assertEquals( "", combo.getText() ); combo.add( "foo" ); combo.select( 0 ); assertEquals( "foo", combo.getText() ); } public void testSelect2() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.select( 0 ); assertEquals( "test", combo.getText() ); combo.remove( 0 ); combo.add( "foo" ); combo.select( 0 ); assertEquals( "foo", combo.getText() ); combo = new CCombo( shell, SWT.READ_ONLY ); combo.add( "test" ); combo.select( 0 ); assertEquals( "test", combo.getText() ); combo.remove( 0 ); assertEquals( "", combo.getText() ); combo.add( "foo" ); combo.select( 0 ); assertEquals( "foo", combo.getText() ); } public void testSelect3() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.setText( "foo" ); combo.removeAll(); assertEquals( "", combo.getText() ); combo = new CCombo( shell, SWT.READ_ONLY ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.setText( "foo" ); combo.removeAll(); assertEquals( "", combo.getText() ); combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.select( 1 ); combo.remove( 1 ); assertEquals( "", combo.getText() ); combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.select( 1 ); combo.remove( "test1" ); assertEquals( "", combo.getText() ); combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.select( 1 ); combo.setText( "foo" ); combo.remove( 1 ); assertEquals( "foo", combo.getText() ); combo.removeAll(); combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.add( "test3" ); combo.select( 1 ); combo.remove( 1, 3 ); assertEquals( "", combo.getText() ); } public void testSelectWithInvalidIndex() { Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.select( 1 ); assertEquals( 1, combo.getSelectionIndex() ); assertEquals( "test1", combo.getText() ); combo.select( -2 ); assertEquals( 1, combo.getSelectionIndex() ); assertEquals( "test1", combo.getText() ); combo.select( 10 ); assertEquals( 1, combo.getSelectionIndex() ); assertEquals( "test1", combo.getText() ); combo.select( -1 ); assertEquals( -1, combo.getSelectionIndex() ); assertEquals( "", combo.getText() ); } public void testSetTextSelect() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test2" ); combo.add( "test3" ); combo.setText( "foo" ); combo.select( 1 ); assertEquals( "test2", combo.getText() ); } public void testRemoveAll() { Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "1" ); combo.add( "2" ); combo.removeAll(); assertEquals( 0, combo.getItems().length ); } public void testDispose() { Display display = new Display(); Composite shell = new Shell( display ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.dispose(); assertTrue( combo.isDisposed() ); } public void testAddModifyListener() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Composite shell = new Shell( display ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.setItems (new String [] {"A-1", "B-1", "C-1"}); ModifyListener listener = new ModifyListener() { public void modifyText( final ModifyEvent event ) { listenerCalled = true; } }; try { combo.addModifyListener( null ); fail( "removeModifyListener must not allow null listener" ); } catch( IllegalArgumentException e ) { // expected } // test whether all content modifying API methods send a Modify event combo.addModifyListener( listener ); listenerCalled = false; combo.setText( "new text" ); assertTrue( listenerCalled ); listenerCalled = false; // select and deselect item(s) test cases combo.select( 1 ); assertTrue( listenerCalled ); listenerCalled = false; combo.deselect( 1 ); assertTrue( listenerCalled ); listenerCalled = false; combo.select( 0 ); assertTrue( listenerCalled ); listenerCalled = false; combo.deselectAll(); assertTrue( listenerCalled ); // remove item(s) test cases listenerCalled = false; combo.select(0); combo.remove(0); assertTrue( listenerCalled ); listenerCalled = false; combo.setItems (new String [] {"A-1", "B-1", "C-1"}); combo.select(0); combo.remove("A-1"); assertTrue( listenerCalled ); listenerCalled = false; combo.setItems (new String [] {"A-1", "B-1", "C-1"}); combo.select(0); combo.remove(0,1); assertTrue( listenerCalled ); listenerCalled = false; combo.setItems (new String [] {"A-1", "B-1", "C-1"}); combo.select(0); combo.removeAll(); assertTrue( listenerCalled ); // listenerCalled = false; combo.removeModifyListener( listener ); // cause to call the listener. combo.setText( "line" ); assertFalse( listenerCalled ); try { combo.removeModifyListener( null ); fail( "removeModifyListener must not allow null listener" ); } catch( IllegalArgumentException e ) { // expected } } public void testAddModifyListenerReadOnly() { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Composite shell = new Shell( display ); CCombo combo = new CCombo( shell, SWT.READ_ONLY ); combo.setItems (new String [] {"A-1", "B-1", "C-1"}); ModifyListener listener = new ModifyListener() { public void modifyText( final ModifyEvent event ) { listenerCalled = true; } }; try { combo.addModifyListener( null ); fail( "removeModifyListener must not allow null listener" ); } catch( IllegalArgumentException e ) { // expected } // test whether all content modifying API methods send a Modify event combo.addModifyListener( listener ); listenerCalled = false; // select and deselect item(s) test cases combo.select( 1 ); assertTrue( listenerCalled ); listenerCalled = false; combo.deselect( 1 ); assertTrue( listenerCalled ); listenerCalled = false; combo.select( 0 ); assertTrue( listenerCalled ); listenerCalled = false; combo.deselectAll(); assertTrue( listenerCalled ); // remove item(s) test cases listenerCalled = false; combo.select(0); combo.remove(0); assertTrue( listenerCalled ); listenerCalled = false; combo.setItems (new String [] {"A-1", "B-1", "C-1"}); combo.select(0); combo.remove("A-1"); assertTrue( listenerCalled ); listenerCalled = false; combo.setItems (new String [] {"A-1", "B-1", "C-1"}); combo.select(0); combo.remove(0,1); assertTrue( listenerCalled ); listenerCalled = false; combo.setItems (new String [] {"A-1", "B-1", "C-1"}); combo.select(0); combo.removeAll(); assertTrue( listenerCalled ); // listenerCalled = false; combo.removeModifyListener( listener ); // cause to call the listener. combo.select( 2 ); assertFalse( listenerCalled ); try { combo.removeModifyListener( null ); fail( "removeModifyListener must not allow null listener" ); } catch( IllegalArgumentException e ) { // expected } } public void testVerifyEvent() { VerifyListener verifyListener; Fixture.fakePhase( PhaseId.PROCESS_ACTION ); final java.util.List log = new ArrayList(); Display display = new Display(); Shell shell = new Shell( display ); final CCombo combo = new CCombo( shell, SWT.NONE ); combo.addModifyListener( new ModifyListener() { public void modifyText( final ModifyEvent event ) { log.add( event ); } } ); combo.addVerifyListener( new VerifyListener() { public void verifyText( final VerifyEvent event ) { log.add( event ); } } ); // VerifyEvent is also sent when setting text to the already set value log.clear(); combo.setText( "" ); assertEquals( 2, log.size() ); assertEquals( VerifyEvent.class, log.get( 0 ).getClass() ); assertEquals( ModifyEvent.class, log.get( 1 ).getClass() ); // Test verifyListener that prevents (doit=false) change combo.setText( "" ); log.clear(); verifyListener = new VerifyListener() { public void verifyText( final VerifyEvent event ) { event.doit = false; } }; combo.addVerifyListener( verifyListener ); combo.setText( "other" ); assertEquals( 1, log.size() ); assertEquals( VerifyEvent.class, log.get( 0 ).getClass() ); assertEquals( "", combo.getText() ); combo.removeVerifyListener( verifyListener ); // Test verifyListener that manipulates text combo.setText( "" ); log.clear(); verifyListener = new VerifyListener() { public void verifyText( final VerifyEvent event ) { event.text = "manipulated"; } }; combo.addVerifyListener( verifyListener ); combo.setText( "other" ); assertEquals( 2, log.size() ); assertEquals( VerifyEvent.class, log.get( 0 ).getClass() ); assertEquals( ModifyEvent.class, log.get( 1 ).getClass() ); assertEquals( "manipulated", combo.getText() ); combo.removeVerifyListener( verifyListener ); // Ensure that VerifyEvent#start and #end denote the positions of the old // text and #text denotes the text to be set String oldText = "old"; combo.setText( oldText ); log.clear(); String newText = oldText + "changed"; combo.setText( newText ); assertEquals( 2, log.size() ); assertEquals( VerifyEvent.class, log.get( 0 ).getClass() ); VerifyEvent verifyEvent = ( VerifyEvent )log.get( 0 ); assertEquals( 0, verifyEvent.start ); assertEquals( oldText.length(), verifyEvent.end ); assertEquals( newText, verifyEvent.text ); assertEquals( ModifyEvent.class, log.get( 1 ).getClass() ); // Ensure that VerifyEvent#text denotes the text to be set // and not the cut by textLimit one combo.setTextLimit( 5 ); String sampleText = "sample_text"; log.clear(); combo.setText( sampleText ); assertEquals( 2, log.size() ); assertEquals( VerifyEvent.class, log.get( 0 ).getClass() ); verifyEvent = ( VerifyEvent )log.get( 0 ); assertEquals( sampleText, verifyEvent.text ); } public void testVisibleItemCount() { Display display = new Display(); Composite shell = new Shell( display ); CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "1" ); combo.add( "2" ); combo.add( "3" ); int visibleItemCount = combo.getVisibleItemCount(); combo.setVisibleItemCount( -2 ); assertEquals( visibleItemCount, combo.getVisibleItemCount() ); combo.setVisibleItemCount( 2 ); assertEquals( 2, combo.getVisibleItemCount() ); combo.setVisibleItemCount( 3 ); assertEquals( 3, combo.getVisibleItemCount() ); } public void testComputeSize() throws Exception { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Composite shell = new Shell( display, SWT.NONE ); CCombo combo = new CCombo( shell, SWT.NONE ); Point expected = new Point( 64, 17 ); assertEquals( expected, combo.computeSize( SWT.DEFAULT, SWT.DEFAULT ) ); combo = new CCombo( shell, SWT.BORDER ); expected = new Point( 66, 19 ); assertEquals( expected, combo.computeSize( SWT.DEFAULT, SWT.DEFAULT ) ); combo = new CCombo( shell, SWT.FLAT ); expected = new Point( 64, 17 ); assertEquals( expected, combo.computeSize( SWT.DEFAULT, SWT.DEFAULT ) ); combo = new CCombo( shell, SWT.NONE ); combo.add( "1" ); combo.add( "22" ); combo.add( "333" ); expected = new Point( 47, 17 ); assertEquals( expected, combo.computeSize( SWT.DEFAULT, SWT.DEFAULT ) ); expected = new Point( 100, 100 ); assertEquals( expected, combo.computeSize( 100, 100 ) ); } public void testSetTextAndSelection() throws Exception { Fixture.fakePhase( PhaseId.PROCESS_ACTION ); Display display = new Display(); Shell shell = new Shell( display, SWT.NONE ); final CCombo combo = new CCombo( shell, SWT.NONE ); combo.add( "test" ); combo.add( "test1" ); combo.add( "test2" ); combo.addVerifyListener( new VerifyListener() { public void verifyText( VerifyEvent event ) { event.text = event.text + "2"; } } ); combo.setText( "test" ); assertEquals( 2, combo.getSelectionIndex() ); } public void testGetTextHeight() { Display display = new Display(); Shell shell = new Shell( display ); CCombo combo = new CCombo( shell, SWT.NONE ); // default theme font is 11px assertEquals( 13, combo.getTextHeight() ); combo.setFont( Graphics.getFont( "Helvetica", 12, SWT.NORMAL ) ); assertEquals( 14, combo.getTextHeight() ); combo.setFont( null ); assertEquals( 13, combo.getTextHeight() ); } protected void setUp() throws Exception { Fixture.setUp(); } protected void tearDown() throws Exception { Fixture.tearDown(); } }