blob: 657f39d1b15d79f2a3f91ebfbc1bb48a450ccadb [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.openapi.ui.playback.commands;
import com.intellij.openapi.ui.Queryable;
import com.intellij.openapi.ui.playback.PlaybackContext;
import com.intellij.openapi.util.ActionCallback;
import com.intellij.openapi.wm.IdeFocusManager;
import java.awt.*;
import java.util.*;
public class AssertFocused extends AbstractCommand {
public static final String PREFIX = CMD_PREFIX + "assert focused";
public AssertFocused(String text, int line) {
super(text, line);
}
protected ActionCallback _execute(final PlaybackContext context) {
final ActionCallback result = new ActionCallback();
String text = getText().substring(PREFIX.length()).trim();
final Map<String, String> expected = new LinkedHashMap<String, String>();
if (text.length() > 0) {
final String[] keyValue = text.split(",");
for (String each : keyValue) {
final String[] eachPair = each.split("=");
if (eachPair.length != 2) {
context.error("Syntax error, must be comma-separated pairs key=value", getLine());
result.setRejected();
return result;
}
expected.put(eachPair[0], eachPair[1]);
}
}
IdeFocusManager.findInstance().doWhenFocusSettlesDown(new Runnable() {
public void run() {
try {
doAssert(expected, context);
result.setDone();
}
catch (AssertionError error) {
context.error("Assertion failed: " + error.getMessage(), getLine());
result.setRejected();
}
}
});
return result;
}
private void doAssert(Map<String, String> expected, PlaybackContext context) throws AssertionError {
final Component owner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (owner == null) {
throw new AssertionError("No component focused");
}
Component eachParent = owner;
final LinkedHashMap<String, String> actual = new LinkedHashMap<String, String>();
while (eachParent != null) {
if (eachParent instanceof Queryable) {
((Queryable)eachParent).putInfo(actual);
}
eachParent = eachParent.getParent();
}
Set testedKeys = new LinkedHashSet<String>();
for (String eachKey : expected.keySet()) {
testedKeys.add(eachKey);
final String actualValue = actual.get(eachKey);
final String expectedValue = expected.get(eachKey);
if (!expectedValue.equals(actualValue)) {
throw new AssertionError(eachKey + " expected: " + expectedValue + " but was: " + actualValue);
}
}
Map<String, String> untested = new HashMap<String, String>();
for (String eachKey : actual.keySet()) {
if (testedKeys.contains(eachKey)) continue;
untested.put(eachKey, actual.get(eachKey));
}
StringBuffer untestedText = new StringBuffer();
for (String each : untested.keySet()) {
if (untestedText.length() > 0) {
untestedText.append(",");
}
untestedText.append(each).append("=").append(untested.get(each));
}
context.message("Untested info: " + untestedText.toString(), getLine());
}
}