@sapui5/sap.fe.test 1.97.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 (72) hide show
  1. package/package.json +1 -1
  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 -1
  8. package/src/sap/fe/test/Flexibility.js +1 -1
  9. package/src/sap/fe/test/FlexibleColumnLayout.js +1 -1
  10. package/src/sap/fe/test/JourneyRunner.js +9 -4
  11. package/src/sap/fe/test/ListReport.js +9 -4
  12. package/src/sap/fe/test/LocationUtil.js +1 -1
  13. package/src/sap/fe/test/ObjectPage.js +20 -12
  14. package/src/sap/fe/test/Shell.js +1 -1
  15. package/src/sap/fe/test/Stubs.js +1 -1
  16. package/src/sap/fe/test/TemplatePage.js +1 -1
  17. package/src/sap/fe/test/TemplatingTestUtils.js +2 -2
  18. package/src/sap/fe/test/UI5MockHelper.js +211 -45
  19. package/src/sap/fe/test/UI5MockHelper.ts +103 -8
  20. package/src/sap/fe/test/Utils.js +1 -13
  21. package/src/sap/fe/test/api/APIHelper.js +1 -1
  22. package/src/sap/fe/test/api/BaseAPI.js +2 -8
  23. package/src/sap/fe/test/api/ChartActions.js +1 -1
  24. package/src/sap/fe/test/api/ChartAssertions.js +5 -5
  25. package/src/sap/fe/test/api/DialogAPI.js +1 -1
  26. package/src/sap/fe/test/api/DialogActions.js +1 -1
  27. package/src/sap/fe/test/api/DialogAssertions.js +1 -1
  28. package/src/sap/fe/test/api/DialogCreateActions.js +1 -1
  29. package/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  30. package/src/sap/fe/test/api/DialogMessageActions.js +1 -1
  31. package/src/sap/fe/test/api/DialogMessageAssertions.js +1 -1
  32. package/src/sap/fe/test/api/DialogType.js +1 -1
  33. package/src/sap/fe/test/api/DialogValueHelpActions.js +1 -1
  34. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +1 -1
  35. package/src/sap/fe/test/api/EditState.js +1 -1
  36. package/src/sap/fe/test/api/FilterBarAPI.js +1 -1
  37. package/src/sap/fe/test/api/FilterBarActions.js +1 -1
  38. package/src/sap/fe/test/api/FilterBarAssertions.js +1 -1
  39. package/src/sap/fe/test/api/FooterAPI.js +1 -1
  40. package/src/sap/fe/test/api/FooterActionsBase.js +1 -1
  41. package/src/sap/fe/test/api/FooterActionsOP.js +1 -1
  42. package/src/sap/fe/test/api/FooterAssertionsBase.js +1 -1
  43. package/src/sap/fe/test/api/FooterAssertionsOP.js +1 -1
  44. package/src/sap/fe/test/api/FormAPI.js +1 -1
  45. package/src/sap/fe/test/api/FormActions.js +1 -1
  46. package/src/sap/fe/test/api/FormAssertions.js +1 -1
  47. package/src/sap/fe/test/api/HeaderAPI.js +1 -1
  48. package/src/sap/fe/test/api/HeaderActions.js +1 -1
  49. package/src/sap/fe/test/api/HeaderActionsLR.js +1 -1
  50. package/src/sap/fe/test/api/HeaderAssertions.js +1 -1
  51. package/src/sap/fe/test/api/HeaderAssertionsLR.js +1 -1
  52. package/src/sap/fe/test/api/HeaderLR.js +1 -1
  53. package/src/sap/fe/test/api/KPICardAPI.js +1 -1
  54. package/src/sap/fe/test/api/KPICardActions.js +42 -0
  55. package/src/sap/fe/test/api/KPICardAssertions.js +20 -16
  56. package/src/sap/fe/test/api/TableAPI.js +1 -1
  57. package/src/sap/fe/test/api/TableActions.js +1 -1
  58. package/src/sap/fe/test/api/TableAssertions.js +12 -1
  59. package/src/sap/fe/test/builder/DialogBuilder.js +1 -1
  60. package/src/sap/fe/test/builder/FEBuilder.js +1 -1
  61. package/src/sap/fe/test/builder/KPIBuilder.js +12 -3
  62. package/src/sap/fe/test/builder/MacroFieldBuilder.js +1 -1
  63. package/src/sap/fe/test/builder/MdcFieldBuilder.js +1 -1
  64. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +1 -1
  65. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +1 -1
  66. package/src/sap/fe/test/builder/MdcTableBuilder.js +23 -1
  67. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +1 -1
  68. package/src/sap/fe/test/builder/VMBuilder.js +1 -1
  69. package/src/sap/fe/test/internal/FEArrangements.js +1 -1
  70. package/src/sap/fe/test/internal/FEJourneyRunner.js +1 -1
  71. package/src/sap/fe/test/library.js +2 -2
  72. package/src/sap/fe/test/massEdit.js +1 -1
