@sapui5/sap.fe.test 1.95.0 → 1.98.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.
Files changed (74) hide show
  1. package/package.json +4 -3
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/BaseActions.js +1 -1
  4. package/src/sap/fe/test/BaseArrangements.js +1 -1
  5. package/src/sap/fe/test/BaseAssertions.js +1 -1
  6. package/src/sap/fe/test/ConfirmDialog.js +1 -1
  7. package/src/sap/fe/test/FCLView.js +1 -7
  8. package/src/sap/fe/test/Flexibility.js +46 -12
  9. package/src/sap/fe/test/FlexibleColumnLayout.js +1 -1
  10. package/src/sap/fe/test/JestTemplatingHelper.js +99 -6
  11. package/src/sap/fe/test/JestTemplatingHelper.ts +65 -3
  12. package/src/sap/fe/test/JourneyRunner.js +9 -4
  13. package/src/sap/fe/test/ListReport.js +9 -15
  14. package/src/sap/fe/test/LocationUtil.js +1 -1
  15. package/src/sap/fe/test/ObjectPage.js +60 -50
  16. package/src/sap/fe/test/Shell.js +17 -12
  17. package/src/sap/fe/test/Stubs.js +1 -1
  18. package/src/sap/fe/test/TemplatePage.js +1 -13
  19. package/src/sap/fe/test/TemplatingTestUtils.js +2 -2
  20. package/src/sap/fe/test/UI5MockHelper.js +405 -0
  21. package/src/sap/fe/test/UI5MockHelper.ts +246 -0
  22. package/src/sap/fe/test/Utils.js +6 -14
  23. package/src/sap/fe/test/api/APIHelper.js +1 -1
  24. package/src/sap/fe/test/api/BaseAPI.js +23 -8
  25. package/src/sap/fe/test/api/ChartActions.js +1 -1
  26. package/src/sap/fe/test/api/ChartAssertions.js +6 -2
  27. package/src/sap/fe/test/api/DialogAPI.js +10 -6
  28. package/src/sap/fe/test/api/DialogActions.js +19 -6
  29. package/src/sap/fe/test/api/DialogAssertions.js +26 -6
  30. package/src/sap/fe/test/api/DialogCreateActions.js +1 -1
  31. package/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  32. package/src/sap/fe/test/api/DialogMessageActions.js +1 -1
  33. package/src/sap/fe/test/api/DialogMessageAssertions.js +1 -1
  34. package/src/sap/fe/test/api/DialogType.js +1 -1
  35. package/src/sap/fe/test/api/DialogValueHelpActions.js +1 -1
  36. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +1 -1
  37. package/src/sap/fe/test/api/EditState.js +10 -1
  38. package/src/sap/fe/test/api/FilterBarAPI.js +1 -1
  39. package/src/sap/fe/test/api/FilterBarActions.js +39 -5
  40. package/src/sap/fe/test/api/FilterBarAssertions.js +1 -1
  41. package/src/sap/fe/test/api/FooterAPI.js +1 -1
  42. package/src/sap/fe/test/api/FooterActionsBase.js +1 -1
  43. package/src/sap/fe/test/api/FooterActionsOP.js +1 -1
  44. package/src/sap/fe/test/api/FooterAssertionsBase.js +1 -1
  45. package/src/sap/fe/test/api/FooterAssertionsOP.js +1 -1
  46. package/src/sap/fe/test/api/FormAPI.js +1 -1
  47. package/src/sap/fe/test/api/FormActions.js +1 -1
  48. package/src/sap/fe/test/api/FormAssertions.js +34 -5
  49. package/src/sap/fe/test/api/HeaderAPI.js +1 -1
  50. package/src/sap/fe/test/api/HeaderActions.js +1 -1
  51. package/src/sap/fe/test/api/HeaderActionsLR.js +1 -1
  52. package/src/sap/fe/test/api/HeaderAssertions.js +1 -1
  53. package/src/sap/fe/test/api/HeaderAssertionsLR.js +1 -1
  54. package/src/sap/fe/test/api/HeaderLR.js +1 -1
  55. package/src/sap/fe/test/api/KPICardAPI.js +1 -1
  56. package/src/sap/fe/test/api/KPICardActions.js +42 -0
  57. package/src/sap/fe/test/api/KPICardAssertions.js +42 -16
  58. package/src/sap/fe/test/api/TableAPI.js +1 -1
  59. package/src/sap/fe/test/api/TableActions.js +2 -2
  60. package/src/sap/fe/test/api/TableAssertions.js +12 -1
  61. package/src/sap/fe/test/builder/DialogBuilder.js +1 -1
  62. package/src/sap/fe/test/builder/FEBuilder.js +1 -1
  63. package/src/sap/fe/test/builder/KPIBuilder.js +28 -3
  64. package/src/sap/fe/test/builder/MacroFieldBuilder.js +1 -1
  65. package/src/sap/fe/test/builder/MdcFieldBuilder.js +1 -1
  66. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +1 -1
  67. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +1 -1
  68. package/src/sap/fe/test/builder/MdcTableBuilder.js +23 -1
  69. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +1 -1
  70. package/src/sap/fe/test/builder/VMBuilder.js +1 -1
  71. package/src/sap/fe/test/internal/FEArrangements.js +1 -1
  72. package/src/sap/fe/test/internal/FEJourneyRunner.js +1 -1
  73. package/src/sap/fe/test/library.js +2 -2
  74. package/src/sap/fe/test/massEdit.js +1 -1
