123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- "use strict";
- module.metadata = {
- "stability": "unstable"
- };
- const { isFunction, isNull, isObject, isString,
- isRegExp, isArray, isDate, isPrimitive,
- isUndefined, instanceOf, source } = require("../lang/type");
- function AssertionError(options) {
- let assertionError = Object.create(AssertionError.prototype);
- if (isString(options))
- options = { message: options };
- if ("actual" in options)
- assertionError.actual = options.actual;
- if ("expected" in options)
- assertionError.expected = options.expected;
- if ("operator" in options)
- assertionError.operator = options.operator;
- assertionError.message = options.message;
- assertionError.stack = new Error().stack;
- return assertionError;
- }
- AssertionError.prototype = Object.create(Error.prototype, {
- constructor: { value: AssertionError },
- name: { value: "AssertionError", enumerable: true },
- toString: { value: function toString() {
- let value;
- if (this.message) {
- value = this.name + " : " + this.message;
- }
- else {
- value = [
- this.name + " : ",
- source(this.expected),
- this.operator,
- source(this.actual)
- ].join(" ");
- }
- return value;
- }}
- });
- exports.AssertionError = AssertionError;
- function Assert(logger) {
- let assert = Object.create(Assert.prototype, { _log: { value: logger }});
- assert.fail = assert.fail.bind(assert);
- assert.pass = assert.pass.bind(assert);
- return assert;
- }
- Assert.prototype = {
- fail: function fail(e) {
- if (!e || typeof(e) !== 'object') {
- this._log.fail(e);
- return;
- }
- let message = e.message;
- try {
- if ('operator' in e) {
- message += [
- " -",
- source(e.expected),
- e.operator,
- source(e.actual)
- ].join(" ");
- }
- }
- catch(e) {}
- this._log.fail(message);
- },
- pass: function pass(message) {
- this._log.pass(message);
- },
- error: function error(e) {
- this._log.exception(e);
- },
- ok: function ok(value, message) {
- if (!!!value) {
- this.fail({
- actual: value,
- expected: true,
- message: message,
- operator: "=="
- });
- }
- else {
- this.pass(message);
- }
- },
-
- equal: function equal(actual, expected, message) {
- if (actual == expected) {
- this.pass(message);
- }
- else {
- this.fail({
- actual: actual,
- expected: expected,
- message: message,
- operator: "=="
- });
- }
- },
-
- notEqual: function notEqual(actual, expected, message) {
- if (actual != expected) {
- this.pass(message);
- }
- else {
- this.fail({
- actual: actual,
- expected: expected,
- message: message,
- operator: "!=",
- });
- }
- },
-
- deepEqual: function deepEqual(actual, expected, message) {
- if (isDeepEqual(actual, expected)) {
- this.pass(message);
- }
- else {
- this.fail({
- actual: actual,
- expected: expected,
- message: message,
- operator: "deepEqual"
- });
- }
- },
-
- notDeepEqual: function notDeepEqual(actual, expected, message) {
- if (!isDeepEqual(actual, expected)) {
- this.pass(message);
- }
- else {
- this.fail({
- actual: actual,
- expected: expected,
- message: message,
- operator: "notDeepEqual"
- });
- }
- },
-
- strictEqual: function strictEqual(actual, expected, message) {
- if (actual === expected) {
- this.pass(message);
- }
- else {
- this.fail({
- actual: actual,
- expected: expected,
- message: message,
- operator: "==="
- });
- }
- },
-
- notStrictEqual: function notStrictEqual(actual, expected, message) {
- if (actual !== expected) {
- this.pass(message);
- }
- else {
- this.fail({
- actual: actual,
- expected: expected,
- message: message,
- operator: "!=="
- })
- }
- },
-
- throws: function throws(block, Error, message) {
- let threw = false;
- let exception = null;
-
-
-
- if (isString(Error) && isUndefined(message)) {
- message = Error;
- Error = undefined;
- }
-
- try {
- block();
- }
- catch (e) {
- threw = true;
- exception = e;
- }
-
-
- if (threw && (isUndefined(Error) ||
-
-
- (isRegExp(Error) && Error.test(exception.message)) ||
-
-
- (isFunction(Error) && instanceOf(exception, Error))))
- {
- this.pass(message);
- }
-
- else {
- let failure = {
- message: message,
- operator: "throws"
- };
- if (exception)
- failure.actual = exception;
- if (Error)
- failure.expected = Error;
- this.fail(failure);
- }
- }
- };
- exports.Assert = Assert;
- function isDeepEqual(actual, expected) {
-
- if (actual === expected) {
- return true;
- }
-
-
- else if (isDate(actual) && isDate(expected)) {
- return actual.getTime() === expected.getTime();
- }
-
- else if (isPrimitive(actual) || isPrimitive(expected)) {
- return expected === actual;
- }
-
-
- else if (!isObject(actual) && !isObject(expected)) {
- return actual == expected;
- }
-
-
-
-
-
-
- else {
- return actual.prototype === expected.prototype &&
- isEquivalent(actual, expected);
- }
- }
- function isEquivalent(a, b, stack) {
- let aKeys = Object.keys(a);
- let bKeys = Object.keys(b);
- return aKeys.length === bKeys.length &&
- isArrayEquivalent(aKeys.sort(), bKeys.sort()) &&
- aKeys.every(function(key) {
- return isDeepEqual(a[key], b[key], stack)
- });
- }
- function isArrayEquivalent(a, b, stack) {
- return isArray(a) && isArray(b) &&
- a.every(function(value, index) {
- return isDeepEqual(value, b[index]);
- });
- }
|