// 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.status;
import com.google.collide.client.status.StatusMessage.MessageType;
import com.google.collide.json.client.JsoArray;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
import com.google.gwt.junit.client.GWTTestCase;
/**
* These test cases exercise the event pumping of the {@link StatusManager} to
* the {@link StatusHandler}.
*/
public class StatusManagerTest extends GWTTestCase {
/**
* A simple mock handler that lets us record events. Each message event is
* appended to the statusMesssages array and the number of clear() calls is
* tracked.
*/
private class MockStatusHandler implements StatusHandler {
private int clearCount = 0;
private JsoArray<StatusMessage> statusMessages = JsoArray.create();
@Override
public void clear() {
clearCount++;
}
@Override
public void onStatusMessage(StatusMessage msg) {
statusMessages.add(msg);
}
}
private StatusMessage c1;
private StatusMessage c2;
private StatusMessage e1;
private StatusMessage e2;
private StatusMessage f1;
private StatusMessage f2;
private MockStatusHandler handler;
private StatusMessage l1;
private StatusMessage l2;
private StatusManager statusManager;
@Override
public String getModuleName() {
return "com.google.collide.client.TestCode";
}
@Override
protected void gwtSetUp() throws Exception {
super.gwtSetUp();
statusManager = new StatusManager();
handler = new MockStatusHandler();
statusManager.setHandler(handler);
l1 = new StatusMessage(statusManager, MessageType.LOADING, "l1");
l2 = new StatusMessage(statusManager, MessageType.LOADING, "l2");
c1 = new StatusMessage(statusManager, MessageType.CONFIRMATION, "c1");
c2 = new StatusMessage(statusManager, MessageType.CONFIRMATION, "c2");
e1 = new StatusMessage(statusManager, MessageType.ERROR, "e1");
e2 = new StatusMessage(statusManager, MessageType.ERROR, "e2");
f1 = new StatusMessage(statusManager, MessageType.FATAL, "f1");
f2 = new StatusMessage(statusManager, MessageType.FATAL, "f2");
}
/**
* Verify that canceling non-active messages triggers no events.
*/
public void testCancelNonActive() {
e1.fire();
l1.fire();
c2.fire();
l2.fire();
l1.cancel();
c1.fire();
c1.cancel();
c2.cancel();
l2.cancel();
assertEquals(1, handler.statusMessages.size());
assertEquals(e1, handler.statusMessages.peek());
assertEquals(0, handler.clearCount);
}
/**
* Verify that an event cannot be fired after being canceled.
*/
public void testCancelThenFire() {
e1.cancel();
e1.fire();
assertEquals(0, handler.statusMessages.size());
}
/**
* Verify that delayed fire works.
*/
public void testDelayFire() {
l1.fire();
e1.fireDelayed(100);
c1.fire();
assertEquals(2, handler.statusMessages.size());
assertEquals(c1, handler.statusMessages.peek());
delayTestFinish(300);
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
assertEquals(3, handler.statusMessages.size());
assertEquals(e1, handler.statusMessages.peek());
finishTest();
return false;
}
}, 200);
}
/**
* Verify that expiry works.
*/
public void testExpire() {
l1.expire(100);
l2.fire();
l1.fire();
assertEquals(2, handler.statusMessages.size());
assertEquals(l1, handler.statusMessages.peek());
assertEquals(0, handler.clearCount);
delayTestFinish(300);
Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
@Override
public boolean execute() {
assertEquals(3, handler.statusMessages.size());
assertEquals(l2, handler.statusMessages.peek());
finishTest();
return false;
}
}, 200);
}
public void testFatalHandoff() {
MockStatusHandler handoff = new MockStatusHandler();
f1.fire();
e1.fire();
statusManager.setHandler(handoff);
f2.fire();
assertEquals(1, handler.statusMessages.size());
assertEquals(f1, handler.statusMessages.peek());
assertEquals(1, handler.clearCount);
assertEquals(1, handoff.statusMessages.size());
assertEquals(f1, handoff.statusMessages.peek());
}
public void testFatalIsFinal() {
l1.fire();
c1.fire();
f1.fire();
assertEquals(3, handler.statusMessages.size());
assertEquals(f1, handler.statusMessages.peek());
e1.fire();
f1.cancel();
f2.fire();
assertEquals(3, handler.statusMessages.size());
assertEquals(f1, handler.statusMessages.peek());
f1.fire();
assertEquals(3, handler.statusMessages.size());
assertEquals(f1, handler.statusMessages.peek());
}
/**
* Verify that handing off to a new handler clears the current one and fires
* the active message to the new one.
*/
public void testHandlerHandoff() {
MockStatusHandler handoff = new MockStatusHandler();
c1.fire();
l1.fire();
e2.fire();
statusManager.setHandler(handoff);
assertEquals(1, handler.clearCount);
assertEquals(1, handoff.statusMessages.size());
assertEquals(e2, handoff.statusMessages.peek());
e2.cancel();
assertEquals(2, handoff.statusMessages.size());
assertEquals(c1, handoff.statusMessages.peek());
}
/**
* Verify our gwtSetup is sane.
*/
public void testInit() {
assertEquals(0, handler.statusMessages.size());
assertEquals(0, handler.clearCount);
}
/**
* Verify that firing a non-active event multiple times is a no-op.
*/
public void testMultipleFireNoop() {
e1.fire();
e2.fire();
assertEquals(2, handler.statusMessages.size());
assertEquals(e2, handler.statusMessages.peek());
e1.fire();
assertEquals(2, handler.statusMessages.size());
assertEquals(e2, handler.statusMessages.peek());
assertEquals(0, handler.clearCount);
}
/**
* Verify that firing an active event multiple times issues updates.
*/
public void testMultipleFireUpdate() {
e1.fire();
e2.fire();
assertEquals(2, handler.statusMessages.size());
assertEquals(e2, handler.statusMessages.peek());
e2.fire();
assertEquals(3, handler.statusMessages.size());
assertEquals(e2, handler.statusMessages.get(2));
assertEquals(e2, handler.statusMessages.get(1));
assertEquals(0, handler.clearCount);
}
/**
* Verify that messages of equivalent priority tie-break by most recent.
*/
public void testRecentPriority() {
e1.fire();
c1.fire();
e2.fire();
assertEquals(2, handler.statusMessages.size());
assertEquals(e2, handler.statusMessages.peek());
}
/**
* Verify that cancellation works.
*/
public void testSimpleCancel() {
l1.fire();
l1.cancel();
assertEquals(1, handler.statusMessages.size());
assertEquals(l1, handler.statusMessages.peek());
assertEquals(1, handler.clearCount);
}
/**
* Verify that a simple message works.
*/
public void testSimpleMessage() {
l1.fire();
assertEquals(1, handler.statusMessages.size());
assertEquals(l1, handler.statusMessages.peek());
assertEquals(0, handler.clearCount);
}
/**
* Verify that our priority logic is sane.
*/
public void testSimplePriority() {
e1.fire();
c1.fire();
l1.fire();
assertEquals(1, handler.statusMessages.size());
assertEquals(e1, handler.statusMessages.peek());
}
}