shouldTestControl = function(sControlName, aControlsToTest, aExcludedControls, bIncludeNonRenderable, bIncludeNonInstantiable) {
		if (!sControlName
			|| aControlsToTest.length && aControlsToTest.indexOf(sControlName) < 0  // only test specific controls
			|| aExcludedControls.indexOf(sControlName) >= 0 ) {
			return Promise.resolve(false);
		}

		return loadControlClass(sControlName).then(function(FNControlClass) {
			var oInfo = {
				name: sControlName,
				"class": FNControlClass,
				canBeInstantiated: controlCanBeInstantiated(sControlName, FNControlClass),
				canBeRendered: controlCanBeRendered(sControlName, FNControlClass)
			};

			if (!bIncludeNonInstantiable && !oInfo.canBeInstantiated) {
				return false;
			}

			if (!bIncludeNonRenderable && !oInfo.canBeRendered) {
				return false;
			}

			return oInfo;
		}, alwaysFalse);
	}
Checks whether the control is not among the explicitly excluded controls and is not excluded due to its
rendering/instantiation capabilities.

The returned promise resolves with an info object describing the control's capabilities when the class
should be included in the iterator or with a falsy value otherwise.

@param {string} sControlName Qualified name (dot notation) of the control to test
@param {string[]} aControlsToTest List of controls to include in the tests (allowlist)
@param {string[]} aExcludedControls List of controls to exclude from the tests (blocklist)
@param {boolean} bIncludeNonRenderable Whether the iterator should include controls that can't be rendered
@param {boolean} bIncludeNonInstantiable Whether the iterator should include controls that can't be instantiated
@returns Promise<({name:string,class:function,canBeInstantiated:boolean,canBeRendered:boolean}|false)>
            A promise on an info object or <code>false</code> if the class should not be tested