private void createAndTestStructures(Program program, DataTypeManager dtm,
			ObjectOrientedClassLayout layoutChoice, MockPdb pdb, boolean is64Bit,
			MsVxtManager vxtManager, Map<ClassID, String> expectedResults,
			Map<ClassID, Map<String, String>> expectedVxtPtrSummaries) throws Exception {

		for (CppCompositeType cppType : pdb.getCppTypes()) {
			ClassID id = cppType.getClassId();
			cppType.createLayout(layoutChoice, vxtManager, monitor);
			Composite composite = pdb.resolveType(dtm, cppType);
			String expected = expectedResults.get(id);
			if (expected == null || expected.equals("NOT YET DETERMINED")) {
				continue;
			}
			CompositeTestUtils.assertExpectedComposite(this, expected, composite, true);
			if (expectedVxtPtrSummaries == null) {
				continue;
			}
			Map<String, String> expectedSummary = expectedVxtPtrSummaries.get(id);
			Map<String, String> vxtPtrSummary = cppType.getVxtPtrSummary();
			assertEquals(expectedSummary.size(), vxtPtrSummary.size());
			for (Map.Entry<String, String> summary : expectedSummary.entrySet()) {
				String tableName = summary.getKey();
				String expectedVxtPtrSummary = summary.getValue();
				String foundVxtPtrSummary = vxtPtrSummary.get(tableName);
				// 20250403:  The following classes currently have "bad" expected vxtptr summaries
				//  for at least one vxtptr (in Egray):
				//  AA4q, AA5g, AA5h, AA5j, AA6h, AA6j, BB2c, BB2d.
				// Our current tests match these bad results so not to fail
				if (expectedVxtPtrSummary == null) {
					Msg.warn(this,
						"Purposefully skipping table test that has bad result for " +
							id.getSymbolPath() + " " + tableName);
					continue;
				}
				assertEquals(expectedVxtPtrSummary, foundVxtPtrSummary);
			}
		}
	}
Tests the classes and artifacts of cfb4 64-bit program PDB (speculative)
@throws Exception upon error
Ghidra/Features/PDB/src/test/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeTypeTest.java