function deepContains(assert, oValue, oExpected, sMessage) {
		for (var sKey in oExpected) {

			if (!(sKey in oValue)) {
				assert.ok(false, "Expected property " + sMessage + "/" + sKey + " does not exist");
				continue;
			}

			if (Array.isArray(oExpected[sKey]) === Array.isArray(oValue[sKey])) {
				assert.equal(typeof oValue[sKey], typeof oExpected[sKey], sMessage + "/" + sKey + " have same type");
			} else {
				assert.ok(false, sMessage + "/" + sKey + " - one is an array, the other is not");
			}


			if (Array.isArray(oExpected[sKey]) && Array.isArray(oValue[sKey])) {
				assert.equal(oValue[sKey].length, oExpected[sKey].length, sMessage + "/" + sKey + " length matches (" + oExpected[sKey].length + ")");
			}

			if (oExpected[sKey] !== null && oExpected[sKey] !== undefined && typeof oExpected[sKey] === "object" && typeof oValue[sKey] === "object") {
				// Go deeper
				if (oValue[sKey] === null) {
					assert.ok(false, "Property " + sMessage + "/" + sKey + " is null");
				} else {
					deepContains(assert, oValue[sKey], oExpected[sKey], sMessage + "/" + sKey);
				}
			} else {
				// Compare directly
				assert.equal(oValue[sKey], oExpected[sKey], sMessage + "/" + sKey + " match (" + oExpected[sKey] + ")");
			}
		}
	}
/**
	 * Test-Function to be used in place of deepEquals which only tests for the existence of the given
	 * values, not the absence of others.
	 *
	 * @param {object} assert - The QUnit assert object
	 * @param {object} oValue - The value to be tested
	 * @param {object} oExpected - The value that is tested against, containing the structure expected inside oValue
	 * @param {string} sMessage - Message prefix for every sub-test. The property names of the structure will be prepended to this string
	 */
Test-Function to be used in place of deepEquals which only tests for the existence of the given
values, not the absence of others.


Test - Function to be used in place of deepEquals which only tests for the existence of the given values not the absence of others .
function deepContains(assert, oValue, oExpected, sMessage) {
		for (var sKey in oExpected) {
			if (!(sKey in oValue)) {
				assert.ok(false, "Expected property " + sMessage + "/" + sKey + " does not exist");
				continue;
			}
			if (Array.isArray(oExpected[sKey]) === Array.isArray(oValue[sKey])) {
				assert.equal(typeof oValue[sKey], typeof oExpected[sKey], sMessage + "/" + sKey + " have same type");
			} else {
				assert.ok(false, sMessage + "/" + sKey + " - one is an array, the other is not");
			}
			if (Array.isArray(oExpected[sKey]) && Array.isArray(oValue[sKey])) {
				assert.equal(oValue[sKey].length, oExpected[sKey].length, sMessage + "/" + sKey + " length matches (" + oExpected[sKey].length + ")");
			}
			if (oExpected[sKey] !== null && oExpected[sKey] !== undefined && typeof oExpected[sKey] === "object" && typeof oValue[sKey] === "object") {
				if (oValue[sKey] === null) {
					assert.ok(false, "Property " + sMessage + "/" + sKey + " is null");
				} else {
					deepContains(assert, oValue[sKey], oExpected[sKey], sMessage + "/" + sKey);
				}
			} else {
				assert.equal(oValue[sKey], oExpected[sKey], sMessage + "/" + sKey + " match (" + oExpected[sKey] + ")");
			}
		}
	}
function deepContains ( assert , oValue , oExpected , sMessage ) { for ( var sKey in oExpected ) { if ( ! ( sKey in oValue ) ) { assert . ok ( false , "Expected property " + sMessage + "/" + sKey + " does not exist" ) ; continue ; } if ( Array . isArray ( oExpected [ sKey ] ) === Array . isArray ( oValue [ sKey ] ) ) { assert . equal ( typeof oValue [ sKey ] , typeof oExpected [ sKey ] , sMessage + "/" + sKey + " have same type" ) ; } else { assert . ok ( false , sMessage + "/" + sKey + " - one is an array, the other is not" ) ; } if ( Array . isArray ( oExpected [ sKey ] ) && Array . isArray ( oValue [ sKey ] ) ) { assert . equal ( oValue [ sKey ] . length , oExpected [ sKey ] . length , sMessage + "/" + sKey + " length matches (" + oExpected [ sKey ] . length + ")" ) ; } if ( oExpected [ sKey ] !== null && oExpected [ sKey ] !== undefined && typeof oExpected [ sKey ] === "object" && typeof oValue [ sKey ] === "object" ) { if ( oValue [ sKey ] === null ) { assert . ok ( false , "Property " + sMessage + "/" + sKey + " is null" ) ; } else { deepContains ( assert , oValue [ sKey ] , oExpected [ sKey ] , sMessage + "/" + sKey ) ; } } else { assert . equal ( oValue [ sKey ] , oExpected [ sKey ] , sMessage + "/" + sKey + " match (" + oExpected [ sKey ] + ")" ) ; } } }
Test-Function to be used in place of deepEquals which only tests for the existence of the given
 values, not the absence of others.
Test - Function to be used in place of deepEquals which only tests for the existence of the given values not the absence of others .
// Go deeper // Compare directly