/* * 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. */ static class MockSelectionChangeHandler implements SelectionChangeEvent.Handler { private boolean eventFired; /** * Assert that a {@link SelectionChangeEvent} was fired and clear the * boolean. * * @param expected the expected value */ public void assertEventFired(boolean expected) { assertEquals(expected, eventFired); eventFired = false; } public void onSelectionChange(SelectionChangeEvent event) { assertFalse(eventFired); 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); } }