blob: 3b98b65823adc380633ef5c95e4c3cc49a27af93 [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.view.client;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.user.client.Timer;
import com.google.gwt.view.client.SelectionModel.AbstractSelectionModel;
/**
* Tests for {@link AbstractSelectionModel}.
*/
public class AbstractSelectionModelTest extends GWTTestCase {
/**
* A mock {@link SelectionChangeEvent.Handler} used for testing.
*/
private static class MockSelectionChangeHandler
implements SelectionChangeEvent.Handler {
private boolean eventFired;
public void assertEventFired(boolean expected) {
assertEquals(expected, eventFired);
}
public void onSelectionChange(SelectionChangeEvent event) {
eventFired = true;
}
}
/**
* A mock {@link SelectionModel} used for testing.
*
* @param <T> the data type
*/
private static class MockSelectionModel<T> extends AbstractSelectionModel<T> {
public MockSelectionModel(ProvidesKey<T> keyProvider) {
super(keyProvider);
}
public boolean isSelected(T object) {
return false;
}
public void setSelected(T object, boolean selected) {
scheduleSelectionChangeEvent();
}
}
@Override
public String getModuleName() {
return "com.google.gwt.view.View";
}
public void testFireSelectionChangeEvent() {
AbstractSelectionModel<String> model = createSelectionModel(null);
MockSelectionChangeHandler handler = new MockSelectionChangeHandler();
model.addSelectionChangeHandler(handler);
model.setSelected("test", true);
model.fireSelectionChangeEvent();
handler.assertEventFired(true);
}
/**
* Test that resolving changes doesn't prevent an event from firing.
*/
public void testResolveChanges() {
AbstractSelectionModel<String> model = createSelectionModel(null);
final MockSelectionChangeHandler handler = new MockSelectionChangeHandler();
model.addSelectionChangeHandler(handler);
model.setSelected("test1", true);
handler.assertEventFired(false);
model.isSelected("test1");
new Timer() {
@Override
public void run() {
handler.assertEventFired(true);
finishTest();
}
}.schedule(1000);
}
public void testScheduleSelectionChangeEvent() {
AbstractSelectionModel<String> model = createSelectionModel(null);
final MockSelectionChangeHandler handler = new MockSelectionChangeHandler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
// We should only see one event fired.
assertEventFired(false);
super.onSelectionChange(event);
}
};
model.addSelectionChangeHandler(handler);
// Schedule the event multiple times.
delayTestFinish(2000);
model.setSelected("test1", true);
model.scheduleSelectionChangeEvent();
model.setSelected("test2", true);
model.scheduleSelectionChangeEvent();
model.setSelected("test3", true);
model.scheduleSelectionChangeEvent();
model.setSelected("test4", true);
model.scheduleSelectionChangeEvent();
model.setSelected("test5", true);
model.scheduleSelectionChangeEvent();
model.setSelected("test6", true);
model.scheduleSelectionChangeEvent();
handler.assertEventFired(false);
new Timer() {
@Override
public void run() {
handler.assertEventFired(true);
finishTest();
}
}.schedule(1000);
}
public void testSetKeyProvider() {
AbstractSelectionModel<String> model = createSelectionModel(null);
// By default, use the object as a key.
assertNull(model.getKeyProvider());
assertEquals("test", model.getKey("test"));
assertEquals(null, model.getKey(null));
// Defer to the key provider if one is set.
ProvidesKey<String> keyProvider = new ProvidesKey<String>() {
public Object getKey(String item) {
return item == null ? item : item.toUpperCase();
}
};
model = createSelectionModel(keyProvider);
assertEquals(keyProvider, model.getKeyProvider());
assertEquals("TEST", model.getKey("test"));
assertEquals(null, model.getKey(null));
}
protected AbstractSelectionModel<String> createSelectionModel(ProvidesKey<String> keyProvider) {
return new MockSelectionModel<String>(keyProvider);
}
}