/**
* 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 org.waveprotocol.wave.client.widget.toolbar;
import static org.mockito.Mockito.mock;
import com.google.common.collect.ImmutableList;
import org.waveprotocol.wave.client.widget.toolbar.buttons.ToolbarButtonView;
import org.waveprotocol.wave.client.widget.toolbar.buttons.ToolbarClickButton;
import org.waveprotocol.wave.client.widget.toolbar.buttons.ToolbarToggleButton;
import junit.framework.TestCase;
import org.waveprotocol.wave.model.util.CollectionUtils;
import java.util.List;
/**
* Tests for {@link GroupingToolbar}.
*
* @author kalman@google.com (Benjamin Kalman)
*/
public final class GroupingToolbarTest extends TestCase {
/**
* A fake item to use in {@link PojoToolbar}.
*/
private interface FakeItem extends ToolbarButtonView {}
/**
* An in-memory fake toolbar.
*/
private static final class PojoToolbar implements GroupingToolbar.View {
private final List<ToolbarButtonView> items = CollectionUtils.newArrayList();
public List<ToolbarButtonView> getDisplayedItems() {
List<ToolbarButtonView> displayedItems = CollectionUtils.newArrayList();
for (ToolbarButtonView item : items) {
if (!(item instanceof FakeItem)) {
displayedItems.add(item);
}
}
return displayedItems;
}
@Override
public int indexOf(ToolbarButtonView button) {
return items.indexOf(button);
}
@Override
public ToolbarClickButton insertClickButton(int beforeIndex) {
ToolbarClickButton button = mock(ToolbarClickButton.class);
items.add(beforeIndex, button);
return button;
}
@Override
public SubmenuToolbarView insertSubmenu(int beforeIndex) {
SubmenuToolbarView submenu = mock(SubmenuToolbarView.class);
items.add(beforeIndex, submenu);
return submenu;
}
@Override
public ToolbarToggleButton insertToggleButton(int beforeIndex) {
ToolbarToggleButton button = mock(ToolbarToggleButton.class);
items.add(beforeIndex, button);
return button;
}
@Override
public ToolbarClickButton addClickButton() {
ToolbarClickButton button = mock(ToolbarClickButton.class);
items.add(button);
return button;
}
@Override
public ToolbarView addGroup() {
return new GroupingToolbar(this, addFakeItem());
}
private ToolbarButtonView addFakeItem() {
FakeItem fakeItem = mock(FakeItem.class);
items.add(fakeItem);
return fakeItem;
}
@Override
public SubmenuToolbarView addSubmenu() {
SubmenuToolbarView submenu = mock(SubmenuToolbarView.class);
items.add(submenu);
return submenu;
}
@Override
public ToolbarToggleButton addToggleButton() {
ToolbarToggleButton button = mock(ToolbarToggleButton.class);
items.add(button);
return button;
}
@Override
public void clearItems() {
items.clear();
}
}
private PojoToolbar toolbar;
@Override
public void setUp() {
toolbar = new PojoToolbar();
}
/**
* Tests that a single group has the buttons in the correct order.
*/
public void testSingleGroup() {
ToolbarView group = toolbar.addGroup();
ToolbarButtonView button1 = group.addClickButton();
ToolbarButtonView button2 = group.addToggleButton();
ToolbarButtonView button3 = group.addSubmenu();
assertEquals(toolbar.getDisplayedItems(), ImmutableList.of(button1, button2, button3));
}
/**
* Tests that a single group surrounded by non-grouped buttons are in the
* correct order.
*/
public void testSingleGroupWithOtherButtons() {
ToolbarButtonView button1 = toolbar.addClickButton();
ToolbarView group = toolbar.addGroup();
ToolbarButtonView button2 = group.addClickButton();
ToolbarButtonView button3 = group.addToggleButton();
ToolbarButtonView button4 = group.addSubmenu();
ToolbarButtonView button5 = toolbar.addToggleButton();
assertEquals(
toolbar.getDisplayedItems(), ImmutableList.of(button1, button2, button3, button4, button5));
}
/**
* Tests that multiple singleton groups have the buttons in the right order.
*/
public void testMultipleSingletonGroups() {
ToolbarButtonView button1 = toolbar.addGroup().addClickButton();
ToolbarButtonView button2 = toolbar.addGroup().addToggleButton();
ToolbarButtonView button3 = toolbar.addGroup().addSubmenu();
assertEquals(toolbar.getDisplayedItems(), ImmutableList.of(button1, button2, button3));
}
/**
* Tests that multiple adjacent groups have the buttons in the correct order
* when populated sequentially.
*/
public void testMultipleSequentialGroups() {
ToolbarView group1 = toolbar.addGroup();
ToolbarView group2 = toolbar.addGroup();
ToolbarView group3 = toolbar.addGroup();
ToolbarButtonView button11 = group1.addClickButton();
ToolbarButtonView button12 = group1.addToggleButton();
ToolbarButtonView button13 = group1.addSubmenu();
ToolbarButtonView button21 = group2.addClickButton();
ToolbarButtonView button22 = group2.addToggleButton();
ToolbarButtonView button23 = group2.addSubmenu();
ToolbarButtonView button31 = group3.addClickButton();
ToolbarButtonView button32 = group3.addToggleButton();
ToolbarButtonView button33 = group3.addSubmenu();
assertEquals(toolbar.getDisplayedItems(), ImmutableList.of(
button11,
button12,
button13,
button21,
button22,
button23,
button31,
button32,
button33));
}
/**
* Tests that multiple adjacent groups have the buttons in the correct order
* when populated "horizontally" (so to speak).
*/
public void testMultipleHorizontalGroups() {
ToolbarView group1 = toolbar.addGroup();
ToolbarView group2 = toolbar.addGroup();
ToolbarView group3 = toolbar.addGroup();
ToolbarButtonView button11 = group1.addClickButton();
ToolbarButtonView button21 = group2.addClickButton();
ToolbarButtonView button31 = group3.addClickButton();
ToolbarButtonView button12 = group1.addToggleButton();
ToolbarButtonView button22 = group2.addToggleButton();
ToolbarButtonView button32 = group3.addToggleButton();
ToolbarButtonView button13 = group1.addSubmenu();
ToolbarButtonView button23 = group2.addSubmenu();
ToolbarButtonView button33 = group3.addSubmenu();
assertEquals(toolbar.getDisplayedItems(), ImmutableList.of(
button11,
button12,
button13,
button21,
button22,
button23,
button31,
button32,
button33));
}
}