| // Licensed to the Software Freedom Conservancy (SFC) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The SFC licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| goog.provide('webdriver.test.testutil'); |
| goog.provide('webdriver.test.testutil.StubError'); |
| |
| goog.require('goog.array'); |
| goog.require('goog.debug.Error'); |
| goog.require('goog.string'); |
| goog.require('goog.testing.recordFunction'); |
| goog.require('webdriver.stacktrace'); |
| |
| |
| |
| /** |
| * A custom error used for testing. |
| * @param {string=} opt_msg The error message to use. |
| * @constructor |
| * @extends {goog.debug.Error} |
| * @final |
| */ |
| webdriver.test.testutil.StubError = function(opt_msg) { |
| webdriver.test.testutil.StubError.base(this, 'constructor', opt_msg); |
| }; |
| goog.inherits(webdriver.test.testutil.StubError, goog.debug.Error); |
| |
| |
| /** @override */ |
| webdriver.test.testutil.StubError.prototype.name = 'StubError'; |
| |
| |
| /** @type {Array.<!string>} */ |
| webdriver.test.testutil.messages = []; |
| |
| webdriver.test.testutil.getStackTrace = function() { |
| return webdriver.stacktrace.get(); |
| }; |
| |
| webdriver.test.testutil.throwStubError = function() { |
| throw new webdriver.test.testutil.StubError; |
| }; |
| |
| webdriver.test.testutil.assertIsStubError = function(error) { |
| assertTrue(error + ' is not an instanceof StubError', |
| error instanceof webdriver.test.testutil.StubError); |
| }; |
| |
| |
| /** |
| * Asserts the contents of the {@link webdriver.test.testutil.messages} array |
| * are as expected. |
| * @param {...*} var_args The expected contents. |
| */ |
| webdriver.test.testutil.assertMessages = function(var_args) { |
| var args = Array.prototype.slice.call(arguments, 0); |
| assertArrayEquals(args, webdriver.test.testutil.messages); |
| }; |
| |
| |
| /** |
| * Wraps a call to {@link webdriver.test.testutil.assertMessages} so it can |
| * be passed as a callback. |
| * @param {...*} var_args The expected contents. |
| * @return {!Function} The wrapped function. |
| */ |
| webdriver.test.testutil.assertingMessages = function(var_args) { |
| var args = goog.array.slice(arguments, 0); |
| return function() { |
| return webdriver.test.testutil.assertMessages.apply(null, args); |
| }; |
| }; |
| |
| |
| /** |
| * Asserts an object is a promise. |
| * @param {*} obj The object to check. |
| */ |
| webdriver.test.testutil.assertIsPromise = function(obj) { |
| assertTrue('Value is not a promise: ' + goog.typeOf(obj), |
| webdriver.promise.isPromise(obj)); |
| }; |
| |
| |
| /** |
| * Asserts an object is not a promise. |
| * @param {*} obj The object to check. |
| */ |
| webdriver.test.testutil.assertNotPromise = function(obj) { |
| assertFalse(webdriver.promise.isPromise(obj)); |
| }; |
| |
| /** |
| * Wraps a function. The wrapped function will have several utility functions: |
| * <ul> |
| * <li>assertCalled: Asserts that the function was called. |
| * <li>assertNotCalled: Asserts that the function was not called. |
| * </ul> |
| * @param {Function=} opt_fn The function to wrap; defaults to |
| * goog.nullFunction. |
| * @return {!Function} The wrapped function. |
| * @see goog.testing.recordFunction |
| */ |
| webdriver.test.testutil.callbackHelper = function(opt_fn) { |
| var callback = goog.testing.recordFunction(opt_fn); |
| |
| callback.getExpectedCallCountMessage = function(n, opt_prefix, opt_noJoin) { |
| var message = []; |
| if (opt_prefix) message.push(opt_prefix); |
| |
| var calls = callback.getCalls(); |
| message.push( |
| 'Expected to be called ' + n + ' times.', |
| ' was called ' + calls.length + ' times:'); |
| goog.array.forEach(calls, function(call) { |
| var e = call.getError(); |
| if (e) { |
| throw e; |
| } |
| }); |
| return opt_noJoin ? message : message.join('\n'); |
| }; |
| |
| callback.assertCalled = function(opt_message) { |
| assertEquals(callback.getExpectedCallCountMessage(1, opt_message), |
| 1, callback.getCallCount()); |
| }; |
| |
| callback.assertNotCalled = function(opt_message) { |
| assertEquals(callback.getExpectedCallCountMessage(0, opt_message), |
| 0, callback.getCallCount()); |
| }; |
| |
| return callback; |
| }; |
| |
| |
| /** |
| * Creates a utility for managing a pair of callbacks, capable of asserting only |
| * one of the pair was ever called. |
| * |
| * @param {Function=} opt_callback The callback to manage. |
| * @param {Function=} opt_errback The errback to manage. |
| */ |
| webdriver.test.testutil.callbackPair = function(opt_callback, opt_errback) { |
| var pair = { |
| callback: webdriver.test.testutil.callbackHelper(opt_callback), |
| errback: webdriver.test.testutil.callbackHelper(opt_errback) |
| }; |
| |
| /** @param {string=} opt_message Optional failure message. */ |
| pair.assertEither = function(opt_message) { |
| if (!pair.callback.getCallCount() && |
| !pair.errback.getCallCount()) { |
| var message = ['Neither callback nor errback has been called']; |
| if (opt_message) goog.array.insertAt(message, opt_message); |
| fail(message.join('\n')); |
| } |
| }; |
| |
| /** @param {string=} opt_message Optional failure message. */ |
| pair.assertNeither = function(opt_message) { |
| var message = (opt_message || '') + 'Did not expect callback or errback'; |
| pair.callback.assertNotCalled(message); |
| pair.errback.assertNotCalled(message); |
| }; |
| |
| /** @param {string=} opt_message Optional failure message. */ |
| pair.assertCallback = function(opt_message) { |
| var message = opt_message ? (opt_message + ': ') : ''; |
| pair.errback.assertNotCalled(message + 'Expected callback, not errback'); |
| pair.callback.assertCalled(message + 'Callback not called'); |
| }; |
| |
| /** @param {string=} opt_message Optional failure message. */ |
| pair.assertErrback = function(opt_message) { |
| var message = opt_message ? (opt_message + ': ') : ''; |
| pair.callback.assertNotCalled(message + 'Expected errback, not callback'); |
| pair.errback.assertCalled(message + 'Errback not called'); |
| }; |
| |
| pair.reset = function() { |
| pair.callback.reset(); |
| pair.errback.reset(); |
| }; |
| |
| return pair; |
| }; |
| |
| |
| webdriver.test.testutil.assertObjectEquals = function(expected, actual) { |
| assertObjectEquals( |
| 'Expected: ' + JSON.stringify(expected) + '\n' + |
| 'Actual: ' + JSON.stringify(actual), |
| expected, actual); |
| }; |