orc-shared 5.10.0-dev.7 → 5.10.0-dev.9
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/dist/components/AppFrame/Preferences.js +46 -45
- package/dist/components/MaterialUI/DataDisplay/PredefinedElements/Placeholder.js +15 -3
- package/dist/components/MaterialUI/DataDisplay/Table.js +15 -8
- package/dist/hocs/withScrollBox.js +9 -3
- package/dist/hooks/useInMemoryPaging.js +139 -0
- package/dist/utils/ListHelper.js +271 -0
- package/dist/utils/comparisonHelper.js +176 -0
- package/package.json +1 -1
- package/src/components/AppFrame/Preferences.js +30 -29
- package/src/components/AppFrame/Preferences.test.js +108 -123
- package/src/components/MaterialUI/DataDisplay/PredefinedElements/Placeholder.js +17 -2
- package/src/components/MaterialUI/DataDisplay/PredefinedElements/Placeholder.test.js +3 -1
- package/src/components/MaterialUI/DataDisplay/Table.js +121 -121
- package/src/components/MaterialUI/DataDisplay/Table.test.js +115 -1
- package/src/hocs/withScrollBox.js +10 -5
- package/src/hocs/withScrollBox.test.js +12 -0
- package/src/hooks/useInMemoryPaging.js +85 -0
- package/src/hooks/useInMemoryPaging.test.js +551 -0
- package/src/utils/ListHelper.js +203 -0
- package/src/utils/ListHelper.test.js +710 -0
- package/src/utils/comparisonHelper.js +124 -0
- package/src/utils/comparisonHelper.test.js +324 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import _ from "lodash";
|
|
2
|
+
|
|
3
|
+
export const partialDeepEqual = (x, y, ignoredRootProps = null) => {
|
|
4
|
+
if (x == null || y == null) return x === y;
|
|
5
|
+
|
|
6
|
+
const keys = Object.keys(x);
|
|
7
|
+
if (!_.isEqual(keys, Object.keys(y))) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
for (let key of keys) {
|
|
12
|
+
if (ignoredRootProps && ignoredRootProps.includes(key)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (!_.isEqual(x[key], y[key])) {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export const areGuidsEquals = (first, second) => {
|
|
25
|
+
function stripDash(value) {
|
|
26
|
+
return value?.replace(/-/g, "");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return areEqualCaseInsensitive(stripDash(first), stripDash(second));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export const areEqualCaseInsensitive = (first, second) => {
|
|
33
|
+
const isFirstNullish = first === null || first === undefined;
|
|
34
|
+
const isSecondNullish = second === null || second === undefined;
|
|
35
|
+
|
|
36
|
+
if (isFirstNullish || isSecondNullish) {
|
|
37
|
+
return isFirstNullish && isSecondNullish;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return first.localeCompare(second, undefined, { sensitivity: "accent" }) === 0;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const processOrderResult = (ascendingOrder, compareResult) => {
|
|
44
|
+
if (!ascendingOrder && compareResult != 0) {
|
|
45
|
+
return compareResult * -1;
|
|
46
|
+
}
|
|
47
|
+
return compareResult;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export const compareTextCaseInsensitive = (first, second, ascendingOrder = true, nullValue = "") => {
|
|
51
|
+
return processOrderResult(
|
|
52
|
+
ascendingOrder,
|
|
53
|
+
(first ?? nullValue).localeCompare(second ?? nullValue, undefined, { sensitivity: "accent" }),
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export const getBooleanValue = value => {
|
|
58
|
+
let result = null;
|
|
59
|
+
|
|
60
|
+
if (typeof value === "string") {
|
|
61
|
+
if (areEqualCaseInsensitive(value, "true")) {
|
|
62
|
+
result = true;
|
|
63
|
+
} else if (areEqualCaseInsensitive(value, "false")) {
|
|
64
|
+
result = false;
|
|
65
|
+
}
|
|
66
|
+
} else if (typeof value === "boolean") {
|
|
67
|
+
result = value === true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return result;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
export const compareBoolean = (first, second) => {
|
|
74
|
+
const firstBool = getBooleanValue(first);
|
|
75
|
+
const secondBool = getBooleanValue(second);
|
|
76
|
+
|
|
77
|
+
if (firstBool === null && secondBool === null) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return firstBool === secondBool;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export const compareNumeric = (first, second, ascendingOrder = true, nullValue = 0.0) => {
|
|
85
|
+
if (typeof first === "string" || first instanceof String || typeof second === "string" || second instanceof String) {
|
|
86
|
+
return processOrderResult(
|
|
87
|
+
ascendingOrder,
|
|
88
|
+
(first ?? nullValue.toString()).localeCompare(second ?? nullValue.toString(), undefined, {
|
|
89
|
+
numeric: true,
|
|
90
|
+
}),
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let result = 0;
|
|
95
|
+
if ((first ?? nullValue) < (second ?? nullValue)) {
|
|
96
|
+
result = -1;
|
|
97
|
+
} else if ((first ?? nullValue) > (second ?? nullValue)) {
|
|
98
|
+
result = 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return processOrderResult(ascendingOrder, result);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
export const doesObjectContainsTextCaseInsensitive = (obj, searchTerm, properties = []) => {
|
|
105
|
+
const caseInsensitiveIncludes = (a, b) => {
|
|
106
|
+
return a?.toLowerCase().includes(b);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
if (!obj) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (searchTerm === null || searchTerm === undefined || searchTerm === "") {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const loweredSearchTerm = searchTerm.toLowerCase();
|
|
118
|
+
const propertiesToSearch = properties.length > 0 ? properties : Object.keys(obj);
|
|
119
|
+
const result =
|
|
120
|
+
propertiesToSearch.find(
|
|
121
|
+
key => typeof obj[key] === "string" && caseInsensitiveIncludes(obj[key], loweredSearchTerm),
|
|
122
|
+
) !== undefined;
|
|
123
|
+
return result;
|
|
124
|
+
};
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import {
|
|
2
|
+
areEqualCaseInsensitive,
|
|
3
|
+
areGuidsEquals,
|
|
4
|
+
doesObjectContainsTextCaseInsensitive,
|
|
5
|
+
partialDeepEqual,
|
|
6
|
+
compareTextCaseInsensitive,
|
|
7
|
+
compareNumeric,
|
|
8
|
+
compareBoolean,
|
|
9
|
+
getBooleanValue,
|
|
10
|
+
} from "./comparisonHelper";
|
|
11
|
+
|
|
12
|
+
describe("partialDeepEqual function", () => {
|
|
13
|
+
it.each([
|
|
14
|
+
["empty with non empty object", {}, { a: 1 }],
|
|
15
|
+
["different properties", { b: 2 }, { a: 1 }],
|
|
16
|
+
["same properties different values", { a: 2 }, { a: 1 }],
|
|
17
|
+
["same nested properties different values", { a: { b: 3 } }, { a: { b: 4 } }],
|
|
18
|
+
])("returns false if the objects are ", (msg, obj1, obj2) => {
|
|
19
|
+
const result = partialDeepEqual(obj1, obj2);
|
|
20
|
+
expect(result, "to equal", false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it.each([
|
|
24
|
+
["empty objects", {}, {}],
|
|
25
|
+
["same properties", { a: 1 }, { a: 1 }],
|
|
26
|
+
["same nested properties same values", { a: { b: 3 } }, { a: { b: 3 } }],
|
|
27
|
+
])("returns true if the objects are ", (msg, obj1, obj2) => {
|
|
28
|
+
const result = partialDeepEqual(obj1, obj2);
|
|
29
|
+
expect(result, "to equal", true);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("returns false even with ignored property", () => {
|
|
33
|
+
const obj1 = {
|
|
34
|
+
a: 2,
|
|
35
|
+
b: 1,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const obj2 = {
|
|
39
|
+
a: 1,
|
|
40
|
+
b: 1,
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const result = partialDeepEqual(obj1, obj2, ["b"]);
|
|
44
|
+
expect(result, "to equal", false);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("returns true with ignored property", () => {
|
|
48
|
+
const obj1 = {
|
|
49
|
+
a: 2,
|
|
50
|
+
b: 1,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const obj2 = {
|
|
54
|
+
a: 1,
|
|
55
|
+
b: 1,
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const result = partialDeepEqual(obj1, obj2, ["a"]);
|
|
59
|
+
expect(result, "to equal", true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("returns true if both are null", () => {
|
|
63
|
+
const obj1 = null;
|
|
64
|
+
|
|
65
|
+
const obj2 = null;
|
|
66
|
+
|
|
67
|
+
const result = partialDeepEqual(obj1, obj2);
|
|
68
|
+
expect(result, "to equal", true);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("returns true if both are undefined", () => {
|
|
72
|
+
const obj1 = undefined;
|
|
73
|
+
|
|
74
|
+
const obj2 = undefined;
|
|
75
|
+
|
|
76
|
+
const result = partialDeepEqual(obj1, obj2);
|
|
77
|
+
expect(result, "to equal", true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("returns true if one is null and the other undefined", () => {
|
|
81
|
+
const obj1 = null;
|
|
82
|
+
|
|
83
|
+
const obj2 = undefined;
|
|
84
|
+
|
|
85
|
+
const result = partialDeepEqual(obj1, obj2);
|
|
86
|
+
expect(result, "to equal", false);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe("areGuidsEquals function", () => {
|
|
91
|
+
it.each([
|
|
92
|
+
[true, "AAA123", "aaa123"],
|
|
93
|
+
[true, "123", "1-2-3"],
|
|
94
|
+
[true, "1-2-3", "1-2-3"],
|
|
95
|
+
[true, "123", "123"],
|
|
96
|
+
[false, "123", "1-2-3-4"],
|
|
97
|
+
[false, "123", "1-2-3-4"],
|
|
98
|
+
[false, "123", null],
|
|
99
|
+
[false, "123", undefined],
|
|
100
|
+
[false, null, "123"],
|
|
101
|
+
[false, undefined, "123"],
|
|
102
|
+
[true, null, null],
|
|
103
|
+
[true, undefined, undefined],
|
|
104
|
+
[true, undefined, null],
|
|
105
|
+
[true, null, undefined],
|
|
106
|
+
])("returns %s for values %s and %s ", (expectedResult, value1, value2) => {
|
|
107
|
+
const result = areGuidsEquals(value1, value2);
|
|
108
|
+
expect(result, "to equal", expectedResult);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
describe("areEqualCaseInsensitive function", () => {
|
|
113
|
+
it.each([
|
|
114
|
+
[true, "AAA123", "aaa123"],
|
|
115
|
+
[false, "123", "1-2-3"],
|
|
116
|
+
[true, "123", "123"],
|
|
117
|
+
[false, "123", null],
|
|
118
|
+
[false, "123", undefined],
|
|
119
|
+
[false, null, "123"],
|
|
120
|
+
[false, undefined, "123"],
|
|
121
|
+
[true, null, null],
|
|
122
|
+
[true, undefined, undefined],
|
|
123
|
+
[true, undefined, null],
|
|
124
|
+
[true, null, undefined],
|
|
125
|
+
])("returns %s for values %s and %s ", (expectedResult, value1, value2) => {
|
|
126
|
+
const result = areEqualCaseInsensitive(value1, value2);
|
|
127
|
+
expect(result, "to equal", expectedResult);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe("getBooleanValue function", () => {
|
|
132
|
+
it.each([
|
|
133
|
+
[true, true],
|
|
134
|
+
[false, false],
|
|
135
|
+
["trUE", true],
|
|
136
|
+
["faLSe", false],
|
|
137
|
+
["faLSeInvalid", null],
|
|
138
|
+
["InvalidTrue", null],
|
|
139
|
+
])("value %s returned the result %s ", (value, expectedResult) => {
|
|
140
|
+
const result = getBooleanValue(value);
|
|
141
|
+
expect(result, "to equal", expectedResult);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
describe("compareBoolean function", () => {
|
|
146
|
+
it.each([
|
|
147
|
+
[true, "tRuE", true],
|
|
148
|
+
[true, "tRuE1", false],
|
|
149
|
+
[true, "false", false],
|
|
150
|
+
[true, false, false],
|
|
151
|
+
["tRuE", true, true],
|
|
152
|
+
["tRuE1", true, false],
|
|
153
|
+
["false", true, false],
|
|
154
|
+
[true, true, true],
|
|
155
|
+
[false, true, false],
|
|
156
|
+
[false, "FaLSe", true],
|
|
157
|
+
[false, "FaLSe1", false],
|
|
158
|
+
[false, "TrUe", false],
|
|
159
|
+
["FaLSe", false, true],
|
|
160
|
+
["FaLSe1", false, false],
|
|
161
|
+
["TrUe", false, false],
|
|
162
|
+
[false, false, true],
|
|
163
|
+
[false, null, false],
|
|
164
|
+
["FaLSe", null, false],
|
|
165
|
+
[false, undefined, false],
|
|
166
|
+
["FaLSe", undefined, false],
|
|
167
|
+
["FaLSeInvalid", "TrueInvalid", false],
|
|
168
|
+
])("values %s and %s returned the result %s ", (value1, value2, expectedResult) => {
|
|
169
|
+
const result = compareBoolean(value1, value2);
|
|
170
|
+
expect(result, "to equal", expectedResult);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
describe("doesObjectContainsTextCaseInsensitive function", () => {
|
|
175
|
+
it("returns false if object is null", function () {
|
|
176
|
+
const result = doesObjectContainsTextCaseInsensitive(null, "val");
|
|
177
|
+
expect(result, "to be", false);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("returns false if object is undefined", function () {
|
|
181
|
+
const result = doesObjectContainsTextCaseInsensitive(undefined, "val");
|
|
182
|
+
expect(result, "to be", false);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("returns true if searchTerm is null", function () {
|
|
186
|
+
const result = doesObjectContainsTextCaseInsensitive({}, null);
|
|
187
|
+
expect(result, "to be", true);
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("returns true if searchTerm is undefined", function () {
|
|
191
|
+
const result = doesObjectContainsTextCaseInsensitive({}, undefined);
|
|
192
|
+
expect(result, "to be", true);
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("returns true if searchTerm is an empty string", function () {
|
|
196
|
+
const result = doesObjectContainsTextCaseInsensitive({}, "");
|
|
197
|
+
expect(result, "to be", true);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("returns false if object has no properties", function () {
|
|
201
|
+
const result = doesObjectContainsTextCaseInsensitive({}, "val");
|
|
202
|
+
expect(result, "to be", false);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it("returns false if text cannot be found in property", function () {
|
|
206
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: "another" }, "val");
|
|
207
|
+
expect(result, "to be", false);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("returns true if text is found in property (exact match)", function () {
|
|
211
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: "another", prop2: "val" }, "val");
|
|
212
|
+
expect(result, "to be", true);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("returns true if text is found in property (contains)", function () {
|
|
216
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: "another", prop2: "some value" }, "val");
|
|
217
|
+
expect(result, "to be", true);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("returns true if text is found in property (case insensitive)", function () {
|
|
221
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: "another", prop2: "VALUE" }, "val");
|
|
222
|
+
expect(result, "to be", true);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it("ignores non string properties", function () {
|
|
226
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: 123, prop2: "VALUE" }, "val");
|
|
227
|
+
expect(result, "to be", true);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it("only look at first level properties (not deep)", function () {
|
|
231
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: { prop2: "VALUE" } }, "val");
|
|
232
|
+
expect(result, "to be", false);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
it("does not crash if prop value is null", function () {
|
|
236
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: null, prop2: "bob" }, "val");
|
|
237
|
+
expect(result, "to be", false);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("returns false because property with value is not looked at", function () {
|
|
241
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: "123", prop2: "VALUE" }, "val", ["prop"]);
|
|
242
|
+
expect(result, "to be", false);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("returns true because property with value is looked at", function () {
|
|
246
|
+
const result = doesObjectContainsTextCaseInsensitive({ prop: "123", prop2: "VALUE" }, "val", ["prop2"]);
|
|
247
|
+
expect(result, "to be", true);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
describe("compareTextCaseInsensitive function", () => {
|
|
252
|
+
it.each([
|
|
253
|
+
[0, "AAA123", "aaa123"],
|
|
254
|
+
[-1, "AAA123", "AAA1234"],
|
|
255
|
+
[-1, "123", "123a"],
|
|
256
|
+
[-1, null, "123"],
|
|
257
|
+
[-1, undefined, "123"],
|
|
258
|
+
[0, null, null],
|
|
259
|
+
[0, undefined, undefined],
|
|
260
|
+
[0, undefined, null],
|
|
261
|
+
[0, null, undefined],
|
|
262
|
+
])("returns %s for values %s and %s ", (expectedResult, value1, value2) => {
|
|
263
|
+
const result = compareTextCaseInsensitive(value1, value2);
|
|
264
|
+
expect(result, "to equal", expectedResult);
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
it.each([
|
|
268
|
+
[0, "AAA123", "aaa123"],
|
|
269
|
+
[1, "AAA123", "AAA1234"],
|
|
270
|
+
[1, "123", "123a"],
|
|
271
|
+
[1, null, "123"],
|
|
272
|
+
[1, undefined, "123"],
|
|
273
|
+
[0, null, null],
|
|
274
|
+
[0, undefined, undefined],
|
|
275
|
+
[0, undefined, null],
|
|
276
|
+
[0, null, undefined],
|
|
277
|
+
])("returns %s for values %s and %s for descending order", (expectedResult, value1, value2) => {
|
|
278
|
+
const result = compareTextCaseInsensitive(value1, value2, false);
|
|
279
|
+
expect(result, "to equal", expectedResult);
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
describe("compareNumeric function", () => {
|
|
284
|
+
it.each([
|
|
285
|
+
[0, 42, 42],
|
|
286
|
+
[-1, 42, 42.42],
|
|
287
|
+
[-1, null, 42],
|
|
288
|
+
[-1, undefined, 42],
|
|
289
|
+
[0, null, null],
|
|
290
|
+
[0, undefined, undefined],
|
|
291
|
+
[0, undefined, null],
|
|
292
|
+
[0, null, undefined],
|
|
293
|
+
[-1, "9", "42"],
|
|
294
|
+
[1, "9", null],
|
|
295
|
+
[1, "9", undefined],
|
|
296
|
+
[1, 9, 7],
|
|
297
|
+
[1, 9, undefined],
|
|
298
|
+
[1, undefined, -1],
|
|
299
|
+
[-1, null, "1"],
|
|
300
|
+
[-1, undefined, "1"],
|
|
301
|
+
])("returns %s for values %s and %s ", (expectedResult, value1, value2) => {
|
|
302
|
+
const result = compareNumeric(value1, value2);
|
|
303
|
+
expect(result, "to equal", expectedResult);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it.each([
|
|
307
|
+
[0, 42, 42],
|
|
308
|
+
[1, 42, 42.42],
|
|
309
|
+
[1, null, 42],
|
|
310
|
+
[1, undefined, 42],
|
|
311
|
+
[0, null, null],
|
|
312
|
+
[0, undefined, undefined],
|
|
313
|
+
[0, undefined, null],
|
|
314
|
+
[0, null, undefined],
|
|
315
|
+
[1, "9", "42"],
|
|
316
|
+
[-1, "9", null],
|
|
317
|
+
[-1, "9", undefined],
|
|
318
|
+
[1, null, "1"],
|
|
319
|
+
[1, undefined, "1"],
|
|
320
|
+
])("returns %s for values %s and %s for descending order", (expectedResult, value1, value2) => {
|
|
321
|
+
const result = compareNumeric(value1, value2, false);
|
|
322
|
+
expect(result, "to equal", expectedResult);
|
|
323
|
+
});
|
|
324
|
+
});
|