chromium/chrome/browser/resources/chromeos/accessibility/common/testing/assert_additions.js

// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * Asserts that a given argument's value is undefined.
 * @param {object} a The argument to check.
 */
function assertUndefined(a) {
  if (a !== undefined) {
    throw new Error('Assertion failed: expected undefined');
  }
}

/**
 * Asserts that a given argument's value is null or undefined.
 * @param {object} obj The argument to check.
 * @param {string=} opt_message Error message if the condition is not met.
 */
function assertNullOrUndefined(obj, opt_message) {
  if (obj !== undefined && obj !== null) {
    throw new Error(
        'Must be null or undefined: ' + (opt_message || '') + '\n' +
        'Actual: ' + obj);
  }
}

/**
 * Asserts that the argument is neither null nor undefined.
 * @param {object} obj The argument to check.
 * @param {string=} opt_message Error message if the condition is not met.
 */
function assertNotNullNorUndefined(obj, opt_message) {
  if (obj === undefined || obj === null) {
    throw new Error(
        'Can\'t be null or undefined: ' + (opt_message || '') + '\n' +
        'Actual: ' + obj);
  }
}

/**
 * Asserts that a given function call throws an exception.
 * @param {string} msg Message to print if exception not thrown.
 * @param {Function} fn The function to call.
 * @param {string} error The name of the exception we expect {@code fn} to
 *     throw.
 */
function assertException(msg, fn, error) {
  try {
    fn();
  } catch (e) {
    if (error && e.name !== error) {
      throw new Error(
          'Expected to throw ' + error + ' but threw ' + e.name + ' - ' + msg);
    }
    return;
  }

  throw new Error('Expected to throw exception ' + error + ' - ' + msg);
}

/**
 * Asserts that two arrays of strings are equal.
 * @param {Array<string>} array1 The expected array.
 * @param {Array<string>} array2 The test array.
 */
function assertEqualStringArrays(array1, array2) {
  let same = true;
  if (array1.length !== array2.length) {
    same = false;
  }
  for (let i = 0; i < Math.min(array1.length, array2.length); i++) {
    if (array1[i].trim() !== array2[i].trim()) {
      same = false;
    }
  }
  if (!same) {
    throw new Error(
        'Expected ' + JSON.stringify(array1) + ', got ' +
        JSON.stringify(array2));
  }
}

/**
 * Asserts that two objects have the same JSON serialization.
 * @param {Object} expected The expected object.
 * @param {Object} actual The actual object.
 * @param {string=} opt_message Message used for errors.
 */
function assertEqualsJSON(expected, actual, opt_message) {
  if (JSON.stringify(actual) !== JSON.stringify(expected)) {
    throw new Error(
        (opt_message ? opt_message + '\n' : '') + 'Expected ' +
        JSON.stringify(expected) + '\n' +
        'Got      ' + JSON.stringify(actual));
  }
}

/**
 * Asserts that two ArrayBuffers have the same content.
 * @param {ArrayBuffer} arrayBufA The expected ArrayBuffer.
 * @param {ArrayBuffer} arrayBufB The test ArrayBuffer.
 */
function assertArrayBuffersEquals(arrayBufA, arrayBufB) {
  const view1 = new Uint8Array(arrayBufA);
  const view2 = new Uint8Array(arrayBufB);
  assertEquals(JSON.stringify(view1), JSON.stringify(view2));
}

/**
 * Asserts that two Arrays have the same content.
 * @param {ArrayBuffer} arrayA The expected array.
 * @param {ArrayBuffer} arrayB The test array.
 */
function assertArraysEquals(arrayA, arrayB) {
  assertEquals(JSON.stringify(arrayA), JSON.stringify(arrayB));
}

/**
 * Asserts and fails immediately once called.
 * @param {string=} opt_msg
 */
function assertNotReached(opt_msg) {
  assertFalse(true, opt_msg);
}

/**
 * Asserts an actual DOM equals an expected stringified DOM.
 * @param {string} expected
 * @param {Node} actual
 */
function assertEqualsDOM(expected, actual) {
  expected = expected.replace(/>\s+</gm, '><').trim(/\s/gm);
  let actualStr = actual.outerHTML;
  actualStr = actualStr.replace(/>\s+</gm, '><').trim(/\s/gm);

  for (let i = 0; i < expected.length; i++) {
    assertEquals(
        expected[i], actualStr[i],
        'Mismatch at index ' + i + ' in expected:\n' + expected +
            '\nactual:\n' + actualStr + '\n');
  }
}

/**
 * Asserts two objects have the same key/value pairs.
 * @param {Object} objectA
 * @param {Object} objectB
 */
function assertObjectEquals(objectA, objectB) {
  const keysA = Object.keys(objectA);
  const keysB = Object.keys(objectB);
  assertEquals(
      keysA.length, keysB.length, 'Expected ', keysA.length, ' keys, but got ',
      keysB.length, 'keys.');
  for (const key of keysA) {
    assertTrue(key in objectB, 'Key in expected not present in actual', key);
    const type = typeof (objectA[key]);
    if (type === 'array') {
      assertArraysEquals(objectA[key], objectB[key]);
    } else if (type === 'object') {
      assertObjectEquals(objectA[key], objectB[key]);
    } else {
      assertEquals(
          objectA[key], objectB[key],
          'Expected key ' + key + ' to have value ' + objectA[key] +
              ', actual: ',
          objectB[key]);
    }
  }
}

assertSame = assertEquals;
assertNotSame = assertNotEquals;