@Test
    public void testCategoryMovedNoConflicts() throws Exception {
		// Move category in My program; no change in latest program

		mtf.initialize("notepad", new ProgramModifierListener() {
			
			@Override
			public void modifyLatest(ProgramDB program) {
				// Make no changes to Latest.
			}

			@Override
			public void modifyPrivate(ProgramDB program) {
				DataTypeManager dtm = program.getDataTypeManager();
				// move MISC to /Category1/Category2/Category3
				Category miscCat = dtm.getCategory(new CategoryPath("/MISC"));
				Category destCat =
					dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
				try {
					destCat.moveCategory(miscCat, TaskMonitor.DUMMY);
					Structure s =
						new StructureDataType(miscCat.getCategoryPath(), "My structure", 0);
					s.add(new ByteDataType());
					s.add(new WordDataType());
					destCat.addDataType(s, DataTypeConflictHandler.DEFAULT_HANDLER);
				}
				catch (DuplicateNameException e) {
					Assert.fail("Got Duplicate name exception!");
				}
			}
		});

		executeMerge(-1);
		DataTypeManager dtm = resultProgram.getDataTypeManager();
		Category root = resultProgram.getDataTypeManager().getCategory(CategoryPath.ROOT);

		assertTrue(dtm.containsCategory(new CategoryPath("/Category1/Category2/Category3/MISC")));
		assertNotNull(
			dtm.getDataType(new CategoryPath("/Category1/Category2/Category3"), "My structure"));
		assertNull(root.getCategory("MISC"));
		assertTrue(!dtm.containsCategory(new CategoryPath("/MISC")));
	}
Tests for the merge data type manager.
Ghidra/Features/Base/src/test.slow/java/ghidra/app/merge/datatypes/CategoryMerge1Test.java