@sapui5/sap.fe.test 1.93.3 → 1.96.2

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 (33) hide show
  1. package/package.json +2 -2
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/Flexibility.js +33 -8
  4. package/src/sap/fe/test/JestTemplatingHelper.js +32 -7
  5. package/src/sap/fe/test/JestTemplatingHelper.ts +23 -6
  6. package/src/sap/fe/test/ListReport.js +20 -3
  7. package/src/sap/fe/test/ObjectPage.js +52 -0
  8. package/src/sap/fe/test/Shell.js +16 -11
  9. package/src/sap/fe/test/TemplatePage.js +48 -0
  10. package/src/sap/fe/test/UI5MockHelper.js +218 -0
  11. package/src/sap/fe/test/UI5MockHelper.ts +137 -0
  12. package/src/sap/fe/test/Utils.js +5 -1
  13. package/src/sap/fe/test/api/BaseAPI.js +10 -0
  14. package/src/sap/fe/test/api/ChartActions.js +11 -0
  15. package/src/sap/fe/test/api/ChartAssertions.js +35 -7
  16. package/src/sap/fe/test/api/DialogAPI.js +82 -37
  17. package/src/sap/fe/test/api/DialogActions.js +27 -0
  18. package/src/sap/fe/test/api/DialogAssertions.js +33 -0
  19. package/src/sap/fe/test/api/DialogCreateActions.js +3 -1
  20. package/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  21. package/src/sap/fe/test/api/FilterBarActions.js +21 -15
  22. package/src/sap/fe/test/api/FilterBarAssertions.js +38 -6
  23. package/src/sap/fe/test/api/FormActions.js +33 -9
  24. package/src/sap/fe/test/api/HeaderAssertions.js +29 -12
  25. package/src/sap/fe/test/api/KPICardAPI.js +28 -0
  26. package/src/sap/fe/test/api/KPICardAssertions.js +204 -0
  27. package/src/sap/fe/test/api/TableActions.js +49 -0
  28. package/src/sap/fe/test/api/TableAssertions.js +27 -0
  29. package/src/sap/fe/test/builder/KPIBuilder.js +60 -4
  30. package/src/sap/fe/test/builder/MacroFieldBuilder.js +2 -0
  31. package/src/sap/fe/test/builder/MdcTableBuilder.js +63 -0
  32. package/src/sap/fe/test/library.js +1 -1
  33. package/src/sap/fe/test/massEdit.js +33 -16
