Как я могу использовать функцию быстрой поддержки Eclipse с помощью SWTBot? - PullRequest
0 голосов
/ 11 июля 2011

Я хотел бы использовать SWTBot , чтобы встроить локальную переменную через меню быстрой помощи. Мой тест SWTBot выскакивает в меню быстрой помощи, но он не может выбрать пункт предложения. Я создал минимальный проект на GitHub , который демонстрирует эту проблему, и открыл проблему , которая подробно описывает проблему.

1 Ответ

1 голос
/ 15 мая 2012

У меня была такая же проблема с меню автозаполнения, и единственный найденный мной обходной путь - реализовать собственные методы автозаполнения. Вы можете легко сделать что-то подобное для быстрой помощи. Мой код был протестирован в системах Windows и Unix:

package aaa.bbb.ccc;

import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;

import java.util.List;

import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swtbot.swt.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.results.VoidResult;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.junit.Assert;

public abstract class AutoCompletionHelper {

public static void autoCompleteWithFirstMatchingProposal(SWTWorkbenchBot bot) {
    SWTBotTable proposalsTable = showCompletionProposalsTable(bot);

    Assert.assertTrue("No completion proposals found", proposalsTable.rowCount() > 0);

    selectProposal(proposalsTable, 0);
}

public static void autoCompleteWithProposal(SWTWorkbenchBot bot, String completionProposal) {
    SWTBotTable proposalsTable = showCompletionProposalsTable(bot);
    int rowCount = proposalsTable.rowCount();

    int index = -1;
    int matchingProposalsCount = 0;

    for (int i = 0; i < rowCount; i++) {
        if (proposalsTable.cell(i, 0).startsWith(completionProposal)) {
            index = i;
            matchingProposalsCount++;
        }
    }

    Assert.assertFalse("No completion proposals matching '" + completionProposal + "'", matchingProposalsCount == 0);
    Assert.assertFalse("Multiple completion proposals matching '" + completionProposal + "'", matchingProposalsCount > 1);

    selectProposal(proposalsTable, index);
}

private static SWTBotTable showCompletionProposalsTable(EclipseBot bot) {
    bot.pressShortcut(KeyStroke.getInstance(SWT.CTRL, 0), KeyStroke.getInstance(0, SWT.SPACE));

    bot.sleep(100); //Wait for auto-completion shell to be displayed
    List<Shell> shells = bot.shells("");
    Table proposalsTable = null;

    long timeout = SWTBotPreferences.TIMEOUT;
    SWTBotPreferences.TIMEOUT = 200;
    boolean findInvisibleControls = bot.getFinder().shouldFindInvisibleControls();
    bot.getFinder().setShouldFindInvisibleControls(true);

    try {
        for (Shell shell : shells) {
            try {
                proposalsTable = bot.widget(widgetOfType(Table.class), shell);
            } catch (WidgetNotFoundException ex) {
                continue;
            }
            break;
        }
    } finally {
        bot.getFinder().setShouldFindInvisibleControls(findInvisibleControls);
        SWTBotPreferences.TIMEOUT = timeout;
    }

    if (proposalsTable == null) {
        throw new RuntimeException("Did not find any completion proposals table ...");
    }
    return new SWTBotTable(proposalsTable);
}

private static void selectProposal(final SWTBotTable proposalsTable, final int proposalIndex) {
    UIThreadRunnable.asyncExec(new VoidResult() {

        @Override
        public void run() {
            Table table = proposalsTable.widget;
            table.setSelection(proposalIndex);
            Event event = new Event();
            event.type = SWT.Selection;
            event.widget = table;
            event.item = table.getItem(proposalIndex);
            table.notifyListeners(SWT.Selection, event);
            table.notifyListeners(SWT.DefaultSelection, event);
        }
    });
}
}
...