in spec/TestingHelper.js [577:705]
static async compare(value1, value2) {
TestingHelper.logDebug(Util.format('compare: %s and %s', TestingHelper.printValue(value1), TestingHelper.printValue(value2)));
if (value1 === undefined || value2 === undefined) {
TestingHelper.logDebug(Util.format('compare: unexpected "undefined" value'));
return false;
}
if (value1 === null && value2 === null) {
return true;
}
if (value1 === null && value2 !== null || value1 !== null && value2 === null) {
return false;
}
if (typeof value1 !== typeof value2) {
TestingHelper.logDebug(Util.format('compare: value types are different: %s and %s',
typeof value1, typeof value2));
return false;
}
if (typeof value1 === 'number') {
return floatComparator(value1, value2);
}
else if (typeof value1 !== 'object') {
return defaultComparator(value1, value2);
}
else if (value1.constructor.name !== value2.constructor.name && !value2 instanceof BinaryObject) {
TestingHelper.logDebug(Util.format('compare: value types are different: %s and %s',
value1.constructor.name, value2.constructor.name));
return false;
}
else if (value1 instanceof Date && value2 instanceof Date) {
return dateComparator(value1, value2);
}
else if (value1 instanceof EnumItem && value2 instanceof EnumItem) {
return enumComparator(value1, value2);
}
else if (value1 instanceof Decimal && value2 instanceof Decimal) {
return decimalComparator(value1, value2);
}
else if (value1 instanceof Timestamp && value2 instanceof Timestamp) {
return timestampComparator(value1, value2);
}
else if (value1 instanceof Array && value2 instanceof Array) {
if (value1.length !== value2.length) {
TestingHelper.logDebug(Util.format('compare: array lengths are different'));
return false;
}
for (var i = 0; i < value1.length; i++) {
if (!await TestingHelper.compare(value1[i], value2[i])) {
TestingHelper.logDebug(Util.format('compare: array elements are different: %s, %s',
TestingHelper.printValue(value1[i]), TestingHelper.printValue(value2[i])));
return false;
}
}
return true;
}
else if (value1 instanceof Map && value2 instanceof Map) {
if (value1.size !== value2.size) {
TestingHelper.logDebug(Util.format('compare: map sizes are different'));
return false;
}
for (var [key, val] of value1) {
if (!value2.has(key)) {
TestingHelper.logDebug(Util.format('compare: maps are different: %s key is absent', TestingHelper.printValue(key)));
return false;
}
if (!(await TestingHelper.compare(val, value2.get(key)))) {
TestingHelper.logDebug(Util.format('compare: map values are different: %s, %s',
TestingHelper.printValue(val), TestingHelper.printValue(value2.get(key))));
return false;
}
}
return true;
}
else if (value1 instanceof Set && value2 instanceof Set) {
if (value1.size !== value2.size) {
TestingHelper.logDebug(Util.format('compare: set sizes are different'));
return false;
}
const value1Arr = [...value1].sort();
const value2Arr = [...value2].sort();
if (!await TestingHelper.compare(value1Arr, value2Arr)) {
TestingHelper.logDebug(Util.format('compare: sets are different: %s and %s',
TestingHelper.printValue(value1Arr), TestingHelper.printValue(value2Arr)));
return false;
}
return true;
}
else if (value2 instanceof BinaryObject) {
if (value1 instanceof BinaryObject) {
if (value1.getTypeName() !== value2.getTypeName()) {
TestingHelper.logDebug(Util.format('compare: binary object type names are different'));
return false;
}
if (!await TestingHelper.compare(value1.getFieldNames(), value2.getFieldNames())) {
TestingHelper.logDebug(Util.format('compare: binary object field names are different'));
return false;
}
for (let fieldName of value1.getFieldNames()) {
if (!value1.hasField(fieldName) || !value2.hasField(fieldName) ||
!await TestingHelper.compare(await value1.getField(fieldName), await value1.getField(fieldName))) {
TestingHelper.logDebug(Util.format('compare: binary objects field "%s" values are different', fieldName));
return false;
}
}
return true;
}
else {
let value;
for (let key of Object.keys(value1)) {
value = await value2.getField(key);
if (!(await TestingHelper.compare(value1[key], value))) {
TestingHelper.logDebug(Util.format('compare: binary object values for key %s are different: %s and %s',
TestingHelper.printValue(key), TestingHelper.printValue(value1[key]), TestingHelper.printValue(value)));
return false;
}
}
return true;
}
}
else {
for (let key of Object.keys(value1)) {
if (!(await TestingHelper.compare(value1[key], value2[key]))) {
TestingHelper.logDebug(Util.format('compare: object values for key %s are different: %s and %s',
TestingHelper.printValue(key), TestingHelper.printValue(value1[key]), TestingHelper.printValue(value2[key])));
return false;
}
}
return true;
}
}