@@ -0,0 +1,218 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define([], function () {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+
10
+ function _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); } }
11
+
12
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
13
+
14
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
15
+
16
+ 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
+
18
+ /**
19
+ * Mock class for a V4 Context
20
+ */
21
+ var MockContext = function MockContext(oValues, oBinding) {
22
+ var _this = this;
23
+
24
+ _classCallCheck(this, MockContext);
25
+
26
+ _defineProperty(this, "getProperty", jest.fn(function (key) {
27
+ return _this.oValues[key];
28
+ }));
29
+
30
+ _defineProperty(this, "getObject", jest.fn(function (key) {
31
+ return _this.oValues[key];
32
+ }));
33
+
34
+ _defineProperty(this, "getPath", jest.fn(function () {
35
+ return _this.oValues["$path"];
36
+ }));
37
+
38
+ _defineProperty(this, "getBinding", jest.fn(function () {
39
+ return _this.oBinding;
40
+ }));
41
+
42
+ this.oValues = oValues;
43
+ this.oBinding = oBinding;
44
+ };
45
+
46
+ _exports.MockContext = MockContext;
47
+
48
+ var MockControl = function MockControl() {
49
+ _classCallCheck(this, MockControl);
50
+
51
+ _defineProperty(this, "getBindingInfo", jest.fn());
52
+
53
+ _defineProperty(this, "getBinding", jest.fn());
54
+ };
55
+ /**
56
+ * Mock class for OData V4 ListBinding
57
+ */
58
+
59
+
60
+ _exports.MockControl = MockControl;
61
+
62
+ var MockListBinding = /*#__PURE__*/function () {
63
+ function MockListBinding(aContexts) {
64
+ var _this2 = this;
65
+
66
+ _classCallCheck(this, MockListBinding);
67
+
68
+ _defineProperty(this, "setAggregation", jest.fn());
69
+
70
+ _defineProperty(this, "filter", jest.fn());
71
+
72
+ _defineProperty(this, "sort", jest.fn());
73
+
74
+ _defineProperty(this, "requestContexts", jest.fn(function () {
75
+ return Promise.resolve(_this2.aMockContexts);
76
+ }));
77
+
78
+ _defineProperty(this, "getCurrentContexts", jest.fn(function () {
79
+ return _this2.aMockContexts;
80
+ }));
81
+
82
+ aContexts = aContexts || [];
83
+ this.aMockContexts = aContexts.map(function (context) {
84
+ return new MockContext(context, _this2);
85
+ });
86
+ }
87
+
88
+ _exports.MockListBinding = MockListBinding;
89
+
90
+ _createClass(MockListBinding, [{
91
+ key: "isA",
92
+ value: function isA(sClassName) {
93
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
94
+ } // Mocked API
95
+
96
+ }]);
97
+
98
+ return MockListBinding;
99
+ }();
100
+
101
+ _exports.MockListBinding = MockListBinding;
102
+
103
+ var MockContextBinding = /*#__PURE__*/function () {
104
+ function MockContextBinding(oContext) {
105
+ var _this3 = this;
106
+
107
+ _classCallCheck(this, MockContextBinding);
108
+
109
+ _defineProperty(this, "getBoundContext", jest.fn(function () {
110
+ return _this3.oMockContext;
111
+ }));
112
+
113
+ _defineProperty(this, "attachEventOnce", jest.fn());
114
+
115
+ this.oMockContext = new MockContext(oContext || {}, this);
116
+ }
117
+
118
+ _exports.MockContextBinding = MockContextBinding;
119
+
120
+ _createClass(MockContextBinding, [{
121
+ key: "isA",
122
+ value: function isA(sClassName) {
123
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
124
+ }
125
+ }, {
126
+ key: "getInternalMockContext",
127
+ value: function getInternalMockContext() {
128
+ return this.oMockContext;
129
+ } // Mocked API
130
+
131
+ }]);
132
+
133
+ return MockContextBinding;
134
+ }();
135
+ /**
136
+ * Mock class for OData V4 MetaModel
137
+ */
138
+
139
+
140
+ _exports.MockContextBinding = MockContextBinding;
141
+
142
+ var MockMetaModel = function MockMetaModel(oMetaData) {
143
+ var _this4 = this;
144
+
145
+ _classCallCheck(this, MockMetaModel);
146
+
147
+ _defineProperty(this, "getMetaContext", jest.fn(function (sPath) {
148
+ return new MockContext({
149
+ $path: sPath
150
+ });
151
+ }));
152
+
153
+ _defineProperty(this, "getObject", jest.fn(function (sPath) {
154
+ return _this4.oMetaContext.getProperty(sPath);
155
+ }));
156
+
157
+ this.oMetaContext = new MockContext(oMetaData || {});
158
+ } // Mocked API
159
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
160
+ ;
161
+ /**
162
+ * Mock class for OData V4 Model
163
+ */
164
+
165
+
166
+ _exports.MockMetaModel = MockMetaModel;
167
+
168
+ var MockModel = /*#__PURE__*/function () {
169
+ function MockModel(mockListBinding, mockContextBinding) {
170
+ var _this5 = this;
171
+
172
+ _classCallCheck(this, MockModel);
173
+
174
+ _defineProperty(this, "bindList", jest.fn(function () {
175
+ return _this5.mockListBinding;
176
+ }));
177
+
178
+ _defineProperty(this, "bindContext", jest.fn(function () {
179
+ return _this5.mockContextBinding;
180
+ }));
181
+
182
+ _defineProperty(this, "getMetaModel", jest.fn(function () {
183
+ return _this5.oMetaModel;
184
+ }));
185
+
186
+ this.mockListBinding = mockListBinding;
187
+ this.mockContextBinding = mockContextBinding;
188
+ } // Factories
189
+
190
+
191
+ _exports.MockModel = MockModel;
192
+
193
+ _createClass(MockModel, [{
194
+ key: "setMetaModel",
195
+ value: function setMetaModel(oMetaModel) {
196
+ this.oMetaModel = oMetaModel;
197
+ } // Mocked API
198
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
199
+
200
+ }], [{
201
+ key: "modelFromListBinding",
202
+ value: function modelFromListBinding(mockListBinding) {
203
+ return new MockModel(mockListBinding);
204
+ }
205
+ }, {
206
+ key: "modelFromContextBinding",
207
+ value: function modelFromContextBinding(mockContextBinding) {
208
+ return new MockModel(undefined, mockContextBinding);
209
+ }
210
+ }]);
211
+
212
+ return MockModel;
213
+ }();
214
+
215
+ _exports.MockModel = MockModel;
216
+ return _exports;
217
+ }, false);
218
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJqZXN0IiwiZm4iLCJrZXkiLCJNb2NrQ29udHJvbCIsIk1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0cyIsIlByb21pc2UiLCJyZXNvbHZlIiwiYU1vY2tDb250ZXh0cyIsIm1hcCIsImNvbnRleHQiLCJzQ2xhc3NOYW1lIiwiTW9ja0NvbnRleHRCaW5kaW5nIiwib0NvbnRleHQiLCJvTW9ja0NvbnRleHQiLCJNb2NrTWV0YU1vZGVsIiwib01ldGFEYXRhIiwic1BhdGgiLCIkcGF0aCIsIm9NZXRhQ29udGV4dCIsImdldFByb3BlcnR5IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwib01ldGFNb2RlbCIsInVuZGVmaW5lZCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUFGQTtBQUNBO0FBQ0E7TUFJYUEsVyxHQUNaLHFCQUEyQkMsT0FBM0IsRUFBaURDLFFBQWpELEVBQWlFO0FBQUE7O0FBQUE7O0FBQUEseUNBRTVDQyxJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWlCO0FBQzdDLGFBQU8sS0FBSSxDQUFDSixPQUFMLENBQWFJLEdBQWIsQ0FBUDtBQUNBLEtBRm9CLENBRjRDOztBQUFBLHVDQUs5Q0YsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUMzQyxhQUFPLEtBQUksQ0FBQ0osT0FBTCxDQUFhSSxHQUFiLENBQVA7QUFDQSxLQUZrQixDQUw4Qzs7QUFBQSxxQ0FRaERGLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDOUIsYUFBTyxLQUFJLENBQUNILE9BQUwsQ0FBYSxPQUFiLENBQVA7QUFDQSxLQUZnQixDQVJnRDs7QUFBQSx3Q0FZN0NFLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQU07QUFDakMsYUFBTyxLQUFJLENBQUNGLFFBQVo7QUFDQSxLQUZtQixDQVo2Qzs7QUFBQSxTQUF0Q0QsT0FBc0MsR0FBdENBLE9BQXNDO0FBQUEsU0FBaEJDLFFBQWdCLEdBQWhCQSxRQUFnQjtBQUFFLEc7Ozs7TUFpQnZESSxXOzs7NENBQ1lILElBQUksQ0FBQ0MsRUFBTCxFOzt3Q0FDSkQsSUFBSSxDQUFDQyxFQUFMLEU7O0FBR3JCO0FBQ0E7QUFDQTs7Ozs7TUFDYUcsZTtBQUdaLDZCQUFtQkMsU0FBbkIsRUFBc0M7QUFBQTs7QUFBQTs7QUFBQSw4Q0FhZEwsSUFBSSxDQUFDQyxFQUFMLEVBYmM7O0FBQUEsc0NBY3RCRCxJQUFJLENBQUNDLEVBQUwsRUFkc0I7O0FBQUEsb0NBZXhCRCxJQUFJLENBQUNDLEVBQUwsRUFmd0I7O0FBQUEsK0NBa0JiRCxJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFhO0FBQzdDLGVBQU9LLE9BQU8sQ0FBQ0MsT0FBUixDQUFpQixNQUFJLENBQUNDLGFBQXRCLENBQVA7QUFDQSxPQUZ3QixDQWxCYTs7QUFBQSxrREFzQlZSLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFlBQWE7QUFDaEQsZUFBUSxNQUFJLENBQUNPLGFBQWI7QUFDQSxPQUYyQixDQXRCVTs7QUFDckNILE1BQUFBLFNBQVMsR0FBR0EsU0FBUyxJQUFJLEVBQXpCO0FBRUEsV0FBS0csYUFBTCxHQUFxQkgsU0FBUyxDQUFDSSxHQUFWLENBQWMsVUFBQUMsT0FBTyxFQUFJO0FBQzdDLGVBQU8sSUFBSWIsV0FBSixDQUFnQmEsT0FBaEIsRUFBeUIsTUFBekIsQ0FBUDtBQUNBLE9BRm9CLENBQXJCO0FBR0E7Ozs7OzthQUVELGFBQVdDLFVBQVgsRUFBd0M7QUFDdkMsZUFBT0EsVUFBVSxLQUFLLHdDQUF0QjtBQUNBLE8sQ0FFRDs7Ozs7Ozs7O01BZVlDLGtCO0FBR1osZ0NBQW1CQyxRQUFuQixFQUFtQztBQUFBOztBQUFBOztBQUFBLCtDQVlWYixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFNO0FBQ3RDLGVBQVEsTUFBSSxDQUFDYSxZQUFiO0FBQ0EsT0FGd0IsQ0FaVTs7QUFBQSwrQ0FlVmQsSUFBSSxDQUFDQyxFQUFMLEVBZlU7O0FBQ2xDLFdBQUthLFlBQUwsR0FBb0IsSUFBSWpCLFdBQUosQ0FBZ0JnQixRQUFRLElBQUksRUFBNUIsRUFBZ0MsSUFBaEMsQ0FBcEI7QUFDQTs7Ozs7O2FBRUQsYUFBV0YsVUFBWCxFQUF3QztBQUN2QyxlQUFPQSxVQUFVLEtBQUssMkNBQXRCO0FBQ0E7OzthQUNELGtDQUE2QztBQUM1QyxlQUFPLEtBQUtHLFlBQVo7QUFDQSxPLENBRUQ7Ozs7OztBQU9EO0FBQ0E7QUFDQTs7Ozs7TUFDYUMsYSxHQUdaLHVCQUFtQkMsU0FBbkIsRUFBb0M7QUFBQTs7QUFBQTs7QUFBQSw0Q0FNWmhCLElBQUksQ0FBQ0MsRUFBTCxDQUFRLFVBQUNnQixLQUFELEVBQW1CO0FBQ2xELGFBQVEsSUFBSXBCLFdBQUosQ0FBZ0I7QUFBRXFCLFFBQUFBLEtBQUssRUFBRUQ7QUFBVCxPQUFoQixDQUFSO0FBQ0EsS0FGdUIsQ0FOWTs7QUFBQSx1Q0FTakJqQixJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDZ0IsS0FBRCxFQUFtQjtBQUM3QyxhQUFPLE1BQUksQ0FBQ0UsWUFBTCxDQUFrQkMsV0FBbEIsQ0FBOEJILEtBQTlCLENBQVA7QUFDQSxLQUZrQixDQVRpQjs7QUFDbkMsU0FBS0UsWUFBTCxHQUFvQixJQUFJdEIsV0FBSixDQUFnQm1CLFNBQVMsSUFBSSxFQUE3QixDQUFwQjtBQUNBLEcsQ0FFRDtBQUNBOztBQVNEO0FBQ0E7QUFDQTs7Ozs7TUFFYUssUztBQUdaLHVCQUEyQkMsZUFBM0IsRUFBc0VDLGtCQUF0RSxFQUErRztBQUFBOztBQUFBOztBQUFBLHdDQWdCN0Z2QixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFhO0FBQ3RDLGVBQVEsTUFBSSxDQUFDcUIsZUFBYjtBQUNBLE9BRmlCLENBaEI2Rjs7QUFBQSwyQ0FvQjFGdEIsSUFBSSxDQUFDQyxFQUFMLENBQVEsWUFBYTtBQUN6QyxlQUFRLE1BQUksQ0FBQ3NCLGtCQUFiO0FBQ0EsT0FGb0IsQ0FwQjBGOztBQUFBLDRDQXVCekZ2QixJQUFJLENBQUNDLEVBQUwsQ0FBUSxZQUFNO0FBQ25DLGVBQVEsTUFBSSxDQUFDdUIsVUFBYjtBQUNBLE9BRnFCLENBdkJ5Rjs7QUFBQSxXQUFwRkYsZUFBb0YsR0FBcEZBLGVBQW9GO0FBQUEsV0FBekNDLGtCQUF5QyxHQUF6Q0Esa0JBQXlDO0FBQUUsSyxDQUVqSDs7Ozs7OzthQVFBLHNCQUFvQkMsVUFBcEIsRUFBK0M7QUFDOUMsYUFBS0EsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQSxPLENBRUQ7QUFDQTs7OzthQVpBLDhCQUE0QkYsZUFBNUIsRUFBeUU7QUFDeEUsZUFBTyxJQUFJRCxTQUFKLENBQWNDLGVBQWQsQ0FBUDtBQUNBOzs7YUFDRCxpQ0FBK0JDLGtCQUEvQixFQUFrRjtBQUNqRixlQUFPLElBQUlGLFNBQUosQ0FBY0ksU0FBZCxFQUF5QkYsa0JBQXpCLENBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuXG5pbXBvcnQgeyBDb250ZXh0LCBPRGF0YUxpc3RCaW5kaW5nLCBPRGF0YUNvbnRleHRCaW5kaW5nLCBPRGF0YU1ldGFNb2RlbCwgT0RhdGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9WYWx1ZXM6IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyBnZXRQYXRoID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub1ZhbHVlc1tcIiRwYXRoXCJdO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9CaW5kaW5nO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sIHtcblx0cHVibGljIGdldEJpbmRpbmdJbmZvID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBMaXN0QmluZGluZ1xuICovXG5leHBvcnQgY2xhc3MgTW9ja0xpc3RCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUxpc3RCaW5kaW5nPiB7XG5cdHByaXZhdGUgYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUNvbnRleHRzPzogYW55W10pIHtcblx0XHRhQ29udGV4dHMgPSBhQ29udGV4dHMgfHwgW107XG5cblx0XHR0aGlzLmFNb2NrQ29udGV4dHMgPSBhQ29udGV4dHMubWFwKGNvbnRleHQgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBNb2NrQ29udGV4dChjb250ZXh0LCB0aGlzKTtcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTGlzdEJpbmRpbmdcIjtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSkgYXMgQ29udGV4dFtdKTtcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldEN1cnJlbnRDb250ZXh0cyA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXTtcblx0fSk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrQ29udGV4dEJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhQ29udGV4dEJpbmRpbmc+IHtcblx0cHJpdmF0ZSBvTW9ja0NvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvQ29udGV4dD86IGFueSkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlID0gamVzdC5mbigpO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1ldGFNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgTW9ja01ldGFNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNZXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YUNvbnRleHQ6IE1vY2tDb250ZXh0O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvTWV0YURhdGE/OiBhbnkpIHtcblx0XHR0aGlzLm9NZXRhQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvTWV0YURhdGEgfHwge30pO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRNZXRhQ29udGV4dCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gKG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0T2JqZWN0ID0gamVzdC5mbigoc1BhdGg6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9NZXRhQ29udGV4dC5nZXRQcm9wZXJ0eShzUGF0aCk7XG5cdH0pO1xufVxuXG4vKipcbiAqIE1vY2sgY2xhc3MgZm9yIE9EYXRhIFY0IE1vZGVsXG4gKi9cblxuZXhwb3J0IGNsYXNzIE1vY2tNb2RlbCBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhTW9kZWw/OiBNb2NrTWV0YU1vZGVsO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vY2tMaXN0QmluZGluZz86IE1vY2tMaXN0QmluZGluZywgcHJpdmF0ZSBtb2NrQ29udGV4dEJpbmRpbmc/OiBNb2NrQ29udGV4dEJpbmRpbmcpIHt9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTGlzdEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUxpc3RCaW5kaW5nO1xuXHR9KTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgYmluZENvbnRleHQgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkpIGFzIE9EYXRhQ29udGV4dEJpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YU1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9NZXRhTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG59XG4iXX0=
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Mock class for a V4 Context
3
+ */
4
+
5
+ import { Context, ODataListBinding, ODataContextBinding, ODataMetaModel, ODataModel } from "sap/ui/model/odata/v4";
6
+
7
+ export class MockContext implements Partial<Context> {
8
+ public constructor(private oValues: any, private oBinding?: any) {}
9
+
10
+ public getProperty = jest.fn((key: string) => {
11
+ return this.oValues[key];
12
+ });
13
+ public getObject = jest.fn((key: string) => {
14
+ return this.oValues[key];
15
+ });
16
+ public getPath = jest.fn(() => {
17
+ return this.oValues["$path"];
18
+ });
19
+
20
+ public getBinding = jest.fn(() => {
21
+ return this.oBinding;
22
+ });
23
+ }
24
+
25
+ export class MockControl {
26
+ public getBindingInfo = jest.fn();
27
+ public getBinding = jest.fn();
28
+ }
29
+
30
+ /**
31
+ * Mock class for OData V4 ListBinding
32
+ */
33
+ export class MockListBinding implements Partial<ODataListBinding> {
34
+ private aMockContexts: MockContext[];
35
+
36
+ public constructor(aContexts?: any[]) {
37
+ aContexts = aContexts || [];
38
+
39
+ this.aMockContexts = aContexts.map(context => {
40
+ return new MockContext(context, this);
41
+ });
42
+ }
43
+
44
+ public isA(sClassName: string): boolean {
45
+ return sClassName === "sap.ui.model.odata.v4.ODataListBinding";
46
+ }
47
+
48
+ // Mocked API
49
+ public setAggregation = jest.fn();
50
+ public filter = jest.fn();
51
+ public sort = jest.fn();
52
+
53
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
+ public requestContexts = jest.fn((...args) => {
55
+ return Promise.resolve((this.aMockContexts as any) as Context[]);
56
+ });
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
58
+ public getCurrentContexts = jest.fn((...args) => {
59
+ return (this.aMockContexts as any) as Context[];
60
+ });
61
+ }
62
+
63
+ export class MockContextBinding implements Partial<ODataContextBinding> {
64
+ private oMockContext: MockContext;
65
+
66
+ public constructor(oContext?: any) {
67
+ this.oMockContext = new MockContext(oContext || {}, this);
68
+ }
69
+
70
+ public isA(sClassName: string): boolean {
71
+ return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
72
+ }
73
+ public getInternalMockContext(): MockContext {
74
+ return this.oMockContext;
75
+ }
76
+
77
+ // Mocked API
78
+ public getBoundContext = jest.fn(() => {
79
+ return (this.oMockContext as any) as Context;
80
+ });
81
+ public attachEventOnce = jest.fn();
82
+ }
83
+
84
+ /**
85
+ * Mock class for OData V4 MetaModel
86
+ */
87
+ export class MockMetaModel implements Partial<ODataMetaModel> {
88
+ private oMetaContext: MockContext;
89
+
90
+ public constructor(oMetaData?: any) {
91
+ this.oMetaContext = new MockContext(oMetaData || {});
92
+ }
93
+
94
+ // Mocked API
95
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
96
+ public getMetaContext = jest.fn((sPath: string) => {
97
+ return (new MockContext({ $path: sPath }) as any) as Context;
98
+ });
99
+ public getObject = jest.fn((sPath: string) => {
100
+ return this.oMetaContext.getProperty(sPath);
101
+ });
102
+ }
103
+
104
+ /**
105
+ * Mock class for OData V4 Model
106
+ */
107
+
108
+ export class MockModel implements Partial<ODataModel> {
109
+ private oMetaModel?: MockMetaModel;
110
+
111
+ public constructor(private mockListBinding?: MockListBinding, private mockContextBinding?: MockContextBinding) {}
112
+
113
+ // Factories
114
+ static modelFromListBinding(mockListBinding: MockListBinding): MockModel {
115
+ return new MockModel(mockListBinding);
116
+ }
117
+ static modelFromContextBinding(mockContextBinding: MockContextBinding): MockModel {
118
+ return new MockModel(undefined, mockContextBinding);
119
+ }
120
+
121
+ public setMetaModel(oMetaModel: MockMetaModel) {
122
+ this.oMetaModel = oMetaModel;
123
+ }
124
+
125
+ // Mocked API
126
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
127
+ public bindList = jest.fn((...args) => {
128
+ return (this.mockListBinding as any) as ODataListBinding;
129
+ });
130
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
131
+ public bindContext = jest.fn((...args) => {
132
+ return (this.mockContextBinding as any) as ODataContextBinding;
133
+ });
134
+ public getMetaModel = jest.fn(() => {
135
+ return (this.oMetaModel as any) as ODataMetaModel;
136
+ });
137
+ }
@@ -42,7 +42,11 @@ sap.ui.define(
42
42
  if (sSingleDeltaManifest.indexOf("/") !== 0) {
43
43
  sSingleDeltaManifest = sComponentName + "/" + sSingleDeltaManifest;
44
44
  }
45
- oTargetManifest = mergeObjects({}, oTargetManifest, LoaderExtensions.loadResource(sSingleDeltaManifest));
45
+ try {
46
+ oTargetManifest = mergeObjects({}, oTargetManifest, LoaderExtensions.loadResource(sSingleDeltaManifest));
47
+ } catch (ignore) {
48
+ // not always an error, e.g. when navigating to a different app that does not have the delta manifest
49
+ }
46
50
  });
