/*******************************************************************************
* Copyright (c) 2009 Matthew Hall 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:
* Matthew Hall - initial API and implementation (bug 293508)
*******************************************************************************/
package org.eclipse.nebula.widgets.radiogroup;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Widget;
import junit.framework.TestCase;
public class RadioGroupTest extends TestCase {
static class MyListener implements Listener {
private List events = new ArrayList();
Event lastEvent;
public void handleEvent(Event e) {
events.add(e);
lastEvent = e;
}
int eventCount() {
return events.size();
}
Event event(int i) {
return (Event) events.get(i);
}
}
private Display display;
private boolean createdDisplay = false;
private Composite composite;
private RadioGroup group;
private RadioItem item;
private MyListener listener;
protected void setUp() throws Exception {
super.setUp();
display = Display.getCurrent();
if( display == null ){
display = new Display();
createdDisplay = true;
}
composite = new Shell(display);
composite.setLayout(new FillLayout());
listener = new MyListener();
}
protected void tearDown() throws Exception {
composite.dispose();
if( createdDisplay){
display.dispose();
}
super.tearDown();
}
public void testConstructor_NullParent() {
try {
new RadioGroup(null, 0);
fail("Excepted exception");
} catch (IllegalArgumentException expected) {
}
}
public void testDispose_DisposesItems() {
createGroup();
createItem();
item.addListener(SWT.Dispose, listener);
group.dispose();
assertEventType(SWT.Dispose, listener.lastEvent);
assertTrue(item.isDisposed());
}
private static void assertEventType(int eventType, Event event) {
assertNotNull(event);
assertEquals(event.type, eventType);
}
private void createGroup() {
group = new RadioGroup(composite, SWT.NONE);
}
private void createItem() {
item = new RadioItem(group, SWT.NONE);
}
public void testDispose_DisposesItemButtons() {
createGroup();
createItem();
Button button = item.getButton();
button.addListener(SWT.Dispose, listener);
group.dispose();
assertEventType(SWT.Dispose, listener.lastEvent);
assertTrue(button.isDisposed());
}
public void testDisposeSelectedItem_FiresDeselectEvent() {
createGroup();
createItem();
group.setSelection(item);
group.addListener(SWT.Selection, listener);
item.dispose();
assertEventType(SWT.Selection, listener.lastEvent);
assertNull(group.getSelection());
}
public void testGetItems_DefensiveCopy() {
createGroup();
createItem();
RadioItem[] items = group.getItems();
items[0] = null;
items = group.getItems();
assertEquals(1, items.length);
assertSame(item, items[0]);
}
public void testSelect_FiresSelectionEvent() {
createGroup();
createItem();
group.addListener(SWT.Selection, listener);
group.select(0);
assertEventType(SWT.Selection, listener.lastEvent);
assertSame(item, group.getSelection());
}
public void testDeselectAll_FiresSelectionEvent() {
createGroup();
createItem();
group.select(0);
group.addListener(SWT.Selection, listener);
group.deselectAll();
assertEventType(SWT.Selection, listener.lastEvent);
assertNull(group.getSelection());
}
public void testSetSelection_NullToItem() {
createGroup();
createItem();
group.addListener(SWT.Selection, listener);
group.setSelection(item);
assertEventType(SWT.Selection, listener.lastEvent);
assertSame(item, group.getSelection());
}
public void testSetSelection_ItemToNull() {
createGroup();
createItem();
group.setSelection(item);
group.addListener(SWT.Selection, listener);
group.setSelection(null);
assertEventType(SWT.Selection, listener.lastEvent);
assertNull(group.getSelection());
}
public void testSetSelection_NullToNull() {
createGroup();
createItem();
group.addListener(SWT.Selection, listener);
group.setSelection(null);
assertEquals(0, listener.events.size());
}
public void testSetSelection_ItemToSameItem() {
createGroup();
createItem();
group.setSelection(item);
group.addListener(SWT.Selection, listener);
group.setSelection(item);
assertEquals(0, listener.events.size());
}
public void testSetSelection_ItemToDifferentItem() {
createGroup();
createItem();
group.setSelection(item);
RadioItem item2 = new RadioItem(group, SWT.NONE);
group.addListener(SWT.Selection, listener);
group.setSelection(item2);
assertEquals(2, listener.eventCount());
assertEvent(SWT.Selection, null, -1, listener.event(0));
assertEvent(SWT.Selection, item2, 1, listener.event(1));
}
private void assertEvent(int eventType, RadioItem item, int index,
Event event) {
assertNotNull(event);
assertEquals(eventType, event.type);
assertSame(item, event.item);
assertEquals(index, event.index);
}
public void testClickSelection_NullToItem() {
createGroup();
createItem();
group.addListener(SWT.Selection, listener);
simulateClick(item);
assertEquals(1, listener.eventCount());
assertEvent(SWT.Selection, item, 0, listener.lastEvent);
}
private void simulateClick(RadioItem item) {
simulateDeselect(group.getSelection());
Button button = item.getButton();
button.setSelection(true);
button.notifyListeners(SWT.Selection, null);
}
private void simulateDeselect(RadioItem item) {
if (item == null)
return;
if (!item.isSelected())
return;
Button button = item.getButton();
button.setSelection(false);
button.notifyListeners(SWT.Selection, null);
}
public void testClickSelection_ItemToItem() {
createGroup();
createItem();
group.setSelection(item);
RadioItem item2 = new RadioItem(group, SWT.NONE);
group.addListener(SWT.Selection, listener);
simulateClick(item2);
assertFalse(item.isSelected());
assertTrue(item2.isSelected());
assertEquals(2, listener.eventCount());
assertEvent(SWT.Selection, null, -1, listener.event(0));
assertEvent(SWT.Selection, item2, 1, listener.event(1));
}
public void testNewItemWithIndex() {
createGroup();
RadioItem item1 = new RadioItem(group, SWT.NONE);
RadioItem item2 = new RadioItem(group, SWT.NONE, 0);
RadioItem item3 = new RadioItem(group, SWT.NONE, -1);
RadioItem[] items = group.getItems();
RadioItem[] expectedItems = { item2, item1, item3 };
assertEquals(Arrays.asList(expectedItems), Arrays.asList(items));
// TODO getChildren will be changed to return empty array at some point
Control[] buttons = group.getChildren();
Control[] expectedButtons = { item2.getButton(), item1.getButton(),
item3.getButton() };
assertEquals(Arrays.asList(expectedButtons), Arrays.asList(buttons));
}
public void testConstructor_FlatStyle() {
group = new RadioGroup(composite, SWT.FLAT);
assertFlatStyle(group);
createItem();
assertFlatStyle(item.getButton());
}
private void assertFlatStyle(Widget widget) {
assertTrue((widget.getStyle() & SWT.FLAT) != 0);
}
}