protected void manipulateAllSettings(boolean testDefaultSetting, boolean insideStruct,
			boolean commonStruct, DockingActionIf dockingAction) throws Exception {

		long loc1 = 0x1006a02;
		long loc2 = 0x100abeb;

		assertNotNull(dockingAction);

		DataType dt;
		boolean useSelection = true;

		if (dockingAction instanceof DataAction) {
			DataAction action = (DataAction) dockingAction;
			dt = action.getDataType();
			useSelection = (dt instanceof StringDataType);
		}
		else if (dockingAction instanceof CreateArrayAction) {
			// array case based upon existing data at location
			gotoLocation(loc1);
			Data data1 = getContextData();
			dt = data1.getDataType();
		}
		else {
			fail("Unsupported data action for test: " + dockingAction.getClass().getName());
			return;
		}

		if (FORMAT_TEST_SKIP_LIST.contains(dt.getName())) {
			System.out.println("Settings not tested for data type: " + dt.getName());
			return;
		}

		final SettingsDefinition[] sdefs = dt.getSettingsDefinitions();
		if (sdefs.length == 0) {
			System.out.println("Data type does not have settings: " + dt.getName());
			return;
		}

		boolean commonDataType =
			!(dt instanceof StringDataType) && (!insideStruct || (insideStruct && commonStruct));

		gotoLocation(loc1);
		if (useSelection) {
			makeSelection(loc1, loc1 + 0x10);
		}
		doAction(dockingAction, true);
		Data data1 = getContextData();

		if (insideStruct) {

			int len = data1.getLength();
			if (len < 1) {
				len = 1;
			}
			makeSelection(loc1, loc1 + len - 1);
			doCreateStructureAction();
			clearSelection();
			if (firstIteration) {
				cb.toggleOpen(getContextData());
			}
			gotoLocation(loc1, new int[] { 0 });
			data1 = getContextData();

		}

		clearSelection();

		Data data2 = null;
		gotoLocation(loc2);
		if (insideStruct && commonStruct) {
			doAction(RECENTLY_USED, true);
		}
		else {
			if (useSelection) {
				makeSelection(loc2, loc2 + 0x10);
			}
			doAction(dockingAction, true);
			data2 = getContextData();

			if (insideStruct) {
				int len = data2.getLength();
				if (len < 1) {
					len = 1;
				}
				makeSelection(loc2, loc2 + len - 1);
				doCreateStructureAction();
				clearSelection();
			}
		}
		if (insideStruct) {
			if (firstIteration) {
				cb.toggleOpen(getContextData());
			}
			gotoLocation(loc2, new int[] { 0 });
			data2 = getContextData();
		}
		clearSelection();

		try {
			dt = data1.getBaseDataType();
			assertTrue("Default data type unexpected", !DefaultDataType.class.isInstance(dt));
			assertNotNull(data2);

			DataType dt2 = data2.getBaseDataType();

			if (commonDataType) {
				assertTrue("Data type instances differ: " + dt.getClass().getName() + " / " +
					dt2.getClass().getName(), dt == dt2);
			}

			for (SettingsDefinition sdef : sdefs) {

				if (sdef instanceof FormatSettingsDefinition) {
					manipulateFormatSettings(testDefaultSetting, insideStruct, commonStruct, data1,
						data2);
				}
				else if (sdef instanceof EndianSettingsDefinition) {
					// tested by manipulateFormatSettings
				}
				else if (sdef instanceof PaddingSettingsDefinition) {
					// tested by manipulateFormatSettings
				}
				else if (sdef instanceof TerminatedSettingsDefinition) {
					manipulateTerminatedSettings(testDefaultSetting, insideStruct, commonStruct,
						data1, data2);
				}
				else if (sdef instanceof DataTypeMnemonicSettingsDefinition) {
					manipulateMnemonicSettings(testDefaultSetting, insideStruct, commonStruct,
						data1, data2);
				}
				else if (sdef instanceof MutabilitySettingsDefinition) {
					manipulateMutabilitySettings(testDefaultSetting, insideStruct, commonStruct,
						data1, data2);
					if (data1.isArray() && data2.isArray()) {
						manipulateMutabilitySettings(testDefaultSetting, insideStruct, commonStruct,
							data1.getComponent(1), data2.getComponent(1));
					}
				}
				else if (sdef == null) {
					System.out.println("DataActionTest: null SettingsDefinition");
				}

			}
		}
		finally {
			if (useSelection) {
				clearRange(loc1, loc1 + 0x10);
				clearRange(loc2, loc2 + 0x10);
			}
			else {
				clearLocation(loc1);
				clearLocation(loc2);
			}
			firstIteration = false;
		}
	}
Asserts that the next value returned from the iterator matches the specified properties.

@param dit data iterator
@param dtClass data type class to expect
@param offset address offset to expect
@param length data instance length to expect
@return Data instance that iterator's .next() returned.
Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/data/AbstractDataActionTest.java