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

/**
 * Tests that an observation matches the expected value.
 * @param {Object} expected The expected value.
 * @param {Object} observed The actual value.
 * @param {string=} opt_message Optional message to include with a test
 *     failure.
 */
function assertEquals(expected, observed, opt_message) {
  if (observed !== expected) {
    var message = 'Assertion Failed\n  Observed: ' + observed +
        '\n  Expected: ' + expected;
    if (opt_message)
      message = message + '\n  ' + opt_message;
    throw new Error(message);
  }
}

/**
 * Verifies that a test result is true.
 * @param {boolean} observed The observed value.
 * @param {string=} opt_message Optional message to include with a test
 *     failure.
 */
function assertTrue(observed, opt_message) {
  assertEquals(true, observed, opt_message);
}

/**
 * Verifies that a test result is false.
 * @param {boolean} observed The observed value.
 * @param {string=} opt_message Optional message to include with a test
 *     failure.
 */
function assertFalse(observed, opt_message) {
  assertEquals(false, observed, opt_message);
}

/**
 * Verifies that the observed and reference values differ.
 * @param {Object} reference The target value for comparison.
 * @param {Object} observed The test result.
 * @param {string=} opt_message Optional message to include with a test
 *     failure.
 */
function assertNotEqual(reference, observed, opt_message) {
  if (observed === reference) {
    var message = 'Assertion Failed\n  Observed: ' + observed +
        '\n  Reference: ' + reference;
    if (opt_message)
      message = message + '\n  ' + opt_message;
    throw new Error(message);
  }
}

/**
 * Verifies that a test evaluation results in an exception.
 * @param {!Function} f The test function.
 */
function assertThrows(f) {
  var triggeredError = false;
  try {
    f();
  } catch(err) {
    triggeredError = true;
  }
  if (!triggeredError)
    throw new Error('Assertion Failed: throw expected.');
}

/**
 * Verifies that the contents of the expected and observed arrays match.
 * @param {!Array} expected The expected result.
 * @param {!Array} observed The actual result.
 */
function assertArrayEquals(expected, observed) {
  var v1 = Array.prototype.slice.call(expected);
  var v2 = Array.prototype.slice.call(observed);
  var equal = v1.length == v2.length;
  if (equal) {
    for (var i = 0; i < v1.length; i++) {
      if (v1[i] !== v2[i]) {
        equal = false;
        break;
      }
    }
  }
  if (!equal) {
    var message =
       ['Assertion Failed', 'Observed: ' + v2, 'Expected: ' + v1].join('\n  ');
    throw new Error(message);
  }
}

/**
 * Verifies that the expected and observed result have the same content.
 * @param {*} expected The expected result.
 * @param {*} observed The actual result.
 */
function assertDeepEquals(expected, observed, opt_message) {
  if (typeof expected == 'object' && expected != null) {
    assertNotEqual(null, observed);
    for (var key in expected) {
      assertTrue(key in observed, opt_message);
      assertDeepEquals(expected[key], observed[key], opt_message);
    }
    for (var key in observed) {
      assertTrue(key in expected, opt_message);
    }
  } else {
    assertEquals(expected, observed, opt_message);
  }
}

/**
 * Defines runTests.
 */
(function(exports) {
  /**
   * List of test cases.
   * @type {Array.<string>} List of function names for tests to run.
   */
  var testCases = [];

  /**
   * Indicates if all tests have run successfully.
   * @type {boolean}
   */
  var cleanTestRun = true;

  /**
   * Armed during setup of a test to call the matching tear down code.
   * @type {Function}
   */
  var pendingTearDown = null;

  /**
   * Runs all functions starting with test and reports success or
   * failure of the test suite.
   */
  function runTests() {
    for (var name in window) {
      if (typeof window[name] == 'function' && /^test/.test(name))
        testCases.push(name);
    }
    if (!testCases.length) {
      console.error('Failed to find test cases.');
      cleanTestRun = false;
    }
    continueTesting();
  }

  /**
   * Runs the next test in the queue. Reports the test results if the queue is
   * empty.
   * @param {boolean=} opt_asyncTestFailure Optional parameter indicated if the
   *     last asynchronous test failed.
   */
  function continueTesting(opt_asyncTestFailure) {
    if (opt_asyncTestFailure)
      cleanTestRun = false;
    var done = false;
    if (pendingTearDown) {
      pendingTearDown();
      pendingTearDown = null;
    }
    if (testCases.length > 0) {
      var fn = testCases.pop();
      var isAsyncTest = window[fn].length;
      try {
        if (window.setUp)
          window.setUp();
        pendingTearDown = window.tearDown;
        window[fn](continueTesting);
      } catch(err) {
        console.error('Failure in test ' + fn + '\n' + err);
        console.log(err.stack);
        cleanTestRun = false;
      }
      // Asynchronous tests must manually call continueTesting when complete.
      if (!isAsyncTest)
        continueTesting();
    } else {
      done = true;
      endTests(cleanTestRun);
    }
    if (!done) {
      domAutomationController.setAutomationId(1);
      domAutomationController.send('PENDING');
    }
  };

  exports.runTests = runTests;
})(this);

/**
 * Signals completion of a test.
 * @param {boolean} success Indicates if the test completed successfully.
 */
function endTests(success) {
  domAutomationController.setAutomationId(1);
  domAutomationController.send(success ? 'SUCCESS' : 'FAILURE');
}

window.onerror = function() {
  endTests(false);
};
