@Test
	public void testDiffOfOverlapOverlaysWithChanges() throws Exception {
		mtf.initialize("NotepadMergeListingTest", new ProgramModifierListener() {
			@Override
			public void modifyLatest(ProgramDB program) {
				// P1 program
				try {
					// Overlay Foo 0x01000000 - 0x0100017f
					Memory memory = program.getMemory();
					memory.createInitializedBlock("Foo", addr(program, "0x01000000"), 0x180L,
						(byte) 0x0, null, true);

					SymbolTable st = program.getSymbolTable();
					Namespace globalNamespace = program.getGlobalNamespace();
					st.createLabel(addr(program, "Foo:0x01000030"), "Sample0030", globalNamespace,
						SourceType.USER_DEFINED);
					st.createLabel(addr(program, "Foo:0x01000179"), "Sample0179", globalNamespace,
						SourceType.USER_DEFINED);
					st.createLabel(addr(program, "Foo:0x0100017f"), "Sample017f", globalNamespace,
						SourceType.USER_DEFINED);
				}
				catch (Exception e) {
					Assert.fail(e.getMessage());
				}
			}

			@Override
			public void modifyPrivate(ProgramDB program) {
				// P2 program
				try {
					// Overlapping overlay with the same name 0x01000080 - 0x0100017f
					Memory memory = program.getMemory();
					memory.createInitializedBlock("Foo", addr(program, "0x01000080"), 0x180L,
						(byte) 0x0, null, true);

					SymbolTable st = program.getSymbolTable();
					Namespace globalNamespace = program.getGlobalNamespace();
					st.createLabel(addr(program, "Foo:0x01000080"), "Other0080", globalNamespace,
						SourceType.USER_DEFINED);
					st.createLabel(addr(program, "Foo:0x01000162"), "Other0162", globalNamespace,
						SourceType.USER_DEFINED);
					st.createLabel(addr(program, "Foo:0x01000200"), "Other0200", globalNamespace,
						SourceType.USER_DEFINED);
				}
				catch (Exception e) {
					Assert.fail(e.getMessage());
				}
			}
		});

		p1 = mtf.getResultProgram();
		p2 = mtf.getPrivateProgram();

		// All overlay blocks in common Foo overlay space is considered
		programDiff = new ProgramDiff(p1, p2);
		programDiff.setFilter(new ProgramDiffFilter(ProgramDiffFilter.ALL_DIFFS));
		AddressSetView diffs = programDiff.getDifferences(programDiff.getFilter(), null);

		AddressSet expectedDiffAs = new AddressSet();
		expectedDiffAs.addRange(addr(p1, "Foo:0x01000000"), addr(p1, "Foo:0x01000080")); // not found in p2
		expectedDiffAs.add(addr(p1, "Foo:0x01000162")); // Other0162 not found in p1
		expectedDiffAs.add(addr(p1, "Foo:0x01000179")); // Sample0179 not found in p2
		expectedDiffAs.addRange(addr(p1, "Foo:0x0100017f"), addr(p1, "Foo:0x010001ff")); // not found in p1
		assertEquals(expectedDiffAs, diffs);
	}
Tests that adding different tags to the same function is recognized as a difference.

@throws Exception
Ghidra/Features/Base/src/test.slow/java/ghidra/program/util/ProgramDiff2Test.java