// tslint:disable:triple-equals
 
// Ref: https://github.com/hyzhak/to-have-property/blob/master/lib/index.js
//      https://github.com/angular/angular/issues/5456
 
export const toHavePropertiesMatcher = {
  toHaveProperties: (util) => {
    return {
      compare: (actual, expected) => {
        const result = {pass: true, message: null};
        const results = Object.keys(expected)
          .filter(prop => typeof expected[prop] !== 'function' )
          .map(key => checkProperty(actual, expected, key))
          .reduce((acc, curr) => {
            acc.pass = acc.pass && curr.pass;
            acc.message = [acc.message, curr.message].filter(msg => !!msg).join(', ');
            return acc;
          }, result);
        return results;
      }
    };
  }
};
 
function checkProperty(actual, expected, key) {
  const result =
    !actual.hasOwnProperty(key)
    ? { pass: false, message: `Expected property ${key} was not found` }
    : expected[key] !== undefined && expected[key] != actual[key]
      ? { pass: false, message: `Expected property ${key} to have value '${expected[key]}', but actual value is '${actual[key]}'` }
      : { pass: true, message: null };
  return result;
}
  |