// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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.collide.client.search.awesomebox;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.util.JsonCollections;
import junit.framework.TestCase;
import elemental.html.Element;
/**
* Tests the managed selection list used by AwesomeBox sections.
*
*/
public class ManagedSelectionListTest extends TestCase {
private class StubSelectableElement implements ManagedSelectionList.SelectableElement {
private boolean isSelected = false;
@Override
public Element getElement() {
// we don't actually have to return a real element for testing
return null;
}
@Override
public boolean onSelected() {
isSelected = true;
return true;
}
@Override
public void onSelectionCleared() {
isSelected = false;
}
public boolean getIsSelected() {
return isSelected;
}
}
private JsonArray<StubSelectableElement> createStubs(int size) {
JsonArray<StubSelectableElement> elements = JsonCollections.createArray();
for (int i = 0; i < size; i++) {
elements.add(new StubSelectableElement());
}
return elements;
}
ManagedSelectionList<StubSelectableElement> elements =
new ManagedSelectionList<StubSelectableElement>();
public void testNoSelectionWhenEmpty() {
assertFalse(elements.hasSelection());
assertEquals(0, elements.size());
elements.add(new StubSelectableElement());
assertFalse(elements.hasSelection());
elements.asJsonArray().clear();
assertFalse(elements.hasSelection());
}
public void testSelectionNextAndPrev() {
JsonArray<StubSelectableElement> stubs = createStubs(5);
elements.asJsonArray().addAll(stubs);
assertFalse(elements.hasSelection());
elements.moveSelection(true);
assertTrue(elements.hasSelection());
assertSame(stubs.get(0), elements.getSelectedElement());
assertTrue(stubs.get(0).getIsSelected());
elements.moveSelection(true);
elements.moveSelection(true);
elements.moveSelection(true);
assertTrue(elements.hasSelection());
assertFalse(stubs.get(0).getIsSelected());
assertTrue(stubs.get(3).getIsSelected());
assertSame(stubs.get(3), elements.getSelectedElement());
elements.moveSelection(false);
elements.moveSelection(false);
elements.moveSelection(false);
assertTrue(elements.hasSelection());
assertSame(stubs.get(0), elements.getSelectedElement());
assertTrue(stubs.get(0).getIsSelected());
assertFalse(stubs.get(3).getIsSelected());
}
public void testSelectFirstAndLastItem() {
JsonArray<StubSelectableElement> stubs = createStubs(5);
elements.asJsonArray().addAll(stubs);
elements.selectFirst();
assertSame(stubs.get(0), elements.getSelectedElement());
assertTrue(stubs.get(0).getIsSelected());
elements.selectLast();
assertSame(stubs.get(4), elements.getSelectedElement());
assertTrue(stubs.get(4).getIsSelected());
}
public void testClearSelection() {
JsonArray<StubSelectableElement> stubs = createStubs(5);
elements.asJsonArray().addAll(stubs);
elements.selectLast();
assertTrue(elements.hasSelection());
elements.clearSelection();
assertFalse(elements.hasSelection());
}
public void testSelectIndex() {
JsonArray<StubSelectableElement> stubs = createStubs(5);
elements.asJsonArray().addAll(stubs);
elements.selectIndex(3);
assertTrue(elements.hasSelection());
assertSame(stubs.get(3), elements.getSelectedElement());
try {
elements.selectIndex(10);
fail("Didn't throw exception when index was out of bounds");
} catch (IndexOutOfBoundsException ex) {
// pass test
}
try {
elements.selectIndex(-1);
fail("Didn't throw exception when index was out of bounds");
} catch (IndexOutOfBoundsException ex) {
// pass test
}
}
public void testNoMoveSelectionAtBoundaries() {
JsonArray<StubSelectableElement> stubs = createStubs(5);
elements.asJsonArray().addAll(stubs);
elements.selectLast();
assertFalse(elements.selectNext());
elements.selectFirst();
assertFalse(elements.selectPrevious());
}
}