@sapui5/sap.fe.test 1.98.0 → 1.99.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 (77) hide show
  1. package/package.json +5 -2
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/BaseActions.js +3 -2
  4. package/src/sap/fe/test/BaseArrangements.js +3 -2
  5. package/src/sap/fe/test/BaseAssertions.js +3 -2
  6. package/src/sap/fe/test/ConfirmDialog.js +3 -2
  7. package/src/sap/fe/test/FCLView.js +3 -2
  8. package/src/sap/fe/test/FeMocks.js +66 -0
  9. package/src/sap/fe/test/FeMocks.ts +77 -0
  10. package/src/sap/fe/test/Flexibility.js +3 -2
  11. package/src/sap/fe/test/FlexibleColumnLayout.js +3 -2
  12. package/src/sap/fe/test/JestTemplatingHelper.js +78 -22
  13. package/src/sap/fe/test/JestTemplatingHelper.ts +66 -22
  14. package/src/sap/fe/test/JourneyRunner.js +3 -2
  15. package/src/sap/fe/test/ListReport.js +3 -2
  16. package/src/sap/fe/test/LocationUtil.js +3 -2
  17. package/src/sap/fe/test/ObjectPage.js +9 -6
  18. package/src/sap/fe/test/Shell.js +3 -2
  19. package/src/sap/fe/test/Stubs.js +3 -2
  20. package/src/sap/fe/test/TemplatePage.js +3 -2
  21. package/src/sap/fe/test/TemplatingTestUtils.js +3 -2
  22. package/src/sap/fe/test/UI5MockHelper.js +44 -21
  23. package/src/sap/fe/test/UI5MockHelper.ts +28 -8
  24. package/src/sap/fe/test/Utils.js +3 -2
  25. package/src/sap/fe/test/api/APIHelper.js +3 -2
  26. package/src/sap/fe/test/api/BaseAPI.js +4 -2
  27. package/src/sap/fe/test/api/ChartActions.js +3 -2
  28. package/src/sap/fe/test/api/ChartAssertions.js +3 -2
  29. package/src/sap/fe/test/api/DialogAPI.js +17 -4
  30. package/src/sap/fe/test/api/DialogActions.js +3 -2
  31. package/src/sap/fe/test/api/DialogAssertions.js +3 -2
  32. package/src/sap/fe/test/api/DialogCreateActions.js +4 -3
  33. package/src/sap/fe/test/api/DialogCreateAssertions.js +4 -3
  34. package/src/sap/fe/test/api/DialogMessageActions.js +19 -3
  35. package/src/sap/fe/test/api/DialogMessageAssertions.js +4 -3
  36. package/src/sap/fe/test/api/DialogType.js +3 -2
  37. package/src/sap/fe/test/api/DialogValueHelpActions.js +4 -3
  38. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +4 -3
  39. package/src/sap/fe/test/api/EditState.js +3 -2
  40. package/src/sap/fe/test/api/FilterBarAPI.js +3 -2
  41. package/src/sap/fe/test/api/FilterBarActions.js +3 -2
  42. package/src/sap/fe/test/api/FilterBarAssertions.js +3 -2
  43. package/src/sap/fe/test/api/FooterAPI.js +3 -2
  44. package/src/sap/fe/test/api/FooterActionsBase.js +3 -2
  45. package/src/sap/fe/test/api/FooterActionsOP.js +3 -2
  46. package/src/sap/fe/test/api/FooterAssertionsBase.js +3 -2
  47. package/src/sap/fe/test/api/FooterAssertionsOP.js +3 -2
  48. package/src/sap/fe/test/api/FormAPI.js +3 -2
  49. package/src/sap/fe/test/api/FormActions.js +3 -2
  50. package/src/sap/fe/test/api/FormAssertions.js +3 -2
  51. package/src/sap/fe/test/api/HeaderAPI.js +3 -2
  52. package/src/sap/fe/test/api/HeaderActions.js +3 -2
  53. package/src/sap/fe/test/api/HeaderActionsLR.js +3 -2
  54. package/src/sap/fe/test/api/HeaderAssertions.js +3 -2
  55. package/src/sap/fe/test/api/HeaderAssertionsLR.js +3 -2
  56. package/src/sap/fe/test/api/HeaderLR.js +3 -2
  57. package/src/sap/fe/test/api/KPICardAPI.js +3 -2
  58. package/src/sap/fe/test/api/KPICardActions.js +3 -2
  59. package/src/sap/fe/test/api/KPICardAssertions.js +3 -2
  60. package/src/sap/fe/test/api/TableAPI.js +3 -2
  61. package/src/sap/fe/test/api/TableActions.js +3 -21
  62. package/src/sap/fe/test/api/TableAssertions.js +6 -6
  63. package/src/sap/fe/test/builder/DialogBuilder.js +3 -2
  64. package/src/sap/fe/test/builder/FEBuilder.js +3 -2
  65. package/src/sap/fe/test/builder/KPIBuilder.js +3 -2
  66. package/src/sap/fe/test/builder/MacroFieldBuilder.js +3 -2
  67. package/src/sap/fe/test/builder/MdcFieldBuilder.js +3 -2
  68. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +3 -2
  69. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +3 -2
  70. package/src/sap/fe/test/builder/MdcTableBuilder.js +7 -2
  71. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +3 -2
  72. package/src/sap/fe/test/builder/VMBuilder.js +3 -2
  73. package/src/sap/fe/test/internal/FEArrangements.js +3 -2
  74. package/src/sap/fe/test/internal/FEJourneyRunner.js +9 -5
  75. package/src/sap/fe/test/library.js +4 -3
  76. package/src/sap/fe/test/massEdit.js +3 -2
  77. package/ui5.yaml +0 -3
