1 | 'use strict';
|
2 | var assert = require('core-assert');
|
3 | var deepEqual = require('deeper');
|
4 | var observableToPromise = require('observable-to-promise');
|
5 | var isObservable = require('is-observable');
|
6 | var isPromise = require('is-promise');
|
7 | var util = require('util');
|
8 | var x = module.exports;
|
9 |
|
10 | Object.defineProperty(x, 'AssertionError', {value: assert.AssertionError});
|
11 |
|
12 | function noop() {}
|
13 |
|
14 | function create(val, expected, operator, msg, fn) {
|
15 | return {
|
16 | actual: val,
|
17 | expected: expected,
|
18 | message: msg,
|
19 | operator: operator,
|
20 | stackStartFunction: fn
|
21 | };
|
22 | }
|
23 |
|
24 | function test(ok, opts) {
|
25 | if (!ok) {
|
26 | throw new assert.AssertionError(opts);
|
27 | }
|
28 | }
|
29 |
|
30 | x.pass = function (msg) {
|
31 | test(true, create(true, true, 'pass', msg, x.pass));
|
32 | };
|
33 |
|
34 | x.fail = function (msg) {
|
35 | msg = msg || 'Test failed via t.fail()';
|
36 | test(false, create(false, false, 'fail', msg, x.fail));
|
37 | };
|
38 |
|
39 | x.ok = function (val, msg) {
|
40 | test(val, create(val, true, '==', msg, x.ok));
|
41 | };
|
42 |
|
43 | x.notOk = function (val, msg) {
|
44 | test(!val, create(val, false, '==', msg, x.notOk));
|
45 | };
|
46 |
|
47 | x.true = function (val, msg) {
|
48 | test(val === true, create(val, true, '===', msg, x.true));
|
49 | };
|
50 |
|
51 | x.false = function (val, msg) {
|
52 | test(val === false, create(val, false, '===', msg, x.false));
|
53 | };
|
54 |
|
55 | x.is = function (val, expected, msg) {
|
56 | test(val === expected, create(val, expected, '===', msg, x.is));
|
57 | };
|
58 |
|
59 | x.not = function (val, expected, msg) {
|
60 | test(val !== expected, create(val, expected, '!==', msg, x.not));
|
61 | };
|
62 |
|
63 | x.same = function (val, expected, msg) {
|
64 | test(deepEqual(val, expected), create(val, expected, '===', msg, x.same));
|
65 | };
|
66 |
|
67 | x.notSame = function (val, expected, msg) {
|
68 | test(!deepEqual(val, expected), create(val, expected, '!==', msg, x.notSame));
|
69 | };
|
70 |
|
71 | x.throws = function (fn, err, msg) {
|
72 | if (isObservable(fn)) {
|
73 | fn = observableToPromise(fn);
|
74 | }
|
75 |
|
76 | if (isPromise(fn)) {
|
77 | return fn
|
78 | .then(function () {
|
79 | x.throws(noop, err, msg);
|
80 | }, function (fnErr) {
|
81 | return x.throws(function () {
|
82 | throw fnErr;
|
83 | }, err, msg);
|
84 | });
|
85 | }
|
86 |
|
87 | try {
|
88 | if (typeof err === 'string') {
|
89 | var errMsg = err;
|
90 | err = function (err) {
|
91 | return err.message === errMsg;
|
92 | };
|
93 | }
|
94 |
|
95 | var result;
|
96 |
|
97 | assert.throws(function () {
|
98 | try {
|
99 | fn();
|
100 | } catch (error) {
|
101 | result = error;
|
102 | throw error;
|
103 | }
|
104 | }, err, msg);
|
105 |
|
106 | return result;
|
107 | } catch (err) {
|
108 | test(false, create(err.actual, err.expected, err.operator, err.message, x.throws));
|
109 | }
|
110 | };
|
111 |
|
112 | x.notThrows = function (fn, msg) {
|
113 | if (isObservable(fn)) {
|
114 | fn = observableToPromise(fn);
|
115 | }
|
116 |
|
117 | if (isPromise(fn)) {
|
118 | return fn
|
119 | .catch(function (err) {
|
120 | x.notThrows(function () {
|
121 | throw err;
|
122 | }, msg);
|
123 | });
|
124 | }
|
125 |
|
126 | try {
|
127 | assert.doesNotThrow(fn, msg);
|
128 | } catch (err) {
|
129 | test(false, create(err.actual, err.expected, err.operator, err.message, x.notThrows));
|
130 | }
|
131 | };
|
132 |
|
133 | x.doesNotThrow = util.deprecate(x.notThrows, 't.doesNotThrow is renamed to t.notThrows. The old name still works, but will be removed in AVA 1.0.0. Update your references.');
|
134 |
|
135 | x.regex = function (contents, regex, msg) {
|
136 | test(regex.test(contents), create(regex, contents, '===', msg, x.regex));
|
137 | };
|
138 |
|
139 | x.ifError = x.error = function (err, msg) {
|
140 | test(!err, create(err, 'Error', '!==', msg, x.ifError));
|
141 | };
|