@Test
	public void testCalllbackRemovesItems_OtherItemNotSelected_ExecuteInBulk() {

		/*
		 	Select multiple items.
		 	Have the first callback remove one of the remaining *selected* items.
		 	The removed item should not itself get a callback.
		 */

		int rowCount = getRowCount();
		List<TestStubRowObject> selected = selectRows(0, 1, 3);
		List<TestStubRowObject> toProcess = new ArrayList<>(selected);

		List<TestStubRowObject> removedButNotExecuted = new ArrayList<>();
		testDecision = r -> {
			toProcess.remove(r);

			// Simulate the client removing items from the table while processing items
			// if not empty, remove one of the remaining items
			if (removedButNotExecuted.isEmpty()) {
				TestStubRowObject other = toProcess.remove(0);
				removedButNotExecuted.add(other);
				dialog.remove(other);
			}
			return true; // remove 'r'
		};

		pressExecuteButton();
		waitForDialog();
		assertTrue(toProcess.isEmpty());

		assertNotInDialog(selected);
		assertRowCount(rowCount - selected.size());
		assertNotExecuted(removedButNotExecuted);
	}
Interface for tests to signal what is expected of the executor
Ghidra/Features/Base/src/test.slow/java/ghidra/app/tablechooser/TableChooserDialogTest.java