2016-11-01 01:00:21 +03:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
|
|
|
|
|
|
|
Cu.import("resource://gre/modules/AppConstants.jsm");
|
|
|
|
Cu.import("resource://gre/modules/Preferences.jsm");
|
2016-12-29 16:04:16 +03:00
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
2016-11-01 01:00:21 +03:00
|
|
|
|
|
|
|
Cu.import("chrome://marionette/content/error.js");
|
|
|
|
|
|
|
|
this.EXPORTED_SYMBOLS = ["assert"];
|
|
|
|
|
|
|
|
const isFennec = () => AppConstants.platform == "android";
|
|
|
|
const isB2G = () => AppConstants.MOZ_B2G;
|
|
|
|
const isFirefox = () => Services.appinfo.name == "Firefox";
|
|
|
|
|
|
|
|
/** Shorthands for common assertions made in Marionette. */
|
|
|
|
this.assert = {};
|
|
|
|
|
2017-02-02 19:09:14 +03:00
|
|
|
/**
|
|
|
|
* Asserts that Marionette has a session.
|
|
|
|
*
|
|
|
|
* @param {GeckoDriver} driver
|
|
|
|
* Marionette driver instance.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {string}
|
|
|
|
* Session ID.
|
|
|
|
*
|
2017-02-10 21:36:52 +03:00
|
|
|
* @throws {InvalidSessionIDError}
|
2017-02-02 19:09:14 +03:00
|
|
|
* If |driver| does not have a session ID.
|
|
|
|
*/
|
|
|
|
assert.session = function (driver, msg = "") {
|
|
|
|
assert.that(sessionID => sessionID,
|
2017-02-10 21:36:52 +03:00
|
|
|
msg, InvalidSessionIDError)(driver.sessionId);
|
2017-02-02 19:09:14 +03:00
|
|
|
return driver.sessionId;
|
|
|
|
};
|
|
|
|
|
2016-11-01 01:00:21 +03:00
|
|
|
/**
|
|
|
|
* Asserts that the current browser is Firefox Desktop.
|
|
|
|
*
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @throws {UnsupportedOperationError}
|
|
|
|
* If current browser is not Firefox.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.firefox = function (msg = "") {
|
2016-12-29 16:04:16 +03:00
|
|
|
msg = msg || "Only supported in Firefox";
|
2016-11-01 01:00:21 +03:00
|
|
|
assert.that(isFirefox, msg, UnsupportedOperationError)();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that the current browser is Fennec, or Firefox for Android.
|
|
|
|
*
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @throws {UnsupportedOperationError}
|
|
|
|
* If current browser is not Fennec.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.fennec = function (msg = "") {
|
2016-12-29 16:04:16 +03:00
|
|
|
msg = msg || "Only supported in Fennec";
|
2016-11-01 01:00:21 +03:00
|
|
|
assert.that(isFennec, msg, UnsupportedOperationError)();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that the current browser is B2G.
|
|
|
|
*
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @throws {UnsupportedOperationError}
|
|
|
|
* If the current browser is not B2G.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.b2g = function (msg = "") {
|
2016-12-29 16:04:16 +03:00
|
|
|
msg = msg || "Only supported in B2G";
|
2016-11-01 01:00:21 +03:00
|
|
|
assert.that(isB2G, msg, UnsupportedOperationError)();
|
|
|
|
};
|
|
|
|
|
2016-12-29 16:04:16 +03:00
|
|
|
/**
|
|
|
|
* Asserts that the current |context| is content.
|
|
|
|
*
|
|
|
|
* @param {string} context
|
|
|
|
* Context to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {string}
|
|
|
|
* |context| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {UnsupportedOperationError}
|
|
|
|
* If |context| is not content.
|
|
|
|
*/
|
|
|
|
assert.content = function (context, msg = "") {
|
|
|
|
msg = msg || "Only supported in content context";
|
|
|
|
assert.that(c => c.toString() == "content", msg, UnsupportedOperationError)(context);
|
|
|
|
}
|
|
|
|
|
2016-11-01 01:00:21 +03:00
|
|
|
/**
|
|
|
|
* Asserts that the current browser is a mobile browser, that is either
|
|
|
|
* B2G or Fennec.
|
|
|
|
*
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @throws {UnsupportedOperationError}
|
|
|
|
* If the current browser is not B2G or Fennec.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.mobile = function (msg = "") {
|
2016-12-29 16:04:16 +03:00
|
|
|
msg = msg || "Only supported in Fennec or B2G";
|
2016-11-01 01:00:21 +03:00
|
|
|
assert.that(() => isFennec() || isB2G(), msg, UnsupportedOperationError)();
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |obj| is defined.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {?}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not defined.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.defined = function (obj, msg = "") {
|
2016-11-01 01:00:21 +03:00
|
|
|
msg = msg || error.pprint`Expected ${obj} to be defined`;
|
|
|
|
return assert.that(o => typeof o != "undefined", msg)(obj);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |obj| is an integer.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {number}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not an integer.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.integer = function (obj, msg = "") {
|
2016-11-01 01:00:21 +03:00
|
|
|
msg = msg || error.pprint`Expected ${obj} to be an integer`;
|
|
|
|
return assert.that(Number.isInteger, msg)(obj);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |obj| is a positive integer.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {number}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not a positive integer.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.positiveInteger = function (obj, msg = "") {
|
2016-11-01 01:00:21 +03:00
|
|
|
assert.integer(obj, msg);
|
|
|
|
msg = msg || error.pprint`Expected ${obj} to be >= 0`;
|
|
|
|
return assert.that(n => n >= 0, msg)(obj);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |obj| is a boolean.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {boolean}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not a boolean.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.boolean = function (obj, msg = "") {
|
2016-11-01 01:00:21 +03:00
|
|
|
msg = msg || error.pprint`Expected ${obj} to be boolean`;
|
|
|
|
return assert.that(b => typeof b == "boolean", msg)(obj);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |obj| is a string.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {string}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not a string.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.string = function (obj, msg = "") {
|
2016-11-01 01:00:21 +03:00
|
|
|
msg = msg || error.pprint`Expected ${obj} to be a string`;
|
|
|
|
return assert.that(s => typeof s == "string", msg)(obj);
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |obj| is an object.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {Object}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not an object.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.object = function (obj, msg = "") {
|
2016-11-01 01:00:21 +03:00
|
|
|
msg = msg || error.pprint`Expected ${obj} to be an object`;
|
2016-12-30 14:21:27 +03:00
|
|
|
return assert.that(o =>
|
|
|
|
Object.prototype.toString.call(o) == "[object Object]", msg)(obj);
|
|
|
|
};
|
2016-12-30 14:39:22 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Asserts that |prop| is in |obj|.
|
|
|
|
*
|
|
|
|
* @param {?} prop
|
|
|
|
* Own property to test if is in |obj|.
|
|
|
|
* @param {?} obj
|
|
|
|
* Object.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {?}
|
|
|
|
* Value of |obj|'s own property |prop|.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |prop| is not in |obj|, or |obj| is not an object.
|
|
|
|
*/
|
|
|
|
assert.in = function (prop, obj, msg = "") {
|
|
|
|
assert.object(obj, msg);
|
|
|
|
msg = msg || error.pprint`Expected ${prop} in ${obj}`;
|
|
|
|
assert.that(p => obj.hasOwnProperty(p), msg)(prop);
|
|
|
|
return obj[prop];
|
2016-11-01 01:00:21 +03:00
|
|
|
};
|
|
|
|
|
2016-12-14 02:29:48 +03:00
|
|
|
/**
|
|
|
|
* Asserts that |obj| is an Array.
|
|
|
|
*
|
|
|
|
* @param {?} obj
|
|
|
|
* Value to test.
|
|
|
|
* @param {string=} msg
|
|
|
|
* Custom error message.
|
|
|
|
*
|
|
|
|
* @return {Object}
|
|
|
|
* |obj| is returned unaltered.
|
|
|
|
*
|
|
|
|
* @throws {InvalidArgumentError}
|
|
|
|
* If |obj| is not an Array.
|
|
|
|
*/
|
|
|
|
assert.array = function (obj, msg = "") {
|
|
|
|
msg = msg || error.pprint`Expected ${obj} to be an Array`;
|
2017-01-05 01:48:11 +03:00
|
|
|
return assert.that(Array.isArray, msg)(obj);
|
2016-12-14 02:29:48 +03:00
|
|
|
};
|
|
|
|
|
2016-11-01 01:00:21 +03:00
|
|
|
/**
|
|
|
|
* Returns a function that is used to assert the |predicate|.
|
|
|
|
*
|
|
|
|
* @param {function(?): boolean} predicate
|
|
|
|
* Evaluated on calling the return value of this function. If its
|
|
|
|
* return value of the inner function is false, |error| is thrown
|
|
|
|
* with |message|.
|
|
|
|
* @param {string=} message
|
|
|
|
* Custom error message.
|
|
|
|
* @param {Error=} error
|
|
|
|
* Custom error type by its class.
|
|
|
|
*
|
|
|
|
* @return {function(?): ?}
|
|
|
|
* Function that takes and returns the passed in value unaltered, and
|
|
|
|
* which may throw |error| with |message| if |predicate| evaluates
|
|
|
|
* to false.
|
|
|
|
*/
|
2016-12-04 14:42:52 +03:00
|
|
|
assert.that = function (
|
2016-11-01 01:00:21 +03:00
|
|
|
predicate, message = "", error = InvalidArgumentError) {
|
|
|
|
return obj => {
|
|
|
|
if (!predicate(obj)) {
|
|
|
|
throw new error(message);
|
|
|
|
}
|
|
|
|
return obj;
|
|
|
|
};
|
|
|
|
};
|