@nestia/e2e 0.1.7 → 0.2.0
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 +1 -1
- package/lib/ArrayUtil.d.ts +8 -9
- package/lib/ArrayUtil.js +34 -41
- package/lib/ArrayUtil.js.map +1 -1
- package/lib/RandomGenerator.d.ts +9 -19
- package/lib/RandomGenerator.js +34 -48
- package/lib/RandomGenerator.js.map +1 -1
- package/lib/StopWatch.d.ts +2 -2
- package/lib/StopWatch.js +18 -21
- package/lib/StopWatch.js.map +1 -1
- package/lib/TestValidator.d.ts +2 -2
- package/lib/TestValidator.js +55 -22
- package/lib/TestValidator.js.map +1 -1
- package/package.json +59 -56
- package/src/ArrayUtil.ts +71 -78
- package/src/RandomGenerator.ts +31 -44
- package/src/StopWatch.ts +10 -8
- package/src/TestValidator.ts +53 -14
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@nestia/e2e)
|
|
4
4
|
[](https://www.npmjs.com/package/@nestia/e2e)
|
|
5
5
|
[](https://github.com/samchon/nestia/actions?query=workflow%3Abuild)
|
|
6
|
-
[](https://
|
|
6
|
+
[](https://typia.io/docs/)
|
|
7
7
|
|
|
8
8
|
Helper library for E2E testing in NestJS.
|
|
9
9
|
|
package/lib/ArrayUtil.d.ts
CHANGED
|
@@ -4,13 +4,12 @@
|
|
|
4
4
|
* @author Jeongho Nam - https://github.com/samchon
|
|
5
5
|
*/
|
|
6
6
|
export declare namespace ArrayUtil {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
function subsets<T>(array: T[]): T[][];
|
|
7
|
+
const asyncFilter: <Input>(elements: readonly Input[]) => (pred: (elem: Input, index: number, array: readonly Input[]) => Promise<boolean>) => Promise<Input[]>;
|
|
8
|
+
const asyncForEach: <Input>(elements: readonly Input[]) => (closure: (elem: Input, index: number, array: readonly Input[]) => Promise<any>) => Promise<void>;
|
|
9
|
+
const asyncMap: <Input>(elements: readonly Input[]) => <Output>(closure: (elem: Input, index: number, array: readonly Input[]) => Promise<Output>) => Promise<Output[]>;
|
|
10
|
+
const asyncRepeat: (count: number) => <T>(closure: (index: number) => Promise<T>) => Promise<T[]>;
|
|
11
|
+
const has: <T>(elements: readonly T[]) => (pred: (elem: T) => boolean) => boolean;
|
|
12
|
+
const repeat: (count: number) => <T>(closure: (index: number) => T) => T[];
|
|
13
|
+
const flat: <T>(matrix: T[][]) => T[];
|
|
14
|
+
const subsets: <T>(array: T[]) => T[][];
|
|
16
15
|
}
|
package/lib/ArrayUtil.js
CHANGED
|
@@ -80,15 +80,16 @@ exports.ArrayUtil = void 0;
|
|
|
80
80
|
*/
|
|
81
81
|
var ArrayUtil;
|
|
82
82
|
(function (ArrayUtil) {
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
var _this = this;
|
|
84
|
+
ArrayUtil.asyncFilter = function (elements) {
|
|
85
|
+
return function (pred) { return __awaiter(_this, void 0, void 0, function () {
|
|
85
86
|
var ret;
|
|
86
87
|
var _this = this;
|
|
87
88
|
return __generator(this, function (_a) {
|
|
88
89
|
switch (_a.label) {
|
|
89
90
|
case 0:
|
|
90
91
|
ret = [];
|
|
91
|
-
return [4 /*yield*/, asyncForEach(elements
|
|
92
|
+
return [4 /*yield*/, ArrayUtil.asyncForEach(elements)(function (elem, index, array) { return __awaiter(_this, void 0, void 0, function () {
|
|
92
93
|
var flag;
|
|
93
94
|
return __generator(this, function (_a) {
|
|
94
95
|
switch (_a.label) {
|
|
@@ -106,14 +107,13 @@ var ArrayUtil;
|
|
|
106
107
|
return [2 /*return*/, ret];
|
|
107
108
|
}
|
|
108
109
|
});
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
ArrayUtil.
|
|
112
|
-
|
|
113
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
110
|
+
}); };
|
|
111
|
+
};
|
|
112
|
+
ArrayUtil.asyncForEach = function (elements) {
|
|
113
|
+
return function (closure) { return __awaiter(_this, void 0, void 0, function () {
|
|
114
114
|
return __generator(this, function (_a) {
|
|
115
115
|
switch (_a.label) {
|
|
116
|
-
case 0: return [4 /*yield*/, asyncRepeat(elements.length
|
|
116
|
+
case 0: return [4 /*yield*/, ArrayUtil.asyncRepeat(elements.length)(function (index) {
|
|
117
117
|
return closure(elements[index], index, elements);
|
|
118
118
|
})];
|
|
119
119
|
case 1:
|
|
@@ -121,18 +121,17 @@ var ArrayUtil;
|
|
|
121
121
|
return [2 /*return*/];
|
|
122
122
|
}
|
|
123
123
|
});
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
ArrayUtil.
|
|
127
|
-
|
|
128
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
124
|
+
}); };
|
|
125
|
+
};
|
|
126
|
+
ArrayUtil.asyncMap = function (elements) {
|
|
127
|
+
return function (closure) { return __awaiter(_this, void 0, void 0, function () {
|
|
129
128
|
var ret;
|
|
130
129
|
var _this = this;
|
|
131
130
|
return __generator(this, function (_a) {
|
|
132
131
|
switch (_a.label) {
|
|
133
132
|
case 0:
|
|
134
133
|
ret = [];
|
|
135
|
-
return [4 /*yield*/, asyncForEach(elements
|
|
134
|
+
return [4 /*yield*/, ArrayUtil.asyncForEach(elements)(function (elem, index, array) { return __awaiter(_this, void 0, void 0, function () {
|
|
136
135
|
var output;
|
|
137
136
|
return __generator(this, function (_a) {
|
|
138
137
|
switch (_a.label) {
|
|
@@ -149,11 +148,10 @@ var ArrayUtil;
|
|
|
149
148
|
return [2 /*return*/, ret];
|
|
150
149
|
}
|
|
151
150
|
});
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
ArrayUtil.
|
|
155
|
-
|
|
156
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
151
|
+
}); };
|
|
152
|
+
};
|
|
153
|
+
ArrayUtil.asyncRepeat = function (count) {
|
|
154
|
+
return function (closure) { return __awaiter(_this, void 0, void 0, function () {
|
|
157
155
|
var indexes, output, indexes_1, indexes_1_1, index, _a, _b, e_1_1;
|
|
158
156
|
var e_1, _c;
|
|
159
157
|
return __generator(this, function (_d) {
|
|
@@ -193,27 +191,23 @@ var ArrayUtil;
|
|
|
193
191
|
case 8: return [2 /*return*/, output];
|
|
194
192
|
}
|
|
195
193
|
});
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
ArrayUtil.
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
function
|
|
204
|
-
return
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
}
|
|
210
|
-
ArrayUtil.last = last;
|
|
211
|
-
function flat(matrix) {
|
|
194
|
+
}); };
|
|
195
|
+
};
|
|
196
|
+
ArrayUtil.has = function (elements) {
|
|
197
|
+
return function (pred) {
|
|
198
|
+
return elements.find(pred) !== undefined;
|
|
199
|
+
};
|
|
200
|
+
};
|
|
201
|
+
ArrayUtil.repeat = function (count) {
|
|
202
|
+
return function (closure) {
|
|
203
|
+
return new Array(count).fill("").map(function (_, index) { return closure(index); });
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
ArrayUtil.flat = function (matrix) {
|
|
212
207
|
var _a;
|
|
213
208
|
return (_a = []).concat.apply(_a, __spreadArray([], __read(matrix), false));
|
|
214
|
-
}
|
|
215
|
-
ArrayUtil.
|
|
216
|
-
function subsets(array) {
|
|
209
|
+
};
|
|
210
|
+
ArrayUtil.subsets = function (array) {
|
|
217
211
|
var check = new Array(array.length).fill(false);
|
|
218
212
|
var output = [];
|
|
219
213
|
var dfs = function (depth) {
|
|
@@ -228,7 +222,6 @@ var ArrayUtil;
|
|
|
228
222
|
};
|
|
229
223
|
dfs(0);
|
|
230
224
|
return output;
|
|
231
|
-
}
|
|
232
|
-
ArrayUtil.subsets = subsets;
|
|
225
|
+
};
|
|
233
226
|
})(ArrayUtil = exports.ArrayUtil || (exports.ArrayUtil = {}));
|
|
234
227
|
//# sourceMappingURL=ArrayUtil.js.map
|
package/lib/ArrayUtil.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArrayUtil.js","sourceRoot":"","sources":["../src/ArrayUtil.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,IAAiB,SAAS,
|
|
1
|
+
{"version":3,"file":"ArrayUtil.js","sourceRoot":"","sources":["../src/ArrayUtil.ts"],"names":[],"mappings":"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"}
|
package/lib/RandomGenerator.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export declare namespace RandomGenerator {
|
|
|
10
10
|
* @param length Length of alphabets
|
|
11
11
|
* @returns Generated alphabets
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
const alphabets: (length: number) => string;
|
|
14
14
|
/**
|
|
15
15
|
* Generate random alpha-numeric characters.
|
|
16
16
|
*
|
|
@@ -19,14 +19,14 @@ export declare namespace RandomGenerator {
|
|
|
19
19
|
* @param length Length of characters
|
|
20
20
|
* @returns Generated string
|
|
21
21
|
*/
|
|
22
|
-
|
|
22
|
+
const alphaNumeric: (length: number) => string;
|
|
23
23
|
/**
|
|
24
24
|
* Generate random name.
|
|
25
25
|
*
|
|
26
26
|
* @param length Length of paragraph, default is 2 or 3
|
|
27
27
|
* @returns Generated name
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
const name: (length?: number) => string;
|
|
30
30
|
/**
|
|
31
31
|
* Generate random paragraph.
|
|
32
32
|
*
|
|
@@ -47,25 +47,15 @@ export declare namespace RandomGenerator {
|
|
|
47
47
|
* @param content Target content
|
|
48
48
|
* @returns Random substring
|
|
49
49
|
*/
|
|
50
|
-
|
|
50
|
+
const substring: (content: string) => string;
|
|
51
51
|
/**
|
|
52
52
|
* Generate random mobile number.
|
|
53
53
|
*
|
|
54
54
|
* @param prefix Prefix string, default is "010"
|
|
55
55
|
* @returns Random mobile number
|
|
56
|
+
* @example 010-334-0067
|
|
56
57
|
*/
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Generate random digit.
|
|
60
|
-
*
|
|
61
|
-
* Generate random digit that filling front with zero characters
|
|
62
|
-
* when value is less than maximum cipher.
|
|
63
|
-
*
|
|
64
|
-
* @param minC Minimum cipher
|
|
65
|
-
* @param maxC Maximum cipher
|
|
66
|
-
* @returns
|
|
67
|
-
*/
|
|
68
|
-
function digit(minC: number, maxC: number): string;
|
|
58
|
+
const mobile: (prefix?: string) => string;
|
|
69
59
|
/**
|
|
70
60
|
* Generate random date.
|
|
71
61
|
*
|
|
@@ -73,7 +63,7 @@ export declare namespace RandomGenerator {
|
|
|
73
63
|
* @param range Range of random milliseconds
|
|
74
64
|
* @returns Random date
|
|
75
65
|
*/
|
|
76
|
-
|
|
66
|
+
const date: (from: Date) => (range: number) => Date;
|
|
77
67
|
/**
|
|
78
68
|
* Pick random elements from an array.
|
|
79
69
|
*
|
|
@@ -81,12 +71,12 @@ export declare namespace RandomGenerator {
|
|
|
81
71
|
* @param count Number of count to pick
|
|
82
72
|
* @returns Sampled array
|
|
83
73
|
*/
|
|
84
|
-
|
|
74
|
+
const sample: <T>(array: T[]) => (count: number) => T[];
|
|
85
75
|
/**
|
|
86
76
|
* Pick random element from an array.
|
|
87
77
|
*
|
|
88
78
|
* @param array Target array
|
|
89
79
|
* @returns picked element
|
|
90
80
|
*/
|
|
91
|
-
|
|
81
|
+
const pick: <T>(array: T[]) => T;
|
|
92
82
|
}
|
package/lib/RandomGenerator.js
CHANGED
|
@@ -21,13 +21,12 @@ var RandomGenerator;
|
|
|
21
21
|
* @param length Length of alphabets
|
|
22
22
|
* @returns Generated alphabets
|
|
23
23
|
*/
|
|
24
|
-
function
|
|
24
|
+
RandomGenerator.alphabets = function (length) {
|
|
25
25
|
return new Array(length)
|
|
26
26
|
.fill("")
|
|
27
27
|
.map(function () { return CHARACTERS[(0, tstl_1.randint)(0, CHARACTERS.length - 1)]; })
|
|
28
28
|
.join("");
|
|
29
|
-
}
|
|
30
|
-
RandomGenerator.alphabets = alphabets;
|
|
29
|
+
};
|
|
31
30
|
/**
|
|
32
31
|
* Generate random alpha-numeric characters.
|
|
33
32
|
*
|
|
@@ -36,24 +35,22 @@ var RandomGenerator;
|
|
|
36
35
|
* @param length Length of characters
|
|
37
36
|
* @returns Generated string
|
|
38
37
|
*/
|
|
39
|
-
function
|
|
38
|
+
RandomGenerator.alphaNumeric = function (length) {
|
|
40
39
|
return new Array(length)
|
|
41
40
|
.fill("")
|
|
42
41
|
.map(function () { return LETTERS[(0, tstl_1.randint)(0, LETTERS.length - 1)]; })
|
|
43
42
|
.join("");
|
|
44
|
-
}
|
|
45
|
-
RandomGenerator.alphaNumeric = alphaNumeric;
|
|
43
|
+
};
|
|
46
44
|
/**
|
|
47
45
|
* Generate random name.
|
|
48
46
|
*
|
|
49
47
|
* @param length Length of paragraph, default is 2 or 3
|
|
50
48
|
* @returns Generated name
|
|
51
49
|
*/
|
|
52
|
-
function
|
|
50
|
+
RandomGenerator.name = function (length) {
|
|
53
51
|
if (length === void 0) { length = (0, tstl_1.randint)(2, 3); }
|
|
54
52
|
return RandomGenerator.paragraph(length)();
|
|
55
|
-
}
|
|
56
|
-
RandomGenerator.name = name;
|
|
53
|
+
};
|
|
57
54
|
/**
|
|
58
55
|
* Generate random paragraph.
|
|
59
56
|
*
|
|
@@ -72,7 +69,7 @@ var RandomGenerator;
|
|
|
72
69
|
if (wordMax === void 0) { wordMax = 7; }
|
|
73
70
|
return new Array(sentences)
|
|
74
71
|
.fill("")
|
|
75
|
-
.map(function () { return alphabets((0, tstl_1.randint)(wordMin, wordMax)); })
|
|
72
|
+
.map(function () { return RandomGenerator.alphabets((0, tstl_1.randint)(wordMin, wordMax)); })
|
|
76
73
|
.join(" ");
|
|
77
74
|
};
|
|
78
75
|
};
|
|
@@ -115,40 +112,29 @@ var RandomGenerator;
|
|
|
115
112
|
* @param content Target content
|
|
116
113
|
* @returns Random substring
|
|
117
114
|
*/
|
|
118
|
-
function
|
|
115
|
+
RandomGenerator.substring = function (content) {
|
|
119
116
|
var first = (0, tstl_1.randint)(0, content.length - 1);
|
|
120
117
|
var last = (0, tstl_1.randint)(first + 1, content.length);
|
|
121
118
|
return content.substring(first, last).trim();
|
|
122
|
-
}
|
|
123
|
-
RandomGenerator.substring = substring;
|
|
119
|
+
};
|
|
124
120
|
/**
|
|
125
121
|
* Generate random mobile number.
|
|
126
122
|
*
|
|
127
123
|
* @param prefix Prefix string, default is "010"
|
|
128
124
|
* @returns Random mobile number
|
|
125
|
+
* @example 010-334-0067
|
|
129
126
|
*/
|
|
130
|
-
function
|
|
127
|
+
RandomGenerator.mobile = function (prefix) {
|
|
131
128
|
if (prefix === void 0) { prefix = "010"; }
|
|
132
|
-
return
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
* @param minC Minimum cipher
|
|
142
|
-
* @param maxC Maximum cipher
|
|
143
|
-
* @returns
|
|
144
|
-
*/
|
|
145
|
-
function digit(minC, maxC) {
|
|
146
|
-
var val = (0, tstl_1.randint)(0, Math.pow(10.0, maxC) - 1);
|
|
147
|
-
var log10 = val ? Math.floor(Math.log10(val)) + 1 : 0;
|
|
148
|
-
var prefix = "0".repeat(Math.max(0, minC - log10));
|
|
149
|
-
return prefix + val.toString();
|
|
150
|
-
}
|
|
151
|
-
RandomGenerator.digit = digit;
|
|
129
|
+
return [
|
|
130
|
+
prefix,
|
|
131
|
+
(function () {
|
|
132
|
+
var value = (0, tstl_1.randint)(0, 9999);
|
|
133
|
+
return value.toString().padStart(value < 1000 ? 3 : 4, "0");
|
|
134
|
+
})(),
|
|
135
|
+
(0, tstl_1.randint)(0, 9999).toString().padStart(4, "0"),
|
|
136
|
+
].join("-");
|
|
137
|
+
};
|
|
152
138
|
/**
|
|
153
139
|
* Generate random date.
|
|
154
140
|
*
|
|
@@ -156,11 +142,11 @@ var RandomGenerator;
|
|
|
156
142
|
* @param range Range of random milliseconds
|
|
157
143
|
* @returns Random date
|
|
158
144
|
*/
|
|
159
|
-
function
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
145
|
+
RandomGenerator.date = function (from) {
|
|
146
|
+
return function (range) {
|
|
147
|
+
return new Date(from.getTime() + (0, tstl_1.randint)(0, range));
|
|
148
|
+
};
|
|
149
|
+
};
|
|
164
150
|
/**
|
|
165
151
|
* Pick random elements from an array.
|
|
166
152
|
*
|
|
@@ -168,21 +154,21 @@ var RandomGenerator;
|
|
|
168
154
|
* @param count Number of count to pick
|
|
169
155
|
* @returns Sampled array
|
|
170
156
|
*/
|
|
171
|
-
function
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
157
|
+
RandomGenerator.sample = function (array) {
|
|
158
|
+
return function (count) {
|
|
159
|
+
var ret = [];
|
|
160
|
+
(0, ranges_1.sample)(array, (0, tstl_1.back_inserter)(ret), count);
|
|
161
|
+
return ret;
|
|
162
|
+
};
|
|
163
|
+
};
|
|
177
164
|
/**
|
|
178
165
|
* Pick random element from an array.
|
|
179
166
|
*
|
|
180
167
|
* @param array Target array
|
|
181
168
|
* @returns picked element
|
|
182
169
|
*/
|
|
183
|
-
function
|
|
170
|
+
RandomGenerator.pick = function (array) {
|
|
184
171
|
return array[(0, tstl_1.randint)(0, array.length - 1)];
|
|
185
|
-
}
|
|
186
|
-
RandomGenerator.pick = pick;
|
|
172
|
+
};
|
|
187
173
|
})(RandomGenerator = exports.RandomGenerator || (exports.RandomGenerator = {}));
|
|
188
174
|
//# sourceMappingURL=RandomGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RandomGenerator.js","sourceRoot":"","sources":["../src/RandomGenerator.ts"],"names":[],"mappings":";;;AAAA,6BAA8C;AAC9C,sCAAgD;AAEhD;;;;GAIG;AACH,IAAiB,eAAe,
|
|
1
|
+
{"version":3,"file":"RandomGenerator.js","sourceRoot":"","sources":["../src/RandomGenerator.ts"],"names":[],"mappings":"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"}
|
package/lib/StopWatch.d.ts
CHANGED
|
@@ -13,12 +13,12 @@ export declare namespace StopWatch {
|
|
|
13
13
|
* @param task
|
|
14
14
|
* @returns
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
const measure: (task: Task) => Promise<number>;
|
|
17
17
|
/**
|
|
18
18
|
*
|
|
19
19
|
* @param title
|
|
20
20
|
* @param task
|
|
21
21
|
* @returns
|
|
22
22
|
*/
|
|
23
|
-
|
|
23
|
+
const trace: (title: string) => (task: Task) => Promise<number>;
|
|
24
24
|
}
|
package/lib/StopWatch.js
CHANGED
|
@@ -44,49 +44,46 @@ exports.StopWatch = void 0;
|
|
|
44
44
|
*/
|
|
45
45
|
var StopWatch;
|
|
46
46
|
(function (StopWatch) {
|
|
47
|
+
var _this = this;
|
|
47
48
|
/**
|
|
48
49
|
*
|
|
49
50
|
* @param task
|
|
50
51
|
* @returns
|
|
51
52
|
*/
|
|
52
|
-
function
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
});
|
|
53
|
+
StopWatch.measure = function (task) { return __awaiter(_this, void 0, void 0, function () {
|
|
54
|
+
var time;
|
|
55
|
+
return __generator(this, function (_a) {
|
|
56
|
+
switch (_a.label) {
|
|
57
|
+
case 0:
|
|
58
|
+
time = Date.now();
|
|
59
|
+
return [4 /*yield*/, task()];
|
|
60
|
+
case 1:
|
|
61
|
+
_a.sent();
|
|
62
|
+
return [2 /*return*/, Date.now() - time];
|
|
63
|
+
}
|
|
65
64
|
});
|
|
66
|
-
}
|
|
67
|
-
StopWatch.measure = measure;
|
|
65
|
+
}); };
|
|
68
66
|
/**
|
|
69
67
|
*
|
|
70
68
|
* @param title
|
|
71
69
|
* @param task
|
|
72
70
|
* @returns
|
|
73
71
|
*/
|
|
74
|
-
function
|
|
75
|
-
return __awaiter(
|
|
72
|
+
StopWatch.trace = function (title) {
|
|
73
|
+
return function (task) { return __awaiter(_this, void 0, void 0, function () {
|
|
76
74
|
var time;
|
|
77
75
|
return __generator(this, function (_a) {
|
|
78
76
|
switch (_a.label) {
|
|
79
77
|
case 0:
|
|
80
78
|
process.stdout.write(" - ".concat(title, ": "));
|
|
81
|
-
return [4 /*yield*/, measure(task)];
|
|
79
|
+
return [4 /*yield*/, StopWatch.measure(task)];
|
|
82
80
|
case 1:
|
|
83
81
|
time = _a.sent();
|
|
84
82
|
console.log("".concat(time.toLocaleString(), " ms"));
|
|
85
83
|
return [2 /*return*/, time];
|
|
86
84
|
}
|
|
87
85
|
});
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
StopWatch.trace = trace;
|
|
86
|
+
}); };
|
|
87
|
+
};
|
|
91
88
|
})(StopWatch = exports.StopWatch || (exports.StopWatch = {}));
|
|
92
89
|
//# sourceMappingURL=StopWatch.js.map
|
package/lib/StopWatch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StopWatch.js","sourceRoot":"","sources":["../src/StopWatch.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,IAAiB,SAAS,
|
|
1
|
+
{"version":3,"file":"StopWatch.js","sourceRoot":"","sources":["../src/StopWatch.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;GAIG;AACH,IAAiB,SAAS,CAgCzB;AAhCD,WAAiB,SAAS;;IAMtB;;;;OAIG;IACU,iBAAO,GAAG,UAAO,IAAU;;;;;oBAC9B,IAAI,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;oBAChC,qBAAM,IAAI,EAAE,EAAA;;oBAAZ,SAAY,CAAC;oBACb,sBAAO,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAC;;;SAC5B,CAAC;IAEF;;;;;OAKG;IACU,eAAK,GACd,UAAC,KAAa;QACd,OAAA,UAAO,IAAU;;;;;wBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAO,KAAK,OAAI,CAAC,CAAC;wBAClB,qBAAM,UAAA,OAAO,CAAC,IAAI,CAAC,EAAA;;wBAAlC,IAAI,GAAW,SAAmB;wBAExC,OAAO,CAAC,GAAG,CAAC,UAAG,IAAI,CAAC,cAAc,EAAE,QAAK,CAAC,CAAC;wBAC3C,sBAAO,IAAI,EAAC;;;aACf;IAND,CAMC,CAAC;AACV,CAAC,EAhCgB,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAgCzB"}
|
package/lib/TestValidator.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare namespace TestValidator {
|
|
|
12
12
|
* @param title Title of error message when condition is not satisfied
|
|
13
13
|
* @return Currying function
|
|
14
14
|
*/
|
|
15
|
-
const predicate: (title: string) => (
|
|
15
|
+
const predicate: (title: string) => <T extends boolean | (() => boolean) | (() => Promise<boolean>)>(condition: T) => T extends () => Promise<boolean> ? Promise<void> : void;
|
|
16
16
|
/**
|
|
17
17
|
* Test whether two values are equal.
|
|
18
18
|
*
|
|
@@ -34,7 +34,7 @@ export declare namespace TestValidator {
|
|
|
34
34
|
*
|
|
35
35
|
* @param title Title of exception because of no error exists
|
|
36
36
|
*/
|
|
37
|
-
const error: (title: string) => (task: () =>
|
|
37
|
+
const error: (title: string) => <T>(task: () => T) => T extends Promise<any> ? Promise<void> : void;
|
|
38
38
|
/**
|
|
39
39
|
* Validate index API.
|
|
40
40
|
*
|
package/lib/TestValidator.js
CHANGED
|
@@ -67,10 +67,37 @@ var TestValidator;
|
|
|
67
67
|
* @param title Title of error message when condition is not satisfied
|
|
68
68
|
* @return Currying function
|
|
69
69
|
*/
|
|
70
|
-
TestValidator.predicate = function (title) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
TestValidator.predicate = function (title) {
|
|
71
|
+
return function (condition) {
|
|
72
|
+
var message = function () {
|
|
73
|
+
return "Bug on ".concat(title, ": expected condition is not satisfied.");
|
|
74
|
+
};
|
|
75
|
+
// SCALAR
|
|
76
|
+
if (typeof condition === "boolean") {
|
|
77
|
+
if (condition !== true)
|
|
78
|
+
throw new Error(message());
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
// CLOSURE
|
|
82
|
+
var output = condition();
|
|
83
|
+
if (typeof output === "boolean") {
|
|
84
|
+
if (output !== true)
|
|
85
|
+
throw new Error(message());
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
// ASYNCHRONOUS
|
|
89
|
+
return new Promise(function (resolve, reject) {
|
|
90
|
+
output
|
|
91
|
+
.then(function (flag) {
|
|
92
|
+
if (flag === true)
|
|
93
|
+
resolve();
|
|
94
|
+
else
|
|
95
|
+
reject(message());
|
|
96
|
+
})
|
|
97
|
+
.catch(reject);
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
};
|
|
74
101
|
/**
|
|
75
102
|
* Test whether two values are equal.
|
|
76
103
|
*
|
|
@@ -101,23 +128,23 @@ var TestValidator;
|
|
|
101
128
|
* @param title Title of exception because of no error exists
|
|
102
129
|
*/
|
|
103
130
|
TestValidator.error = function (title) {
|
|
104
|
-
return function (task) {
|
|
105
|
-
var
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
}
|
|
131
|
+
return function (task) {
|
|
132
|
+
var message = function () { return "Bug on ".concat(title, ": exception must be thrown."); };
|
|
133
|
+
try {
|
|
134
|
+
var output_1 = task();
|
|
135
|
+
if (is_promise(output_1))
|
|
136
|
+
return new Promise(function (resolve, reject) {
|
|
137
|
+
return output_1
|
|
138
|
+
.catch(function () { return resolve(); })
|
|
139
|
+
.then(function () { return reject(message()); });
|
|
140
|
+
});
|
|
141
|
+
else
|
|
142
|
+
throw new Error(message());
|
|
143
|
+
}
|
|
144
|
+
catch (_a) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
121
148
|
};
|
|
122
149
|
/**
|
|
123
150
|
* Validate index API.
|
|
@@ -184,7 +211,7 @@ var TestValidator;
|
|
|
184
211
|
return __generator(this, function (_b) {
|
|
185
212
|
switch (_b.label) {
|
|
186
213
|
case 0:
|
|
187
|
-
samples = RandomGenerator_1.RandomGenerator.sample(total
|
|
214
|
+
samples = RandomGenerator_1.RandomGenerator.sample(total)(sampleCount);
|
|
188
215
|
_loop_1 = function (s) {
|
|
189
216
|
var values, filtered, gotten;
|
|
190
217
|
return __generator(this, function (_c) {
|
|
@@ -301,4 +328,10 @@ var TestValidator;
|
|
|
301
328
|
function get_ids(entities) {
|
|
302
329
|
return entities.map(function (entity) { return entity.id; }).sort(function (x, y) { return (x < y ? -1 : 1); });
|
|
303
330
|
}
|
|
331
|
+
function is_promise(input) {
|
|
332
|
+
return (typeof input === "object" &&
|
|
333
|
+
input !== null &&
|
|
334
|
+
typeof input.then === "function" &&
|
|
335
|
+
typeof input.catch === "function");
|
|
336
|
+
}
|
|
304
337
|
//# sourceMappingURL=TestValidator.js.map
|
package/lib/TestValidator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestValidator.js","sourceRoot":"","sources":["../src/TestValidator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sCAAwC;AAExC,qDAAoD;AACpD,0DAAyD;AAEzD;;;;;;GAMG;AACH,IAAiB,aAAa,
|
|
1
|
+
{"version":3,"file":"TestValidator.js","sourceRoot":"","sources":["../src/TestValidator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,56 +1,59 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@nestia/e2e",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "E2E test utilify functions",
|
|
5
|
-
"main": "lib/index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"build": "rimraf lib && tsc",
|
|
8
|
-
"dev": "npm run build -- --watch",
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"prepare": "ts-patch install"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
"
|
|
32
|
-
|
|
33
|
-
"@
|
|
34
|
-
"@types/
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@nestia/e2e",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "E2E test utilify functions",
|
|
5
|
+
"main": "lib/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "rimraf lib && tsc",
|
|
8
|
+
"dev": "npm run build -- --watch",
|
|
9
|
+
"eslint": "eslint src",
|
|
10
|
+
"prettier": "prettier --write ./src/**/*.ts",
|
|
11
|
+
"prepare": "ts-patch install",
|
|
12
|
+
"test": "node lib/test"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/samchon/nestia"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"e2e",
|
|
20
|
+
"nestia",
|
|
21
|
+
"nestjs",
|
|
22
|
+
"test",
|
|
23
|
+
"tdd",
|
|
24
|
+
"utility"
|
|
25
|
+
],
|
|
26
|
+
"author": "Jeongho Nam",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/samchon/nestia/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/samchon/nestia#readme",
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@trivago/prettier-plugin-sort-imports": "^4.0.0",
|
|
34
|
+
"@types/cli": "^0.11.21",
|
|
35
|
+
"@types/node": "^18.11.18",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^5.57.0",
|
|
37
|
+
"@typescript-eslint/parser": "^5.57.0",
|
|
38
|
+
"prettier": "^2.8.3",
|
|
39
|
+
"rimraf": "^4.1.2",
|
|
40
|
+
"ts-node": "^10.9.1",
|
|
41
|
+
"ts-patch": "^2.1.0",
|
|
42
|
+
"typescript": "^4.9.5",
|
|
43
|
+
"typia": "^3.6.9"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"chalk": "^4.1.2",
|
|
47
|
+
"cli": "^1.0.1",
|
|
48
|
+
"tstl": "^2.5.13"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"lib",
|
|
52
|
+
"src",
|
|
53
|
+
"!lib/test",
|
|
54
|
+
"!src/test",
|
|
55
|
+
"README.md",
|
|
56
|
+
"LICENSE",
|
|
57
|
+
"package.json"
|
|
58
|
+
]
|
|
59
|
+
}
|
package/src/ArrayUtil.ts
CHANGED
|
@@ -1,106 +1,99 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utility functions for arrays.
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* @author Jeongho Nam - https://github.com/samchon
|
|
5
5
|
*/
|
|
6
6
|
export namespace ArrayUtil {
|
|
7
|
-
export
|
|
8
|
-
elements: readonly Input[]
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export async function asyncForEach<Input>(
|
|
24
|
-
elements: readonly Input[],
|
|
25
|
-
closure: (
|
|
26
|
-
elem: Input,
|
|
27
|
-
index: number,
|
|
28
|
-
array: readonly Input[],
|
|
29
|
-
) => Promise<any>,
|
|
30
|
-
): Promise<void> {
|
|
31
|
-
await asyncRepeat(elements.length, (index) =>
|
|
32
|
-
closure(elements[index], index, elements),
|
|
33
|
-
);
|
|
34
|
-
}
|
|
7
|
+
export const asyncFilter =
|
|
8
|
+
<Input>(elements: readonly Input[]) =>
|
|
9
|
+
async (
|
|
10
|
+
pred: (
|
|
11
|
+
elem: Input,
|
|
12
|
+
index: number,
|
|
13
|
+
array: readonly Input[],
|
|
14
|
+
) => Promise<boolean>,
|
|
15
|
+
): Promise<Input[]> => {
|
|
16
|
+
const ret: Input[] = [];
|
|
17
|
+
await asyncForEach(elements)(async (elem, index, array) => {
|
|
18
|
+
const flag: boolean = await pred(elem, index, array);
|
|
19
|
+
if (flag === true) ret.push(elem);
|
|
20
|
+
});
|
|
21
|
+
return ret;
|
|
22
|
+
};
|
|
35
23
|
|
|
36
|
-
export
|
|
37
|
-
elements: readonly Input[]
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
return ret;
|
|
50
|
-
}
|
|
24
|
+
export const asyncForEach =
|
|
25
|
+
<Input>(elements: readonly Input[]) =>
|
|
26
|
+
async (
|
|
27
|
+
closure: (
|
|
28
|
+
elem: Input,
|
|
29
|
+
index: number,
|
|
30
|
+
array: readonly Input[],
|
|
31
|
+
) => Promise<any>,
|
|
32
|
+
): Promise<void> => {
|
|
33
|
+
await asyncRepeat(elements.length)((index) =>
|
|
34
|
+
closure(elements[index], index, elements),
|
|
35
|
+
);
|
|
36
|
+
};
|
|
51
37
|
|
|
52
|
-
export
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
38
|
+
export const asyncMap =
|
|
39
|
+
<Input>(elements: readonly Input[]) =>
|
|
40
|
+
async <Output>(
|
|
41
|
+
closure: (
|
|
42
|
+
elem: Input,
|
|
43
|
+
index: number,
|
|
44
|
+
array: readonly Input[],
|
|
45
|
+
) => Promise<Output>,
|
|
46
|
+
): Promise<Output[]> => {
|
|
47
|
+
const ret: Output[] = [];
|
|
48
|
+
await asyncForEach(elements)(async (elem, index, array) => {
|
|
49
|
+
const output: Output = await closure(elem, index, array);
|
|
50
|
+
ret.push(output);
|
|
51
|
+
});
|
|
52
|
+
return ret;
|
|
53
|
+
};
|
|
59
54
|
|
|
60
|
-
|
|
61
|
-
|
|
55
|
+
export const asyncRepeat =
|
|
56
|
+
(count: number) =>
|
|
57
|
+
async <T>(closure: (index: number) => Promise<T>): Promise<T[]> => {
|
|
58
|
+
const indexes: number[] = new Array(count)
|
|
59
|
+
.fill(1)
|
|
60
|
+
.map((_, index) => index);
|
|
62
61
|
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
const output: T[] = [];
|
|
63
|
+
for (const index of indexes) output.push(await closure(index));
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
pred: (elem: T) => boolean,
|
|
69
|
-
): boolean {
|
|
70
|
-
return elements.find(pred) !== undefined;
|
|
71
|
-
}
|
|
65
|
+
return output;
|
|
66
|
+
};
|
|
72
67
|
|
|
73
|
-
export
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return new Array(count).fill("").map((_, index) => closure(index));
|
|
78
|
-
}
|
|
68
|
+
export const has =
|
|
69
|
+
<T>(elements: readonly T[]) =>
|
|
70
|
+
(pred: (elem: T) => boolean): boolean =>
|
|
71
|
+
elements.find(pred) !== undefined;
|
|
79
72
|
|
|
80
|
-
export
|
|
81
|
-
|
|
82
|
-
|
|
73
|
+
export const repeat =
|
|
74
|
+
(count: number) =>
|
|
75
|
+
<T>(closure: (index: number) => T): T[] =>
|
|
76
|
+
new Array(count).fill("").map((_, index) => closure(index));
|
|
83
77
|
|
|
84
|
-
export
|
|
85
|
-
|
|
86
|
-
}
|
|
78
|
+
export const flat = <T>(matrix: T[][]): T[] =>
|
|
79
|
+
([] as T[]).concat(...matrix);
|
|
87
80
|
|
|
88
|
-
export
|
|
81
|
+
export const subsets = <T>(array: T[]): T[][] => {
|
|
89
82
|
const check: boolean[] = new Array(array.length).fill(false);
|
|
90
83
|
const output: T[][] = [];
|
|
91
|
-
|
|
92
|
-
const dfs = (depth: number) => {
|
|
84
|
+
|
|
85
|
+
const dfs = (depth: number): void => {
|
|
93
86
|
if (depth === check.length)
|
|
94
87
|
output.push(array.filter((_v, idx) => check[idx]));
|
|
95
88
|
else {
|
|
96
89
|
check[depth] = true;
|
|
97
90
|
dfs(depth + 1);
|
|
98
|
-
|
|
91
|
+
|
|
99
92
|
check[depth] = false;
|
|
100
93
|
dfs(depth + 1);
|
|
101
94
|
}
|
|
102
95
|
};
|
|
103
96
|
dfs(0);
|
|
104
97
|
return output;
|
|
105
|
-
}
|
|
98
|
+
};
|
|
106
99
|
}
|
package/src/RandomGenerator.ts
CHANGED
|
@@ -19,12 +19,11 @@ export namespace RandomGenerator {
|
|
|
19
19
|
* @param length Length of alphabets
|
|
20
20
|
* @returns Generated alphabets
|
|
21
21
|
*/
|
|
22
|
-
export
|
|
23
|
-
|
|
22
|
+
export const alphabets = (length: number): string =>
|
|
23
|
+
new Array(length)
|
|
24
24
|
.fill("")
|
|
25
25
|
.map(() => CHARACTERS[randint(0, CHARACTERS.length - 1)])
|
|
26
26
|
.join("");
|
|
27
|
-
}
|
|
28
27
|
|
|
29
28
|
/**
|
|
30
29
|
* Generate random alpha-numeric characters.
|
|
@@ -34,12 +33,11 @@ export namespace RandomGenerator {
|
|
|
34
33
|
* @param length Length of characters
|
|
35
34
|
* @returns Generated string
|
|
36
35
|
*/
|
|
37
|
-
export
|
|
38
|
-
|
|
36
|
+
export const alphaNumeric = (length: number): string =>
|
|
37
|
+
new Array(length)
|
|
39
38
|
.fill("")
|
|
40
39
|
.map(() => LETTERS[randint(0, LETTERS.length - 1)])
|
|
41
40
|
.join("");
|
|
42
|
-
}
|
|
43
41
|
|
|
44
42
|
/**
|
|
45
43
|
* Generate random name.
|
|
@@ -47,9 +45,8 @@ export namespace RandomGenerator {
|
|
|
47
45
|
* @param length Length of paragraph, default is 2 or 3
|
|
48
46
|
* @returns Generated name
|
|
49
47
|
*/
|
|
50
|
-
export
|
|
51
|
-
|
|
52
|
-
}
|
|
48
|
+
export const name = (length: number = randint(2, 3)): string =>
|
|
49
|
+
paragraph(length)();
|
|
53
50
|
|
|
54
51
|
/**
|
|
55
52
|
* Generate random paragraph.
|
|
@@ -106,40 +103,29 @@ export namespace RandomGenerator {
|
|
|
106
103
|
* @param content Target content
|
|
107
104
|
* @returns Random substring
|
|
108
105
|
*/
|
|
109
|
-
export
|
|
106
|
+
export const substring = (content: string): string => {
|
|
110
107
|
const first: number = randint(0, content.length - 1);
|
|
111
108
|
const last: number = randint(first + 1, content.length);
|
|
112
109
|
|
|
113
110
|
return content.substring(first, last).trim();
|
|
114
|
-
}
|
|
111
|
+
};
|
|
115
112
|
|
|
116
113
|
/**
|
|
117
114
|
* Generate random mobile number.
|
|
118
115
|
*
|
|
119
116
|
* @param prefix Prefix string, default is "010"
|
|
120
117
|
* @returns Random mobile number
|
|
118
|
+
* @example 010-334-0067
|
|
121
119
|
*/
|
|
122
|
-
export
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
*
|
|
132
|
-
* @param minC Minimum cipher
|
|
133
|
-
* @param maxC Maximum cipher
|
|
134
|
-
* @returns
|
|
135
|
-
*/
|
|
136
|
-
export function digit(minC: number, maxC: number): string {
|
|
137
|
-
const val: number = randint(0, Math.pow(10.0, maxC) - 1);
|
|
138
|
-
const log10: number = val ? Math.floor(Math.log10(val)) + 1 : 0;
|
|
139
|
-
const prefix: string = "0".repeat(Math.max(0, minC - log10));
|
|
140
|
-
|
|
141
|
-
return prefix + val.toString();
|
|
142
|
-
}
|
|
120
|
+
export const mobile = (prefix: string = "010"): string =>
|
|
121
|
+
[
|
|
122
|
+
prefix,
|
|
123
|
+
(() => {
|
|
124
|
+
const value = randint(0, 9999);
|
|
125
|
+
return value.toString().padStart(value < 1_000 ? 3 : 4, "0");
|
|
126
|
+
})(),
|
|
127
|
+
randint(0, 9999).toString().padStart(4, "0"),
|
|
128
|
+
].join("-");
|
|
143
129
|
|
|
144
130
|
/**
|
|
145
131
|
* Generate random date.
|
|
@@ -148,10 +134,10 @@ export namespace RandomGenerator {
|
|
|
148
134
|
* @param range Range of random milliseconds
|
|
149
135
|
* @returns Random date
|
|
150
136
|
*/
|
|
151
|
-
export
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
137
|
+
export const date =
|
|
138
|
+
(from: Date) =>
|
|
139
|
+
(range: number): Date =>
|
|
140
|
+
new Date(from.getTime() + randint(0, range));
|
|
155
141
|
|
|
156
142
|
/**
|
|
157
143
|
* Pick random elements from an array.
|
|
@@ -160,11 +146,13 @@ export namespace RandomGenerator {
|
|
|
160
146
|
* @param count Number of count to pick
|
|
161
147
|
* @returns Sampled array
|
|
162
148
|
*/
|
|
163
|
-
export
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
149
|
+
export const sample =
|
|
150
|
+
<T>(array: T[]) =>
|
|
151
|
+
(count: number): T[] => {
|
|
152
|
+
const ret: T[] = [];
|
|
153
|
+
_Sample(array, back_inserter(ret), count);
|
|
154
|
+
return ret;
|
|
155
|
+
};
|
|
168
156
|
|
|
169
157
|
/**
|
|
170
158
|
* Pick random element from an array.
|
|
@@ -172,7 +160,6 @@ export namespace RandomGenerator {
|
|
|
172
160
|
* @param array Target array
|
|
173
161
|
* @returns picked element
|
|
174
162
|
*/
|
|
175
|
-
export
|
|
176
|
-
|
|
177
|
-
}
|
|
163
|
+
export const pick = <T>(array: T[]): T =>
|
|
164
|
+
array[randint(0, array.length - 1)];
|
|
178
165
|
}
|
package/src/StopWatch.ts
CHANGED
|
@@ -14,11 +14,11 @@ export namespace StopWatch {
|
|
|
14
14
|
* @param task
|
|
15
15
|
* @returns
|
|
16
16
|
*/
|
|
17
|
-
export async
|
|
17
|
+
export const measure = async (task: Task): Promise<number> => {
|
|
18
18
|
const time: number = Date.now();
|
|
19
19
|
await task();
|
|
20
20
|
return Date.now() - time;
|
|
21
|
-
}
|
|
21
|
+
};
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
*
|
|
@@ -26,11 +26,13 @@ export namespace StopWatch {
|
|
|
26
26
|
* @param task
|
|
27
27
|
* @returns
|
|
28
28
|
*/
|
|
29
|
-
export
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
export const trace =
|
|
30
|
+
(title: string) =>
|
|
31
|
+
async (task: Task): Promise<number> => {
|
|
32
|
+
process.stdout.write(` - ${title}: `);
|
|
33
|
+
const time: number = await measure(task);
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
console.log(`${time.toLocaleString()} ms`);
|
|
36
|
+
return time;
|
|
37
|
+
};
|
|
36
38
|
}
|
package/src/TestValidator.ts
CHANGED
|
@@ -17,12 +17,37 @@ export namespace TestValidator {
|
|
|
17
17
|
* @param title Title of error message when condition is not satisfied
|
|
18
18
|
* @return Currying function
|
|
19
19
|
*/
|
|
20
|
-
export const predicate =
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
export const predicate =
|
|
21
|
+
(title: string) =>
|
|
22
|
+
<T extends boolean | (() => boolean) | (() => Promise<boolean>)>(
|
|
23
|
+
condition: T,
|
|
24
|
+
): T extends () => Promise<boolean> ? Promise<void> : void => {
|
|
25
|
+
const message = () =>
|
|
26
|
+
`Bug on ${title}: expected condition is not satisfied.`;
|
|
27
|
+
|
|
28
|
+
// SCALAR
|
|
29
|
+
if (typeof condition === "boolean") {
|
|
30
|
+
if (condition !== true) throw new Error(message());
|
|
31
|
+
return undefined as any;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// CLOSURE
|
|
35
|
+
const output: boolean | Promise<boolean> = condition();
|
|
36
|
+
if (typeof output === "boolean") {
|
|
37
|
+
if (output !== true) throw new Error(message());
|
|
38
|
+
return undefined as any;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ASYNCHRONOUS
|
|
42
|
+
return new Promise<void>((resolve, reject) => {
|
|
43
|
+
output
|
|
44
|
+
.then((flag) => {
|
|
45
|
+
if (flag === true) resolve();
|
|
46
|
+
else reject(message());
|
|
47
|
+
})
|
|
48
|
+
.catch(reject);
|
|
49
|
+
}) as any;
|
|
50
|
+
};
|
|
26
51
|
|
|
27
52
|
/**
|
|
28
53
|
* Test whether two values are equal.
|
|
@@ -59,13 +84,20 @@ export namespace TestValidator {
|
|
|
59
84
|
*/
|
|
60
85
|
export const error =
|
|
61
86
|
(title: string) =>
|
|
62
|
-
|
|
87
|
+
<T>(task: () => T): T extends Promise<any> ? Promise<void> : void => {
|
|
88
|
+
const message = () => `Bug on ${title}: exception must be thrown.`;
|
|
63
89
|
try {
|
|
64
|
-
|
|
90
|
+
const output: T = task();
|
|
91
|
+
if (is_promise(output))
|
|
92
|
+
return new Promise<void>((resolve, reject) =>
|
|
93
|
+
output
|
|
94
|
+
.catch(() => resolve())
|
|
95
|
+
.then(() => reject(message())),
|
|
96
|
+
) as any;
|
|
97
|
+
else throw new Error(message());
|
|
65
98
|
} catch {
|
|
66
|
-
return;
|
|
99
|
+
return undefined as any;
|
|
67
100
|
}
|
|
68
|
-
throw new Error(`Bug on ${title}: exception must be thrown.`);
|
|
69
101
|
};
|
|
70
102
|
|
|
71
103
|
/**
|
|
@@ -137,10 +169,8 @@ export namespace TestValidator {
|
|
|
137
169
|
async <Values extends any[]>(
|
|
138
170
|
props: ISearchProps<Entity, Values, Request>,
|
|
139
171
|
): Promise<void> => {
|
|
140
|
-
const samples: Entity[] =
|
|
141
|
-
total
|
|
142
|
-
sampleCount,
|
|
143
|
-
);
|
|
172
|
+
const samples: Entity[] =
|
|
173
|
+
RandomGenerator.sample(total)(sampleCount);
|
|
144
174
|
for (const s of samples) {
|
|
145
175
|
const values: Values = props.values(s);
|
|
146
176
|
const filtered: Entity[] = total.filter((entity) =>
|
|
@@ -239,3 +269,12 @@ interface IEntity<Type extends string | number | bigint> {
|
|
|
239
269
|
function get_ids<Entity extends IEntity<any>>(entities: Entity[]): string[] {
|
|
240
270
|
return entities.map((entity) => entity.id).sort((x, y) => (x < y ? -1 : 1));
|
|
241
271
|
}
|
|
272
|
+
|
|
273
|
+
function is_promise(input: any): input is Promise<any> {
|
|
274
|
+
return (
|
|
275
|
+
typeof input === "object" &&
|
|
276
|
+
input !== null &&
|
|
277
|
+
typeof (input as any).then === "function" &&
|
|
278
|
+
typeof (input as any).catch === "function"
|
|
279
|
+
);
|
|
280
|
+
}
|