package com.googlecode.gwt.test;
import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerManager;
import org.junit.Before;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
public class CustomEventTest extends GwtTestTest {
private int addCount;
private ListModel listModel;
private int removeCount;
@Test
public void add() {
// Given
listModel.addItemAddedHandler(new ItemAddedHandler() {
public void onItemAdded(ItemAddedEvent event) {
addCount++;
assertThat(event.getListItem().getText()).isEqualTo("addedItem");
}
});
listModel.addItemRemovedHandler(new ItemRemovedHandler() {
public void onItemRemoved(ItemRemovedEvent event) {
fail("should not be called");
}
});
// When
listModel.addItem(new ListItem("addedItem"));
// Then
assertThat(addCount).isEqualTo(1);
assertThat(removeCount).isEqualTo(0);
}
@Before
public void beforeCustomEventTest() {
listModel = new ListModel();
addCount = 0;
removeCount = 0;
}
@Test
public void remove() {
// Given
final ListItem itemToRemove = new ListItem("itemToRemove");
listModel.addItem(itemToRemove);
listModel.addItemRemovedHandler(new ItemRemovedHandler() {
public void onItemRemoved(ItemRemovedEvent event) {
removeCount++;
assertThat(event.getListItem()).isEqualTo(itemToRemove);
}
});
listModel.addItemAddedHandler(new ItemAddedHandler() {
public void onItemAdded(ItemAddedEvent event) {
fail("should not be called");
}
});
// When
listModel.removeItem(itemToRemove);
// Then
assertThat(removeCount).isEqualTo(1);
}
private static interface ItemAddedHandler extends EventHandler {
void onItemAdded(ItemAddedEvent event);
}
private static interface ItemRemovedHandler extends EventHandler {
void onItemRemoved(ItemRemovedEvent event);
}
private static class ItemAddedEvent extends GwtEvent<ItemAddedHandler> {
private static final Type<ItemAddedHandler> TYPE = new Type<ItemAddedHandler>();
private final ListItem listItem;
public ItemAddedEvent(ListItem listItem) {
this.listItem = listItem;
}
public static Type<ItemAddedHandler> getType() {
return TYPE;
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<ItemAddedHandler> getAssociatedType() {
return TYPE;
}
/**
* @returns The item added to the model
*/
public ListItem getListItem() {
return listItem;
}
@Override
protected void dispatch(ItemAddedHandler handler) {
handler.onItemAdded(this);
}
}
private static class ItemRemovedEvent extends GwtEvent<ItemRemovedHandler> {
private static final Type<ItemRemovedHandler> TYPE = new Type<ItemRemovedHandler>();
private final ListItem listItem;
public ItemRemovedEvent(ListItem listItem) {
this.listItem = listItem;
}
public static Type<ItemRemovedHandler> getType() {
return TYPE;
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<ItemRemovedHandler> getAssociatedType() {
return TYPE;
}
public ListItem getListItem() {
return listItem;
}
@Override
protected void dispatch(ItemRemovedHandler handler) {
handler.onItemRemoved(this);
}
}
private static class ListItem {
private final String text;
public ListItem(String text) {
this.text = text;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
ListItem other = (ListItem) obj;
if (text == null) {
if (other.text != null) {
return false;
}
} else if (!text.equals(other.text)) {
return false;
}
return true;
}
public String getText() {
return text;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((text == null) ? 0 : text.hashCode());
return result;
}
}
private static class ListModel {
private final HandlerManager handlerManager = new HandlerManager(this);
private final List<ListItem> items = new ArrayList<ListItem>();
public void addItem(ListItem item) {
items.add(item);
handlerManager.fireEvent(new ItemAddedEvent(item));
}
public void addItemAddedHandler(ItemAddedHandler handler) {
handlerManager.addHandler(ItemAddedEvent.getType(), handler);
}
public void addItemRemovedHandler(ItemRemovedHandler handler) {
handlerManager.addHandler(ItemRemovedEvent.getType(), handler);
}
public void removeItem(ListItem item) {
items.remove(item);
handlerManager.fireEvent(new ItemRemovedEvent(item));
}
}
}