blob: 8e0a0b1e9aa35ea868fc115272346a4c321e9e7b [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* 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.intellij.ide;
import com.intellij.mock.MockProject;
import com.intellij.mock.MockProjectEx;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.application.impl.LaterInvocator;
import com.intellij.openapi.application.impl.ModalityStateEx;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.BusyObject;
import com.intellij.testFramework.LightPlatformTestCase;
import com.intellij.util.ui.UIUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Created by IntelliJ IDEA.
* User: kirillk
* Date: 8/17/11
* Time: 10:04 AM
* To change this template use File | Settings | File Templates.
*/
public class ActivityMonitorTest extends LightPlatformTestCase {
private UiActivityMonitorImpl myMonitor;
@Override
protected void setUp() throws Exception {
super.setUp();
myMonitor = new UiActivityMonitorImpl();
myMonitor.setActive(true);
disposeOnTearDown(myMonitor);
}
public void testReady() {
assertReady(null);
MockProject project1 = new MockProjectEx(getTestRootDisposable());
assertReady(project1);
MockProject project2 = new MockProjectEx(getTestRootDisposable());
assertReady(project2);
myMonitor.initBusyObjectFor(project1);
assertTrue(myMonitor.hasObjectFor(project1));
myMonitor.initBusyObjectFor(project2);
assertTrue(myMonitor.hasObjectFor(project2));
myMonitor.addActivity(new UiActivity("global"), ModalityState.any());
assertBusy(null);
assertBusy(project1);
assertBusy(project2);
myMonitor.addActivity(new UiActivity("global"), ModalityState.any());
assertBusy(null);
assertBusy(project1);
assertBusy(project2);
myMonitor.removeActivity(new UiActivity("global"));
assertReady(null);
assertReady(project1);
assertReady(project2);
myMonitor.addActivity(project1, new UiActivity("p1"), ModalityState.any());
assertReady(null);
assertBusy(project1);
assertReady(project2);
myMonitor.addActivity(new UiActivity("global"), ModalityState.any());
assertBusy(null);
assertBusy(project1);
assertBusy(project2);
myMonitor.removeActivity(new UiActivity("global"));
assertReady(null);
assertBusy(project1);
assertReady(project2);
myMonitor.removeActivity(project1, new UiActivity("p1"));
assertReady(null);
assertReady(project1);
assertReady(project2);
}
public void testReadyWithWatchActivities() throws Exception {
final UiActivity root = new UiActivity("root");
final UiActivity op1 = new UiActivity("root", "operation1");
final UiActivity op2 = new UiActivity("root", "operation2");
final UiActivity op12 = new UiActivity("root", "operation1", "operation12");
final UiActivity op121 = new UiActivity("root", "operation1", "operation12", "operation121");
myMonitor.addActivity(op1);
assertBusy(null);
assertReady(null, op2);
assertBusy(null, op1);
assertBusy(null, root);
myMonitor.removeActivity(op1);
assertReady(null);
assertReady(null, op2);
assertReady(null, op1);
assertReady(null, root);
myMonitor.addActivity(op12);
assertBusy(null);
assertBusy(null, root);
assertBusy(null, op12);
assertReady(null, op121);
}
public void testModalityState() {
assertReady(null);
myMonitor.addActivity(new UiActivity("non_modal_1"), ModalityState.NON_MODAL);
assertBusy(null);
LaterInvocator.enterModal("dialog");
try {
assertReady(null);
myMonitor.addActivity(new UiActivity("non_modal2"), ModalityState.NON_MODAL);
assertReady(null);
myMonitor.addActivity(new UiActivity("modal_1"), new ModalityStateEx(new Object[] {"dialog"}));
assertBusy(null);
myMonitor.addActivity(new UiActivity("modal_2"), new ModalityStateEx(new Object[] {"dialog", "popup"}));
assertBusy(null);
}
finally {
LaterInvocator.leaveModal("dialog");
}
assertBusy(null);
}
public void testModalityStateAny() {
assertReady(null);
myMonitor.addActivity(new UiActivity("non_modal_1"), ModalityState.any());
assertBusy(null);
try {
LaterInvocator.enterModal("dialog");
assertBusy(null);
}
finally {
LaterInvocator.leaveModal("dialog");
}
}
public void testUiActivity() throws Exception {
assertTrue(new UiActivity("root", "folder1").isSameOrGeneralFor(new UiActivity("root", "folder1")));
assertTrue(new UiActivity("root", "folder1").isSameOrGeneralFor(new UiActivity("root", "folder1", "folder2")));
assertFalse(new UiActivity("root", "folder2").isSameOrGeneralFor(new UiActivity("root", "folder1", "folder2")));
assertFalse(new UiActivity("root", "folder2").isSameOrGeneralFor(new UiActivity("anotherRoot")));
}
private void assertReady(@Nullable Project key, @NotNull UiActivity ... activities) {
UIUtil.dispatchAllInvocationEvents();
BusyObject.Impl busy = (BusyObject.Impl)(key != null ? myMonitor.getBusy(key, activities) : myMonitor.getBusy(activities));
assertTrue("Must be READY, but was: BUSY", busy.isReady());
final boolean[] done = {false};
busy.getReady(this).doWhenDone(new Runnable() {
@Override
public void run() {
done[0] = true;
}
});
assertTrue(done[0]);
}
private void assertBusy(@Nullable Project key, @NotNull UiActivity ... activities) {
UIUtil.dispatchAllInvocationEvents();
BusyObject.Impl busy = (BusyObject.Impl)(key != null ? myMonitor.getBusy(key, activities) : myMonitor.getBusy(activities));
assertFalse("Must be BUSY, but was: READY", busy.isReady());
}
}