protected void assertLogicalBreakpointsForUnmappedBookmarks() {
		assertEquals(2, breakpointService.getAllBreakpoints().size());

		LogicalBreakpoint enLb = Unique
				.assertOne(breakpointService.getBreakpointsAt(program, addr(program, 0x00400123)));
		assertEquals(program, enLb.getProgram());
		assertEquals(addr(program, 0x00400123), enLb.getProgramLocation().getAddress());
		assertEquals(enBm, enLb.getProgramBookmark());
		assertTrue(enLb.getMappedTraces().isEmpty());
		assertEquals(State.INEFFECTIVE_ENABLED, enLb.computeStateForProgram(program));
		assertEquals(Set.of(TraceBreakpointKind.SW_EXECUTE), enLb.getKinds());

		LogicalBreakpoint disLb = Unique
				.assertOne(breakpointService.getBreakpointsAt(program, addr(program, 0x00400321)));
		assertEquals(program, disLb.getProgram());
		assertEquals(addr(program, 0x00400321), disLb.getProgramLocation().getAddress());
		assertEquals(disBm, disLb.getProgramBookmark());
		assertTrue(disLb.getMappedTraces().isEmpty());
		assertEquals(State.INEFFECTIVE_DISABLED, disLb.computeStateForProgram(program));
		assertEquals(Set.of(TraceBreakpointKind.SW_EXECUTE), disLb.getKinds());
	}
Tracks the current set of logical breakpoints.

<p>
Its assertions require perfection in the sequence of events: 1) No double-adds. 2) No
double-removes. 3) No extraneous updates. At the end of each test, the current set of
breakpoints in this listener should be verified against those reported by the service.
Ghidra/Test/DebuggerIntegrationTest/src/test/java/ghidra/app/plugin/core/debug/service/breakpoint/AbstractDebuggerLogicalBreakpointServiceTest.java