@@ -7,72 +7,150 @@ sap.ui.define([], function () {
7
7
 
8
8
  var _exports = {};
9
9
 
10
- 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); } }
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
11
 
12
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
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); }
13
23
 
14
24
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
15
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
+
16
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; }
17
31
 
18
32
  /**
19
33
  * Mock class for a V4 Context
20
34
  */
21
- var MockContext = function MockContext(oValues, oBinding) {
22
- var _this = this;
35
+ var MockContext = /*#__PURE__*/function () {
36
+ function MockContext(oValues, oBinding) {
37
+ var _this = this;
23
38
 
24
- _classCallCheck(this, MockContext);
39
+ _classCallCheck(this, MockContext);
25
40
 
26
- _defineProperty(this, "getProperty", jest.fn(function (key) {
27
- return _this.oValues[key];
28
- }));
41
+ _defineProperty(this, "getProperty", jest.fn(function (key) {
42
+ return _this.oValues[key];
43
+ }));
29
44
 
30
- _defineProperty(this, "setProperty", jest.fn(function (key, value) {
31
- _this.oValues[key] = value;
32
- return _this.oValues[key];
33
- }));
45
+ _defineProperty(this, "setProperty", jest.fn(function (key, value) {
46
+ _this.oValues[key] = value;
47
+ return _this.oValues[key];
48
+ }));
34
49
 
35
- _defineProperty(this, "getObject", jest.fn(function (key) {
36
- return _this.oValues[key];
37
- }));
50
+ _defineProperty(this, "getObject", jest.fn(function (key) {
51
+ return _this.oValues[key];
52
+ }));
38
53
 
39
- _defineProperty(this, "getPath", jest.fn(function () {
40
- return _this.oValues["$path"];
41
- }));
54
+ _defineProperty(this, "getPath", jest.fn(function () {
55
+ return _this.oValues["$path"];
56
+ }));
42
57
 
43
- _defineProperty(this, "getBinding", jest.fn(function () {
44
- return _this.oBinding;
45
- }));
58
+ _defineProperty(this, "getBinding", jest.fn(function () {
59
+ return _this.oBinding;
60
+ }));
46
61
 
47
- _defineProperty(this, "getModel", jest.fn());
62
+ _defineProperty(this, "getModel", jest.fn(function () {
63
+ var _this$oBinding;
48
64
 
49
- this.oValues = oValues;
50
- this.oBinding = oBinding;
51
- };
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
+ }();
52
85
 
53
86
  _exports.MockContext = MockContext;
54
87
 
55
- var MockControl = function MockControl() {
56
- _classCallCheck(this, MockControl);
88
+ var MockUI5Element = function MockUI5Element() {
89
+ _classCallCheck(this, MockUI5Element);
57
90
 
58
- _defineProperty(this, "getBindingInfo", jest.fn());
91
+ _defineProperty(this, "bindingContext", new MockContext({}));
59
92
 
60
93
  _defineProperty(this, "getBinding", jest.fn());
61
94
 
95
+ _defineProperty(this, "getBindingContext", jest.fn().mockReturnValue(this.bindingContext));
96
+
97
+ _defineProperty(this, "getBindingInfo", jest.fn());
98
+
62
99
  _defineProperty(this, "data", jest.fn());
63
100
 
64
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;
65
143
  };
66
144
  /**
67
145
  * Mock class for OData V4 ListBinding
68
146
  */
69
147
 
70
148
 
71
- _exports.MockControl = MockControl;
149
+ _exports.MockEvent = MockEvent;
72
150
 
73
151
  var MockListBinding = /*#__PURE__*/function () {
74
- function MockListBinding(aContexts) {
75
- var _this2 = this;
152
+ function MockListBinding(aContexts, mockModel) {
153
+ var _this3 = this;
76
154
 
77
155
  _classCallCheck(this, MockListBinding);
78
156
 
@@ -83,16 +161,21 @@ sap.ui.define([], function () {
83
161
  _defineProperty(this, "sort", jest.fn());
84
162
 
85
163
  _defineProperty(this, "requestContexts", jest.fn(function () {
86
- return Promise.resolve(_this2.aMockContexts);
164
+ return Promise.resolve(_this3.aMockContexts);
87
165
  }));
88
166
 
89
167
  _defineProperty(this, "getCurrentContexts", jest.fn(function () {
90
- return _this2.aMockContexts;
168
+ return _this3.aMockContexts;
91
169
  }));
92
170
 
171
+ _defineProperty(this, "getModel", jest.fn(function () {
172
+ return _this3.mockModel;
173
+ }));
174
+
175
+ this.mockModel = mockModel;
93
176
  aContexts = aContexts || [];
94
177
  this.aMockContexts = aContexts.map(function (context) {
95
- return new MockContext(context, _this2);
178
+ return new MockContext(context, _this3);
96
179
  });
97
180
  }
98
181
 
@@ -102,6 +185,11 @@ sap.ui.define([], function () {
102
185
  key: "isA",
103
186
  value: function isA(sClassName) {
104
187
  return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
188
+ }
189
+ }, {
190
+ key: "setModel",
191
+ value: function setModel(oModel) {
192
+ this.mockModel = oModel;
105
193
  } // Mocked API
106
194
 
107
195
  }]);
@@ -112,17 +200,22 @@ sap.ui.define([], function () {
112
200
  _exports.MockListBinding = MockListBinding;
113
201
 
114
202
  var MockContextBinding = /*#__PURE__*/function () {
115
- function MockContextBinding(oContext) {
116
- var _this3 = this;
203
+ function MockContextBinding(oContext, mockModel) {
204
+ var _this4 = this;
117
205
 
118
206
  _classCallCheck(this, MockContextBinding);
119
207
 
120
208
  _defineProperty(this, "getBoundContext", jest.fn(function () {
121
- return _this3.oMockContext;
209
+ return _this4.oMockContext;
122
210
  }));
123
211
 
124
212
  _defineProperty(this, "attachEventOnce", jest.fn());
125
213
 
214
+ _defineProperty(this, "getModel", jest.fn(function () {
215
+ return _this4.mockModel;
216
+ }));
217
+
218
+ this.mockModel = mockModel;
126
219
  this.oMockContext = new MockContext(oContext || {}, this);
127
220
  }
128
221
 
@@ -137,6 +230,11 @@ sap.ui.define([], function () {
137
230
  key: "getInternalMockContext",
138
231
  value: function getInternalMockContext() {
139
232
  return this.oMockContext;
233
+ }
234
+ }, {
235
+ key: "setModel",
236
+ value: function setModel(oModel) {
237
+ this.mockModel = oModel;
140
238
  } // Mocked API
141
239
 
142
240
  }]);
@@ -151,7 +249,7 @@ sap.ui.define([], function () {
151
249
  _exports.MockContextBinding = MockContextBinding;
152
250
 
153
251
  var MockMetaModel = function MockMetaModel(oMetaData) {
154
- var _this4 = this;
252
+ var _this5 = this;
155
253
 
156
254
  _classCallCheck(this, MockMetaModel);
157
255
 
@@ -162,12 +260,16 @@ sap.ui.define([], function () {
162
260
  }));
163
261
 
164
262
  _defineProperty(this, "getObject", jest.fn(function (sPath) {
165
- return _this4.oMetaContext.getProperty(sPath);
263
+ return _this5.oMetaContext.getProperty(sPath);
166
264
  }));
167
265
 
168
266
  _defineProperty(this, "requestObject", jest.fn());
169
267
 
170
- _defineProperty(this, "createBindingContext", jest.fn());
268
+ _defineProperty(this, "createBindingContext", jest.fn(function (sPath) {
269
+ return new MockContext({
270
+ $path: sPath
271
+ });
272
+ }));
171
273
 
172
274
  _defineProperty(this, "getMetaPath", jest.fn());
173
275
 
@@ -184,20 +286,20 @@ sap.ui.define([], function () {
184
286
 
185
287
  var MockModel = /*#__PURE__*/function () {
186
288
  function MockModel(mockListBinding, mockContextBinding) {
187
- var _this5 = this;
289
+ var _this6 = this;
188
290
 
189
291
  _classCallCheck(this, MockModel);
190
292
 
191
293
  _defineProperty(this, "bindList", jest.fn(function () {
192
- return _this5.mockListBinding;
294
+ return _this6.mockListBinding;
193
295
  }));
194
296
 
195
297
  _defineProperty(this, "bindContext", jest.fn(function () {
196
- return _this5.mockContextBinding;
298
+ return _this6.mockContextBinding;
197
299
  }));
198
300
 
199
301
  _defineProperty(this, "getMetaModel", jest.fn(function () {
200
- return _this5.oMetaModel;
302
+ return _this6.oMetaModel;
201
303
  }));
202
304
 
203
305
  _defineProperty(this, "getProperty", jest.fn());
@@ -206,6 +308,14 @@ sap.ui.define([], function () {
206
308
 
207
309
  this.mockListBinding = mockListBinding;
208
310
  this.mockContextBinding = mockContextBinding;
311
+
312
+ if (mockListBinding) {
313
+ mockListBinding.setModel(this);
314
+ }
315
+
316
+ if (mockContextBinding) {
317
+ mockContextBinding.setModel(this);
318
+ }
209
319
  } // Factories
210
320
 
211
321
 
@@ -234,6 +344,62 @@ sap.ui.define([], function () {
234
344
  }();
235
345
 
236
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;
237
403
  return _exports;
238
404
  }, false);
239
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJ2YWx1ZSIsIk1vY2tDb250cm9sIiwiTW9ja0xpc3RCaW5kaW5nIiwiYUNvbnRleHRzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJhTW9ja0NvbnRleHRzIiwibWFwIiwiY29udGV4dCIsInNDbGFzc05hbWUiLCJNb2NrQ29udGV4dEJpbmRpbmciLCJvQ29udGV4dCIsIm9Nb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJzUGF0aCIsIiRwYXRoIiwib01ldGFDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJNb2NrTW9kZWwiLCJtb2NrTGlzdEJpbmRpbmciLCJtb2NrQ29udGV4dEJpbmRpbmciLCJvTWV0YU1vZGVsIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQUZBO0FBQ0E7QUFDQTtNQUlhQSxXLEdBQ1oscUJBQTJCQyxPQUEzQixFQUFpREMsUUFBakQsRUFBaUU7QUFBQTs7QUFBQTs7QUFBQSx5Q0FFNUNDLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNDLEdBQUQsRUFBaUI7QUFDN0MsYUFBTyxLQUFJLENBQUNKLE9BQUwsQ0FBYUksR0FBYixDQUFQO0FBQ0EsS0FGb0IsQ0FGNEM7O0FBQUEseUNBSzVDRixJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWNDLEtBQWQsRUFBNkI7QUFDekQsTUFBQSxLQUFJLENBQUNMLE9BQUwsQ0FBYUksR0FBYixJQUFvQkMsS0FBcEI7QUFDQSxhQUFPLEtBQUksQ0FBQ0wsT0FBTCxDQUFhSSxHQUFiLENBQVA7QUFDQSxLQUhvQixDQUw0Qzs7QUFBQSx1Q0FVOUNGLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNDLEdBQUQsRUFBaUI7QUFDM0MsYUFBTyxLQUFJLENBQUNKLE9BQUwsQ0FB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dCI6WyIvKipcbiAqIE1vY2sgY2xhc3MgZm9yIGEgVjQgQ29udGV4dFxuICovXG5cbmltcG9ydCB7IENvbnRleHQsIE9EYXRhTGlzdEJpbmRpbmcsIE9EYXRhQ29udGV4dEJpbmRpbmcsIE9EYXRhTWV0YU1vZGVsLCBPRGF0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRleHQ+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlczogYW55LCBwcml2YXRlIG9CaW5kaW5nPzogYW55KSB7fVxuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1trZXldO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKGtleTogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1trZXldO1xuXHR9KTtcblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW1wiJHBhdGhcIl07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub0JpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbCB7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBkYXRhID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tMaXN0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFMaXN0QmluZGluZz4ge1xuXHRwcml2YXRlIGFNb2NrQ29udGV4dHM6IE1vY2tDb250ZXh0W107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFDb250ZXh0cz86IGFueVtdKSB7XG5cdFx0YUNvbnRleHRzID0gYUNvbnRleHRzIHx8IFtdO1xuXG5cdFx0dGhpcy5hTW9ja0NvbnRleHRzID0gYUNvbnRleHRzLm1hcChjb250ZXh0ID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdHB1YmxpYyBzZXRBZ2dyZWdhdGlvbiA9IGplc3QuZm4oKTtcblx0cHVibGljIGZpbHRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIHNvcnQgPSBqZXN0LmZuKCk7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgcmVxdWVzdENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXSk7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRDdXJyZW50Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55KSBhcyBDb250ZXh0W107XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHRCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdHByaXZhdGUgb01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob0NvbnRleHQ/OiBhbnkpIHtcblx0XHR0aGlzLm9Nb2NrQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgdGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH1cblx0cHVibGljIGdldEludGVybmFsTW9ja0NvbnRleHQoKTogTW9ja0NvbnRleHQge1xuXHRcdHJldHVybiB0aGlzLm9Nb2NrQ29udGV4dDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIGdldEJvdW5kQ29udGV4dCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5vTW9ja0NvbnRleHQgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZSA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBNZXRhTW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tNZXRhTW9kZWwgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhTWV0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFDb250ZXh0OiBNb2NrQ29udGV4dDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob01ldGFEYXRhPzogYW55KSB7XG5cdFx0dGhpcy5vTWV0YUNvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0TWV0YUNvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIChuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoc1BhdGgpO1xuXHR9KTtcblx0cHVibGljIHJlcXVlc3RPYmplY3QgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBjcmVhdGVCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1ldGFQYXRoID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHt9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZENvbnRleHQgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9NZXRhTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG5cblx0cHVibGljIGdldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc2V0UHJvcGVydHkgPSBqZXN0LmZuKCk7XG59XG4iXX0=
405
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJ2YWx1ZSIsImdldE1vZGVsIiwic0NsYXNzTmFtZSIsIk1vY2tVSTVFbGVtZW50IiwibW9ja1JldHVyblZhbHVlIiwiYmluZGluZ0NvbnRleHQiLCJNb2NrQ29udHJvbCIsIk1vY2tFdmVudCIsInBhcmFtcyIsInNvdXJjZSIsIm5hbWUiLCJNb2NrTGlzdEJpbmRpbmciLCJhQ29udGV4dHMiLCJtb2NrTW9kZWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsImFNb2NrQ29udGV4dHMiLCJtYXAiLCJjb250ZXh0Iiwib01vZGVsIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJNb2NrTWV0YU1vZGVsIiwib01ldGFEYXRhIiwic1BhdGgiLCIkcGF0aCIsIm9NZXRhQ29udGV4dCIsImdldFByb3BlcnR5IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwib01ldGFNb2RlbCIsInNldE1vZGVsIiwidW5kZWZpbmVkIiwiTW9ja1ZpZXciLCJNb2NrQ29udHJvbGxlciIsIm5hdmlnYXRlVG9UYXJnZXQiLCJzeW5jVGFzayIsImhhbmRsZUZpZWxkQ2hhbmdlIiwibW9ja01WQyIsImV4aXN0aW5nIiwibW9kZWwiLCJ2aWV3IiwiY29udHJvbGxlciIsImdldENvbnRyb2xsZXIiLCJnZXRWaWV3Il0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRkE7QUFDQTtBQUNBO01BTWFBLFc7QUFDWix5QkFBMkJDLE9BQTNCLEVBQWlEQyxRQUFqRCxFQUFpRTtBQUFBOztBQUFBOztBQUFBLDJDQU01Q0MsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUM3QyxlQUFPLEtBQUks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LEVBQUw7QUFERCxLOzt1Q0FJQztBQUNsQndDLE1BQUFBLFFBQVEsRUFBRXpDLElBQUksQ0FBQ0MsRUFBTDtBQURRLEs7OzBDQUlHO0FBQ3JCeUMsTUFBQUEsaUJBQWlCLEVBQUUxQyxJQUFJLENBQUNDLEVBQUw7QUFERSxLOztpQ0FJaEJELElBQUksQ0FBQ0MsRUFBTCxHQUFVTSxlQUFWLENBQTBCLEtBQTFCLEM7Ozs7O0FBU1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sV0FBU29DLE9BQVQsQ0FBaUJDLFFBQWpCLEVBQXVEO0FBQzdELFFBQU1DLEtBQUssR0FBRyxDQUFBRCxRQUFRLFNBQVIsSUFBQUEsUUFBUSxXQUFSLFlBQUFBLFFBQVEsQ0FBRUMsS0FBVixLQUFtQixJQUFJYixTQUFKLEVBQWpDO0FBQ0EsUUFBTWMsSUFBSSxHQUFHLENBQUFGLFFBQVEsU0FBUixJQUFBQSxRQUFRLFdBQVIsWUFBQUEsUUFBUSxDQUFFRSxJQUFWLEtBQWtCLElBQUlSLFFBQUosRUFBL0I7QUFDQSxRQUFNUyxVQUFVLEdBQUcsQ0FBQUgsUUFBUSxTQUFSLElBQUFBLFFBQVEsV0FBUixZQUFBQSxRQUFRLENBQUVHLFVBQVYsS0FBd0IsSUFBSVIsY0FBSixFQUEzQztBQUVBTyxJQUFBQSxJQUFJLENBQUNFLGFBQUwsQ0FBbUJ6QyxlQUFuQixDQUFtQ3dDLFVBQW5DO0FBQ0FELElBQUFBLElBQUksQ0FBQzFDLFFBQUwsQ0FBY0csZUFBZCxDQUE4QnNDLEtBQTlCO0FBQ0FFLElBQUFBLFVBQVUsQ0FBQ0UsT0FBWCxDQUFtQjFDLGVBQW5CLENBQW1DdUMsSUFBbkM7QUFFQSxXQUFPO0FBQUVELE1BQUFBLEtBQUssRUFBTEEsS0FBRjtBQUFTQyxNQUFBQSxJQUFJLEVBQUpBLElBQVQ7QUFBZUMsTUFBQUEsVUFBVSxFQUFWQTtBQUFmLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tIFwic2FwL3VpL2Jhc2VcIjtcbmltcG9ydCB7IENvbnRyb2wsIFVJNUVsZW1lbnQgfSBmcm9tIFwic2FwL3VpL2NvcmVcIjtcbmltcG9ydCB7IENvbnRyb2xsZXIsIFZpZXcgfSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjXCI7XG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YUxpc3RCaW5kaW5nLCBPRGF0YUNvbnRleHRCaW5kaW5nLCBPRGF0YU1ldGFNb2RlbCwgT0RhdGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9WYWx1ZXM6IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBzZXRQcm9wZXJ0eSA9IGplc3QuZm4oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0dGhpcy5vVmFsdWVzW2tleV0gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW2tleV07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRQYXRoID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1tcIiRwYXRoXCJdO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nO1xuXHR9KTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9CaW5kaW5nPy5nZXRNb2RlbCgpIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cdHB1YmxpYyBpc1RyYW5zaWVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tVSTVFbGVtZW50IGltcGxlbWVudHMgUGFydGlhbDxVSTVFbGVtZW50PiB7XG5cdFtrZXk6IHN0cmluZ106IGFueTtcblx0cHVibGljIGJpbmRpbmdDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KHt9KTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodGhpcy5iaW5kaW5nQ29udGV4dCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGRhdGEgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldFBhcmVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIGV4dGVuZHMgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRyb2w+IHt9XG5cbmV4cG9ydCBjbGFzcyBNb2NrRXZlbnQgaW1wbGVtZW50cyBQYXJ0aWFsPEV2ZW50PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sIHB1YmxpYyBzb3VyY2U6IE1vY2tVSTVFbGVtZW50ID0gbmV3IE1vY2tVSTVFbGVtZW50KCkpIHt9XG5cblx0cHVibGljIGdldFBhcmFtZXRlciA9IGplc3QuZm4obmFtZSA9PiB0aGlzLnBhcmFtc1tuYW1lXSk7XG5cblx0cHVibGljIGdldFNvdXJjZSA9IGplc3QuZm4oKCkgPT4gdGhpcy5zb3VyY2UgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBMaXN0QmluZGluZ1xuICovXG5leHBvcnQgY2xhc3MgTW9ja0xpc3RCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUxpc3RCaW5kaW5nPiB7XG5cdHByaXZhdGUgYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUNvbnRleHRzPzogYW55W10sIHByaXZhdGUgbW9ja01vZGVsPzogTW9ja01vZGVsKSB7XG5cdFx0YUNvbnRleHRzID0gYUNvbnRleHRzIHx8IFtdO1xuXG5cdFx0dGhpcy5hTW9ja0NvbnRleHRzID0gYUNvbnRleHRzLm1hcChjb250ZXh0ID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSkgYXMgQ29udGV4dFtdKTtcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldEN1cnJlbnRDb250ZXh0cyA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXTtcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRwcml2YXRlIG9Nb2NrQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9Db250ZXh0PzogYW55LCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cdHB1YmxpYyBzZXRNb2RlbChvTW9kZWw6IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMubW9ja01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja01vZGVsIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTWV0YU1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2NrTWV0YU1vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1ldGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9NZXRhRGF0YT86IGFueSkge1xuXHRcdHRoaXMub01ldGFDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9NZXRhRGF0YSB8fCB7fSk7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldE1ldGFDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiAobmV3IE1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pIGFzIGFueSkgYXMgQ29udGV4dDtcblx0fSk7XG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0T2JqZWN0ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgY3JlYXRlQmluZGluZ0NvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIChuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGdldE1ldGFQYXRoID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHtcblx0XHRpZiAobW9ja0xpc3RCaW5kaW5nKSB7XG5cdFx0XHRtb2NrTGlzdEJpbmRpbmcuc2V0TW9kZWwodGhpcyk7XG5cdFx0fVxuXHRcdGlmIChtb2NrQ29udGV4dEJpbmRpbmcpIHtcblx0XHRcdG1vY2tDb250ZXh0QmluZGluZy5zZXRNb2RlbCh0aGlzKTtcblx0XHR9XG5cdH1cblxuXHQvLyBGYWN0b3JpZXNcblx0c3RhdGljIG1vZGVsRnJvbUxpc3RCaW5kaW5nKG1vY2tMaXN0QmluZGluZzogTW9ja0xpc3RCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0XHRyZXR1cm4gbmV3IE1vY2tNb2RlbChtb2NrTGlzdEJpbmRpbmcpO1xuXHR9XG5cdHN0YXRpYyBtb2RlbEZyb21Db250ZXh0QmluZGluZyhtb2NrQ29udGV4dEJpbmRpbmc6IE1vY2tDb250ZXh0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwodW5kZWZpbmVkLCBtb2NrQ29udGV4dEJpbmRpbmcpO1xuXHR9XG5cblx0cHVibGljIHNldE1ldGFNb2RlbChvTWV0YU1vZGVsOiBNb2NrTWV0YU1vZGVsKSB7XG5cdFx0dGhpcy5vTWV0YU1vZGVsID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZExpc3QgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tMaXN0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhTGlzdEJpbmRpbmc7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kQ29udGV4dCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja0NvbnRleHRCaW5kaW5nIGFzIGFueSkgYXMgT0RhdGFDb250ZXh0QmluZGluZztcblx0fSk7XG5cdHB1YmxpYyBnZXRNZXRhTW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMub01ldGFNb2RlbCBhcyBhbnkpIGFzIE9EYXRhTWV0YU1vZGVsO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBzZXRQcm9wZXJ0eSA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tWaWV3IGltcGxlbWVudHMgUGFydGlhbDxWaWV3PiB7XG5cdHB1YmxpYyBnZXRDb250cm9sbGVyID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgZ2V0Vmlld0RhdGEgPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udHJvbGxlciBpbXBsZW1lbnRzIFBhcnRpYWw8Q29udHJvbGxlcj4ge1xuXHRwdWJsaWMgZ2V0VmlldyA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgX3JvdXRpbmcgPSB7XG5cdFx0bmF2aWdhdGVUb1RhcmdldDogamVzdC5mbigpXG5cdH07XG5cblx0cHVibGljIF9lZGl0RmxvdyA9IHtcblx0XHRzeW5jVGFzazogamVzdC5mbigpXG5cdH07XG5cblx0cHVibGljIF9zaWRlRWZmZWN0cyA9IHtcblx0XHRoYW5kbGVGaWVsZENoYW5nZTogamVzdC5mbigpXG5cdH07XG5cblx0aXNBID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTVZDTW9jayB7XG5cdG1vZGVsOiBNb2NrTW9kZWw7XG5cdHZpZXc6IE1vY2tWaWV3O1xuXHRjb250cm9sbGVyOiBNb2NrQ29udHJvbGxlcjtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBtb2NrcyB0aGF0IHJlZmVyIHRvIGVhY2ggb3RoZXIuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nIE9wdGlvbmFsIGV4aXN0aW5nIG1vY2tlZCBpbnN0YW5jZXMgdGhhdCBzaG91bGQgYmUgdXNlZFxuICogQHJldHVybnMgTW9ja2VkIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIGluc3RhbmNlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbW9ja01WQyhleGlzdGluZz86IFBhcnRpYWw8TVZDTW9jaz4pOiBNVkNNb2NrIHtcblx0Y29uc3QgbW9kZWwgPSBleGlzdGluZz8ubW9kZWwgfHwgbmV3IE1vY2tNb2RlbCgpO1xuXHRjb25zdCB2aWV3ID0gZXhpc3Rpbmc/LnZpZXcgfHwgbmV3IE1vY2tWaWV3KCk7XG5cdGNvbnN0IGNvbnRyb2xsZXIgPSBleGlzdGluZz8uY29udHJvbGxlciB8fCBuZXcgTW9ja0NvbnRyb2xsZXIoKTtcblxuXHR2aWV3LmdldENvbnRyb2xsZXIubW9ja1JldHVyblZhbHVlKGNvbnRyb2xsZXIpO1xuXHR2aWV3LmdldE1vZGVsLm1vY2tSZXR1cm5WYWx1ZShtb2RlbCk7XG5cdGNvbnRyb2xsZXIuZ2V0Vmlldy5tb2NrUmV0dXJuVmFsdWUodmlldyk7XG5cblx0cmV0dXJuIHsgbW9kZWwsIHZpZXcsIGNvbnRyb2xsZXIgfTtcbn1cbiJdfQ==
@@ -1,12 +1,18 @@
1
1
  /**
2
2
  * Mock class for a V4 Context
3
3
  */
4
-
4
+ import { Event } from "sap/ui/base";
5
+ import { Control, UI5Element } from "sap/ui/core";
6
+ import { Controller, View } from "sap/ui/core/mvc";
5
7
  import { Context, ODataListBinding, ODataContextBinding, ODataMetaModel, ODataModel } from "sap/ui/model/odata/v4";
6
8
 
7
9
  export class MockContext implements Partial<Context> {
8
10
  public constructor(private oValues: any, private oBinding?: any) {}
9
11
 
12
+ public isA(sClassName: string): boolean {
13
+ return sClassName === "sap.ui.model.odata.v4.Context";
14
+ }
15
+
10
16
  public getProperty = jest.fn((key: string) => {
11
17
  return this.oValues[key];
12
18
  });
@@ -25,14 +31,31 @@ export class MockContext implements Partial<Context> {
25
31
  public getBinding = jest.fn(() => {
26
32
  return this.oBinding;
27
33
  });
28
- public getModel = jest.fn();
34
+ public getModel = jest.fn(() => {
35
+ return (this.oBinding?.getModel() as any) as ODataModel;
36
+ });
37
+ public isTransient = jest.fn();
29
38
  }
30
39
 
31
- export class MockControl {
32
- public getBindingInfo = jest.fn();
40
+ export class MockUI5Element implements Partial<UI5Element> {
41
+ [key: string]: any;
42
+ public bindingContext = new MockContext({});
33
43
  public getBinding = jest.fn();
44
+ public getBindingContext = jest.fn().mockReturnValue(this.bindingContext);
45
+ public getBindingInfo = jest.fn();
34
46
  public data = jest.fn();
35
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);
36
59
  }
37
60
 
38
61
  /**
@@ -41,7 +64,7 @@ export class MockControl {
41
64
  export class MockListBinding implements Partial<ODataListBinding> {
42
65
  private aMockContexts: MockContext[];
43
66
 
44
- public constructor(aContexts?: any[]) {
67
+ public constructor(aContexts?: any[], private mockModel?: MockModel) {
45
68
  aContexts = aContexts || [];
46
69
 
47
70
  this.aMockContexts = aContexts.map(context => {
@@ -53,6 +76,10 @@ export class MockListBinding implements Partial<ODataListBinding> {
53
76
  return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
54
77
  }
55
78
 
79
+ public setModel(oModel: MockModel) {
80
+ this.mockModel = oModel;
81
+ }
82
+
56
83
  // Mocked API
57
84
  public setAggregation = jest.fn();
58
85
  public filter = jest.fn();
@@ -66,12 +93,15 @@ export class MockListBinding implements Partial<ODataListBinding> {
66
93
  public getCurrentContexts = jest.fn((...args) => {
67
94
  return (this.aMockContexts as any) as Context[];
68
95
  });
96
+ public getModel = jest.fn(() => {
97
+ return (this.mockModel as any) as ODataModel;
98
+ });
69
99
  }
70
100
 
71
101
  export class MockContextBinding implements Partial<ODataContextBinding> {
72
102
  private oMockContext: MockContext;
73
103
 
74
- public constructor(oContext?: any) {
104
+ public constructor(oContext?: any, private mockModel?: MockModel) {
75
105
  this.oMockContext = new MockContext(oContext || {}, this);
76
106
  }
77
107
 
@@ -81,12 +111,18 @@ export class MockContextBinding implements Partial<ODataContextBinding> {
81
111
  public getInternalMockContext(): MockContext {
82
112
  return this.oMockContext;
83
113
  }
114
+ public setModel(oModel: MockModel) {
115
+ this.mockModel = oModel;
116
+ }
84
117
 
85
118
  // Mocked API
86
119
  public getBoundContext = jest.fn(() => {
87
120
  return (this.oMockContext as any) as Context;
88
121
  });
89
122
  public attachEventOnce = jest.fn();
123
+ public getModel = jest.fn(() => {
124
+ return (this.mockModel as any) as ODataModel;
125
+ });
90
126
  }
91
127
 
92
128
  /**
@@ -108,7 +144,9 @@ export class MockMetaModel implements Partial<ODataMetaModel> {
108
144
  return this.oMetaContext.getProperty(sPath);
109
145
  });
110
146
  public requestObject = jest.fn();
111
- public createBindingContext = jest.fn();
147
+ public createBindingContext = jest.fn((sPath: string) => {
148
+ return (new MockContext({ $path: sPath }) as any) as Context;
149
+ });
112
150
  public getMetaPath = jest.fn();
113
151
  }
114
152
 
@@ -119,7 +157,14 @@ export class MockMetaModel implements Partial<ODataMetaModel> {
119
157
  export class MockModel implements Partial<ODataModel> {
120
158
  private oMetaModel?: MockMetaModel;
121
159
 
122
- public constructor(private mockListBinding?: MockListBinding, private mockContextBinding?: MockContextBinding) {}
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
+ }
123
168
 
124
169
  // Factories
125
170
  static modelFromListBinding(mockListBinding: MockListBinding): MockModel {
@@ -149,3 +194,53 @@ export class MockModel implements Partial<ODataModel> {
149
194
  public getProperty = jest.fn();
150
195
  public setProperty = jest.fn();
151
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
+ }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(
6
6
  [
@@ -287,18 +287,6 @@ sap.ui.define(
287
287
  return vTarget;
288
288
  };
289
289
 
290
- Utils.getParametersArray = function(iStartIndex, aArguments) {
291
- var aArguments = Array.prototype.slice.call(arguments, 1);
292
- if (aArguments.length === 1 && Utils.isArguments(aArguments[0])) {
293
- aArguments = Array.prototype.slice.call(aArguments[0], 0);
294
- }
295
- var aParameters = aArguments[iStartIndex];
296
- if (aArguments.length > iStartIndex || (aParameters && !Array.isArray(aParameters))) {
297
- aParameters = Array.prototype.slice.call(aArguments, iStartIndex);
298
- }
299
- return aParameters;
300
- };
301
-
302
290
  return Utils;
303
291
  }
304
292
  );
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder"], function(Utils, OpaBuilder, FEBuilder) {
6
6
  "use strict";