// 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.client.search.awesomebox.AwesomeBox.AwesomeBoxSection;
import com.google.collide.client.search.awesomebox.AwesomeBox.SectionIterationCallback;
import com.google.collide.client.search.awesomebox.AwesomeBoxModel.ContextChangeListener;
import junit.framework.TestCase;
/**
* Test the context and model of the AwesomeBox.
*/
public class AwesomeBoxModelAndContextTest extends TestCase {
private AwesomeBoxModel model;
private AwesomeBoxContext testContext;
private class StubContextChangeListener implements ContextChangeListener {
private int calledCount = 0;
@Override
public void onContextChanged(boolean contextAlreadyActive) {
if (!contextAlreadyActive) {
calledCount++;
}
}
public int getCalledCount() {
return calledCount;
}
}
@Override
public void setUp() {
model = new AwesomeBoxModel();
testContext = new AwesomeBoxContext(new AwesomeBoxContext.Builder());
}
@Override
public void tearDown() {
AwesomeBoxContext.DEFAULT.clearSections();
}
public void testDefaultContextEmpty() {
assertEquals(0, AwesomeBoxContext.DEFAULT.size());
}
public void testSectionsCanBeAdded() {
AwesomeBoxContext.DEFAULT.addSection(new StubAwesomeBoxSection());
AwesomeBoxContext.DEFAULT.addSection(new StubAwesomeBoxSection());
AwesomeBoxContext.DEFAULT.addSection(new StubAwesomeBoxSection());
assertEquals(3, AwesomeBoxContext.DEFAULT.size());
}
public void testChangeContextsReturnsRightSections() {
StubAwesomeBoxSection defaultSection = new StubAwesomeBoxSection();
StubAwesomeBoxSection testSection1 = new StubAwesomeBoxSection();
StubAwesomeBoxSection testSection2 = new StubAwesomeBoxSection();
AwesomeBoxContext.DEFAULT.addSection(defaultSection);
testContext.addSection(testSection1);
testContext.addSection(testSection2);
assertSame(defaultSection, model.getContext().getSections().get(0));
model.changeContext(testContext);
assertSame(testSection1, model.getContext().getSections().get(0));
assertSame(testSection2, model.getContext().getSections().get(1));
}
public void testTrySetSelection() {
StubAwesomeBoxSection section1 = new StubAwesomeBoxSection(true);
StubAwesomeBoxSection section2 = new StubAwesomeBoxSection(false);
AwesomeBoxContext.DEFAULT.addSection(section1);
AwesomeBoxContext.DEFAULT.addSection(section2);
assertTrue(model.trySetSelection(section1, true));
assertFalse(model.trySetSelection(section2, true));
}
public void testGetSetSelection() {
StubAwesomeBoxSection section1 = new StubAwesomeBoxSection();
StubAwesomeBoxSection section2 = new StubAwesomeBoxSection(false);
AwesomeBoxContext.DEFAULT.addSection(section1);
AwesomeBoxContext.DEFAULT.addSection(section2);
model.setSelection(section1);
assertSame(section1, model.getSelection(AwesomeBoxModel.SelectMode.DEFAULT));
}
public void testSelectFirstItem() {
StubAwesomeBoxSection section1 = new StubAwesomeBoxSection(false);
StubAwesomeBoxSection section2 = new StubAwesomeBoxSection(false);
StubAwesomeBoxSection section3 = new StubAwesomeBoxSection(true);
AwesomeBoxContext.DEFAULT.addSection(section1);
AwesomeBoxContext.DEFAULT.addSection(section2);
AwesomeBoxContext.DEFAULT.addSection(section3);
model.selectFirstItem();
assertSame(section3, model.getSelection(AwesomeBoxModel.SelectMode.DEFAULT));
assertFalse(section1.getHasSelection());
assertFalse(section2.getHasSelection());
assertTrue(section3.getHasSelection());
}
public void testIteration() {
final StubAwesomeBoxSection section1 = new StubAwesomeBoxSection(false);
final StubAwesomeBoxSection section2 = new StubAwesomeBoxSection(false);
final StubAwesomeBoxSection section3 = new StubAwesomeBoxSection(true);
AwesomeBoxContext.DEFAULT.addSection(section1);
AwesomeBoxContext.DEFAULT.addSection(section2);
AwesomeBoxContext.DEFAULT.addSection(section3);
// backward not quiting iteration
model.iterateFrom(section3, false, new SectionIterationCallback() {
@Override
public boolean onIteration(AwesomeBoxSection section) {
StubAwesomeBoxSection stub = (StubAwesomeBoxSection) section;
stub.wasIterated();
return true;
}
});
assertEquals(1, section1.getAndResetWasIterated());
assertEquals(1, section2.getAndResetWasIterated());
assertEquals(0, section3.getAndResetWasIterated());
// forward quiting the iteration
model.iterateFrom(section1, true, new SectionIterationCallback() {
@Override
public boolean onIteration(AwesomeBoxSection section) {
StubAwesomeBoxSection stub = (StubAwesomeBoxSection) section;
stub.wasIterated();
return false;
}
});
assertEquals(0, section1.getAndResetWasIterated());
assertEquals(1, section2.getAndResetWasIterated());
assertEquals(0, section3.getAndResetWasIterated());
// forward not-quiting the iteration
model.iterateFrom(section1, true, new SectionIterationCallback() {
@Override
public boolean onIteration(AwesomeBoxSection section) {
StubAwesomeBoxSection stub = (StubAwesomeBoxSection) section;
stub.wasIterated();
return true;
}
});
assertEquals(0, section1.getAndResetWasIterated());
assertEquals(1, section2.getAndResetWasIterated());
assertEquals(1, section3.getAndResetWasIterated());
}
public void testContextListenerCallback() {
StubContextChangeListener listener = new StubContextChangeListener();
model.getContextChangeListener().add(listener);
model.changeContext(testContext);
model.changeContext(AwesomeBoxContext.DEFAULT);
assertEquals(2, listener.getCalledCount());
}
}