function deeplyContains(oActual, oExpected, sPath) {
		var sActualType = QUnit.objectType(oActual),
			sExpectedType = QUnit.objectType(oExpected),
			sName;

		if (sActualType === "string" && sExpectedType === "regexp") {
			if (!oExpected.test(oActual)) {
				throw new Error(sPath + ": actual value " + oActual
					+ " does not match expected regular expression " + oExpected);
			}
			return;
		}

		if (sActualType !== sExpectedType) {
			throw new Error(sPath + ": actual type " + sActualType
				+ " does not match expected type " + sExpectedType);
		}

		if (sActualType === "array") {
			if (oActual.length < oExpected.length) {
				throw new Error(sPath
					+ ": array length: " + oActual.length + " < " + oExpected.length);
			}
		}

		if (sActualType === "array" || sActualType === "object") {
			for (sName in oExpected) {
				deeplyContains(oActual[sName], oExpected[sName],
					sPath === "/" ? sPath + sName : sPath + "/" + sName);
			}
		} else if (oActual !== oExpected) {
			throw new Error(sPath + ": actual value " + oActual
				+ " does not match expected value " + oExpected);
		}
	}
/**
	 * Checks that the actual value deeply contains the expected value, ignoring additional
	 * properties.
	 *
	 * @param {object} oActual
	 *   the actual value to be tested
	 * @param {object|RegExp} oExpected
	 *   the expected value which needs to be contained structurally (as a subset) within the
	 *   actual value, or a regular expression which must match the actual string(!) value
	 * @param {string} sPath
	 *   path to the values under investigation
	 * @throws {Error}
	 *   in case the actual value does not deeply contain the expected value; the error message
	 *   provides a proof of this
	 */
Checks that the actual value deeply contains the expected value, ignoring additional
properties.

@param {object} oActual
the actual value to be tested
@param {object|RegExp} oExpected
the expected value which needs to be contained structurally (as a subset) within the
actual value, or a regular expression which must match the actual string(!) value
@param {string} sPath
path to the values under investigation
@throws {Error}
in case the actual value does not deeply contain the expected value; the error message
provides a proof of this
Checks that the actual value deeply contains the expected value ignoring additional properties . @param { object } oActual the actual value to be tested @param { object|RegExp } oExpected the expected value which needs to be contained structurally ( as a subset ) within the actual value or a regular expression which must match the actual string ( ! ) value @param { string } sPath path to the values under investigation @throws { Error } in case the actual value does not deeply contain the expected value ; the error message provides a proof of this
function deeplyContains(oActual, oExpected, sPath) {
		var sActualType = QUnit.objectType(oActual),
			sExpectedType = QUnit.objectType(oExpected),
			sName;
		if (sActualType === "string" && sExpectedType === "regexp") {
			if (!oExpected.test(oActual)) {
				throw new Error(sPath + ": actual value " + oActual
					+ " does not match expected regular expression " + oExpected);
			}
			return;
		}
		if (sActualType !== sExpectedType) {
			throw new Error(sPath + ": actual type " + sActualType
				+ " does not match expected type " + sExpectedType);
		}
		if (sActualType === "array") {
			if (oActual.length < oExpected.length) {
				throw new Error(sPath
					+ ": array length: " + oActual.length + " < " + oExpected.length);
			}
		}
		if (sActualType === "array" || sActualType === "object") {
			for (sName in oExpected) {
				deeplyContains(oActual[sName], oExpected[sName],
					sPath === "/" ? sPath + sName : sPath + "/" + sName);
			}
		} else if (oActual !== oExpected) {
			throw new Error(sPath + ": actual value " + oActual
				+ " does not match expected value " + oExpected);
		}
	}
function deeplyContains ( oActual , oExpected , sPath ) { var sActualType = QUnit . objectType ( oActual ) , sExpectedType = QUnit . objectType ( oExpected ) , sName ; if ( sActualType === "string" && sExpectedType === "regexp" ) { if ( ! oExpected . test ( oActual ) ) { throw new Error ( sPath + ": actual value " + oActual + " does not match expected regular expression " + oExpected ) ; } return ; } if ( sActualType !== sExpectedType ) { throw new Error ( sPath + ": actual type " + sActualType + " does not match expected type " + sExpectedType ) ; } if ( sActualType === "array" ) { if ( oActual . length < oExpected . length ) { throw new Error ( sPath + ": array length: " + oActual . length + " < " + oExpected . length ) ; } } if ( sActualType === "array" || sActualType === "object" ) { for ( sName in oExpected ) { deeplyContains ( oActual [ sName ] , oExpected [ sName ] , sPath === "/" ? sPath + sName : sPath + "/" + sName ) ; } } else if ( oActual !== oExpected ) { throw new Error ( sPath + ": actual value " + oActual + " does not match expected value " + oExpected ) ; } }
Checks that the actual value deeply contains the expected value, ignoring additional
 properties.
Checks that the actual value deeply contains the expected value ignoring additional properties .