protected void assertLogicalBreakpointForLoneSoftwareBreakpoint(Trace trace, long offset,
			int total) {
		assertEquals(total, breakpointService.getAllBreakpoints().size());

		LogicalBreakpoint enLb =
			Unique.assertOne(breakpointService.getBreakpointsAt(trace, addr(trace, offset)));
		assertNull(enLb.getProgramLocation());
		assertEquals(Set.of(TraceBreakpointKind.SW_EXECUTE), enLb.getKinds());

		TraceBreakpoint bpt = Unique.assertOne(trace.getBreakpointManager().getAllBreakpoints());
		assertEquals(Set.of(trace), enLb.getMappedTraces());
		assertEquals(addr(trace, offset), enLb.getTraceAddress(trace));
		assertEquals(Set.of(bpt), enLb.getTraceBreakpoints(trace));
		assertEquals(Set.of(bpt), enLb.getTraceBreakpoints());
		assertEquals(State.INCONSISTENT_ENABLED, enLb.computeStateForTrace(trace));
	}
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