@@ -1,29 +1,27 @@
1
1
  import { PhantomUtil } from "sap/fe/macros";
2
- import { _MetadataRequestor } from "sap/ui/model/odata/v4/lib";
3
- import { ODataMetaModel } from "sap/ui/model/odata/v4";
4
- import { XMLPreprocessor } from "sap/ui/core/util";
5
- import { Log } from "sap/base";
2
+ import _MetadataRequestor from "sap/ui/model/odata/v4/lib/_MetadataRequestor";
3
+ import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
4
+ import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
5
+ import Log from "sap/base/Log";
6
6
  import xpath from "xpath";
7
7
  import * as fs from "fs";
8
8
  import { compileSources, to } from "@sap/cds-compiler";
9
9
  import { format } from "prettier";
10
- import { BindingParser } from "sap/ui/base";
10
+ import BindingParser from "sap/ui/base/BindingParser";
11
11
  import { AnyAnnotation, ConverterOutput, EntitySet, Property } from "@sap-ux/annotation-converter";
12
12
  import { DataModelObjectPath } from "sap/fe/core/templating/DataModelPathHelper";
13
- import { JSONModel } from "sap/ui/model/json";
14
- import { InvisibleText } from "sap/ui/core";
13
+ import JSONModel from "sap/ui/model/json/JSONModel";
14
+ import InvisibleText from "sap/ui/core/InvisibleText";
15
15
  import { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
16
16
  import { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
17
17
  import { IDiagnostics } from "sap/fe/core/converters/TemplateConverter";
18
- import { merge } from "sap/base/util";
18
+ import merge from "sap/base/util/merge";
19
19
  import * as path from "path";
20
20
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
21
21
  import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
22
+ import TemplateModel from "sap/fe/core/TemplateModel";
22
23
  // eslint-disable-next-line @typescript-eslint/no-var-requires
23
24
  const formatXml = require("xml-formatter");
24
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
- // @ts-ignore
26
- import * as TemplateModel from "sap/fe/core/TemplateModel";
27
25
 
28
26
  Log.setLevel(1 as any, "sap.ui.core.util.XMLPreprocessor");
29
27
  jest.setTimeout(40000);
@@ -38,8 +36,10 @@ const nameSpaceMap = {
38
36
  "core": "sap.ui.core",
39
37
  "m": "sap.m",
40
38
  "f": "sap.ui.layout.form",
39
+ "internalMacro": "sap.fe.macros.internal",
41
40
  "mdc": "sap.ui.mdc",
42
41
  "mdcField": "sap.ui.mdc.field",
42
+ "mdcTable": "sap.ui.mdc.table",
43
43
  "u": "sap.ui.unified",
44
44
  "macroMicroChart": "sap.fe.macros.microchart",
45
45
  "microChart": "sap.suite.ui.microchart"
@@ -105,8 +105,7 @@ export const serializeXML = function(xmlDom: Node) {
105
105
  */
106
106
  export const compileCDS = function(sCDSUrl: string) {
107
107
  const cdsString = fs.readFileSync(sCDSUrl, "utf-8");
108
- const csn = compileSources({ "string.cds": cdsString }, {});
109
- const edmxContent = to.edmx(csn, { service: "sap.fe.test.JestService" });
108
+ const edmxContent = cds2edmx(cdsString, "sap.fe.test.JestService");
110
109
  const dir = path.resolve(sCDSUrl, "..", "gen");
111
110
  const edmxUrl = path.resolve(dir, path.basename(sCDSUrl).replace(".cds", ".xml"));
112
111
 
@@ -118,6 +117,22 @@ export const compileCDS = function(sCDSUrl: string) {
118
117
  return edmxUrl;
119
118
  };
120
119
 
120
+ /**
121
+ * Compile CDS to EDMX.
122
+ *
123
+ * @param cds The CDS model. It must define at least one service.
124
+ * @param service The fully-qualified name of the service to compile. Defaults to "sap.fe.test.JestService".
125
+ * @returns The compiled service model as EDMX.
126
+ */
127
+ export function cds2edmx(cds: string, service: string = "sap.fe.test.JestService") {
128
+ const csn = compileSources({ "string.cds": cds }, {});
129
+ const edmx = to.edmx(csn, { service: service, odataForeignKeys: true, odataFormat: "structured", odataContainment: false });
130
+ if (!edmx) {
131
+ throw new Error(`Compilation failed. Hint: Make sure that the CDS model defines service ${service}.`);
132
+ }
133
+ return edmx;
134
+ }
135
+
121
136
  export const getFakeSideEffectsService = async function(oMetaModel: ODataMetaModel): Promise<any> {
122
137
  const oServiceContext = { scopeObject: {}, scopeType: "", settings: {} };
123
138
  return new SideEffectsFactory().createInstance(oServiceContext).then(function(oServiceInstance: any) {
@@ -200,15 +215,41 @@ export const evaluateBinding = function(bindingString: string, ...args: any[]) {
200
215
  return bindingElement.formatter.apply(undefined, args);
201
216
  };
202
217
 
203
- export const evaluateBindingWithModel = function(bindingString: string | undefined, modelContent: any) {
218
+ type ModelContent = {
219
+ [name: string]: any;
220
+ };
221
+
222
+ /**
223
+ * Evaluate a binding against a model.
224
+ *
225
+ * @param bindingString The binding string.
226
+ * @param modelContent Content of the default model to use for evaluation.
227
+ * @param namedModelsContent Contents of additional, named models to use.
228
+ * @returns The evaluated binding.
229
+ */
230
+ export function evaluateBindingWithModel(
231
+ bindingString: string | undefined,
232
+ modelContent: ModelContent,
233
+ namedModelsContent?: { [modelName: string]: ModelContent }
234
+ ): string {
204
235
  const bindingElement = BindingParser.complexParser(bindingString);
205
- const jsonModel = new JSONModel(modelContent);
206
236
  const text = new InvisibleText();
207
237
  text.bindProperty("text", bindingElement);
208
- text.setModel(jsonModel);
209
- text.setBindingContext(jsonModel.createBindingContext("/"));
238
+
239
+ const defaultModel = new JSONModel(modelContent);
240
+ text.setModel(defaultModel);
241
+ text.setBindingContext(defaultModel.createBindingContext("/"));
242
+
243
+ if (namedModelsContent) {
244
+ for (const [name, content] of Object.entries(namedModelsContent)) {
245
+ const model = new JSONModel(content);
246
+ text.setModel(model, name);
247
+ text.setBindingContext(model.createBindingContext("/"), name);
248
+ }
249
+ }
250
+
210
251
  return text.getText();
211
- };
252
+ }
212
253
 
213
254
  export const getTemplatingResult = async function(
214
255
  xmlInput: string,
@@ -275,7 +316,7 @@ export const getTemplatedXML = async function(
275
316
  *
276
317
  * @param {string} name Fully qualified name of the fragment to be tested.
277
318
  * @param {object} testData Test data consisting
278
- * @returns Tempalted fragment as string
319
+ * @returns Templated fragment as string
279
320
  */
280
321
  export async function processFragment(name: string, testData: { [model: string]: object }): Promise<string> {
281
322
  const inputXml = `<root><core:Fragment fragmentName="${name}" type="XML" xmlns:core="sap.ui.core" /></root>`;
@@ -284,11 +325,11 @@ export async function processFragment(name: string, testData: { [model: string]:
284
325
 
285
326
  // build model and bindings for given test data
286
327
  const settings = {
287
- models: {} as { [name: string]: JSONModel<object> },
328
+ models: {} as { [name: string]: JSONModel },
288
329
  bindingContexts: {} as { [name: string]: object }
289
330
  };
290
331
  for (const model in testData) {
291
- const jsonModel = new JSONModel<object>();
332
+ const jsonModel = new JSONModel();
292
333
  jsonModel.setData(testData[model]);
293
334
  settings.models[model] = jsonModel;
294
335
  settings.bindingContexts[model] = settings.models[model].createBindingContext("/");
@@ -305,7 +346,10 @@ export async function processFragment(name: string, testData: { [model: string]:
305
346
  }
306
347
  }
307
348
 
308
- return formatXml(resultDoc.innerHTML, {
349
+ // Keep the fragment result as child of root node when fragment generates multiple root controls
350
+ const xmlResult = resultDoc.children.length > 1 ? resultDoc.outerHTML : resultDoc.innerHTML;
351
+
352
+ return formatXml(xmlResult, {
309
353
  filter: (node: any) => node.type !== "Comment"
310
354
  });
311
355
  }
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  /* global QUnit */
6
7
  sap.ui.define(
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  [
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"], function(OpaBuilder, Opa5, Utils) {
6
7
  "use strict";
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  [
@@ -39,8 +40,10 @@ sap.ui.define(
39
40
  ) {
40
41
  "use strict";
41
42
 
42
- function getTableId(sNavProperty) {
43
- return "fe::table::" + sNavProperty.split("/").join("::") + "::LineItem";
43
+ function getTableId(sNavProperty, sQualifier) {
44
+ return sQualifier
45
+ ? "fe::table::" + sNavProperty.split("/").join("::") + "::LineItem::" + sQualifier
46
+ : "fe::table::" + sNavProperty.split("/").join("::") + "::LineItem";
44
47
  }
45
48
 
46
49
  function getChartId(sEntityType) {
@@ -182,7 +185,7 @@ sap.ui.define(
182
185
  */
183
186
  onTable: function(vTableIdentifier) {
184
187
  if (!Utils.isOfType(vTableIdentifier, String)) {
185
- vTableIdentifier = { id: getTableId(vTableIdentifier.property) };
188
+ vTableIdentifier = { id: getTableId(vTableIdentifier.property, vTableIdentifier.qualifier) };
186
189
  }
187
190
  return this._onTable(vTableIdentifier);
188
191
  },
@@ -465,7 +468,7 @@ sap.ui.define(
465
468
  */
466
469
  onTable: function(vTableIdentifier) {
467
470
  if (!Utils.isOfType(vTableIdentifier, String)) {
468
- vTableIdentifier = { id: getTableId(vTableIdentifier.property) };
471
+ vTableIdentifier = { id: getTableId(vTableIdentifier.property, vTableIdentifier.qualifier) };
469
472
  }
470
473
  return this._onTable(vTableIdentifier);
471
474
  },
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"], function(OpaBuilder, Opa5, Utils) {
6
7
  "use strict";
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  /**
6
7
  * Actions and assertions to be used with a page hosted in an FCL
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  [
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  [
@@ -47,8 +47,19 @@ sap.ui.define([], function () {
47
47
  return _this.oValues[key];
48
48
  }));
49
49
 
50
- _defineProperty(this, "getObject", jest.fn(function (key) {
51
- return _this.oValues[key];
50
+ _defineProperty(this, "getObject", jest.fn(function (path) {
51
+ var that = _this;
52
+ var result = path ? that.oValues[path] : that.oValues;
53
+
54
+ if (!result && path && path.indexOf("/") > -1) {
55
+ var parts = path.split("/");
56
+ result = parts.reduce(function (sum, part) {
57
+ sum = part ? sum[part] : sum;
58
+ return sum;
59
+ }, that.oValues);
60
+ }
61
+
62
+ return result;
52
63
  }));
53
64
 
54
65
  _defineProperty(this, "getPath", jest.fn(function () {
@@ -111,9 +122,19 @@ sap.ui.define([], function () {
111
122
  var _super = _createSuper(MockControl);
112
123
 
113
124
  function MockControl() {
125
+ var _this2;
126
+
114
127
  _classCallCheck(this, MockControl);
115
128
 
116
- return _super.apply(this, arguments);
129
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
130
+ args[_key] = arguments[_key];
131
+ }
132
+
133
+ _this2 = _super.call.apply(_super, [this].concat(args));
134
+
135
+ _defineProperty(_assertThisInitialized(_this2), "getBindingContext", jest.fn());
136
+
137
+ return _this2;
117
138
  }
118
139
 
119
140
  _exports.MockControl = MockControl;
@@ -123,7 +144,7 @@ sap.ui.define([], function () {
123
144
  _exports.MockControl = MockControl;
124
145
 
125
146
  var MockEvent = function MockEvent() {
126
- var _this2 = this;
147
+ var _this3 = this;
127
148
 
128
149
  var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
129
150
  var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new MockUI5Element();
@@ -131,11 +152,11 @@ sap.ui.define([], function () {
131
152
  _classCallCheck(this, MockEvent);
132
153
 
133
154
  _defineProperty(this, "getParameter", jest.fn(function (name) {
134
- return _this2.params[name];
155
+ return _this3.params[name];
135
156
  }));
136
157
 
137
158
  _defineProperty(this, "getSource", jest.fn(function () {
138
- return _this2.source;
159
+ return _this3.source;
139
160
  }));
140
161
 
141
162
  this.params = params;
@@ -150,7 +171,7 @@ sap.ui.define([], function () {
150
171
 
151
172
  var MockListBinding = /*#__PURE__*/function () {
152
173
  function MockListBinding(aContexts, mockModel) {
153
- var _this3 = this;
174
+ var _this4 = this;
154
175
 
155
176
  _classCallCheck(this, MockListBinding);
156
177
 
@@ -161,21 +182,21 @@ sap.ui.define([], function () {
161
182
  _defineProperty(this, "sort", jest.fn());
162
183
 
163
184
  _defineProperty(this, "requestContexts", jest.fn(function () {
164
- return Promise.resolve(_this3.aMockContexts);
185
+ return Promise.resolve(_this4.aMockContexts);
165
186
  }));
166
187
 
167
188
  _defineProperty(this, "getCurrentContexts", jest.fn(function () {
168
- return _this3.aMockContexts;
189
+ return _this4.aMockContexts;
169
190
  }));
170
191
 
171
192
  _defineProperty(this, "getModel", jest.fn(function () {
172
- return _this3.mockModel;
193
+ return _this4.mockModel;
173
194
  }));
174
195
 
175
196
  this.mockModel = mockModel;
176
197
  aContexts = aContexts || [];
177
198
  this.aMockContexts = aContexts.map(function (context) {
178
- return new MockContext(context, _this3);
199
+ return new MockContext(context, _this4);
179
200
  });
180
201
  }
181
202
 
@@ -201,18 +222,18 @@ sap.ui.define([], function () {
201
222
 
202
223
  var MockContextBinding = /*#__PURE__*/function () {
203
224
  function MockContextBinding(oContext, mockModel) {
204
- var _this4 = this;
225
+ var _this5 = this;
205
226
 
206
227
  _classCallCheck(this, MockContextBinding);
207
228
 
208
229
  _defineProperty(this, "getBoundContext", jest.fn(function () {
209
- return _this4.oMockContext;
230
+ return _this5.oMockContext;
210
231
  }));
211
232
 
212
233
  _defineProperty(this, "attachEventOnce", jest.fn());
213
234
 
214
235
  _defineProperty(this, "getModel", jest.fn(function () {
215
- return _this4.mockModel;
236
+ return _this5.mockModel;
216
237
  }));
217
238
 
218
239
  this.mockModel = mockModel;
@@ -249,7 +270,7 @@ sap.ui.define([], function () {
249
270
  _exports.MockContextBinding = MockContextBinding;
250
271
 
251
272
  var MockMetaModel = function MockMetaModel(oMetaData) {
252
- var _this5 = this;
273
+ var _this6 = this;
253
274
 
254
275
  _classCallCheck(this, MockMetaModel);
255
276
 
@@ -260,7 +281,7 @@ sap.ui.define([], function () {
260
281
  }));
261
282
 
262
283
  _defineProperty(this, "getObject", jest.fn(function (sPath) {
263
- return _this5.oMetaContext.getProperty(sPath);
284
+ return _this6.oMetaContext.getProperty(sPath);
264
285
  }));
265
286
 
266
287
  _defineProperty(this, "requestObject", jest.fn());
@@ -273,6 +294,8 @@ sap.ui.define([], function () {
273
294
 
274
295
  _defineProperty(this, "getMetaPath", jest.fn());
275
296
 
297
+ _defineProperty(this, "getContext", jest.fn());
298
+
276
299
  this.oMetaContext = new MockContext(oMetaData || {});
277
300
  } // Mocked API
278
301
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -286,20 +309,20 @@ sap.ui.define([], function () {
286
309
 
287
310
  var MockModel = /*#__PURE__*/function () {
288
311
  function MockModel(mockListBinding, mockContextBinding) {
289
- var _this6 = this;
312
+ var _this7 = this;
290
313
 
291
314
  _classCallCheck(this, MockModel);
292
315
 
293
316
  _defineProperty(this, "bindList", jest.fn(function () {
294
- return _this6.mockListBinding;
317
+ return _this7.mockListBinding;
295
318
  }));
296
319
 
297
320
  _defineProperty(this, "bindContext", jest.fn(function () {
298
- return _this6.mockContextBinding;
321
+ return _this7.mockContextBinding;
299
322
  }));
300
323
 
301
324
  _defineProperty(this, "getMetaModel", jest.fn(function () {
302
- return _this6.oMetaModel;
325
+ return _this7.oMetaModel;
303
326
  }));
304
327
 
305
328
  _defineProperty(this, "getProperty", jest.fn());
@@ -402,4 +425,4 @@ sap.ui.define([], function () {
402
425
  _exports.mockMVC = mockMVC;
403
426
  return _exports;
404
427
  }, 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==
428
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJ2YWx1ZSIsInBhdGgiLCJ0aGF0IiwicmVzdWx0IiwiaW5kZXhPZiIsInBhcnRzIiwic3BsaXQiLCJyZWR1Y2UiLCJzdW0iLCJwYXJ0IiwiZ2V0TW9kZWwiLCJzQ2xhc3NOYW1lIiwiTW9ja1VJNUVsZW1lbnQiLCJtb2NrUmV0dXJuVmFsdWUiLCJiaW5kaW5nQ29udGV4dCIsIk1vY2tDb250cm9sIiwiTW9ja0V2ZW50IiwicGFyYW1zIiwic291cmNlIiwibmFtZSIsIk1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0cyIsIm1vY2tNb2RlbCIsIlByb21pc2UiLCJyZXNvbHZlIiwiYU1vY2tDb250ZXh0cyIsIm1hcCIsImNvbnRleHQiLCJvTW9kZWwiLCJNb2NrQ29udGV4dEJpbmRpbmciLCJvQ29udGV4dCIsIm9Nb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJzUGF0aCIsIiRwYXRoIiwib01ldGFDb250ZXh0IiwiZ2V0UHJvcGVydHkiLCJNb2NrTW9kZWwiLCJtb2NrTGlzdEJpbmRpbmciLCJtb2NrQ29udGV4dEJpbmRpbmciLCJvTWV0YU1vZGVsIiwic2V0TW9kZWwiLCJ1bmRlZmluZWQiLCJNb2NrVmlldyIsIk1vY2tDb250cm9sbGVyIiwibmF2aWdhdGVUb1RhcmdldCIsInN5bmNUYXNrIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJtb2NrTVZDIiwiZXhpc3RpbmciLCJtb2RlbCIsInZpZXciLCJjb250cm9sbGVyIiwiZ2V0Q29udHJvbGxlciIsImdldFZpZXciXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFGQTtBQUNBO0FBQ0E7TUFZYUEsVztBQUNaLHlCQUEyQkMsT0FBM0IsRUFBa0RDLFFBQWxELEVBQWtFO0FBQUE7O0FB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RUMsS0FBVixLQUFtQixJQUFJYixTQUFKLEVBQWpDO0FBQ0EsUUFBTWMsSUFBSSxHQUFHLENBQUFGLFFBQVEsU0FBUixJQUFBQSxRQUFRLFdBQVIsWUFBQUEsUUFBUSxDQUFFRSxJQUFWLEtBQWtCLElBQUlSLFFBQUosRUFBL0I7QUFDQSxRQUFNUyxVQUFVLEdBQUcsQ0FBQUgsUUFBUSxTQUFSLElBQUFBLFFBQVEsV0FBUixZQUFBQSxRQUFRLENBQUVHLFVBQVYsS0FBd0IsSUFBSVIsY0FBSixFQUEzQztBQUVBTyxJQUFBQSxJQUFJLENBQUNFLGFBQUwsQ0FBbUJ6QyxlQUFuQixDQUFtQ3dDLFVBQW5DO0FBQ0FELElBQUFBLElBQUksQ0FBQzFDLFFBQUwsQ0FBY0csZUFBZCxDQUE4QnNDLEtBQTlCO0FBQ0FFLElBQUFBLFVBQVUsQ0FBQ0UsT0FBWCxDQUFtQjFDLGVBQW5CLENBQW1DdUMsSUFBbkM7QUFFQSxXQUFPO0FBQUVELE1BQUFBLEtBQUssRUFBTEEsS0FBRjtBQUFTQyxNQUFBQSxJQUFJLEVBQUpBLElBQVQ7QUFBZUMsTUFBQUEsVUFBVSxFQUFWQTtBQUFmLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRleHQ+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlcz86IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBzZXRQcm9wZXJ0eSA9IGplc3QuZm4oKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG5cdFx0dGhpcy5vVmFsdWVzW2tleV0gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW2tleV07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChwYXRoOiBzdHJpbmcpID0+IHtcblx0XHRjb25zdCB0aGF0ID0gdGhpcyBhcyBhbnk7XG5cdFx0bGV0IHJlc3VsdCA9IHBhdGggPyB0aGF0Lm9WYWx1ZXNbcGF0aF0gOiB0aGF0Lm9WYWx1ZXM7XG5cblx0XHRpZiAoIXJlc3VsdCAmJiBwYXRoICYmIHBhdGguaW5kZXhPZihcIi9cIikgPiAtMSkge1xuXHRcdFx0Y29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiL1wiKTtcblx0XHRcdHJlc3VsdCA9IHBhcnRzLnJlZHVjZSgoc3VtLCBwYXJ0OiBhbnkpID0+IHtcblx0XHRcdFx0c3VtID0gcGFydCA/IHN1bVtwYXJ0XSA6IHN1bTtcblx0XHRcdFx0cmV0dXJuIHN1bTtcblx0XHRcdH0sIHRoYXQub1ZhbHVlcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSk7XG5cdHB1YmxpYyBnZXRQYXRoID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1tcIiRwYXRoXCJdO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nO1xuXHR9KTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9CaW5kaW5nPy5nZXRNb2RlbCgpIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cdHB1YmxpYyBpc1RyYW5zaWVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tVSTVFbGVtZW50IGltcGxlbWVudHMgUGFydGlhbDxVSTVFbGVtZW50PiB7XG5cdFtrZXk6IHN0cmluZ106IGFueTtcblx0cHVibGljIGJpbmRpbmdDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KHt9KTtcblx0cHVibGljIGdldEJpbmRpbmcgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUodGhpcy5iaW5kaW5nQ29udGV4dCk7XG5cdHB1YmxpYyBnZXRCaW5kaW5nSW5mbyA9IGplc3QuZm4oKTtcblx0cHVibGljIGRhdGEgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldFBhcmVudCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIGV4dGVuZHMgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRyb2w+IHtcblx0cHVibGljIGdldEJpbmRpbmdDb250ZXh0OiBqZXN0Lk1vY2s8YW55LCBhbnk+ID0gamVzdC5mbigpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0V2ZW50IGltcGxlbWVudHMgUGFydGlhbDxFdmVudD4ge1xuXHRwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9LCBwdWJsaWMgc291cmNlOiBNb2NrVUk1RWxlbWVudCA9IG5ldyBNb2NrVUk1RWxlbWVudCgpKSB7fVxuXG5cdHB1YmxpYyBnZXRQYXJhbWV0ZXIgPSBqZXN0LmZuKG5hbWUgPT4gdGhpcy5wYXJhbXNbbmFtZV0pO1xuXG5cdHB1YmxpYyBnZXRTb3VyY2UgPSBqZXN0LmZuKCgpID0+IHRoaXMuc291cmNlIGFzIGFueSk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tMaXN0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFMaXN0QmluZGluZz4ge1xuXHRwcml2YXRlIGFNb2NrQ29udGV4dHM6IE1vY2tDb250ZXh0W107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFDb250ZXh0cz86IGFueVtdLCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdGFDb250ZXh0cyA9IGFDb250ZXh0cyB8fCBbXTtcblxuXHRcdHRoaXMuYU1vY2tDb250ZXh0cyA9IGFDb250ZXh0cy5tYXAoY29udGV4dCA9PiB7XG5cdFx0XHRyZXR1cm4gbmV3IE1vY2tDb250ZXh0KGNvbnRleHQsIHRoaXMpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGlzQShzQ2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFMaXN0QmluZGluZ1wiO1xuXHR9XG5cblx0cHVibGljIHNldE1vZGVsKG9Nb2RlbDogTW9ja01vZGVsKSB7XG5cdFx0dGhpcy5tb2NrTW9kZWwgPSBvTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdHB1YmxpYyBzZXRBZ2dyZWdhdGlvbiA9IGplc3QuZm4oKTtcblx0cHVibGljIGZpbHRlciA9IGplc3QuZm4oKTtcblx0cHVibGljIHNvcnQgPSBqZXN0LmZuKCk7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgcmVxdWVzdENvbnRleHRzID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXSk7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRDdXJyZW50Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55KSBhcyBDb250ZXh0W107XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja01vZGVsIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udGV4dEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBvTW9ja0NvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvQ29udGV4dD86IGFueSwgcHJpdmF0ZSBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm9Nb2NrQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgdGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH1cblx0cHVibGljIGdldEludGVybmFsTW9ja0NvbnRleHQoKTogTW9ja0NvbnRleHQge1xuXHRcdHJldHVybiB0aGlzLm9Nb2NrQ29udGV4dDtcblx0fVxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIGdldEJvdW5kQ29udGV4dCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5vTW9ja0NvbnRleHQgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGF0dGFjaEV2ZW50T25jZSA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tNb2RlbCBhcyBhbnkpIGFzIE9EYXRhTW9kZWw7XG5cdH0pO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1ldGFNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9ja01ldGFNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNZXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvTWV0YURhdGE/OiBhbnkpIHtcblx0XHR0aGlzLm9NZXRhQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRNZXRhQ29udGV4dCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gKG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0T2JqZWN0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcblx0cHVibGljIGNyZWF0ZUJpbmRpbmdDb250ZXh0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiAobmV3IE1vY2tDb250ZXh0KHsgJHBhdGg6IHNQYXRoIH0pIGFzIGFueSkgYXMgQ29udGV4dDtcblx0fSk7XG5cdHB1YmxpYyBnZXRNZXRhUGF0aCA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldENvbnRleHQgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTW9kZWxcbiAqL1xuXG5leHBvcnQgY2xhc3MgTW9ja01vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFNb2RlbD86IE1vY2tNZXRhTW9kZWw7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBwcml2YXRlIG1vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdGlmIChtb2NrTGlzdEJpbmRpbmcpIHtcblx0XHRcdG1vY2tMaXN0QmluZGluZy5zZXRNb2RlbCh0aGlzKTtcblx0XHR9XG5cdFx0aWYgKG1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdFx0bW9ja0NvbnRleHRCaW5kaW5nLnNldE1vZGVsKHRoaXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEZhY3Rvcmllc1xuXHRzdGF0aWMgbW9kZWxGcm9tTGlzdEJpbmRpbmcobW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKG1vY2tMaXN0QmluZGluZyk7XG5cdH1cblx0c3RhdGljIG1vZGVsRnJvbUNvbnRleHRCaW5kaW5nKG1vY2tDb250ZXh0QmluZGluZzogTW9ja0NvbnRleHRCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0XHRyZXR1cm4gbmV3IE1vY2tNb2RlbCh1bmRlZmluZWQsIG1vY2tDb250ZXh0QmluZGluZyk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TWV0YU1vZGVsKG9NZXRhTW9kZWw6IE1vY2tNZXRhTW9kZWwpIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kTGlzdCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja0xpc3RCaW5kaW5nIGFzIGFueSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRDb250ZXh0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrQ29udGV4dEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nO1xuXHR9KTtcblx0cHVibGljIGdldE1ldGFNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5vTWV0YU1vZGVsIGFzIGFueSkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja1ZpZXcgaW1wbGVtZW50cyBQYXJ0aWFsPFZpZXc+IHtcblx0cHVibGljIGdldENvbnRyb2xsZXIgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRWaWV3RGF0YSA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sbGVyIGltcGxlbWVudHMgUGFydGlhbDxDb250cm9sbGVyPiB7XG5cdHB1YmxpYyBnZXRWaWV3ID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBfcm91dGluZyA9IHtcblx0XHRuYXZpZ2F0ZVRvVGFyZ2V0OiBqZXN0LmZuKClcblx0fTtcblxuXHRwdWJsaWMgX2VkaXRGbG93ID0ge1xuXHRcdHN5bmNUYXNrOiBqZXN0LmZuKClcblx0fTtcblxuXHRwdWJsaWMgX3NpZGVFZmZlY3RzID0ge1xuXHRcdGhhbmRsZUZpZWxkQ2hhbmdlOiBqZXN0LmZuKClcblx0fTtcblxuXHRpc0EgPSBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKGZhbHNlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNVkNNb2NrIHtcblx0bW9kZWw6IE1vY2tNb2RlbDtcblx0dmlldzogTW9ja1ZpZXc7XG5cdGNvbnRyb2xsZXI6IE1vY2tDb250cm9sbGVyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIG1vZGVsLCB2aWV3IGFuZCBjb250cm9sbGVyIG1vY2tzIHRoYXQgcmVmZXIgdG8gZWFjaCBvdGhlci5cbiAqXG4gKiBAcGFyYW0gZXhpc3RpbmcgT3B0aW9uYWwgZXhpc3RpbmcgbW9ja2VkIGluc3RhbmNlcyB0aGF0IHNob3VsZCBiZSB1c2VkXG4gKiBAcmV0dXJucyBNb2NrZWQgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgaW5zdGFuY2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb2NrTVZDKGV4aXN0aW5nPzogUGFydGlhbDxNVkNNb2NrPik6IE1WQ01vY2sge1xuXHRjb25zdCBtb2RlbCA9IGV4aXN0aW5nPy5tb2RlbCB8fCBuZXcgTW9ja01vZGVsKCk7XG5cdGNvbnN0IHZpZXcgPSBleGlzdGluZz8udmlldyB8fCBuZXcgTW9ja1ZpZXcoKTtcblx0Y29uc3QgY29udHJvbGxlciA9IGV4aXN0aW5nPy5jb250cm9sbGVyIHx8IG5ldyBNb2NrQ29udHJvbGxlcigpO1xuXG5cdHZpZXcuZ2V0Q29udHJvbGxlci5tb2NrUmV0dXJuVmFsdWUoY29udHJvbGxlcik7XG5cdHZpZXcuZ2V0TW9kZWwubW9ja1JldHVyblZhbHVlKG1vZGVsKTtcblx0Y29udHJvbGxlci5nZXRWaWV3Lm1vY2tSZXR1cm5WYWx1ZSh2aWV3KTtcblxuXHRyZXR1cm4geyBtb2RlbCwgdmlldywgY29udHJvbGxlciB9O1xufVxuIl19
@@ -1,13 +1,19 @@
1
1
  /**
2
2
  * Mock class for a V4 Context
3
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";
4
+ import Event from "sap/ui/base/Event";
5
+ import Control from "sap/ui/core/Control";
6
+ import UI5Element from "sap/ui/core/Element";
7
+ import Controller from "sap/ui/core/mvc/Controller";
8
+ import View from "sap/ui/core/mvc/View";
9
+ import Context from "sap/ui/model/odata/v4/Context";
10
+ import ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
11
+ import ODataContextBinding from "sap/ui/model/odata/v4/ODataContextBinding";
12
+ import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
13
+ import ODataModel from "sap/ui/model/odata/v4/ODataModel";
8
14
 
9
15
  export class MockContext implements Partial<Context> {
10
- public constructor(private oValues: any, private oBinding?: any) {}
16
+ public constructor(private oValues?: any, private oBinding?: any) {}
11
17
 
12
18
  public isA(sClassName: string): boolean {
13
19
  return sClassName === "sap.ui.model.odata.v4.Context";
@@ -21,8 +27,19 @@ export class MockContext implements Partial<Context> {
21
27
  return this.oValues[key];
22
28
  });
23
29
 
24
- public getObject = jest.fn((key: string) => {
25
- return this.oValues[key];
30
+ public getObject = jest.fn((path: string) => {
31
+ const that = this as any;
32
+ let result = path ? that.oValues[path] : that.oValues;
33
+
34
+ if (!result && path && path.indexOf("/") > -1) {
35
+ const parts = path.split("/");
36
+ result = parts.reduce((sum, part: any) => {
37
+ sum = part ? sum[part] : sum;
38
+ return sum;
39
+ }, that.oValues);
40
+ }
41
+
42
+ return result;
26
43
  });
27
44
  public getPath = jest.fn(() => {
28
45
  return this.oValues["$path"];
@@ -48,7 +65,9 @@ export class MockUI5Element implements Partial<UI5Element> {
48
65
  public getParent = jest.fn();
49
66
  }
50
67
 
51
- export class MockControl extends MockUI5Element implements Partial<Control> {}
68
+ export class MockControl extends MockUI5Element implements Partial<Control> {
69
+ public getBindingContext: jest.Mock<any, any> = jest.fn();
70
+ }
52
71
 
53
72
  export class MockEvent implements Partial<Event> {
54
73
  public constructor(public params: { [key: string]: any } = {}, public source: MockUI5Element = new MockUI5Element()) {}
@@ -148,6 +167,7 @@ export class MockMetaModel implements Partial<ODataMetaModel> {
148
167
  return (new MockContext({ $path: sPath }) as any) as Context;
149
168
  });
150
169
  public getMetaPath = jest.fn();
170
+ public getContext = jest.fn();
151
171
  }
152
172
 
153
173
  /**
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  [
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(["sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder"], function(Utils, OpaBuilder, FEBuilder) {
6
7
  "use strict";
@@ -1,6 +1,7 @@
1
1
  /*
2
- * ! SAPUI5
3
- * (c) Copyright 2009-2022 SAP SE. All rights reserved.
2
+ * ! SAP UI development toolkit for HTML5 (SAPUI5)
3
+ (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+
4
5
  */
5
6
  sap.ui.define(
6
7
  ["sap/fe/test/Utils", "sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/m/p13n/BasePanel"],
@@ -12,6 +13,7 @@ sap.ui.define(
12
13
  *
13
14
  * @typedef {object} TableIdentifier
14
15
  * @property {string} property The name of the navigation property used for the table
16
+ * @property {string} [qualifier] The name of a qualifier for the table
15
17
  *
16
18
  * @name sap.fe.test.api.TableIdentifier
17
19
  * @public