@@ -0,0 +1,405 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define([], function () {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+
10
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
11
+
12
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
13
+
14
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
15
+
16
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
17
+
18
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
19
+
20
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
21
+
22
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
23
+
24
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
25
+
26
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
27
+
28
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
29
+
30
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
31
+
32
+ /**
33
+ * Mock class for a V4 Context
34
+ */
35
+ var MockContext = /*#__PURE__*/function () {
36
+ function MockContext(oValues, oBinding) {
37
+ var _this = this;
38
+
39
+ _classCallCheck(this, MockContext);
40
+
41
+ _defineProperty(this, "getProperty", jest.fn(function (key) {
42
+ return _this.oValues[key];
43
+ }));
44
+
45
+ _defineProperty(this, "setProperty", jest.fn(function (key, value) {
46
+ _this.oValues[key] = value;
47
+ return _this.oValues[key];
48
+ }));
49
+
50
+ _defineProperty(this, "getObject", jest.fn(function (key) {
51
+ return _this.oValues[key];
52
+ }));
53
+
54
+ _defineProperty(this, "getPath", jest.fn(function () {
55
+ return _this.oValues["$path"];
56
+ }));
57
+
58
+ _defineProperty(this, "getBinding", jest.fn(function () {
59
+ return _this.oBinding;
60
+ }));
61
+
62
+ _defineProperty(this, "getModel", jest.fn(function () {
63
+ var _this$oBinding;
64
+
65
+ return (_this$oBinding = _this.oBinding) === null || _this$oBinding === void 0 ? void 0 : _this$oBinding.getModel();
66
+ }));
67
+
68
+ _defineProperty(this, "isTransient", jest.fn());
69
+
70
+ this.oValues = oValues;
71
+ this.oBinding = oBinding;
72
+ }
73
+
74
+ _exports.MockContext = MockContext;
75
+
76
+ _createClass(MockContext, [{
77
+ key: "isA",
78
+ value: function isA(sClassName) {
79
+ return sClassName === "sap.ui.model.odata.v4.Context";
80
+ }
81
+ }]);
82
+
83
+ return MockContext;
84
+ }();
85
+
86
+ _exports.MockContext = MockContext;
87
+
88
+ var MockUI5Element = function MockUI5Element() {
89
+ _classCallCheck(this, MockUI5Element);
90
+
91
+ _defineProperty(this, "bindingContext", new MockContext({}));
92
+
93
+ _defineProperty(this, "getBinding", jest.fn());
94
+
95
+ _defineProperty(this, "getBindingContext", jest.fn().mockReturnValue(this.bindingContext));
96
+
97
+ _defineProperty(this, "getBindingInfo", jest.fn());
98
+
99
+ _defineProperty(this, "data", jest.fn());
100
+
101
+ _defineProperty(this, "getModel", jest.fn());
102
+
103
+ _defineProperty(this, "getParent", jest.fn());
104
+ };
105
+
106
+ _exports.MockUI5Element = MockUI5Element;
107
+
108
+ var MockControl = /*#__PURE__*/function (_MockUI5Element) {
109
+ _inherits(MockControl, _MockUI5Element);
110
+
111
+ var _super = _createSuper(MockControl);
112
+
113
+ function MockControl() {
114
+ _classCallCheck(this, MockControl);
115
+
116
+ return _super.apply(this, arguments);
117
+ }
118
+
119
+ _exports.MockControl = MockControl;
120
+ return MockControl;
121
+ }(MockUI5Element);
122
+
123
+ _exports.MockControl = MockControl;
124
+
125
+ var MockEvent = function MockEvent() {
126
+ var _this2 = this;
127
+
128
+ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
129
+ var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new MockUI5Element();
130
+
131
+ _classCallCheck(this, MockEvent);
132
+
133
+ _defineProperty(this, "getParameter", jest.fn(function (name) {
134
+ return _this2.params[name];
135
+ }));
136
+
137
+ _defineProperty(this, "getSource", jest.fn(function () {
138
+ return _this2.source;
139
+ }));
140
+
141
+ this.params = params;
142
+ this.source = source;
143
+ };
144
+ /**
145
+ * Mock class for OData V4 ListBinding
146
+ */
147
+
148
+
149
+ _exports.MockEvent = MockEvent;
150
+
151
+ var MockListBinding = /*#__PURE__*/function () {
152
+ function MockListBinding(aContexts, mockModel) {
153
+ var _this3 = this;
154
+
155
+ _classCallCheck(this, MockListBinding);
156
+
157
+ _defineProperty(this, "setAggregation", jest.fn());
158
+
159
+ _defineProperty(this, "filter", jest.fn());
160
+
161
+ _defineProperty(this, "sort", jest.fn());
162
+
163
+ _defineProperty(this, "requestContexts", jest.fn(function () {
164
+ return Promise.resolve(_this3.aMockContexts);
165
+ }));
166
+
167
+ _defineProperty(this, "getCurrentContexts", jest.fn(function () {
168
+ return _this3.aMockContexts;
169
+ }));
170
+
171
+ _defineProperty(this, "getModel", jest.fn(function () {
172
+ return _this3.mockModel;
173
+ }));
174
+
175
+ this.mockModel = mockModel;
176
+ aContexts = aContexts || [];
177
+ this.aMockContexts = aContexts.map(function (context) {
178
+ return new MockContext(context, _this3);
179
+ });
180
+ }
181
+
182
+ _exports.MockListBinding = MockListBinding;
183
+
184
+ _createClass(MockListBinding, [{
185
+ key: "isA",
186
+ value: function isA(sClassName) {
187
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
188
+ }
189
+ }, {
190
+ key: "setModel",
191
+ value: function setModel(oModel) {
192
+ this.mockModel = oModel;
193
+ } // Mocked API
194
+
195
+ }]);
196
+
197
+ return MockListBinding;
198
+ }();
199
+
200
+ _exports.MockListBinding = MockListBinding;
201
+
202
+ var MockContextBinding = /*#__PURE__*/function () {
203
+ function MockContextBinding(oContext, mockModel) {
204
+ var _this4 = this;
205
+
206
+ _classCallCheck(this, MockContextBinding);
207
+
208
+ _defineProperty(this, "getBoundContext", jest.fn(function () {
209
+ return _this4.oMockContext;
210
+ }));
211
+
212
+ _defineProperty(this, "attachEventOnce", jest.fn());
213
+
214
+ _defineProperty(this, "getModel", jest.fn(function () {
215
+ return _this4.mockModel;
216
+ }));
217
+
218
+ this.mockModel = mockModel;
219
+ this.oMockContext = new MockContext(oContext || {}, this);
220
+ }
221
+
222
+ _exports.MockContextBinding = MockContextBinding;
223
+
224
+ _createClass(MockContextBinding, [{
225
+ key: "isA",
226
+ value: function isA(sClassName) {
227
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
228
+ }
229
+ }, {
230
+ key: "getInternalMockContext",
231
+ value: function getInternalMockContext() {
232
+ return this.oMockContext;
233
+ }
234
+ }, {
235
+ key: "setModel",
236
+ value: function setModel(oModel) {
237
+ this.mockModel = oModel;
238
+ } // Mocked API
239
+
240
+ }]);
241
+
242
+ return MockContextBinding;
243
+ }();
244
+ /**
245
+ * Mock class for OData V4 MetaModel
246
+ */
247
+
248
+
249
+ _exports.MockContextBinding = MockContextBinding;
250
+
251
+ var MockMetaModel = function MockMetaModel(oMetaData) {
252
+ var _this5 = this;
253
+
254
+ _classCallCheck(this, MockMetaModel);
255
+
256
+ _defineProperty(this, "getMetaContext", jest.fn(function (sPath) {
257
+ return new MockContext({
258
+ $path: sPath
259
+ });
260
+ }));
261
+
262
+ _defineProperty(this, "getObject", jest.fn(function (sPath) {
263
+ return _this5.oMetaContext.getProperty(sPath);
264
+ }));
265
+
266
+ _defineProperty(this, "requestObject", jest.fn());
267
+
268
+ _defineProperty(this, "createBindingContext", jest.fn(function (sPath) {
269
+ return new MockContext({
270
+ $path: sPath
271
+ });
272
+ }));
273
+
274
+ _defineProperty(this, "getMetaPath", jest.fn());
275
+
276
+ this.oMetaContext = new MockContext(oMetaData || {});
277
+ } // Mocked API
278
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
279
+ ;
280
+ /**
281
+ * Mock class for OData V4 Model
282
+ */
283
+
284
+
285
+ _exports.MockMetaModel = MockMetaModel;
286
+
287
+ var MockModel = /*#__PURE__*/function () {
288
+ function MockModel(mockListBinding, mockContextBinding) {
289
+ var _this6 = this;
290
+
291
+ _classCallCheck(this, MockModel);
292
+
293
+ _defineProperty(this, "bindList", jest.fn(function () {
294
+ return _this6.mockListBinding;
295
+ }));
296
+
297
+ _defineProperty(this, "bindContext", jest.fn(function () {
298
+ return _this6.mockContextBinding;
299
+ }));
300
+
301
+ _defineProperty(this, "getMetaModel", jest.fn(function () {
302
+ return _this6.oMetaModel;
303
+ }));
304
+
305
+ _defineProperty(this, "getProperty", jest.fn());
306
+
307
+ _defineProperty(this, "setProperty", jest.fn());
308
+
309
+ this.mockListBinding = mockListBinding;
310
+ this.mockContextBinding = mockContextBinding;
311
+
312
+ if (mockListBinding) {
313
+ mockListBinding.setModel(this);
314
+ }
315
+
316
+ if (mockContextBinding) {
317
+ mockContextBinding.setModel(this);
318
+ }
319
+ } // Factories
320
+
321
+
322
+ _exports.MockModel = MockModel;
323
+
324
+ _createClass(MockModel, [{
325
+ key: "setMetaModel",
326
+ value: function setMetaModel(oMetaModel) {
327
+ this.oMetaModel = oMetaModel;
328
+ } // Mocked API
329
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
330
+
331
+ }], [{
332
+ key: "modelFromListBinding",
333
+ value: function modelFromListBinding(mockListBinding) {
334
+ return new MockModel(mockListBinding);
335
+ }
336
+ }, {
337
+ key: "modelFromContextBinding",
338
+ value: function modelFromContextBinding(mockContextBinding) {
339
+ return new MockModel(undefined, mockContextBinding);
340
+ }
341
+ }]);
342
+
343
+ return MockModel;
344
+ }();
345
+
346
+ _exports.MockModel = MockModel;
347
+
348
+ var MockView = function MockView() {
349
+ _classCallCheck(this, MockView);
350
+
351
+ _defineProperty(this, "getController", jest.fn());
352
+
353
+ _defineProperty(this, "getModel", jest.fn());
354
+
355
+ _defineProperty(this, "getViewData", jest.fn());
356
+ };
357
+
358
+ _exports.MockView = MockView;
359
+
360
+ var MockController = function MockController() {
361
+ _classCallCheck(this, MockController);
362
+
363
+ _defineProperty(this, "getView", jest.fn());
364
+
365
+ _defineProperty(this, "_routing", {
366
+ navigateToTarget: jest.fn()
367
+ });
368
+
369
+ _defineProperty(this, "_editFlow", {
370
+ syncTask: jest.fn()
371
+ });
372
+
373
+ _defineProperty(this, "_sideEffects", {
374
+ handleFieldChange: jest.fn()
375
+ });
376
+
377
+ _defineProperty(this, "isA", jest.fn().mockReturnValue(false));
378
+ };
379
+
380
+ _exports.MockController = MockController;
381
+
382
+ /**
383
+ * Generate model, view and controller mocks that refer to each other.
384
+ *
385
+ * @param existing Optional existing mocked instances that should be used
386
+ * @returns Mocked model, view and controller instances
387
+ */
388
+ function mockMVC(existing) {
389
+ var model = (existing === null || existing === void 0 ? void 0 : existing.model) || new MockModel();
390
+ var view = (existing === null || existing === void 0 ? void 0 : existing.view) || new MockView();
391
+ var controller = (existing === null || existing === void 0 ? void 0 : existing.controller) || new MockController();
392
+ view.getController.mockReturnValue(controller);
393
+ view.getModel.mockReturnValue(model);
394
+ controller.getView.mockReturnValue(view);
395
+ return {
396
+ model: model,
397
+ view: view,
398
+ controller: controller
399
+ };
400
+ }
401
+
402
+ _exports.mockMVC = mockMVC;
403
+ return _exports;
404
+ }, false);
405
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJ2YWx1ZSIsImdldE1vZGVsIiwic0NsYXNzTmFtZSIsIk1vY2tVSTVFbGVtZW50IiwibW9ja1JldHVyblZhbHVlIiwiYmluZGluZ0NvbnRleHQiLCJNb2NrQ29udHJvbCIsIk1vY2tFdmVudCIsInBhcmFtcyIsInNvdXJjZSIsIm5hbWUiLCJNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dHMiLCJtb2NrTW9kZWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFNb2NrQ29udGV4dHMiLCJtYXAiLCJjb250ZXh0Iiwib01vZGVsIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJNb2NrTWV0YU1vZGVsIiwib01ldGFEYXRhIiwic1BhdGgiLCIkcGF0aCIsIm9NZXRhQ29udGV4dCIsImdldFByb3BlcnR5IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwib01ldGFNb2RlbCIsInNldE1vZGVsIiwidW5kZWZpbmVkIiwiTW9ja1ZpZXciLCJNb2NrQ29udHJvbGxlciIsIm5hdmlnYXRlVG9UYXJnZXQiLCJzeW5jVGFzayIsImhhbmRsZUZpZWxkQ2hhbmdlIiwibW9ja01WQyIsImV4aXN0aW5nIiwibW9kZWwiLCJ2aWV3IiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJnZXRWaWV3Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRkE7QUFDQTtBQUNBO01BTWFBLFc7QUFDWix5QkFBMkJDLE9BQTNCLEVBQWlEQyxRQUFqRCxFQUFpRTtBQUFBOztBQUFBOztBQUFBLDJDQU01Q0MsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUM3QyxlQUFPLEtBQUks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LEVBQUw7QUFERCxLOzt1Q0FJQztBQUNsQndDLE1BQUFBLFFBQVEsRUFBRXpDLElBQUksQ0FBQ0MsRUFBTDtBQURRLEs7OzBDQUlHO0FBQ3JCeUMsTUFBQUEsaUJBQWlCLEVBQUUxQyxJQUFJLENBQUNDLEVBQUw7QUFERSxLOztpQ0FJaEJELElBQUksQ0FBQ0MsRUFBTCxHQUFVTSxlQUFWLENBQTBCLEtBQTFCLEM7Ozs7O0FBU1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sV0FBU29DLE9BQVQsQ0FBaUJDLFFBQWpCLEVBQXVEO0FBQzdELFFBQU1DLEtBQUssR0FBRyxDQUFBRCxRQUFRLFNBQVIsSUFBQUEsUUFBUSxXQUFSLFlBQUFBLFFBQVEsQ0FBRUMsS0FBVixLQUFtQixJQUFJYixTQUFKLEVBQWpDO0FBQ0EsUUFBTWMsSUFBSSxHQUFHLENBQUFGLFFBQVEsU0FBUixJQUFBQSxRQUFRLFdBQVIsWUFBQUEsUUFBUSxDQUFFRSxJQUFWLEtBQWtCLElBQUlSLFFBQUosRUFBL0I7QUFDQSxRQUFNUyxVQUFVLEdBQUcsQ0FBQUgsUUFBUSxTQUFSLElBQUFBLFFBQVEsV0FBUixZQUFBQSxRQUFRLENBQUVHLFVBQVYsS0FBd0IsSUFBSVIsY0FBSixFQUEzQztBQUVBTyxJQUFBQSxJQUFJLENBQUNFLGFBQUwsQ0FBbUJ6QyxlQUFuQixDQUFtQ3dDLFVBQW5DO0FBQ0FELElBQUFBLElBQUksQ0FBQzFDLFFBQUwsQ0FBY0csZUFBZCxDQUE4QnNDLEtBQTlCO0FBQ0FFLElBQUFBLFVBQVUsQ0FBQ0UsT0FBWCxDQUFtQjFDLGVBQW5CLENBQW1DdUMsSUFBbkM7QUFFQSxXQUFPO0FBQUVELE1BQUFBLEtBQUssRUFBTEEsS0FBRjtBQUFTQyxNQUFBQSxJQUFJLEVBQUpBLElBQVQ7QUFBZUMsTUFBQUEsVUFBVSxFQUFWQTtBQUFmLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic2FwL3VpL2Jhc2VcIjtcbmltcG9ydCB7IENvbnRyb2wsIFVJNUVsZW1lbnQgfSBmcm9tIFwic2FwL3VpL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIFZpZXcgfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YUxpc3RCaW5kaW5nLCBPRGF0YUNvbnRleHRCaW5kaW5nLCBPRGF0YU1ldGFNb2RlbCwgT0RhdGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9WYWx1ZXM6IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBzZXRQcm9wZXJ0eSA9IGplc3QuZm4oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0dGhpcy5vVmFsdWVzW2tleV0gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW2tleV07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRQYXRoID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1tcIiRwYXRoXCJdO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nO1xuXHR9KTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9CaW5kaW5nPy5nZXRNb2RlbCgpIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cdHB1YmxpYyBpc1RyYW5zaWVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tVSTVFbGVtZW50IGltcGxlbWVudHMgUGFydGlhbDxVSTVFbGVtZW50PiB7XG5cdFtrZXk6IHN0cmluZ106IGFueTtcblx0cHVibGljIGJpbmRpbmdDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KHt9KTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodGhpcy5iaW5kaW5nQ29udGV4dCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGRhdGEgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldFBhcmVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIGV4dGVuZHMgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRyb2w+IHt9XG5cbmV4cG9ydCBjbGFzcyBNb2NrRXZlbnQgaW1wbGVtZW50cyBQYXJ0aWFsPEV2ZW50PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sIHB1YmxpYyBzb3VyY2U6IE1vY2tVSTVFbGVtZW50ID0gbmV3IE1vY2tVSTVFbGVtZW50KCkpIHt9XG5cblx0cHVibGljIGdldFBhcmFtZXRlciA9IGplc3QuZm4obmFtZSA9PiB0aGlzLnBhcmFtc1tuYW1lXSk7XG5cblx0cHVibGljIGdldFNvdXJjZSA9IGplc3QuZm4oKCkgPT4gdGhpcy5zb3VyY2UgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBMaXN0QmluZGluZ1xuICovXG5leHBvcnQgY2xhc3MgTW9ja0xpc3RCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUxpc3RCaW5kaW5nPiB7XG5cdHByaXZhdGUgYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUNvbnRleHRzPzogYW55W10sIHByaXZhdGUgbW9ja01vZGVsPzogTW9ja01vZGVsKSB7XG5cdFx0YUNvbnRleHRzID0gYUNvbnRleHRzIHx8IFtdO1xuXG5cdFx0dGhpcy5hTW9ja0NvbnRleHRzID0gYUNvbnRleHRzLm1hcChjb250ZXh0ID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSkgYXMgQ29udGV4dFtdKTtcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldEN1cnJlbnRDb250ZXh0cyA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXTtcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRwcml2YXRlIG9Nb2NrQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9Db250ZXh0PzogYW55LCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cdHB1YmxpYyBzZXRNb2RlbChvTW9kZWw6IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMubW9ja01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja01vZGVsIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTWV0YU1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2NrTWV0YU1vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1ldGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9NZXRhRGF0YT86IGFueSkge1xuXHRcdHRoaXMub01ldGFDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9NZXRhRGF0YSB8fCB7fSk7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldE1ldGFDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiAobmV3IE1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pIGFzIGFueSkgYXMgQ29udGV4dDtcblx0fSk7XG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0T2JqZWN0ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgY3JlYXRlQmluZGluZ0NvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIChuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGdldE1ldGFQYXRoID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHtcblx0XHRpZiAobW9ja0xpc3RCaW5kaW5nKSB7XG5cdFx0XHRtb2NrTGlzdEJpbmRpbmcuc2V0TW9kZWwodGhpcyk7XG5cdFx0fVxuXHRcdGlmIChtb2NrQ29udGV4dEJpbmRpbmcpIHtcblx0XHRcdG1vY2tDb250ZXh0QmluZGluZy5zZXRNb2RlbCh0aGlzKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGYWN0b3JpZXNcblx0c3RhdGljIG1vZGVsRnJvbUxpc3RCaW5kaW5nKG1vY2tMaXN0QmluZGluZzogTW9ja0xpc3RCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0XHRyZXR1cm4gbmV3IE1vY2tNb2RlbChtb2NrTGlzdEJpbmRpbmcpO1xuXHR9XG5cdHN0YXRpYyBtb2RlbEZyb21Db250ZXh0QmluZGluZyhtb2NrQ29udGV4dEJpbmRpbmc6IE1vY2tDb250ZXh0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwodW5kZWZpbmVkLCBtb2NrQ29udGV4dEJpbmRpbmcpO1xuXHR9XG5cblx0cHVibGljIHNldE1ldGFNb2RlbChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSB7XG5cdFx0dGhpcy5vTWV0YU1vZGVsID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZExpc3QgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tMaXN0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kQ29udGV4dCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja0NvbnRleHRCaW5kaW5nIGFzIGFueSkgYXMgT0RhdGFDb250ZXh0QmluZGluZztcblx0fSk7XG5cdHB1YmxpYyBnZXRNZXRhTW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMub01ldGFNb2RlbCBhcyBhbnkpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBzZXRQcm9wZXJ0eSA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tWaWV3IGltcGxlbWVudHMgUGFydGlhbDxWaWV3PiB7XG5cdHB1YmxpYyBnZXRDb250cm9sbGVyID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgZ2V0Vmlld0RhdGEgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbGxlciBpbXBsZW1lbnRzIFBhcnRpYWw8Q29udHJvbGxlcj4ge1xuXHRwdWJsaWMgZ2V0VmlldyA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgX3JvdXRpbmcgPSB7XG5cdFx0bmF2aWdhdGVUb1RhcmdldDogamVzdC5mbigpXG5cdH07XG5cblx0cHVibGljIF9lZGl0RmxvdyA9IHtcblx0XHRzeW5jVGFzazogamVzdC5mbigpXG5cdH07XG5cblx0cHVibGljIF9zaWRlRWZmZWN0cyA9IHtcblx0XHRoYW5kbGVGaWVsZENoYW5nZTogamVzdC5mbigpXG5cdH07XG5cblx0aXNBID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVZDTW9jayB7XG5cdG1vZGVsOiBNb2NrTW9kZWw7XG5cdHZpZXc6IE1vY2tWaWV3O1xuXHRjb250cm9sbGVyOiBNb2NrQ29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBtb2NrcyB0aGF0IHJlZmVyIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIE9wdGlvbmFsIGV4aXN0aW5nIG1vY2tlZCBpbnN0YW5jZXMgdGhhdCBzaG91bGQgYmUgdXNlZFxuICogQHJldHVybnMgTW9ja2VkIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIGluc3RhbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja01WQyhleGlzdGluZz86IFBhcnRpYWw8TVZDTW9jaz4pOiBNVkNNb2NrIHtcblx0Y29uc3QgbW9kZWwgPSBleGlzdGluZz8ubW9kZWwgfHwgbmV3IE1vY2tNb2RlbCgpO1xuXHRjb25zdCB2aWV3ID0gZXhpc3Rpbmc/LnZpZXcgfHwgbmV3IE1vY2tWaWV3KCk7XG5cdGNvbnN0IGNvbnRyb2xsZXIgPSBleGlzdGluZz8uY29udHJvbGxlciB8fCBuZXcgTW9ja0NvbnRyb2xsZXIoKTtcblxuXHR2aWV3LmdldENvbnRyb2xsZXIubW9ja1JldHVyblZhbHVlKGNvbnRyb2xsZXIpO1xuXHR2aWV3LmdldE1vZGVsLm1vY2tSZXR1cm5WYWx1ZShtb2RlbCk7XG5cdGNvbnRyb2xsZXIuZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUodmlldyk7XG5cblx0cmV0dXJuIHsgbW9kZWwsIHZpZXcsIGNvbnRyb2xsZXIgfTtcbn1cbiJdfQ==
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Mock class for a V4 Context
3
+ */
4
+ import { Event } from "sap/ui/base";
5
+ import { Control, UI5Element } from "sap/ui/core";
6
+ import { Controller, View } from "sap/ui/core/mvc";
7
+ import { Context, ODataListBinding, ODataContextBinding, ODataMetaModel, ODataModel } from "sap/ui/model/odata/v4";
8
+
9
+ export class MockContext implements Partial<Context> {
10
+ public constructor(private oValues: any, private oBinding?: any) {}
11
+
12
+ public isA(sClassName: string): boolean {
13
+ return sClassName === "sap.ui.model.odata.v4.Context";
14
+ }
15
+
16
+ public getProperty = jest.fn((key: string) => {
17
+ return this.oValues[key];
18
+ });
19
+ public setProperty = jest.fn((key: string, value: any) => {
20
+ this.oValues[key] = value;
21
+ return this.oValues[key];
22
+ });
23
+
24
+ public getObject = jest.fn((key: string) => {
25
+ return this.oValues[key];
26
+ });
27
+ public getPath = jest.fn(() => {
28
+ return this.oValues["$path"];
29
+ });
30
+
31
+ public getBinding = jest.fn(() => {
32
+ return this.oBinding;
33
+ });
34
+ public getModel = jest.fn(() => {
35
+ return (this.oBinding?.getModel() as any) as ODataModel;
36
+ });
37
+ public isTransient = jest.fn();
38
+ }
39
+
40
+ export class MockUI5Element implements Partial<UI5Element> {
41
+ [key: string]: any;
42
+ public bindingContext = new MockContext({});
43
+ public getBinding = jest.fn();
44
+ public getBindingContext = jest.fn().mockReturnValue(this.bindingContext);
45
+ public getBindingInfo = jest.fn();
46
+ public data = jest.fn();
47
+ public getModel = jest.fn();
48
+ public getParent = jest.fn();
49
+ }
50
+
51
+ export class MockControl extends MockUI5Element implements Partial<Control> {}
52
+
53
+ export class MockEvent implements Partial<Event> {
54
+ public constructor(public params: { [key: string]: any } = {}, public source: MockUI5Element = new MockUI5Element()) {}
55
+
56
+ public getParameter = jest.fn(name => this.params[name]);
57
+
58
+ public getSource = jest.fn(() => this.source as any);
59
+ }
60
+
61
+ /**
62
+ * Mock class for OData V4 ListBinding
63
+ */
64
+ export class MockListBinding implements Partial<ODataListBinding> {
65
+ private aMockContexts: MockContext[];
66
+
67
+ public constructor(aContexts?: any[], private mockModel?: MockModel) {
68
+ aContexts = aContexts || [];
69
+
70
+ this.aMockContexts = aContexts.map(context => {
71
+ return new MockContext(context, this);
72
+ });
73
+ }
74
+
75
+ public isA(sClassName: string): boolean {
76
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
77
+ }
78
+
79
+ public setModel(oModel: MockModel) {
80
+ this.mockModel = oModel;
81
+ }
82
+
83
+ // Mocked API
84
+ public setAggregation = jest.fn();
85
+ public filter = jest.fn();
86
+ public sort = jest.fn();
87
+
88
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
89
+ public requestContexts = jest.fn((...args) => {
90
+ return Promise.resolve((this.aMockContexts as any) as Context[]);
91
+ });
92
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
93
+ public getCurrentContexts = jest.fn((...args) => {
94
+ return (this.aMockContexts as any) as Context[];
95
+ });
96
+ public getModel = jest.fn(() => {
97
+ return (this.mockModel as any) as ODataModel;
98
+ });
99
+ }
100
+
101
+ export class MockContextBinding implements Partial<ODataContextBinding> {
102
+ private oMockContext: MockContext;
103
+
104
+ public constructor(oContext?: any, private mockModel?: MockModel) {
105
+ this.oMockContext = new MockContext(oContext || {}, this);
106
+ }
107
+
108
+ public isA(sClassName: string): boolean {
109
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
110
+ }
111
+ public getInternalMockContext(): MockContext {
112
+ return this.oMockContext;
113
+ }
114
+ public setModel(oModel: MockModel) {
115
+ this.mockModel = oModel;
116
+ }
117
+
118
+ // Mocked API
119
+ public getBoundContext = jest.fn(() => {
120
+ return (this.oMockContext as any) as Context;
121
+ });
122
+ public attachEventOnce = jest.fn();
123
+ public getModel = jest.fn(() => {
124
+ return (this.mockModel as any) as ODataModel;
125
+ });
126
+ }
127
+
128
+ /**
129
+ * Mock class for OData V4 MetaModel
130
+ */
131
+ export class MockMetaModel implements Partial<ODataMetaModel> {
132
+ private oMetaContext: MockContext;
133
+
134
+ public constructor(oMetaData?: any) {
135
+ this.oMetaContext = new MockContext(oMetaData || {});
136
+ }
137
+
138
+ // Mocked API
139
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
140
+ public getMetaContext = jest.fn((sPath: string) => {
141
+ return (new MockContext({ $path: sPath }) as any) as Context;
142
+ });
143
+ public getObject = jest.fn((sPath: string) => {
144
+ return this.oMetaContext.getProperty(sPath);
145
+ });
146
+ public requestObject = jest.fn();
147
+ public createBindingContext = jest.fn((sPath: string) => {
148
+ return (new MockContext({ $path: sPath }) as any) as Context;
149
+ });
150
+ public getMetaPath = jest.fn();
151
+ }
152
+
153
+ /**
154
+ * Mock class for OData V4 Model
155
+ */
156
+
157
+ export class MockModel implements Partial<ODataModel> {
158
+ private oMetaModel?: MockMetaModel;
159
+
160
+ public constructor(private mockListBinding?: MockListBinding, private mockContextBinding?: MockContextBinding) {
161
+ if (mockListBinding) {
162
+ mockListBinding.setModel(this);
163
+ }
164
+ if (mockContextBinding) {
165
+ mockContextBinding.setModel(this);
166
+ }
167
+ }
168
+
169
+ // Factories
170
+ static modelFromListBinding(mockListBinding: MockListBinding): MockModel {
171
+ return new MockModel(mockListBinding);
172
+ }
173
+ static modelFromContextBinding(mockContextBinding: MockContextBinding): MockModel {
174
+ return new MockModel(undefined, mockContextBinding);
175
+ }
176
+
177
+ public setMetaModel(oMetaModel: MockMetaModel) {
178
+ this.oMetaModel = oMetaModel;
179
+ }
180
+
181
+ // Mocked API
182
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
183
+ public bindList = jest.fn((...args) => {
184
+ return (this.mockListBinding as any) as ODataListBinding;
185
+ });
186
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
187
+ public bindContext = jest.fn((...args) => {
188
+ return (this.mockContextBinding as any) as ODataContextBinding;
189
+ });
190
+ public getMetaModel = jest.fn(() => {
191
+ return (this.oMetaModel as any) as ODataMetaModel;
192
+ });
193
+
194
+ public getProperty = jest.fn();
195
+ public setProperty = jest.fn();
196
+ }
197
+
198
+ export class MockView implements Partial<View> {
199
+ public getController = jest.fn();
200
+
201
+ public getModel = jest.fn();
202
+
203
+ public getViewData = jest.fn();
204
+ }
205
+
206
+ export class MockController implements Partial<Controller> {
207
+ public getView = jest.fn();
208
+
209
+ public _routing = {
210
+ navigateToTarget: jest.fn()
211
+ };
212
+
213
+ public _editFlow = {
214
+ syncTask: jest.fn()
215
+ };
216
+
217
+ public _sideEffects = {
218
+ handleFieldChange: jest.fn()
219
+ };
220
+
221
+ isA = jest.fn().mockReturnValue(false);
222
+ }
223
+
224
+ export interface MVCMock {
225
+ model: MockModel;
226
+ view: MockView;
227
+ controller: MockController;
228
+ }
229
+
230
+ /**
231
+ * Generate model, view and controller mocks that refer to each other.
232
+ *
233
+ * @param existing Optional existing mocked instances that should be used
234
+ * @returns Mocked model, view and controller instances
235
+ */
236
+ export function mockMVC(existing?: Partial<MVCMock>): MVCMock {
237
+ const model = existing?.model || new MockModel();
238
+ const view = existing?.view || new MockView();
239
+ const controller = existing?.controller || new MockController();
240
+
241
+ view.getController.mockReturnValue(controller);
242
+ view.getModel.mockReturnValue(model);
243
+ controller.getView.mockReturnValue(view);
244
+
245
+ return { model, view, controller };
246
+ }