@Test
	public void testActionToggleBreakpointProgramWithNoCurrentBreakpointOnData() throws Throwable {
		addMappedBreakpointOpenAndWait(); // wasteful, but whatever
		for (LogicalBreakpoint lb : List.copyOf(breakpointService.getAllBreakpoints())) {
			TraceBreakpoint brk = Unique.assertOne(lb.getTraceBreakpoints(tb.trace));
			CompletableFuture<Void> delete = lb.delete();
			handleDeleteBreakpointInvocation(brk);
			waitOn(delete);
		}
		waitForDomainObject(program);
		waitForDomainObject(tb.trace);
		waitOn(breakpointService.changesSettled());
		waitForPass(() -> assertEquals(0, breakpointService.getAllBreakpoints().size()));

		try (Transaction tx = program.openTransaction("Disassemble")) {
			program.getListing().createData(addr(program, 0x00400123), ByteDataType.dataType);
		}
		waitForDomainObject(program);

		ProgramLocationActionContext ctx = staticCtx(addr(program, 0x00400123));
		assertTrue(breakpointMarkerPlugin.actionToggleBreakpoint.isAddToPopup(ctx));
		performAction(breakpointMarkerPlugin.actionToggleBreakpoint, ctx, false);
		DebuggerPlaceBreakpointDialog dialog =
			waitForDialogComponent(DebuggerPlaceBreakpointDialog.class);
		runSwing(() -> dialog.okCallback());
		handleSetBreakpointInvocation(TraceBreakpointKindSet.ACCESS, 0x55550123);
		waitForDomainObject(program);
		waitForDomainObject(tb.trace);
		waitOn(breakpointService.changesSettled());

		waitForPass(() -> {
			LogicalBreakpoint lb = Unique.assertOne(breakpointService.getAllBreakpoints());
			assertEquals(State.ENABLED, lb.computeState());
			// TODO: Different cases for different expected default kinds?
			assertEquals(TraceBreakpointKindSet.ACCESS, lb.getKinds());
		});
	}
HACK: since service doesn't let me get markers for an address, change each that I care about
to have a distinct background color
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/gui/breakpoint/AbstractDebuggerBreakpointMarkerPluginTest.java