Merge remote-tracking branch 'origin/GP-0-dragonmacher-test-fixes-5-22-24'

This commit is contained in:
Ryan Kurtz
2024-05-22 11:50:39 -04:00
2 changed files with 36 additions and 68 deletions

View File

@@ -100,7 +100,7 @@ public class SymbolGTreeDragNDropHandler implements GTreeDragNDropHandler {
}
private void dropProgramSelection(Namespace namespace, SelectionTransferData selectionData) {
List<Symbol> symbolsToMove = new ArrayList<Symbol>();
List<Symbol> symbolsToMove = new ArrayList<>();
Program program = plugin.getProgram();
FunctionManager functionManager = program.getFunctionManager();
AddressSetView addressSet = selectionData.getAddressSet();
@@ -118,7 +118,7 @@ public class SymbolGTreeDragNDropHandler implements GTreeDragNDropHandler {
private void dropNodeList(Namespace namespace, Object transferData) {
@SuppressWarnings("unchecked")
List<GTreeNode> nodeList = (List<GTreeNode>) transferData;
List<Symbol> symbolsToMoveList = new ArrayList<Symbol>();
List<Symbol> symbolsToMoveList = new ArrayList<>();
for (GTreeNode node : nodeList) {
// we only allow dragging of SymbolNodes
SymbolNode symbolNode = (SymbolNode) node;
@@ -167,7 +167,7 @@ public class SymbolGTreeDragNDropHandler implements GTreeDragNDropHandler {
@Override
public DataFlavor[] getSupportedDataFlavors(List<GTreeNode> transferNodes) {
Set<DataFlavor> flavorSet = new HashSet<DataFlavor>();
Set<DataFlavor> flavorSet = new HashSet<>();
for (GTreeNode node : transferNodes) {
SymbolTreeNode symbolNode = (SymbolTreeNode) node;
DataFlavor flavor = symbolNode.getNodeDataFlavor();
@@ -189,16 +189,16 @@ public class SymbolGTreeDragNDropHandler implements GTreeDragNDropHandler {
if (SymbolDataFlavor.DATA_FLAVOR.equals(flavor)) {
return getSymbols(transferNodes);
}
List<GTreeNode> flavorNodes = new ArrayList<>();
for (GTreeNode node : transferNodes) {
SymbolTreeNode symbolNode = (SymbolTreeNode) node;
DataFlavor nodeFlavor = symbolNode.getNodeDataFlavor();
if (Objects.equals(flavor, nodeFlavor)) {
flavorNodes.add(symbolNode);
else if (SymbolTreeDataFlavor.DATA_FLAVOR.equals(flavor)) {
List<GTreeNode> nodes = new ArrayList<>();
for (GTreeNode node : transferNodes) {
SymbolTreeNode symbolNode = (SymbolTreeNode) node;
nodes.add(symbolNode);
}
return nodes;
}
return flavorNodes;
throw new UnsupportedFlavorException(flavor);
}
private SymbolTransferData getSymbols(List<GTreeNode> transferNodes) {

View File

@@ -23,7 +23,6 @@ import java.awt.dnd.DnDConstants;
import java.util.*;
import java.util.stream.Collectors;
import javax.swing.SwingUtilities;
import javax.swing.tree.TreePath;
import org.junit.*;
@@ -40,7 +39,6 @@ import ghidra.app.plugin.core.programtree.ProgramTreePlugin;
import ghidra.app.plugin.core.symboltree.nodes.*;
import ghidra.app.util.viewer.field.LabelFieldFactory;
import ghidra.framework.options.SaveState;
import ghidra.framework.plugintool.Plugin;
import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.plugintool.util.PluginException;
import ghidra.program.model.listing.GhidraClass;
@@ -51,9 +49,6 @@ import ghidra.test.TestEnv;
/**
* More tests for the SymbolTreePlugin.
*
*
*
*/
public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
@@ -114,7 +109,7 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
DataFlavor flavor = ((SymbolTreeNode) gNode).getNodeDataFlavor();
GTreeDragNDropHandler dnd = util.getTree().getDragNDropHandler();
assertTrue(!dnd.isDropSiteOk(dNode, new DataFlavor[] { flavor }, DnDConstants.ACTION_MOVE));
assertFalse(dnd.isDropSiteOk(dNode, new DataFlavor[] { flavor }, DnDConstants.ACTION_MOVE));
}
@Test
@@ -133,29 +128,12 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
DataFlavor flavor = ((SymbolTreeNode) gNode).getNodeDataFlavor();
GTreeDragNDropHandler dnd = util.getTree().getDragNDropHandler();
assertTrue(
!dnd.isDropSiteOk(extNode, new DataFlavor[] { flavor }, DnDConstants.ACTION_MOVE));
assertTrue(
!dnd.isDropSiteOk(extNode, new DataFlavor[] { flavor }, DnDConstants.ACTION_COPY));
DataFlavor[] flavors = new DataFlavor[] { flavor };
assertFalse(dnd.isDropSiteOk(extNode, flavors, DnDConstants.ACTION_MOVE));
assertFalse(dnd.isDropSiteOk(extNode, flavors, DnDConstants.ACTION_COPY));
}
@Test
public void testStartDragOK() throws Exception {
GTreeNode fNode = rootNode.getChild(2);
util.expandNode(fNode);
GTreeNode gNode = fNode.getChild(1);
util.expandNode(gNode);
GTreeNode pNode = gNode.getChild(0);
List<GTreeNode> list = new ArrayList<>();
list.add(pNode);
GTreeNode p2Node = gNode.getChild(1);
list.add(p2Node);
GTreeDragNDropHandler dnd = util.getTree().getDragNDropHandler();
assertTrue(!dnd.isStartDragOk(list, DnDConstants.ACTION_MOVE));
}
@Test
public void testDragDrop() throws Exception {
GTreeNode nsParentNode = rootNode.getChild(5);
@@ -192,13 +170,13 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
private void doDrag(final GTreeNode destinationNode, final int dragAction,
GTreeNode... dragNode) {
final GTreeDragNDropHandler dragNDropHandler = util.getTree().getDragNDropHandler();
GTreeDragNDropHandler dragNDropHandler = util.getTree().getDragNDropHandler();
List<GTreeNode> dropList = new ArrayList<>();
for (GTreeNode gTreeNode : dragNode) {
dropList.add(gTreeNode);
}
final Transferable transferable = new GTreeNodeTransferable(dragNDropHandler, dropList);
Transferable transferable = new GTreeNodeTransferable(dragNDropHandler, dropList);
executeOnSwingWithoutBlocking(
() -> dragNDropHandler.drop(destinationNode, transferable, dragAction));
@@ -211,7 +189,7 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
final ToggleDockingAction goToToggleAction =
(ToggleDockingAction) getAction(plugin, "Navigation");
SwingUtilities.invokeAndWait(() -> goToToggleAction.setSelected(true));
runSwing(() -> goToToggleAction.setSelected(true));
GTreeNode cNode = rootNode.getChild(4);
GTreeNode nsNode = util.createObject(cNode, "MyClass", createClassAction);
assertNotNull(nsNode);
@@ -264,18 +242,13 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
String[] names =
new String[] { "aNamespace", "MYnamespace", "Bnamespace", "AaNamespace", "Cnamespace" };
List<Symbol> list = new ArrayList<>();
int transactionID = program.startTransaction("test");
try {
tx(program, () -> {
for (String element : names) {
Namespace ns = symTable.createNameSpace(program.getGlobalNamespace(), element,
SourceType.USER_DEFINED);
list.add(ns.getSymbol());
}
}
finally {
program.endTransaction(transactionID, true);
}
});
Collections.sort(list, util.getSymbolComparator());
@@ -306,13 +279,13 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
.filter(symbol -> symbol.getSymbolType() == SymbolType.NAMESPACE)
.map(symbol -> symbol.getName())
.collect(Collectors.toList());
//@formatter:off
//@formatter:on
//
// This is the way we currently sort, documented here for posterity.
//
List<String> expectedOrder =
Arrays.asList( "AaNamespace", "aNamespace", "Bnamespace", "Cnamespace", "MYnamespace" );
List<String> expectedOrder =
Arrays.asList("AaNamespace", "aNamespace", "Bnamespace", "Cnamespace", "MYnamespace");
assertEquals(expectedOrder.size(), symbolNames.size());
assertEquals(expectedOrder, symbolNames);
@@ -324,21 +297,16 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
String[] names =
new String[] { "BClass", "MYclass", "bBClass", "Aaclass", "Cclass", "_anotherClass" };
List<Symbol> list = new ArrayList<>();
int transactionID = program.startTransaction("test");
try {
tx(program, () -> {
for (String element : names) {
GhidraClass gc = symTable.createClass(program.getGlobalNamespace(), element,
SourceType.USER_DEFINED);
list.add(gc.getSymbol());
}
}
finally {
program.endTransaction(transactionID, true);
}
});
program.flushEvents();
waitForSwing();
util.waitForTree();
GTreeNode cnode = rootNode.getChild(4);
@@ -351,12 +319,12 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
.filter(symbol -> symbol.getSymbolType() == SymbolType.CLASS)
.map(symbol -> symbol.getName())
.collect(Collectors.toList());
//@formatter:off
//@formatter:on
//
// This is the way we currently sort, documented here for posterity.
//
List<String> expectedOrder =
List<String> expectedOrder =
Arrays.asList("_anotherClass", "Aaclass", "bBClass", "BClass", "Cclass", "MYclass");
assertEquals(expectedOrder.size(), symbolNames.size());
@@ -368,15 +336,15 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
final ToggleDockingAction goToToggleAction =
(ToggleDockingAction) getAction(plugin, "Navigation");
assertNotNull(goToToggleAction);
SwingUtilities.invokeAndWait(() -> goToToggleAction.setSelected(true));
runSwing(() -> goToToggleAction.setSelected(true));
SaveState saveState = new SaveState("Test");
plugin.writeConfigState(saveState);
assertTrue(saveState.getBoolean("GO_TO_TOGGLE_STATE", false));
SwingUtilities.invokeAndWait(() -> {
tool.removePlugins(new Plugin[] { plugin });
runSwing(() -> {
tool.removePlugins(List.of(plugin));
try {
tool.addPlugin(SymbolTreePlugin.class.getName());
}
@@ -391,7 +359,7 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
ToggleDockingAction goToToggleAction2 =
(ToggleDockingAction) getAction(plugin, "Navigation");
assertNotNull(goToToggleAction2);
assertTrue(!goToToggleAction2.isSelected());
assertFalse(goToToggleAction2.isSelected());
plugin.readConfigState(saveState);
assertTrue(goToToggleAction2.isSelected());
@@ -406,7 +374,7 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
program.flushEvents();
util.waitForTree();
SwingUtilities.invokeAndWait(() -> util.getTree().stopEditing());
runSwing(() -> util.getTree().stopEditing());
GTreeNode nsParentNode = rootNode.getChild(5);
util.expandNode(nsParentNode);
@@ -418,11 +386,11 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
GTreeNode classesRoot = rootNode.getChild("Classes");
util.selectNode(classesRoot);
assertTrue(createClassAction.isEnabledForContext(util.getSymbolTreeContext()));
performAction(createClassAction,util.getSymbolTreeContext(), true);
performAction(createClassAction, util.getSymbolTreeContext(), true);
program.flushEvents();
util.waitForTree();
SwingUtilities.invokeAndWait(() -> util.getTree().stopEditing());
runSwing(() -> util.getTree().stopEditing());
GTreeNode cParentNode = rootNode.getChild(4);
util.expandNode(cParentNode);
assertEquals(1, cParentNode.getChildCount());
@@ -433,14 +401,14 @@ public class SymbolTreePlugin3Test extends AbstractGhidraHeadedIntegrationTest {
GTreeNode cNode = rootNode.getChild(4);
util.selectNode(cNode);
assertTrue(createClassAction.isEnabledForContext(util.getSymbolTreeContext()));
assertTrue(!createNamespaceAction.isEnabledForContext(util.getSymbolTreeContext()));
assertFalse(createNamespaceAction.isEnabledForContext(util.getSymbolTreeContext()));
}
@Test
public void testActionsEnabledOnNamespaceNode() throws Exception {
GTreeNode nsParentNode = rootNode.getChild(5);
util.selectNode(nsParentNode);
assertTrue(!createClassAction.isEnabledForContext(util.getSymbolTreeContext()));
assertFalse(createClassAction.isEnabledForContext(util.getSymbolTreeContext()));
assertTrue(createNamespaceAction.isEnabledForContext(util.getSymbolTreeContext()));
}
}