47
51
  }
48
52
 
@@ -68,6 +68,16 @@ sap.ui.define(
68
68
  * @public
69
69
  */
70
70
 
71
+ /**
72
+ * An action parameter dialog field identifier
73
+ *
74
+ * @typedef {object} ActionDialogFieldIdentifier
75
+ * @property {string} property The name of the field
76
+ *
77
+ * @name sap.fe.test.api.ActionDialogFieldIdentifier
78
+ * @public
79
+ */
80
+
71
81
  function _findParentChainFunction(oResult, sChainKeyword) {
72
82
  var oAnd = oResult.and;
73
83
  if (sChainKeyword in oAnd) {
@@ -115,5 +115,16 @@ sap.ui.define(["./BaseAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder", "sap/
115
115
  .execute();
116
116
  };
117
117
 
118
+ Actions.prototype.iExecuteActionWithText = function(sText) {
119
+ return OpaBuilder.create(this)
120
+ .hasType("sap.m.Button")
121
+ .hasProperties({
122
+ text: sText
123
+ })
124
+ .doPress()
125
+ .description("Clicked on button" + sText)
126
+ .execute();
127
+ };
128
+
118
129
  return Actions;
119
130
  });
@@ -25,11 +25,26 @@ sap.ui.define(
25
25
  ChartAssertions.prototype.constructor = ChartAssertions;
26
26
  ChartAssertions.prototype.isAction = false;
27
27
 
28
- ChartAssertions.prototype.iCheckItems = function(iNumberOfItems) {
28
+ ChartAssertions.prototype.iCheckItems = function(iNumberOfItems, sTab) {
29
29
  return OpaBuilder.create(this)
30
- .hasType("sap.ui.mdc.Chart")
31
- .check(function(oChart) {
32
- var aContexts = oChart[0].getBinding("data").getContexts();
30
+ .hasType("sap.ui.mdc.ChartNew")
31
+ .check(function(aCharts) {
32
+ var oChart;
33
+ if (sTab && aCharts && aCharts.length > 1) {
34
+ for (var i = 0; i < aCharts.length; i++) {
35
+ if (aCharts[i].getId().indexOf("fe::Chart::" + sTab) > -1) {
36
+ oChart = aCharts[i];
37
+ break;
38
+ }
39
+ }
40
+ } else {
41
+ oChart = aCharts[0];
42
+ }
43
+ var aContexts = oChart
44
+ .getControlDelegate()
45
+ ._getChart(oChart)
46
+ .getBinding("data")
47
+ .getContexts();
33
48
  return (
34
49
  (aContexts && (iNumberOfItems === undefined ? aContexts.length !== 0 : aContexts.length === iNumberOfItems)) ||
35
50
  (!aContexts && iNumberOfItems === 0)
@@ -41,7 +56,7 @@ sap.ui.define(
41
56
 
42
57
  ChartAssertions.prototype.iSeeChartType = function(sChartType) {
43
58
  return OpaBuilder.create(this)
44
- .hasType("sap.ui.mdc.Chart")
59
+ .hasType("sap.ui.mdc.ChartNew")
45
60
  .check(function(oChart) {
46
61
  return sChartType === oChart[0].getChartType();
47
62
  }, true)
@@ -51,7 +66,7 @@ sap.ui.define(
51
66
 
52
67
  ChartAssertions.prototype.iSeeChartVisible = function() {
53
68
  return OpaBuilder.create(this)
54
- .hasType("sap.ui.mdc.Chart")
69
+ .hasType("sap.ui.mdc.ChartNew")
55
70
  .check(function(oChart) {
56
71
  return oChart[0].getVisible() === true;
57
72
  }, true)
@@ -88,13 +103,26 @@ sap.ui.define(
88
103
 
89
104
  ChartAssertions.prototype.iCheckChartNoDataText = function(sNoDataText) {
90
105
  return OpaBuilder.create(this)
91
- .hasType("sap.ui.mdc.Chart")
106
+ .hasType("sap.ui.mdc.ChartNew")
92
107
  .check(function(oChart) {
93
108
  return sNoDataText === oChart[0].getNoDataText();
94
109
  })
95
110
  .description("No Data text is " + sNoDataText)
96
111
  .execute();
97
112
  };
113
+
114
+ ChartAssertions.prototype.iCheckButtonWithText = function(sText) {
115
+ return OpaBuilder.create(this)
116
+ .hasType("sap.m.Button")
117
+ .hasProperties({ text: sText })
118
+ .description("Seeing Button with text '" + sText + "'")
119
+ .execute();
120
+ };
121
+
122
+ ChartAssertions.prototype.iCheckMessageToastWithText = function(sText) {
123
+ return FEBuilder.createMessageToastBuilder(sText).execute(this);
124
+ };
125
+
98
126
  return ChartAssertions;
99
127
  }
100
128
  );
@@ -2,46 +2,91 @@
2
2
  * ! SAPUI5
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved.
4
4
  */
5
- sap.ui.define(["./BaseAPI", "sap/fe/test/Utils", "sap/fe/test/builder/DialogBuilder"], function(BaseAPI, Utils, DialogBuilder) {
6
- "use strict";
5
+ sap.ui.define(
6
+ [
7
+ "./BaseAPI",
8
+ "sap/fe/test/Utils",
9
+ "sap/fe/test/builder/FEBuilder",
10
+ "sap/fe/test/builder/MdcFieldBuilder",
11
+ "sap/fe/test/builder/DialogBuilder"
12
+ ],
13
+ function(BaseAPI, Utils, FEBuilder, MdcFieldBuilder, DialogBuilder) {
14
+ "use strict";
7
15
 
8
- /**
9
- * Constructs a new DialogAPI instance.
10
- *
11
- * @param {sap.fe.test.builder.DialogBuilder} oDialogBuilder The {@link sap.fe.test.builder.DialogBuilder} instance used to interact with the UI
12
- * @param {string} [vDialogDescription] Description (optional) of the dialog to be used for logging messages
13
- * @param {int} [iConfirmButtonIndex] Index of the 'confirm' button in the button aggregation; the default setting is 0 (first button from the left)
14
- * @returns {sap.fe.test.api.DialogAPI} The new instance
15
- * @class
16
- * @private
17
- */
18
- var DialogAPI = function(oDialogBuilder, vDialogDescription, iConfirmButtonIndex) {
19
- if (!Utils.isOfType(oDialogBuilder, DialogBuilder)) {
20
- throw new Error("oDialogBuilder parameter must be a DialogBuilder instance");
21
- }
22
- this._iConfirmButtonIndex = iConfirmButtonIndex || 0;
23
- return BaseAPI.call(this, oDialogBuilder, vDialogDescription);
24
- };
25
- DialogAPI.prototype = Object.create(BaseAPI.prototype);
26
- DialogAPI.prototype.constructor = DialogAPI;
16
+ /**
17
+ * Constructs a new DialogAPI instance.
18
+ *
19
+ * @param {sap.fe.test.builder.DialogBuilder} oDialogBuilder The {@link sap.fe.test.builder.DialogBuilder} instance used to interact with the UI
20
+ * @param {string} [vDialogDescription] Description (optional) of the dialog to be used for logging messages
21
+ * @param {int} [iConfirmButtonIndex] Index of the 'confirm' button in the button aggregation; the default setting is 0 (first button from the left)
22
+ * @returns {sap.fe.test.api.DialogAPI} The new instance
23
+ * @class
24
+ * @private
25
+ */
26
+ var DialogAPI = function(oDialogBuilder, vDialogDescription, iConfirmButtonIndex) {
27
+ if (!Utils.isOfType(oDialogBuilder, DialogBuilder)) {
28
+ throw new Error("oDialogBuilder parameter must be a DialogBuilder instance");
29
+ }
30
+ this._iConfirmButtonIndex = iConfirmButtonIndex || 0;
31
+ return BaseAPI.call(this, oDialogBuilder, vDialogDescription);
32
+ };
33
+ DialogAPI.prototype = Object.create(BaseAPI.prototype);
34
+ DialogAPI.prototype.constructor = DialogAPI;
35
+
36
+ /**
37
+ * Creates a matcher for fields within action dialogs.
38
+ *
39
+ * @param {sap.fe.test.api.FieldIdentifier | string} vFieldIdentifier Identifier to be used for the matcher
40
+ *
41
+ * @returns {object} A matcher
42
+ *
43
+ * @private
44
+ */
45
+ DialogAPI.prototype._createFieldMatcher = function(vFieldIdentifier) {
46
+ var vMatcher, sFieldId;
47
+ if (!Utils.isOfType(vFieldIdentifier, String)) {
48
+ if (typeof vFieldIdentifier.property === "string") {
49
+ sFieldId = "APD_::" + vFieldIdentifier.property.replaceAll("/", "::");
50
+ } else {
51
+ throw new Error(
52
+ "The 'property' parameter for creating a control ID for a field in an action dialog is not supported: " +
53
+ vFieldIdentifier.property
54
+ );
55
+ }
56
+ vMatcher = FEBuilder.Matchers.id(new RegExp(Utils.formatMessage("{0}", sFieldId)));
57
+ } else {
58
+ // identify a field by its label
59
+ //vMatcher = FEBuilder.Matchers.label(vFieldIdentifier);
60
+ }
61
+ return vMatcher;
62
+ };
63
+
64
+ DialogAPI.prototype._createFieldBuilder = function(vFieldIdentifier) {
65
+ var oMdcFieldBuilder = new MdcFieldBuilder(this.getOpaInstance());
66
+ return oMdcFieldBuilder
67
+ .isDialogElement()
68
+ .hasType("sap.ui.mdc.Field")
69
+ .has(this._createFieldMatcher(vFieldIdentifier));
70
+ };
27
71
 
28
- DialogAPI.prototype._getConfirmButtonMatcher = function() {
29
- var iConfirmButtonIndex = this._iConfirmButtonIndex;
30
- return function(oButton) {
31
- var aButtons = oButton.getParent().getButtons();
32
- // Confirm is (usually) the first button
33
- return aButtons.indexOf(oButton) === Math.min(aButtons.length - 1, iConfirmButtonIndex);
72
+ DialogAPI.prototype._getConfirmButtonMatcher = function() {
73
+ var iConfirmButtonIndex = this._iConfirmButtonIndex;
74
+ return function(oButton) {
75
+ var aButtons = oButton.getParent().getButtons();
76
+ // Confirm is (usually) the first button
77
+ return aButtons.indexOf(oButton) === Math.min(aButtons.length - 1, iConfirmButtonIndex);
78
+ };
34
79
  };
35
- };
36
80
 
37
- DialogAPI.prototype._getCancelButtonMatcher = function() {
38
- var iConfirmButtonIndex = this._iConfirmButtonIndex;
39
- return function(oButton) {
40
- var aButtons = oButton.getParent().getButtons();
41
- // Cancel is (usually) right next to the first (confirm) button
42
- return aButtons.indexOf(oButton) === Math.min(aButtons.length - 1, iConfirmButtonIndex + 1);
81
+ DialogAPI.prototype._getCancelButtonMatcher = function() {
82
+ var iConfirmButtonIndex = this._iConfirmButtonIndex;
83
+ return function(oButton) {
84
+ var aButtons = oButton.getParent().getButtons();
85
+ // Cancel is (usually) right next to the first (confirm) button
86
+ return aButtons.indexOf(oButton) === Math.min(aButtons.length - 1, iConfirmButtonIndex + 1);
87
+ };
43
88
  };
44
- };
45
89
 
46
- return DialogAPI;
47
- });
90
+ return DialogAPI;
91
+ }
92
+ );
@@ -69,5 +69,32 @@ sap.ui.define(["./DialogAPI", "sap/fe/test/Utils", "sap/ui/test/OpaBuilder"], fu
69
69
  );
70
70
  };
71
71
 
72
+ /**
73
+ * Changes the content of a field in an action parameter dialog.
74
+ *
75
+ * @param {sap.fe.test.api.ActionDialogFieldIdentifier} vFieldIdentifier The identifier of the field
76
+ * @param {string} [vValue] The new target value.
77
+ * @param {boolean} [bClearFirst] Set to <code>true</code> to clear previously set filters, otherwise all previously set values will be kept
78
+ * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, that can be used for chaining statements
79
+ * @public
80
+ */
81
+ DialogActions.prototype.iChangeActionParameterDialogField = function(vFieldIdentifier, vValue, bClearFirst) {
82
+ var aArguments = Utils.parseArguments([Object, String, Boolean], arguments);
83
+ return this.prepareResult(
84
+ this._createFieldBuilder(vFieldIdentifier)
85
+ .doChangeValue(aArguments[1], aArguments[2])
86
+ .description(
87
+ Utils.formatMessage(
88
+ "Changing the field '{1}' of action parameter dialog '{0}' by adding '{2}' (was cleared first: {3})",
89
+ this.getIdentifier(),
90
+ aArguments[0],
91
+ aArguments[1],
92
+ !!aArguments[2]
93
+ )
94
+ )
95
+ .execute()
96
+ );
97
+ };
98
+
72
99
  return DialogActions;
73
100
  });