velocious 1.0.668 → 1.0.669
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -6
- package/build/src/testing/expect-utils.d.ts +1 -51
- package/build/src/testing/expect-utils.d.ts.map +1 -1
- package/build/src/testing/expect-utils.js +2 -205
- package/build/src/testing/expect.d.ts +1 -171
- package/build/src/testing/expect.d.ts.map +1 -1
- package/build/src/testing/expect.js +2 -667
- package/build/src/testing/test.d.ts +1 -13
- package/build/src/testing/test.d.ts.map +1 -1
- package/build/src/testing/test.js +2 -14
- package/build/testing/expect-utils.js +1 -242
- package/build/testing/expect.js +1 -760
- package/build/testing/test.js +3 -14
- package/package.json +3 -4
- package/src/testing/expect-utils.js +1 -242
- package/src/testing/expect.js +1 -760
- package/src/testing/test.js +3 -14
- package/build/src/testing/base-expect.d.ts +0 -15
- package/build/src/testing/base-expect.d.ts.map +0 -1
- package/build/src/testing/base-expect.js +0 -16
- package/build/src/testing/expect-to-change.d.ts +0 -32
- package/build/src/testing/expect-to-change.d.ts.map +0 -1
- package/build/src/testing/expect-to-change.js +0 -46
- package/build/testing/base-expect.js +0 -17
- package/build/testing/expect-to-change.js +0 -55
- package/src/testing/base-expect.js +0 -17
- package/src/testing/expect-to-change.js +0 -55
package/README.md
CHANGED
|
@@ -180,13 +180,15 @@ Baselines are generated against a fresh checkout (no generated dummy `configurat
|
|
|
180
180
|
# Testing
|
|
181
181
|
|
|
182
182
|
Application tests may import the testing DSL from the independent public package.
|
|
183
|
-
`@velocious/testing` `0.0.
|
|
184
|
-
|
|
185
|
-
|
|
183
|
+
`@velocious/testing` `0.0.17` owns framework-neutral expectations, matchers,
|
|
184
|
+
equality, change observation, mocks, discovery, filtering, execution, reporting,
|
|
185
|
+
deterministic weighted grouping, profiling, and timing manifests. Compatible
|
|
186
|
+
installed copies share one protocol-1/schema-3 default registry.
|
|
186
187
|
Velocious retains application/configuration startup, database and transaction
|
|
187
188
|
lifecycle, browser execution, environment handling, framework profile spans, and
|
|
188
189
|
report translation. Existing Velocious import paths remain supported as thin
|
|
189
|
-
delegating compatibility facades.
|
|
190
|
+
delegating compatibility facades. Package diagnostics are canonical when legacy
|
|
191
|
+
facades differ only in wording or formatting.
|
|
190
192
|
|
|
191
193
|
```js
|
|
192
194
|
import {describe, expect, it} from "@velocious/testing"
|
|
@@ -2295,8 +2297,11 @@ npx velocious test
|
|
|
2295
2297
|
|
|
2296
2298
|
Test declarations can be imported from `@velocious/testing`; the compatibility
|
|
2297
2299
|
`velocious/build/src/testing/test.js` facade uses the same package registry and remains
|
|
2298
|
-
supported.
|
|
2299
|
-
|
|
2300
|
+
supported. Its `expect`, `arrayContaining`, and `objectContaining` exports, along
|
|
2301
|
+
with the retained deep `expect.js` and `expect-utils.js` paths, delegate directly
|
|
2302
|
+
to the browser-safe package implementation. Under Velocious, ordinary callbacks
|
|
2303
|
+
receive `testArgs`, while `it.each` callbacks receive their row arguments followed
|
|
2304
|
+
by `testArgs`.
|
|
2300
2305
|
|
|
2301
2306
|
If you are developing on Velocious, you can run the tests with:
|
|
2302
2307
|
|
|
@@ -1,52 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Runs object containing.
|
|
3
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
4
|
-
* @returns {{__velociousMatcher: string, value: ReturnType<typeof JSON.parse>}} - Matcher wrapper.
|
|
5
|
-
*/
|
|
6
|
-
declare function objectContaining(value: ReturnType<typeof JSON.parse>): {
|
|
7
|
-
__velociousMatcher: string;
|
|
8
|
-
value: ReturnType<typeof JSON.parse>;
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Runs array containing.
|
|
12
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
13
|
-
* @returns {{__velociousMatcher: string, value: ReturnType<typeof JSON.parse>}} - Matcher wrapper.
|
|
14
|
-
*/
|
|
15
|
-
declare function arrayContaining(value: ReturnType<typeof JSON.parse>): {
|
|
16
|
-
__velociousMatcher: string;
|
|
17
|
-
value: ReturnType<typeof JSON.parse>;
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Runs is array containing.
|
|
21
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
22
|
-
* @returns {boolean} - Whether arrayContaining matcher.
|
|
23
|
-
*/
|
|
24
|
-
declare function isArrayContaining(value: ReturnType<typeof JSON.parse>): boolean;
|
|
25
|
-
/**
|
|
26
|
-
* Runs is object containing.
|
|
27
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
28
|
-
* @returns {boolean} - Whether objectContaining matcher.
|
|
29
|
-
*/
|
|
30
|
-
declare function isObjectContaining(value: ReturnType<typeof JSON.parse>): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Runs match object.
|
|
33
|
-
* @param {ReturnType<typeof JSON.parse>} actual - Actual value.
|
|
34
|
-
* @param {Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>} expected - Expected value.
|
|
35
|
-
* @returns {{matches: boolean, differences: Record<string, Array<ReturnType<typeof JSON.parse>>>}} - Match result.
|
|
36
|
-
*/
|
|
37
|
-
declare function matchObject(actual: ReturnType<typeof JSON.parse>, expected: Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>): {
|
|
38
|
-
matches: boolean;
|
|
39
|
-
differences: Record<string, Array<ReturnType<typeof JSON.parse>>>;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Runs match array containing.
|
|
43
|
-
* @param {ReturnType<typeof JSON.parse>} actual - Actual value.
|
|
44
|
-
* @param {Array<ReturnType<typeof JSON.parse>>} expected - Expected values.
|
|
45
|
-
* @returns {{matches: boolean, differences: Record<string, Array<ReturnType<typeof JSON.parse>>>}} - Match result.
|
|
46
|
-
*/
|
|
47
|
-
declare function matchArrayContaining(actual: ReturnType<typeof JSON.parse>, expected: Array<ReturnType<typeof JSON.parse>>): {
|
|
48
|
-
matches: boolean;
|
|
49
|
-
differences: Record<string, Array<ReturnType<typeof JSON.parse>>>;
|
|
50
|
-
};
|
|
51
|
-
export { arrayContaining, isArrayContaining, isObjectContaining, matchArrayContaining, matchObject, objectContaining };
|
|
1
|
+
export { arrayContaining, isArrayContaining, isObjectContaining, matchArrayContaining, matchObject, objectContaining } from "@velocious/testing";
|
|
52
2
|
//# sourceMappingURL=expect-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expect-utils.d.ts","sourceRoot":"","sources":["../../../src/testing/expect-utils.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expect-utils.d.ts","sourceRoot":"","sources":["../../../src/testing/expect-utils.js"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EACjB,MAAM,oBAAoB,CAAA"}
|
|
@@ -1,206 +1,3 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* Runs object containing.
|
|
5
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
6
|
-
* @returns {{__velociousMatcher: string, value: ReturnType<typeof JSON.parse>}} - Matcher wrapper.
|
|
7
|
-
*/
|
|
8
|
-
function objectContaining(value) {
|
|
9
|
-
if (value === null || typeof value !== "object") {
|
|
10
|
-
throw new Error(`Expected object but got ${typeof value}`);
|
|
11
|
-
}
|
|
12
|
-
return {
|
|
13
|
-
__velociousMatcher: "objectContaining",
|
|
14
|
-
value
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Runs array containing.
|
|
19
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
20
|
-
* @returns {{__velociousMatcher: string, value: ReturnType<typeof JSON.parse>}} - Matcher wrapper.
|
|
21
|
-
*/
|
|
22
|
-
function arrayContaining(value) {
|
|
23
|
-
if (!Array.isArray(value)) {
|
|
24
|
-
throw new Error(`Expected array but got ${typeof value}`);
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
__velociousMatcher: "arrayContaining",
|
|
28
|
-
value
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Runs is object like.
|
|
33
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
34
|
-
* @returns {boolean} - Whether object-like.
|
|
35
|
-
*/
|
|
36
|
-
function isObjectLike(value) {
|
|
37
|
-
return value !== null && typeof value === "object";
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Runs is array containing.
|
|
41
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
42
|
-
* @returns {boolean} - Whether arrayContaining matcher.
|
|
43
|
-
*/
|
|
44
|
-
function isArrayContaining(value) {
|
|
45
|
-
return !!value && typeof value === "object" && /** @type {ReturnType<typeof JSON.parse>} */ (value).__velociousMatcher === "arrayContaining";
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Runs is object containing.
|
|
49
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
50
|
-
* @returns {boolean} - Whether objectContaining matcher.
|
|
51
|
-
*/
|
|
52
|
-
function isObjectContaining(value) {
|
|
53
|
-
return !!value && typeof value === "object" && /** @type {ReturnType<typeof JSON.parse>} */ (value).__velociousMatcher === "objectContaining";
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Runs is plain object.
|
|
57
|
-
* @param {ReturnType<typeof JSON.parse>} value - Value.
|
|
58
|
-
* @returns {boolean} - Whether plain object.
|
|
59
|
-
*/
|
|
60
|
-
function isPlainObject(value) {
|
|
61
|
-
if (!value || typeof value !== "object")
|
|
62
|
-
return false;
|
|
63
|
-
const prototype = Object.getPrototypeOf(value);
|
|
64
|
-
return prototype === Object.prototype || prototype === null;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Runs values equal.
|
|
68
|
-
* @param {ReturnType<typeof JSON.parse>} actual - Actual value.
|
|
69
|
-
* @param {ReturnType<typeof JSON.parse>} expected - Expected value.
|
|
70
|
-
* @returns {boolean} - Whether values are equal.
|
|
71
|
-
*/
|
|
72
|
-
function valuesEqual(actual, expected) {
|
|
73
|
-
if (actual instanceof Date && expected instanceof Date) {
|
|
74
|
-
return actual.getTime() === expected.getTime();
|
|
75
|
-
}
|
|
76
|
-
if (actual instanceof RegExp && expected instanceof RegExp) {
|
|
77
|
-
return actual.source === expected.source && actual.flags === expected.flags;
|
|
78
|
-
}
|
|
79
|
-
return Object.is(actual, expected);
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Runs collect match differences.
|
|
83
|
-
* @param {ReturnType<typeof JSON.parse>} actual - Actual value.
|
|
84
|
-
* @param {ReturnType<typeof JSON.parse>} expected - Expected value.
|
|
85
|
-
* @param {string} path - Path.
|
|
86
|
-
* @param {Record<string, Array<ReturnType<typeof JSON.parse>>>} differences - Differences.
|
|
87
|
-
* @returns {void} - No return value.
|
|
88
|
-
*/
|
|
89
|
-
function collectMatchDifferences(actual, expected, path, differences) {
|
|
90
|
-
if (isObjectContaining(expected)) {
|
|
91
|
-
collectMatchDifferences(actual, /** @type {ReturnType<typeof JSON.parse>} */ (expected).value, path, differences);
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
if (isArrayContaining(expected)) {
|
|
95
|
-
const { matches } = matchArrayContaining(actual, /** @type {Array<ReturnType<typeof JSON.parse>>} */ ( /** @type {ReturnType<typeof JSON.parse>} */(expected).value));
|
|
96
|
-
if (!matches) {
|
|
97
|
-
differences[path || "$"] = [expected, actual];
|
|
98
|
-
}
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
if (Array.isArray(expected)) {
|
|
102
|
-
if (!Array.isArray(actual)) {
|
|
103
|
-
differences[path || "$"] = [expected, actual];
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
for (let i = 0; i < expected.length; i++) {
|
|
107
|
-
const nextPath = `${path}[${i}]`;
|
|
108
|
-
collectMatchDifferences(actual[i], expected[i], nextPath, differences);
|
|
109
|
-
}
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
if (isPlainObject(expected)) {
|
|
113
|
-
if (!isObjectLike(actual)) {
|
|
114
|
-
differences[path || "$"] = [expected, actual];
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const expectedObject = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (expected);
|
|
118
|
-
const actualObject = /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (actual);
|
|
119
|
-
for (const key of Object.keys(expectedObject)) {
|
|
120
|
-
const nextPath = path ? `${path}.${key}` : key;
|
|
121
|
-
if (!Object.prototype.hasOwnProperty.call(actualObject, key)) {
|
|
122
|
-
differences[nextPath] = [expectedObject[key], undefined];
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
collectMatchDifferences(actualObject[key], expectedObject[key], nextPath, differences);
|
|
126
|
-
}
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
if (!valuesEqual(actual, expected)) {
|
|
130
|
-
differences[path || "$"] = [expected, actual];
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Runs match object.
|
|
135
|
-
* @param {ReturnType<typeof JSON.parse>} actual - Actual value.
|
|
136
|
-
* @param {Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>} expected - Expected value.
|
|
137
|
-
* @returns {{matches: boolean, differences: Record<string, Array<ReturnType<typeof JSON.parse>>>}} - Match result.
|
|
138
|
-
*/
|
|
139
|
-
function matchObject(actual, expected) {
|
|
140
|
-
/**
|
|
141
|
-
* Differences.
|
|
142
|
-
* @type {Record<string, Array<ReturnType<typeof JSON.parse>>>} */
|
|
143
|
-
const differences = {};
|
|
144
|
-
collectMatchDifferences(actual, expected, "", differences);
|
|
145
|
-
return {
|
|
146
|
-
matches: Object.keys(differences).length === 0,
|
|
147
|
-
differences
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Runs match array containing.
|
|
152
|
-
* @param {ReturnType<typeof JSON.parse>} actual - Actual value.
|
|
153
|
-
* @param {Array<ReturnType<typeof JSON.parse>>} expected - Expected values.
|
|
154
|
-
* @returns {{matches: boolean, differences: Record<string, Array<ReturnType<typeof JSON.parse>>>}} - Match result.
|
|
155
|
-
*/
|
|
156
|
-
function matchArrayContaining(actual, expected) {
|
|
157
|
-
/**
|
|
158
|
-
* Differences.
|
|
159
|
-
* @type {Record<string, Array<ReturnType<typeof JSON.parse>>>} */
|
|
160
|
-
const differences = {};
|
|
161
|
-
if (!Array.isArray(actual)) {
|
|
162
|
-
differences["$"] = [expected, actual];
|
|
163
|
-
return { matches: false, differences };
|
|
164
|
-
}
|
|
165
|
-
const usedIndexes = new Set();
|
|
166
|
-
for (const expectedItem of expected) {
|
|
167
|
-
let matchedIndex = -1;
|
|
168
|
-
for (let i = 0; i < actual.length; i++) {
|
|
169
|
-
if (usedIndexes.has(i))
|
|
170
|
-
continue;
|
|
171
|
-
if (isObjectContaining(expectedItem)) {
|
|
172
|
-
const { matches } = matchObject(actual[i], /** @type {ReturnType<typeof JSON.parse>} */ (expectedItem).value);
|
|
173
|
-
if (matches) {
|
|
174
|
-
matchedIndex = i;
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
if (isArrayContaining(expectedItem)) {
|
|
180
|
-
const { matches } = matchArrayContaining(actual[i], /** @type {ReturnType<typeof JSON.parse>} */ (expectedItem).value);
|
|
181
|
-
if (matches) {
|
|
182
|
-
matchedIndex = i;
|
|
183
|
-
break;
|
|
184
|
-
}
|
|
185
|
-
continue;
|
|
186
|
-
}
|
|
187
|
-
if (!anythingDifferent(actual[i], expectedItem)) {
|
|
188
|
-
matchedIndex = i;
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
if (matchedIndex >= 0) {
|
|
193
|
-
usedIndexes.add(matchedIndex);
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
differences["$"] = [expected, actual];
|
|
197
|
-
break;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return {
|
|
201
|
-
matches: Object.keys(differences).length === 0,
|
|
202
|
-
differences
|
|
203
|
-
};
|
|
204
|
-
}
|
|
205
|
-
export { arrayContaining, isArrayContaining, isObjectContaining, matchArrayContaining, matchObject, objectContaining };
|
|
206
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZXhwZWN0LXV0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQTtBQUV2RTs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLO0lBQzdCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixPQUFPLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDNUQsQ0FBQztJQUVELE9BQU87UUFDTCxrQkFBa0IsRUFBRSxrQkFBa0I7UUFDdEMsS0FBSztLQUNOLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQUs7SUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixPQUFPLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELE9BQU87UUFDTCxrQkFBa0IsRUFBRSxpQkFBaUI7UUFDckMsS0FBSztLQUNOLENBQUE7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQTtBQUNwRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsaUJBQWlCLENBQUMsS0FBSztJQUM5QixPQUFPLENBQUMsQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFLLDRDQUE0QyxDQUFDLENBQUMsS0FBSyxDQUFFLENBQUMsa0JBQWtCLEtBQUssaUJBQWlCLENB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Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2FueXRoaW5nRGlmZmVyZW50fSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvZGlmZi11dGlscy5qc1wiXG5cbi8qKlxuICogUnVucyBvYmplY3QgY29udGFpbmluZy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7e19fdmVsb2Npb3VzTWF0Y2hlcjogc3RyaW5nLCB2YWx1ZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSAtIE1hdGNoZXIgd3JhcHBlci5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0Q29udGFpbmluZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCAke3R5cGVvZiB2YWx1ZX1gKVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBfX3ZlbG9jaW91c01hdGNoZXI6IFwib2JqZWN0Q29udGFpbmluZ1wiLFxuICAgIHZhbHVlXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGFycmF5IGNvbnRhaW5pbmcuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge3tfX3ZlbG9jaW91c01hdGNoZXI6IHN0cmluZywgdmFsdWU6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fX0gLSBNYXRjaGVyIHdyYXBwZXIuXG4gKi9cbmZ1bmN0aW9uIGFycmF5Q29udGFpbmluZyh2YWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhcnJheSBidXQgZ290ICR7dHlwZW9mIHZhbHVlfWApXG4gIH1cblxuICByZXR1cm4ge1xuICAgIF9fdmVsb2Npb3VzTWF0Y2hlcjogXCJhcnJheUNvbnRhaW5pbmdcIixcbiAgICB2YWx1ZVxuICB9XG59XG5cbi8qKlxuICogUnVucyBpcyBvYmplY3QgbGlrZS5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIG9iamVjdC1saWtlLlxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIlxufVxuXG4vKipcbiAqIFJ1bnMgaXMgYXJyYXkgY29udGFpbmluZy5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGFycmF5Q29udGFpbmluZyBtYXRjaGVyLlxuICovXG5mdW5jdGlvbiBpc0FycmF5Q29udGFpbmluZyh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovICh2YWx1ZSkpLl9fdmVsb2Npb3VzTWF0Y2hlciA9PT0gXCJhcnJheUNvbnRhaW5pbmdcIlxufVxuXG4vKipcbiAqIFJ1bnMgaXMgb2JqZWN0IGNvbnRhaW5pbmcuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSB2YWx1ZSAtIFZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBvYmplY3RDb250YWluaW5nIG1hdGNoZXIuXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0Q29udGFpbmluZyh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgKC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovICh2YWx1ZSkpLl9fdmVsb2Npb3VzTWF0Y2hlciA9PT0gXCJvYmplY3RDb250YWluaW5nXCJcbn1cblxuLyoqXG4gKiBSdW5zIGlzIHBsYWluIG9iamVjdC5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gVmFsdWUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlXG5cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKVxuXG4gIHJldHVybiBwcm90b3R5cGUgPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG90eXBlID09PSBudWxsXG59XG5cbi8qKlxuICogUnVucyB2YWx1ZXMgZXF1YWwuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhY3R1YWwgLSBBY3R1YWwgdmFsdWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBleHBlY3RlZCAtIEV4cGVjdGVkIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB2YWx1ZXMgYXJlIGVxdWFsLlxuICovXG5mdW5jdGlvbiB2YWx1ZXNFcXVhbChhY3R1YWwsIGV4cGVjdGVkKSB7XG4gIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBEYXRlICYmIGV4cGVjdGVkIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBhY3R1YWwuZ2V0VGltZSgpID09PSBleHBlY3RlZC5nZXRUaW1lKClcbiAgfVxuXG4gIGlmIChhY3R1YWwgaW5zdGFuY2VvZiBSZWdFeHAgJiYgZXhwZWN0ZWQgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICByZXR1cm4gYWN0dWFsLnNvdXJjZSA9PT0gZXhwZWN0ZWQuc291cmNlICYmIGFjdHVhbC5mbGFncyA9PT0gZXhwZWN0ZWQuZmxhZ3NcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuaXMoYWN0dWFsLCBleHBlY3RlZClcbn1cblxuLyoqXG4gKiBSdW5zIGNvbGxlY3QgbWF0Y2ggZGlmZmVyZW5jZXMuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhY3R1YWwgLSBBY3R1YWwgdmFsdWUuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBleHBlY3RlZCAtIEV4cGVjdGVkIHZhbHVlLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSBkaWZmZXJlbmNlcyAtIERpZmZlcmVuY2VzLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBjb2xsZWN0TWF0Y2hEaWZmZXJlbmNlcyhhY3R1YWwsIGV4cGVjdGVkLCBwYXRoLCBkaWZmZXJlbmNlcykge1xuICBpZiAoaXNPYmplY3RDb250YWluaW5nKGV4cGVjdGVkKSkge1xuICAgIGNvbGxlY3RNYXRjaERpZmZlcmVuY2VzKGFjdHVhbCwgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGV4cGVjdGVkKS52YWx1ZSwgcGF0aCwgZGlmZmVyZW5jZXMpXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoaXNBcnJheUNvbnRhaW5pbmcoZXhwZWN0ZWQpKSB7XG4gICAgY29uc3Qge21hdGNoZXN9ID0gbWF0Y2hBcnJheUNvbnRhaW5pbmcoYWN0dWFsLCAvKiogQHR5cGUge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovIChleHBlY3RlZCkudmFsdWUpKVxuXG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICBkaWZmZXJlbmNlc1twYXRoIHx8IFwiJFwiXSA9IFtleHBlY3RlZCwgYWN0dWFsXVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFjdHVhbCkpIHtcbiAgICAgIGRpZmZlcmVuY2VzW3BhdGggfHwgXCIkXCJdID0gW2V4cGVjdGVkLCBhY3R1YWxdXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuZXh0UGF0aCA9IGAke3BhdGh9WyR7aX1dYFxuICAgICAgY29sbGVjdE1hdGNoRGlmZmVyZW5jZXMoYWN0dWFsW2ldLCBleHBlY3RlZFtpXSwgbmV4dFBhdGgsIGRpZmZlcmVuY2VzKVxuICAgIH1cblxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKGlzUGxhaW5PYmplY3QoZXhwZWN0ZWQpKSB7XG4gICAgaWYgKCFpc09iamVjdExpa2UoYWN0dWFsKSkge1xuICAgICAgZGlmZmVyZW5jZXNbcGF0aCB8fCBcIiRcIl0gPSBbZXhwZWN0ZWQsIGFjdHVhbF1cbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGV4cGVjdGVkT2JqZWN0ID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovIChleHBlY3RlZClcbiAgICBjb25zdCBhY3R1YWxPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKGFjdHVhbClcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGV4cGVjdGVkT2JqZWN0KSkge1xuICAgICAgY29uc3QgbmV4dFBhdGggPSBwYXRoID8gYCR7cGF0aH0uJHtrZXl9YCA6IGtleVxuXG4gICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhY3R1YWxPYmplY3QsIGtleSkpIHtcbiAgICAgICAgZGlmZmVyZW5jZXNbbmV4dFBhdGhdID0gW2V4cGVjdGVkT2JqZWN0W2tleV0sIHVuZGVmaW5lZF1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29sbGVjdE1hdGNoRGlmZmVyZW5jZXMoYWN0dWFsT2JqZWN0W2tleV0sIGV4cGVjdGVkT2JqZWN0W2tleV0sIG5leHRQYXRoLCBkaWZmZXJlbmNlcylcbiAgICB9XG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmICghdmFsdWVzRXF1YWwoYWN0dWFsLCBleHBlY3RlZCkpIHtcbiAgICBkaWZmZXJlbmNlc1twYXRoIHx8IFwiJFwiXSA9IFtleHBlY3RlZCwgYWN0dWFsXVxuICB9XG59XG5cbi8qKlxuICogUnVucyBtYXRjaCBvYmplY3QuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhY3R1YWwgLSBBY3R1YWwgdmFsdWUuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gZXhwZWN0ZWQgLSBFeHBlY3RlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHt7bWF0Y2hlczogYm9vbGVhbiwgZGlmZmVyZW5jZXM6IFJlY29yZDxzdHJpbmcsIEFycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59fSAtIE1hdGNoIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gbWF0Y2hPYmplY3QoYWN0dWFsLCBleHBlY3RlZCkge1xuICAvKipcbiAgICogRGlmZmVyZW5jZXMuXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSAqL1xuICBjb25zdCBkaWZmZXJlbmNlcyA9IHt9XG5cbiAgY29sbGVjdE1hdGNoRGlmZmVyZW5jZXMoYWN0dWFsLCBleHBlY3RlZCwgXCJcIiwgZGlmZmVyZW5jZXMpXG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID09PSAwLFxuICAgIGRpZmZlcmVuY2VzXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIG1hdGNoIGFycmF5IGNvbnRhaW5pbmcuXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhY3R1YWwgLSBBY3R1YWwgdmFsdWUuXG4gKiBAcGFyYW0ge0FycmF5PFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gZXhwZWN0ZWQgLSBFeHBlY3RlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyB7e21hdGNoZXM6IGJvb2xlYW4sIGRpZmZlcmVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fX0gLSBNYXRjaCByZXN1bHQuXG4gKi9cbmZ1bmN0aW9uIG1hdGNoQXJyYXlDb250YWluaW5nKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgLyoqXG4gICAqIERpZmZlcmVuY2VzLlxuICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgQXJyYXk8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0gKi9cbiAgY29uc3QgZGlmZmVyZW5jZXMgPSB7fVxuXG4gIGlmICghQXJyYXkuaXNBcnJheShhY3R1YWwpKSB7XG4gICAgZGlmZmVyZW5jZXNbXCIkXCJdID0gW2V4cGVjdGVkLCBhY3R1YWxdXG4gICAgcmV0dXJuIHttYXRjaGVzOiBmYWxzZSwgZGlmZmVyZW5jZXN9XG4gIH1cblxuICBjb25zdCB1c2VkSW5kZXhlcyA9IG5ldyBTZXQoKVxuXG4gIGZvciAoY29uc3QgZXhwZWN0ZWRJdGVtIG9mIGV4cGVjdGVkKSB7XG4gICAgbGV0IG1hdGNoZWRJbmRleCA9IC0xXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHVzZWRJbmRleGVzLmhhcyhpKSkgY29udGludWVcblxuICAgICAgaWYgKGlzT2JqZWN0Q29udGFpbmluZyhleHBlY3RlZEl0ZW0pKSB7XG4gICAgICAgIGNvbnN0IHttYXRjaGVzfSA9IG1hdGNoT2JqZWN0KGFjdHVhbFtpXSwgLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKGV4cGVjdGVkSXRlbSkudmFsdWUpXG4gICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgbWF0Y2hlZEluZGV4ID0gaVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQXJyYXlDb250YWluaW5nKGV4cGVjdGVkSXRlbSkpIHtcbiAgICAgICAgY29uc3Qge21hdGNoZXN9ID0gbWF0Y2hBcnJheUNvbnRhaW5pbmcoYWN0dWFsW2ldLCAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAoZXhwZWN0ZWRJdGVtKS52YWx1ZSlcbiAgICAgICAgaWYgKG1hdGNoZXMpIHtcbiAgICAgICAgICBtYXRjaGVkSW5kZXggPSBpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBpZiAoIWFueXRoaW5nRGlmZmVyZW50KGFjdHVhbFtpXSwgZXhwZWN0ZWRJdGVtKSkge1xuICAgICAgICBtYXRjaGVkSW5kZXggPSBpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1hdGNoZWRJbmRleCA+PSAwKSB7XG4gICAgICB1c2VkSW5kZXhlcy5hZGQobWF0Y2hlZEluZGV4KVxuICAgIH0gZWxzZSB7XG4gICAgICBkaWZmZXJlbmNlc1tcIiRcIl0gPSBbZXhwZWN0ZWQsIGFjdHVhbF1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYXRjaGVzOiBPYmplY3Qua2V5cyhkaWZmZXJlbmNlcykubGVuZ3RoID09PSAwLFxuICAgIGRpZmZlcmVuY2VzXG4gIH1cbn1cblxuZXhwb3J0IHtcbiAgYXJyYXlDb250YWluaW5nLFxuICBpc0FycmF5Q29udGFpbmluZyxcbiAgaXNPYmplY3RDb250YWluaW5nLFxuICBtYXRjaEFycmF5Q29udGFpbmluZyxcbiAgbWF0Y2hPYmplY3QsXG4gIG9iamVjdENvbnRhaW5pbmdcbn1cbiJdfQ==
|
|
2
|
+
export { arrayContaining, isArrayContaining, isObjectContaining, matchArrayContaining, matchObject, objectContaining } from "@velocious/testing";
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZWN0LXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3Rlc3RpbmcvZXhwZWN0LXV0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQ0wsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLFdBQVcsRUFDWCxnQkFBZ0IsRUFDakIsTUFBTSxvQkFBb0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5leHBvcnQge1xuICBhcnJheUNvbnRhaW5pbmcsXG4gIGlzQXJyYXlDb250YWluaW5nLFxuICBpc09iamVjdENvbnRhaW5pbmcsXG4gIG1hdGNoQXJyYXlDb250YWluaW5nLFxuICBtYXRjaE9iamVjdCxcbiAgb2JqZWN0Q29udGFpbmluZ1xufSBmcm9tIFwiQHZlbG9jaW91cy90ZXN0aW5nXCJcbiJdfQ==
|
|
@@ -1,172 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import ExpectToChange from "./expect-to-change.js";
|
|
3
|
-
export default class Expect extends BaseExpect {
|
|
4
|
-
_object: any;
|
|
5
|
-
/**
|
|
6
|
-
* Narrows the runtime value to the documented type.
|
|
7
|
-
* @type {Array<Expect | ExpectToChange>} */
|
|
8
|
-
expectations: Array<Expect | ExpectToChange>;
|
|
9
|
-
_not: boolean | undefined;
|
|
10
|
-
/**
|
|
11
|
-
* Runs constructor.
|
|
12
|
-
* @param {ReturnType<typeof JSON.parse>} object - Object.
|
|
13
|
-
*/
|
|
14
|
-
constructor(object: ReturnType<typeof JSON.parse>);
|
|
15
|
-
/**
|
|
16
|
-
* Runs and change.
|
|
17
|
-
* @param {() => Promise<number>} changeCallback - Change callback.
|
|
18
|
-
* @returns {ExpectToChange} - The and change.
|
|
19
|
-
*/
|
|
20
|
-
andChange(changeCallback: () => Promise<number>): ExpectToChange;
|
|
21
|
-
/**
|
|
22
|
-
* Returns not.
|
|
23
|
-
* @returns {this} - A value.
|
|
24
|
-
*/
|
|
25
|
-
get not(): this;
|
|
26
|
-
/**
|
|
27
|
-
* Runs to be.
|
|
28
|
-
* @param {ReturnType<typeof JSON.parse>} result - Result.
|
|
29
|
-
* @returns {void} - No return value.
|
|
30
|
-
*/
|
|
31
|
-
toBe(result: ReturnType<typeof JSON.parse>): void;
|
|
32
|
-
/**
|
|
33
|
-
* Runs to be less than.
|
|
34
|
-
* @param {number} result - Result.
|
|
35
|
-
* @returns {void} - No return value.
|
|
36
|
-
*/
|
|
37
|
-
toBeLessThan(result: number): void;
|
|
38
|
-
/**
|
|
39
|
-
* Runs to be less than or equal.
|
|
40
|
-
* @param {number} result - Result.
|
|
41
|
-
* @returns {void} - No return value.
|
|
42
|
-
*/
|
|
43
|
-
toBeLessThanOrEqual(result: number): void;
|
|
44
|
-
/**
|
|
45
|
-
* Runs to be greater than.
|
|
46
|
-
* @param {number} result - Result.
|
|
47
|
-
* @returns {void} - No return value.
|
|
48
|
-
*/
|
|
49
|
-
toBeGreaterThan(result: number): void;
|
|
50
|
-
/**
|
|
51
|
-
* Runs to be greater than or equal.
|
|
52
|
-
* @param {number} result - Result.
|
|
53
|
-
* @returns {void} - No return value.
|
|
54
|
-
*/
|
|
55
|
-
toBeGreaterThanOrEqual(result: number): void;
|
|
56
|
-
/**
|
|
57
|
-
* Runs to be close to.
|
|
58
|
-
* @param {number} result - Result.
|
|
59
|
-
* @param {number} [precision] - Decimal precision.
|
|
60
|
-
* @returns {void} - No return value.
|
|
61
|
-
*/
|
|
62
|
-
toBeCloseTo(result: number, precision?: number): void;
|
|
63
|
-
/**
|
|
64
|
-
* Runs to have length.
|
|
65
|
-
* @param {number} result - Expected length.
|
|
66
|
-
* @returns {void} - No return value.
|
|
67
|
-
*/
|
|
68
|
-
toHaveLength(result: number): void;
|
|
69
|
-
/**
|
|
70
|
-
* Runs to be defined.
|
|
71
|
-
* @returns {void} - No return value.
|
|
72
|
-
*/
|
|
73
|
-
toBeDefined(): void;
|
|
74
|
-
/**
|
|
75
|
-
* Runs to be instance of.
|
|
76
|
-
* @param {new (...args: Array<ReturnType<typeof JSON.parse>>) => ReturnType<typeof JSON.parse>} klass - Class constructor to check against (e.g. a built-in like Error).
|
|
77
|
-
* @returns {void} - No return value.
|
|
78
|
-
*/
|
|
79
|
-
toBeInstanceOf(klass: new (...args: Array<ReturnType<typeof JSON.parse>>) => ReturnType<typeof JSON.parse>): void;
|
|
80
|
-
/**
|
|
81
|
-
* Runs to be false.
|
|
82
|
-
* @returns {void} - No return value.
|
|
83
|
-
*/
|
|
84
|
-
toBeFalse(): void;
|
|
85
|
-
/**
|
|
86
|
-
* Runs to be null.
|
|
87
|
-
* @returns {void} - No return value.
|
|
88
|
-
*/
|
|
89
|
-
toBeNull(): void;
|
|
90
|
-
/**
|
|
91
|
-
* Runs to be undefined.
|
|
92
|
-
* @returns {void} - No return value.
|
|
93
|
-
*/
|
|
94
|
-
toBeUndefined(): void;
|
|
95
|
-
/**
|
|
96
|
-
* Runs to be true.
|
|
97
|
-
* @returns {void} - No return value.
|
|
98
|
-
*/
|
|
99
|
-
toBeTrue(): void;
|
|
100
|
-
/**
|
|
101
|
-
* Runs to be truthy.
|
|
102
|
-
* @returns {void} - No return value.
|
|
103
|
-
*/
|
|
104
|
-
toBeTruthy(): void;
|
|
105
|
-
/**
|
|
106
|
-
* Runs to change.
|
|
107
|
-
* @param {() => Promise<number>} changeCallback - Change callback.
|
|
108
|
-
* @returns {ExpectToChange} - The change.
|
|
109
|
-
*/
|
|
110
|
-
toChange(changeCallback: () => Promise<number>): ExpectToChange;
|
|
111
|
-
/**
|
|
112
|
-
* Runs to contain.
|
|
113
|
-
* @param {ReturnType<typeof JSON.parse>} valueToContain - Value to contain.
|
|
114
|
-
* @returns {void} - No return value.
|
|
115
|
-
*/
|
|
116
|
-
toContain(valueToContain: ReturnType<typeof JSON.parse>): void;
|
|
117
|
-
/**
|
|
118
|
-
* Runs to contain equal.
|
|
119
|
-
* @param {ReturnType<typeof JSON.parse>} valueToContain - Value to contain.
|
|
120
|
-
* @returns {void} - No return value.
|
|
121
|
-
*/
|
|
122
|
-
toContainEqual(valueToContain: ReturnType<typeof JSON.parse>): void;
|
|
123
|
-
/**
|
|
124
|
-
* Runs to include.
|
|
125
|
-
* @param {ReturnType<typeof JSON.parse>} valueToInclude - Value to include.
|
|
126
|
-
* @returns {void} - No return value.
|
|
127
|
-
*/
|
|
128
|
-
toInclude(valueToInclude: ReturnType<typeof JSON.parse>): void;
|
|
129
|
-
/**
|
|
130
|
-
* Runs to equal.
|
|
131
|
-
* @param {ReturnType<typeof JSON.parse>} result - Result.
|
|
132
|
-
* @returns {void} - No return value.
|
|
133
|
-
*/
|
|
134
|
-
toEqual(result: ReturnType<typeof JSON.parse>): void;
|
|
135
|
-
/**
|
|
136
|
-
* Runs to match.
|
|
137
|
-
* @param {RegExp} regex - Regex.
|
|
138
|
-
* @returns {void} - No return value.
|
|
139
|
-
*/
|
|
140
|
-
toMatch(regex: RegExp): void;
|
|
141
|
-
/**
|
|
142
|
-
* Runs to match object.
|
|
143
|
-
* @param {Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>} expected - Expected partial object.
|
|
144
|
-
* @returns {void} - No return value.
|
|
145
|
-
*/
|
|
146
|
-
toMatchObject(expected: Record<string, ReturnType<typeof JSON.parse>> | Array<ReturnType<typeof JSON.parse>>): void;
|
|
147
|
-
/**
|
|
148
|
-
* Runs to throw error.
|
|
149
|
-
* @template T extends Error
|
|
150
|
-
* @param {string|T} expectedError - Expected error.
|
|
151
|
-
* @returns {Promise<void>} - Resolves when complete.
|
|
152
|
-
*/
|
|
153
|
-
toThrowError<T>(expectedError: string | T): Promise<void>;
|
|
154
|
-
/**
|
|
155
|
-
* Runs to throw.
|
|
156
|
-
* @param {string|RegExp|Error|((new (...args: Array<ReturnType<typeof JSON.parse>>) => Error))} [expected] - Expected error.
|
|
157
|
-
* @returns {Promise<void>} - Resolves when complete.
|
|
158
|
-
*/
|
|
159
|
-
toThrow(expected?: string | RegExp | Error | ((new (...args: Array<ReturnType<typeof JSON.parse>>) => Error))): Promise<void>;
|
|
160
|
-
/**
|
|
161
|
-
* Runs execute.
|
|
162
|
-
* @returns {Promise<ReturnType<typeof JSON.parse>>} - Resolves with the execute.
|
|
163
|
-
*/
|
|
164
|
-
execute(): Promise<ReturnType<typeof JSON.parse>>;
|
|
165
|
-
/**
|
|
166
|
-
* Runs to have attributes.
|
|
167
|
-
* @param {Record<string, ReturnType<typeof JSON.parse>>} result - Result.
|
|
168
|
-
* @returns {void} - No return value.
|
|
169
|
-
*/
|
|
170
|
-
toHaveAttributes(result: Record<string, ReturnType<typeof JSON.parse>>): void;
|
|
171
|
-
}
|
|
1
|
+
export { Expect as default } from "@velocious/testing";
|
|
172
2
|
//# sourceMappingURL=expect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../../src/testing/expect.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../../src/testing/expect.js"],"names":[],"mappings":"AAEA,OAAO,EAAC,MAAM,IAAI,OAAO,EAAC,MAAM,oBAAoB,CAAA"}
|