From 708495117cf4294627215122f2a08873fc564269 Mon Sep 17 00:00:00 2001 From: OpenUI5 Bot Date: Tue, 22 Oct 2024 08:17:29 +0000 Subject: [PATCH] OpenUI5 Documentation Update 22.10.2024 --- docs/0index.md | 2 +- docs/Batch_Control_74142a3.md | 4 + ...nges_Compared_to_OData_V2_Model_abd4d7c.md | 48 +++++ docs/Concept_and_Basic_Setup_22f50c0.md | 3 +- docs/Configuration_Options_738ed02.md | 10 -- ...egation_and_Recursive_Hierarchy_7d91431.md | 6 +- docs/Expression_Binding_daf6852.md | 40 +++-- docs/Make_Your_App_CSP_Compliant_1f81a09.md | 2 +- docs/Number_Format_91f2f28.md | 112 +++++++----- docs/OData_V4_Model_5de13cf.md | 4 +- docs/Selection_ec55312.md | 167 +++--------------- docs/Step_10_Automated_Testing_07c97a2.md | 33 ++++ ...est_Suite_and_Automated_Testing_07c97a2.md | 103 ----------- docs/Step_11_Testing_User_Input_92959b1.md | 11 +- ...tep_13_Testing_User_Interaction_19ccd47.md | 34 ++-- docs/Step_14_Adding_Tabs_6e9c6bd.md | 2 +- ..._Short_Date_Formatter_Using_TDD_bc4114a.md | 88 +++++---- ...ep_16_Adding_the_Date_Formatter_2ca583d.md | 8 +- ...1_Overview_and_Testing_Strategy_ab134ef.md | 2 +- docs/Step_9_Adding_the_Post_Page_4a9f063.md | 2 +- docs/Testing_Tutorial_291c912.md | 10 +- ...80078484830540769b67f12a6b88bbd3_HiRes.png | Bin 18864 -> 0 bytes ...0078484830540769b67f12a6b88bbd3_LowRes.png | Bin 0 -> 28468 bytes ...715577da0714787b4e7839cdc524991_LowRes.png | Bin 54700 -> 0 bytes docs/index.json | 4 +- docs/index.md | 2 +- docs/sidebar.md | 2 +- 27 files changed, 307 insertions(+), 392 deletions(-) create mode 100644 docs/Step_10_Automated_Testing_07c97a2.md delete mode 100644 docs/Step_10_Test_Suite_and_Automated_Testing_07c97a2.md delete mode 100644 docs/images/loio80078484830540769b67f12a6b88bbd3_HiRes.png create mode 100644 docs/images/loio80078484830540769b67f12a6b88bbd3_LowRes.png delete mode 100644 docs/images/loioa715577da0714787b4e7839cdc524991_LowRes.png diff --git a/docs/0index.md b/docs/0index.md index 493f54df..fba66d6e 100644 --- a/docs/0index.md +++ b/docs/0index.md @@ -263,7 +263,7 @@ OpenUI5 Version for the OpenUI5 Demo Kit - [Step 7: Changing the Table to a Growing Table](Step_7_Changing_the_Table_to_a_Growing_Table_016e0d4.md) - [Step 8: Testing Navigation](Step_8_Testing_Navigation_10592af.md) - [Step 9: Adding the Post Page](Step_9_Adding_the_Post_Page_4a9f063.md) - - [Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md) + - [Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md) - [Step 11: Testing User Input](Step_11_Testing_User_Input_92959b1.md) - [Step 12: Adding a Search](Step_12_Adding_a_Search_0c270b4.md) - [Step 13: Testing User Interaction](Step_13_Testing_User_Interaction_19ccd47.md) diff --git a/docs/Batch_Control_74142a3.md b/docs/Batch_Control_74142a3.md index 4d2df06c..a01cb843 100644 --- a/docs/Batch_Control_74142a3.md +++ b/docs/Batch_Control_74142a3.md @@ -36,6 +36,9 @@ A group ID has one of the following [submit modes](https://sdk.openui5.org/api/s - `sap.ui.model.odata.v4.SubmitMode.Direct` - Requests associated with the group ID are sent directly without batch. Note that some features of the OData V4 model rely on the correct order of request processing in the back end. This is only guaranteed for requests made in batch requests. +> ### Note: +> We recommend using either`sap.ui.model.odata.v4.SubmitMode.API` or `sap.ui.model.odata.v4.SubmitMode.Auto` groups in productive applications as not all features of the OData V4 model work without batch requests. + The following group IDs are possible: - `"$auto"` and `"$auto.*"`: Predefined batch group ID which is the default if no group ID is specified. You can use different `$auto.*` group IDs to use different batch requests. The suffix can be any non-empty string consisting of alphanumeric characters from the basic Latin alphabet, including the underscore. They have the submit mode `sap.ui.model.odata.v4.SubmitMode.Auto`. @@ -44,6 +47,7 @@ The following group IDs are possible: - An application group ID is a non-empty string consisting of alphanumeric characters from the basic Latin alphabet, including the underscore. By default, an application group has the submit mode `sap.ui.model.odata.v4.SubmitMode.API`. It is possible to use a different submit mode; for details see section [Define submit mode for an application group ID](Batch_Control_74142a3.md#loio74142a38e3d4467c8d6a70b28764048f__section_e1x_pfg_1cb). +- With [`sap.ui.model.odata.v4.Context#delete`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.Context%23methods/delete), [`sap.ui.model.odata.v4.ODataModel#delete`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataModel%23methods/delete), and [`sap.ui.model.odata.v4.ODataContextBinding#execute`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataContextBinding%23methods/execute), you can also use the `$single` group ID. With this group ID, a single batch request is sent directly, similar to `sap.ui.model.odata.v4.SubmitMode.Direct` groups. To specify the group ID for implicit requests, use the parameters `$$groupId` \(group ID for read requests\) and `$$updateGroupId` \(group ID for update requests\) for the binding which initiates the request \(see the [ODataModel.bindList](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataModel/methods/bindList), [ODataModel.bindContext](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataModel/methods/bindContext) and [ODataModel.bindProperty](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataModel/methods/bindProperty) API documentation\). diff --git a/docs/Changes_Compared_to_OData_V2_Model_abd4d7c.md b/docs/Changes_Compared_to_OData_V2_Model_abd4d7c.md index 51f2ef1f..f30ae734 100644 --- a/docs/Changes_Compared_to_OData_V2_Model_abd4d7c.md +++ b/docs/Changes_Compared_to_OData_V2_Model_abd4d7c.md @@ -171,6 +171,54 @@ For more information, see [Type Determination](Type_Determination_53cdd55.md). + + + + + +There is no `AnalyticalBinding` and no `ODataTreeBinding` available. Data aggregation and recursive hierarchy support are available with the `sap.ui.model.odata.v4.ODataListBinding` using the `$$aggregate` binding parameter and the related [`sap.ui.model.odata.v4.ODataListBinding#setAggregation`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.ODataListBinding/methods/setAggregation) method. + + + + +Aggregated data as well as hierarchical data is displayed in a table or list. As a result, the interface of the table or list control and the list binding is reused and enhanced without providing new binding classes. This allows to reuse functionality of the `sap.ui.model.odata.v4.ODataListBinding`. + + + + + + +There is no global cache of entities. Instead, data is kept with respect to bindings and different data for the same entity may be displayed. As a consequence, it is important to use relative bindings as described in [Data Reuse](Data_Reuse_648e360.md) if the same data should be displayed. + + + + +It is now possible to show different states of the same entity, e.g. to allow comparison between the data states before and after a change. + + + + + + +A selection is managed by the `ODataModel` and not by the table. + + + + +The `ODataModel` is responsible for fetching data for the client and caching data on the client. It is important for the model to know which records are selected, so that the respective `sap.ui.model.odata.v4.Context` instances remain available. Also, possible future improvements require the handling of record selection in the `ODataModel`. + + + + + + +Data of selected contexts may not be available synchronously. + + + + +In applications, a user may continue editing after selecting a record. This might cause side effects; see [`sap.ui.model.odata.v4.Context#requestSideEffects`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.Context%23methods/requestSideEffects). The user may also refresh, change, sort, or filter. In all these cases, the expectation is that the client shows up-to-date data. For selected contexts, this means that, instead of keeping their data up to date all the time, their data needs to be accessed asynchronously when needed. + diff --git a/docs/Concept_and_Basic_Setup_22f50c0.md b/docs/Concept_and_Basic_Setup_22f50c0.md index 016717cf..01dc0f9a 100644 --- a/docs/Concept_and_Basic_Setup_22f50c0.md +++ b/docs/Concept_and_Basic_Setup_22f50c0.md @@ -103,7 +103,7 @@ The `tests` object is empty for now. For more information on how to add a define ### The Generic Test Page -The generic test page runs one or multiple test modules. Typically, this file is named `test.qunit.html`. The generic test page is configured in the test suite module. It will be called with the test suite and test name in order to run a test. +The generic test page runs one or multiple test modules. Typically, this file is named `Test.qunit.html`. The generic test page is configured in the test suite module. It will be called with the test suite and test name in order to run a test. ``` @@ -123,5 +123,6 @@ The generic test page runs one or multiple test modules. Typically, this file is
+ ``` diff --git a/docs/Configuration_Options_738ed02.md b/docs/Configuration_Options_738ed02.md index 78980509..08db1787 100644 --- a/docs/Configuration_Options_738ed02.md +++ b/docs/Configuration_Options_738ed02.md @@ -157,16 +157,6 @@ The following options are available on the `defaults` and the individual test co }, - /* - * Whether the UI5 Core (sap/ui/core/Core.js) should be required and booted. - * - * When this option is true, the Core is not only loaded and started, but loading and execution - * of the test module(s) is also delayed until the Promise resolves which is returned from Core.ready() - * ("Core" required from module "sap/ui/core/Core"). - */ - bootCore: true, - - /* * Whether the test starter should call QUnit.start() after all prerequisites have been fulfilled * (e.g. QUnit, Sinon, a bridge, have been loaded, coverage tooling has been loaded and configured, diff --git a/docs/Data_Aggregation_and_Recursive_Hierarchy_7d91431.md b/docs/Data_Aggregation_and_Recursive_Hierarchy_7d91431.md index e564ab73..e0bfa292 100644 --- a/docs/Data_Aggregation_and_Recursive_Hierarchy_7d91431.md +++ b/docs/Data_Aggregation_and_Recursive_Hierarchy_7d91431.md @@ -27,9 +27,7 @@ Since 1.117.0, either a read-only recursive hierarchy \(see below\) or \(pure\) ### Data Aggregation -For every aggregatable property, you can provide the name of the custom aggregate for a corresponding currency or unit of measure. That custom aggregate must return the single value of a unit in case there is only one, or `null` otherwise \("multi-unit situation"\). For SQL-based services, this might be implemented as follows: - -`CASE WHEN min(Unit) = max(Unit) THEN min(Unit) END` +For every aggregatable property, you can provide the name of the custom aggregate for a corresponding currency or unit of measure. That custom aggregate must return the single value of a unit in case there is only one, or `null` otherwise \("multi-unit situation"\). In the special case that the single value is `null`, an empty string `""` has to be returned. Normally, there is also a structural property of the same name as the custom aggregate, providing type information, etc. In case of a multi-unit situation, [`v4.Context#getFilter`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.Context%23methods/getFilter) may be helpful to send a request for more details. @@ -190,7 +188,7 @@ The `@$ui5.node.level` and `@$ui5.node.isExpanded` client-side instance annotati Since 1.125.0, a recursive hierarchy need not be read-only, but maintenance is supported, namely: - **Update of arbitrary properties**, including any corresponding side effects. Note that a side-effects refresh needs to be requested explicitly if the change affects the hierarchy \(node IDs, parent/child relations, or sibling order\); this is not done by the model itself. -- **Creation of new nodes**, either as new root nodes or below an existing parent node. Creation is even supported if the parent was a leaf before, however it is not supported for a collapsed parent.For more details, see [`v4.ODataListBinding#create`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.ODataListBinding/methods/create) and "`@$ui5.node.parent`" therein. Unless the `createInPlace` parameter is used, a newly created node is displayed even if it does not match current filters, and it is always shown in the first position among its siblings, independent of the current sort order or its real back-end position; this is called "out of place". +- **Creation of new nodes**, either as new root nodes or below an existing parent node. Creation is even supported if the parent was a leaf before, however it is not supported for a collapsed parent.For more details, see [`v4.ODataListBinding#create`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.ODataListBinding/methods/create) and "`@$ui5.node.parent`" therein. Since 1.130.0, the `createInPlace` option is supported for the`$$aggregation` binding parameter and the [`v4.ODataListBinding#setAggregation`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.ODataListBinding%23methods/setAggregation) method. When set, newly created nodes are shown "in place", i.e. at the position specified by the service . Otherwise, created nodes are displayed out of place as the first children of their parent or as the first roots, but not in their usual position as defined by the service and the current sort order. - **Deletion of existing nodes**; see [`v4.Context#delete`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.Context/methods/delete). Note that the deletion is first done on the server and only later shown on the client. Thus, the group ID must not have submit mode "API". - **Moving of nodes**. You can change the parent node, including turning a child node into a root node and vice versa, and you can also change the sibling position, including making a node the last one among its siblings or moving it just before a specified sibling. For more details, see [`v4.Context#move`](https://sdk.openui5.orgapi/sap.ui.model.odata.v4.Context/methods/move). Note that `nextSibling` requires a ["com.sap.vocabularies.Hierarchy.v1.RecursiveHierarchyActions"](https://github.com/SAP/odata-vocabularies/blob/main/vocabularies/Hierarchy.md#RecursiveHierarchyActions) annotation with at least a `ChangeNextSiblingAction`. An out-of-place node has no preceding sibling and thus cannot be moved up. Each out-of-place node with the same parent has the same following sibling, namely that parent's first in-place \(that is, not out-of-place\) node; that following sibling is `null` if the parent has no in-place children. A similar consideration applies for out-of-place root nodes. This way, you can move out-of-place nodes down so that they become in-place nodes; thus, you actively determine their position among their siblings. A first in-place node has no preceding sibling even if out-of-place nodes are present; thus, an in-place node cannot be moved up in order to become out-of-place \(again\). diff --git a/docs/Expression_Binding_daf6852.md b/docs/Expression_Binding_daf6852.md index ddc73d3b..cc79f701 100644 --- a/docs/Expression_Binding_daf6852.md +++ b/docs/Expression_Binding_daf6852.md @@ -27,30 +27,34 @@ An expression binding is specified in an XML view by one of the following two op The syntax of the `expression` is similar to JavaScript syntax, but you can only use a subset of the JavaScript expression syntax as defined in the table below. Additionally, you can embed values from the model layer into an expression as additional bindings by using one of the following syntaxes: +- %{binding} + - ${binding} -- %{binding} +`binding` can either be a simple path or a complex binding. The embedded binding ${binding} delivers a value formatted according to the target type of the control property the expression binding applies to, for example `boolean` in case of ``. This can be undesirable or even lead to errors, for example if OData V4 automatically adds the correct type for the `status` property, which is string-like, not boolean. For expression bindings, we therefore recommend to use the syntax `%{binding}` by default, which is just a shortcut for `${path : 'binding', targetType : 'any'}`. In rare cases, you might also want to specify a different `targetType`, for example `string`, `boolean`, `int` or `float`. + +For more information how these values relate to OData types, see the [`sap.ui.model.odata.type`](https://sdk.openui5.org/api/sap.ui.model.odata.type) API documentation or explore the [XML Templating: UI5 OData Types](https://sdk.openui5.org/entity/sap.ui.core.mvc.XMLView/sample/sap.ui.core.sample.ViewTemplate.types) sample in the Demo Kit. -`binding` can either be a simple path, or a complex binding. The embedded binding ${binding} delivers a value formatted according to the target type of the control property the expression binding applies to, for example, “boolean” in case of ``. This can be undesirable or even lead to errors, for example, if OData V4 automatically adds the correct type for the “status” property which is string-like, not boolean. In such cases, use the syntax `%{binding}` instead. It is just a shortcut for `${path : 'binding', targetType : 'any'}`. In rare cases, you might also want to specify a different “targetType”, for example “string”, “boolean”, “int” or “float”. For more information how these values relate to OData types, see the [sap.ui.model.odata.type](https://sdk.openui5.org/api/sap.ui.model.odata.type) API documentation or explore the [XML Templating: UI5 OData Types](https://sdk.openui5.org/entity/sap.ui.core.mvc.XMLView/sample/sap.ui.core.sample.ViewTemplate.types) sample in the Demo Kit. For more information about `targetType`, see the [sap.ui.base.ManagedObject\#bindProperty](https://sdk.openui5.org/api/sap.ui.base.ManagedObject/methods/bindProperty) API documentation in the Demo Kit. +For more information about `targetType`, see the [sap.ui.base.ManagedObject\#bindProperty](https://sdk.openui5.org/api/sap.ui.base.ManagedObject/methods/bindProperty) API documentation in the Demo Kit. > ### Note: > Expression binding can also be used with JavaScript. For example: > > ```js -> new Text({"visible" : "{= ${status} === 'critical' && ${amount} > 10000 }"}); +> new Text({"visible" : "{= %{status} === 'critical' && %{amount} > 10000 }"}); > ``` > > or > > ```js -> new Icon({color : "'{= encodeURIComponent(${/ID}) }'"}); +> new Icon({color : "'{= encodeURIComponent(%{/ID}) }'"}); > ``` > ### Note: > An expression binding does **not** validate binding paths. As a result, an expression binding will **not** detect incorrect or misspelled binding paths. But if you use an OData V4 model and try to bind data that does **not** exist in the model, a warning is logged in the console. -To embed a path containing a closing curly brace into an expression binding, use a complex binding syntax: `${path:'...'}`, for example `"{:= ${path:'target>extensions/[${name} === \'semantics\']/value'} === 'email'}"`. You can use this also to avoid variable replacement by build tools like Maven for special names like “Description” or “Name”. +To embed a path containing a closing curly brace into an expression binding, use a complex binding syntax: `%{path:'...'}`, for example `"{:= %{path:'target>extensions/[${name} === \'semantics\']/value'} === 'email'}"`. You can use this also to avoid variable replacement by buildtools like Maven for special names like "Description" or "Name". @@ -217,7 +221,7 @@ Member access operator with the `.` operator > ### Note: > With these, you can use members and member methods on standard types such as string, array, number, and so on. > -> Example: `${message>/}.length >0` or `${/firstName}.indexOf('S')`. +> Example: `%{message>/}.length >0` or `%{/firstName}.indexOf('S')`. @@ -235,7 +239,7 @@ Function call Example: -• text="{= Math.max(${/value1}, ${/value2}, ${/value3}) }" +• text="{= Math.max(%{/value1}, %{/value2}, %{/value3}) }" > ### Note: > You can use functions that are available via global symbols, such as `Math.max(...)` or `isNaN(...)`. @@ -347,7 +351,7 @@ When using expression binding, however, you only need the XML view without contr ... - + ... @@ -378,40 +382,40 @@ Examples for more complex expressions: -visible="{= ${status} === 'critical' && ${amount} > 10000 }" +visible="{= %{status} === 'critical' && %{amount} > 10000 }" ``` ```xml -text="{= ${/amount} > 10000 ? ${i18n>/high} : ${i18n>/normal} }" +text="{= %{/amount} > 10000 ? %{i18n>/high} : %{i18n>/normal} }" ``` ```xml -visible="{= ${/rating}.toUpperCase() === 'VIP' || ${/orderAmount} > 10000 }" +visible="{= %{/rating}.toUpperCase() === 'VIP' || %{/orderAmount} > 10000 }" ``` ```xml -visible={= RegExp('vip', 'i').test(${/rating}) } +visible={= RegExp('vip', 'i').test(%{/rating}) } ``` ```xml -text="{= Math.max(${/value1}, ${/value2}, ${/value3}) }" +text="{= Math.max(%{/value1}, %{/value2}, %{/value3}) }" ``` ```xml -enabled="{= ${/orderStatus} !== null }" +enabled="{= %{/orderStatus} !== null }" ``` ```xml @@ -425,7 +429,7 @@ text="{= 'small@middle@long'.split('@')[1] }" -text="Hello {=${gender}==='male' ? 'Mr.' : 'Mrs.'} {lastName}" +text="Hello {=%{gender}==='male' ? 'Mr.' : 'Mrs.'} {lastName}" ``` ```xml @@ -441,9 +445,9 @@ errorMsg=Message is too short ... - errorMsg} + : %{parts: [ {path: 'i18n>successMsg'}, {path: '/data/today', type:'sap.ui.model.type.Date', constraints:{displayFormat:'Date'}}, {path: '/data/tomorrow', type:'sap.ui.model.type.Date', constraints:{displayFormat:'Date'}} diff --git a/docs/Make_Your_App_CSP_Compliant_1f81a09.md b/docs/Make_Your_App_CSP_Compliant_1f81a09.md index 2ff34d61..ed4abd39 100644 --- a/docs/Make_Your_App_CSP_Compliant_1f81a09.md +++ b/docs/Make_Your_App_CSP_Compliant_1f81a09.md @@ -75,6 +75,6 @@ HTML file: ``` -- Learn how: Testing Tutorial [Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md) +- Learn how: Testing Tutorial [Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md) - Find out more: [Content Security Policy](Content_Security_Policy_fe1a6db.md) diff --git a/docs/Number_Format_91f2f28.md b/docs/Number_Format_91f2f28.md index 427ae780..91ed7d10 100644 --- a/docs/Number_Format_91f2f28.md +++ b/docs/Number_Format_91f2f28.md @@ -29,7 +29,7 @@ There are four types of formatters defined in `NumberFormat`: ### Instantiation -The instantiation of `sap.ui.core.format.NumberFormat` is done by calling `getter` defined on `NumberFormat` \(and not by using the constructor\). +The instantiation of `sap.ui.core.format.NumberFormat` is done by calling a getter defined on `NumberFormat` \(and not by using the constructor\). ```js // "NumberFormat" required from module "sap/ui/core/format/NumberFormat" @@ -45,25 +45,57 @@ var oCurrencyFormat = NumberFormat.getCurrencyInstance(); All parameters have their default value defined in the current locale. Therefore, if no parameter is given when instantiating the formatter instance, it fetches the parameters from the current locale. The samples here assume that the current locale is `en-US`. -All parameters can be overwritten by giving a format option object in the `getter` of the formatter. There are a bunch of parameter defined for the four types of formatters. Most of them are shared among the types, and the rest are specifically defined for a certain kind of formatter. +All parameters can be overwritten by giving a format option object in the getter of the formatter. There are a number of parameters defined for the four types of formatters. Most of them are shared among the types, and the rest are specifically defined for a certain kind of formatter. *** #### Integer and Decimal Digits -- `minIntegerDigits`: minimal number of non-fraction digits. If there are less integer digits in the number than the value here, `'0'(s)` is prepended in the final result. +- `minIntegerDigits`: minimal number of non-fractional digits. If there are fewer integer digits in the number than the value defined here, `"0"`s are prepended to the final result. -- `maxIntegerDigits`: maximal number of non-fraction digits. If there are more digits in the number than the value here, all integer digits in the final result are replace by `?`. +- `maxIntegerDigits`: maximum number of non-fractional digits. If there are more digits in the number than the value defined here, all integer digits in the final result are replaced by `"?"`. -- `minFractionDigits`: minimal number of fraction digits. If there are less decimal digits in the number than the value here, '0'\(s\) is appended in the final result. +- `minFractionDigits`: minimal number of fractional digits. If there are fewer decimal digits in the number than the value defined here, `"0"`s are appended to the final result. -- `maxFractionDigits`: maximal number of fraction digits. If there are more decimal digits in the number than the value here, those digits are discarded from the result and the least significant digit is calculated by using the given `roundingMode` parameter. +- `maxFractionDigits`: maximum number of fractional digits. If there are more decimal digits in the number than the value defined here, the surplus digits are discarded, and the least significant digit is calculated via the given `roundingMode` parameter. -- `decimals`: number of decimal digits in the final result. Same result is achieved by setting both `minFractionDigits` and `maxFractionDigits` to this value. +- `decimals`: number of decimal digits in the final result. The same result is achieved by setting both `minFractionDigits` and `maxFractionDigits` to this value. -- `precision`: number of digits used to display the number, for example with precision 5 a number could be 1.3456 or 134.45. +- `precision`: maximum number of digits in the formatted representation of a number; if the `precision` is less than the overall length of the number, the fractional part is truncated by rounding. The integer part can have more digits than defined by the `precision`; it can only be affected by rounding when this option is used. -- `shortDecimals`: number of decimal digits in the shortifed number when parameter `style` is set to `short` or `long`. If this isn't set, the parameter `decimal` is used instead. + For integer format types, this option is only considered if formatting leads to a representation of a number with decimal places, e.g. if the option `style: "short"` is set. + + **Example 1:** + + - Number to format: `1234.5678` + - Precision: `2` + - Formatted result: `"1,235"` \(rounding is applied\) + + > ### Note: + > The integer value of the number is `1234`, the decimal value is `5678`, and the precision defines the number of digits to express the value of the number as `2`. As the integer part must remain unaffected by this constraint, the decimals are removed in the formatted result. In addition, rounding is applied. + + **Example 2:** + + - Number to format: `1234.5678` + - Precision: `6` + - Formatted result: `"1,234.57"` \(rounding is applied\) + + > ### Note: + > The integer value of the number is `1234`, the decimal value is `5678`, and the precision defines the number of digits to express the value of the number as `6`. Thus, only the first 2 decimal places are retained and rounding is again applied. + + **Example 3 \(integer type\):** + + - Number to format: `123567` + - Precision: `6` + - Style option: `short` + - Formatted result: `"123.567K"` + + > ### Note: + > The integer value of the number is `123567`. Applying the `short` format to this number results in a representation with decimal places. The K stands for "kilo", which is to be interpreted as 3 powers of ten. + > + > If the `precision` would now be reduced to, e.g. `2`, the formatted result would now become `124K` as the decimal places would get truncated and the integer part would be affected by rounding. + +- `shortDecimals`: number of decimal digits in the shortifed number when the `style` parameter is set to `"short"` or `"long"`. If this isn't set, the parameter `decimal` is used instead. ```js @@ -76,9 +108,9 @@ var oFormatOptions = { // "NumberFormat" required from module "sap/ui/core/format/NumberFormat" var oFloatFormat = NumberFormat.getFloatInstance(oFormatOptions); -oFloatFormat.format(1.1); // returns 001.10 -oFloatFormat.format(1234.567); // returns 1,234.567 -oFloatFormat.format(123456.56789); // returns ??,???.5679 +oFloatFormat.format(1.1); // returns "001.10" +oFloatFormat.format(1234.567); // returns "1,234.567" +oFloatFormat.format(123456.56789); // returns "??,???.5679" ``` ```js @@ -90,30 +122,28 @@ var oFormatOptions = { // "NumberFormat" required from module "sap/ui/core/format/NumberFormat" var oFloatFormat = NumberFormat.getFloatInstance(oFormatOptions); -oFloatFormat.format(1234.56); // returns 1.23K (shortified number takes the shortDecimals parameter) -oFloatFormat.format(123.456); // returns 123.5 (non-shortified number takes the decimals parameter) +oFloatFormat.format(1234.56); // returns "1.23K" (shortified number takes the shortDecimals parameter) +oFloatFormat.format(123.456); // returns "123.5" (non-shortified number takes the decimals parameter) ``` *** #### Separator and Signs -- `groupingEnabled` defines whether the integer digits are put into groups which are separated by the `groupingSeparator` parameter +- `decimalSeparator` defines the symbol used for the decimal point. -- `groupingType` defines the type of grouping. Either `Arabic` or `Indian` can be set here. +- `groupingBaseSize` only used if your locale uses a specific group size for the first group \(e.g. Indian locale\) and you don't want to use this standard. -- `groupingSeparator` defines the separator of grouping. +- `groupingEnabled` defines whether the integer digits are put into groups which are separated by the `groupingSeparator` parameter. -- `decimalSeparator` defines the symbol of decimal point. +- `groupingSeparator` defines the separator of grouping. -- `groupingSize` only used if you don't want the locale-dependent grouping, for example 3 digits for de or en +- `groupingSize` only used if you don't want the locale-specific grouping, for example, 3 digits for `de` or `en`. -- `groupingBaseSize` only used if your locale uses a specific group size for the first group \(like Indian\), and you don't want to use the standard +- `minusSign` - `plusSign` -- `minusSign` - *** @@ -121,16 +151,16 @@ oFloatFormat.format(123.456); // returns 123.5 (non-shortified number takes the You can use compact format to format a number using a given scale. For example, 1000000 may be formatted under en-US locale as *1 Million*. -To format a number in compact format, set the option `style` to either `short` or `long`. These styles control which version of scale name is used. For example, 1000000 is formatted as *1M* with `short` and *1 Million* with `long`. +To format a number in compact format, set the `style` option to either `"short"` or `"long"`. These styles control which version of scale name is used. For example, 1000000 is formatted as *1M* with `"short"` and *1 Million* with `"long"`. -The scale can be selected automatically based on the given number, or you can set it explicitely by using `shortRefNumber`. You can set this option with a number which is then used for calculating the scaling factor for formatting all given numbers to this formatter. +The scale can be selected automatically based on the given number, or you can set it explicitly by using `shortRefNumber`. You can set this option with a number which is then used for calculating the scaling factor for formatting all given numbers to this formatter. -To hide the scaling formatter from the formatted number and only be shown once on the screen, you can use option `showScale`. In order to get the scaling factor name of the number set to `shortRefNumber` under the current running locale, you use method `getScale`. +To hide the scaling formatter from the formatted number and only be shown once on the screen, you can use option `showScale`. In order to get the scaling factor name of the number set to `shortRefNumber` under the current locale, `getScale` can be used. -To control the start the starting point of numbers which should be displyed in compact format, you use `shortLimit`. +To control the starting point of numbers which should be displayed in compact format, `shortLimit` can be used. > ### Example: -> In the following chart, all numbers both on the chart and axis should be formatted using the same scaling factor. The scaling factor should only appear in the chart title and be hidden from the formatted number. In order to achieve this, the option `shortRefNumber` is set to `1000000` and `showScale` is set to `false`. The corresponding scaling factor name is returned by calling the `getScale` method. +> In the following chart, all numbers both on the chart and the axis should be formatted using the same scaling factor. The scaling factor should only appear in the chart title and be hidden from the formatted number. In order to achieve this, the option `shortRefNumber` is set to `1000000`, and `showScale` is set to `false`. The corresponding scaling factor name is returned by calling the `getScale` method. > > ![](images/loiodd8f106a130b484a86f4c56955006207_LowRes.png) @@ -509,8 +539,8 @@ If not otherwise mentioned, the examples below are based on the US locale standa ```js // "NumberFormat" required from module "sap/ui/core/format/NumberFormat" var oOptions = { - groupingSeparator : ",", decimalSeparator : ".", + groupingSeparator : ",", groupingSize : 3 }; var oFloatFormat = NumberFormat.getFloatInstance(oOptions); @@ -521,9 +551,9 @@ The following user input is considered to be potentially wrong and therefore **i - There is no decimal separator and only one grouping separator, which occurs at an unexpected position. ```js - oFloatFormat.parse("1,2"); // NaN (before: 12) - oFloatFormat.parse("1,23"); // NaN (before: 123) - oFloatFormat.parse("1,2345"); // NaN (before: 12345) + oFloatFormat.parse("1,2"); // NaN (before: 12) + oFloatFormat.parse("1,23"); // NaN (before: 123) + oFloatFormat.parse("1,2345"); // NaN (before: 12345) ``` **Assumption:** As the position of the grouping separator does not match the locale-specific convention, the user might have intended to use a decimal separator but used a separator from a different locale by mistake. @@ -531,7 +561,7 @@ The following user input is considered to be potentially wrong and therefore **i - There is no decimal separator, only a single grouping separator is present, and at least one additional grouping separator is missing, **including the least significant \(lowest\) grouping separator**. ```js - oFloatFormat.parse("1234,567891"); // NaN (before: 1234567891) + oFloatFormat.parse("1234,567891"); // NaN (before: 1234567891) ``` **Assumption:** Any user aware of the right grouping separator would probably have added the missing grouping separator\(s\) as well. It is therefore likely that the grouping separator was confused with the decimal separator. @@ -546,11 +576,9 @@ The following user input is considered to be potentially wrong and therefore **i > > > ```js -> oFloatFormat.parse("1,2"); // NaN +> oFloatFormat.parse("1,2"); // NaN > -> NumberFormat -> .getCurrencyInstance(oOptions) -> .parse("1,2 EUR"); // null +> NumberFormat.getCurrencyInstance(oOptions).parse("1,2 EUR"); // null > ``` The following user input is considered to be **valid**: @@ -558,7 +586,7 @@ The following user input is considered to be **valid**: - There is no decimal separator, **only the least significant \(lowest\) grouping separator is present**, and at least one additional grouping separator is missing. ```js - oFloatFormat.parse("1234,567"); // 1234567 + oFloatFormat.parse("1234,567"); // 1234567 ``` > ### Note: @@ -569,7 +597,7 @@ The following user input is considered to be **valid**: - At least 2 grouping separators are present in the input. ```js - oFloatFormat.parse("1234,567,892"); // 1234567892 + oFloatFormat.parse("1234,567,892"); // 1234567892 ``` **Assumption:** As more than one grouping separator was used and as decimal separators must only occur once, a mix-up of the separators can be ruled out. @@ -577,7 +605,7 @@ The following user input is considered to be **valid**: - One decimal separator and at least one grouping separator are present in correct sequential order. ```js - oFloatFormat.parse("1234,567.89"); // 1234567.89 + oFloatFormat.parse("1234,567.89"); // 1234567.89 ``` **Assumption:** As both separators are used in the expected order, a wrong usage is not likely. @@ -585,7 +613,7 @@ The following user input is considered to be **valid**: - There are no decimal or grouping separators \(trivial as no misinterpretation possible\). ```js - oFloatFormat.parse("1234567891"); // 1234567891 + oFloatFormat.parse("1234567891"); // 1234567891 ``` @@ -602,14 +630,14 @@ While grouping separators are then still treated as optional and can be wholly o ```js // "NumberFormat" required from module "sap/ui/core/format/NumberFormat" var oOptions = { - groupingSeparator : ",", decimalSeparator : ".", + groupingSeparator : ",", groupingSize : 3, strictGroupingValidation: true }; var oFloatFormat = NumberFormat.getFloatInstance(oOptions); -oFloatFormat.parse("1,2,3"); // NaN (before: 123) +oFloatFormat.parse("1,2,3"); // NaN (before: 123) ``` **Related Information** diff --git a/docs/OData_V4_Model_5de13cf.md b/docs/OData_V4_Model_5de13cf.md index c731a11b..7b94730e 100644 --- a/docs/OData_V4_Model_5de13cf.md +++ b/docs/OData_V4_Model_5de13cf.md @@ -47,8 +47,8 @@ Bindings connect OpenUI5 view elements to model data, allowing changes in the mo The OData V4 model supports certain events intended for applications, and others that are to be used for controls, as outlined in this section. - **[Filtering](Filtering_5338bd1.md "The OData V4 Model supports server side filtering on lists.")** The OData V4 Model supports server side filtering on lists. -- **[Selection](Selection_ec55312.md "The OData V4 Model supports server side filtering on lists.")** -The OData V4 Model supports server side filtering on lists. +- **[Selection](Selection_ec55312.md "The OData V4 Model supports (de-)selection of individual rows and of all rows at once.")** +The OData V4 Model supports \(de-\)selection of individual rows and of all rows at once. - **[Sorting](Sorting_d2ce3f5.md "The OData V4 model supports server side sorting on lists.")** The OData V4 model supports server side sorting on lists. - **[Value Lists](Value_Lists_ab267a6.md "The OData V4 model supports the access to value list metadata and data.")** diff --git a/docs/Selection_ec55312.md b/docs/Selection_ec55312.md index 8ab73723..27151079 100644 --- a/docs/Selection_ec55312.md +++ b/docs/Selection_ec55312.md @@ -10,160 +10,37 @@ view on: [demo kit nightly build](https://sdk.openui5.org/nightly/#/topic/ec5531 ## Selection -The OData V4 Model supports server side filtering on lists. +The OData V4 Model supports \(de-\)selection of individual rows and of all rows at once. -To use server side filtering, set the operation mode to [`sap.ui.model.odata.OperationMode.Server`](https://sdk.openui5.org/api/sap.ui.model.odata.OperationMode/properties). This can be done as follows: +Individual rows can be \(de-\)selected via `sap.ui.model.odata.v4.Context#setSelected`. If the selection state changes, a [`selectionChanged`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataListBinding%23events/selectionChanged) event is fired on the list binding which this context belongs to. While a context is currently [deleted](https://sdk.openui5.org/api/sap.ui.model.odata.v4.Context%23methods/isDeleted) on the client, it does not appear as [selected](https://sdk.openui5.org/api/sap.ui.model.odata.v4.Context%23methods/isSelected). -- For a single `ODataListBinding` instance, set the binding parameter `$$operationMode` +The selection state of **all rows at once** \("select all"\) can be defined logically by calling [`v4.Context#setSelected`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.Context%23methods/setSelected) on the list binding's [header context](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataListBinding%23methods/getHeaderContext). The new selection state is propagated to all row contexts. If the selection state of the header context changes, a [`selectionChanged`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataListBinding%23events/selectionChanged) event is fired for that header context. The setter can be called again with the same value to again select all row contexts. For example, if a row context was deselected explicitly in between, it is selected again by selecting the header context again - even if the header context is already selected. If the selection state of any row context changes in this way, a `selectionChanged` event is nevertheless fired for that header context but not for the row context. When no selection state changes, no event is fired. When all rows are \(de-\)selected, this same selection state is applied to any new rows which are loaded due to scrolling or paging. -- For all list bindings of the model, set the model parameter `operationMode`. +A list binding's selection state is thus defined by the "select all" state of its [header context](https://sdk.openui5.org/api/sap.ui.model.odata.v4.ODataListBinding%23methods/getHeaderContext) in combination with all "exceptions to the rule" \(as illustrated above\). If the preconditions of [`#setKeepAlive`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.Context%23methods/setKeepAlive) hold, a best effort is made to implicitly keep those exceptions alive in order to preserve the binding's selection state. Once a row selection is no longer needed, for example because you perform an operation on this context which logically removes it from its list, you need to reset that context's selection. +Because the selection state is kept, you can easily describe the current selection as follows \(assuming there is a key property `ID` and a non-key property `Name`\). Of course, your controller code can also operate on this information in any other way, for example including some back-end call. Note that you can only rely on the key properties being available synchronously. Due to side effects, invisible \(de-\)selected rows may not be kept up to date, and thus non-key properties should be requested asynchronously. -**Example: Operation mode set in `manifest.json` for the model** +**Select All with exceptions** ```js - -"models" : { - "" : { - "dataSource" : "default", - "settings" : { - "operationMode" : "Server", - "synchronizationMode" : "None" - } - } -} -``` - -**Example: Operation mode set as binding parameter for a specific list binding** - -```js - -
-``` - -The `ODataListBinding` allows to set static and dynamic filters: - -- To set a static filter, use the `$filter` system query option in the binding parameters. The static filter value is sent with every data service request for the binding; you may specify any filter value allowed in OData V4. The static filter cannot be overwritten for an existing binding. - -- The dynamic filter is an instance of [sap.ui.model.Filter](https://sdk.openui5.org/api/sap.ui.model.Filter) , or an array thereof. For an array, the filters are combined with a logical AND. You can set the initial value for the dynamic filter in [ODataModel\#bindList](https://sdk.openui5.org/api/ODataModel%23methods/bindList) or declaratively in an XML view with the `filters` property in an aggregation's binding information. To set the dynamic filter, use the [ODataListBinding\#filter](https://sdk.openui5.org/api/ODataListBinding%23methods/filter) method. This filter overwrites the initial value specified on binding construction. - - -The `ODataListBinding` combines the dynamic filter and static filter with a logical AND. - -**Examle: Dynamic and static filters** - -```js - -
-``` - -The example above filters the `Equipments` entity set by `Category` \(static filter\) and `EmployeeId` \(dynamic filter, initial value\). - -*** - - - -### Filtering with Any and All - -The OData V4 model also supports the Lambda Operators `any` and `all` as defined in section 5.1.1.10 of the [OData Version 4.0. Part 2: URL Conventions](http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part2-url-conventions/odata-v4.0-errata03-os-part2-url-conventions-complete.html#_Toc453752358) specification. They are represented by [sap.ui.model.Filter](https://sdk.openui5.org/api/sap.ui.model.Filter) objects with filter operators [sap.ui.model.FilterOperator.Any](https://sdk.openui5.org/api/sap.ui.model.FilterOperator/properties) and [sap.ui.model.FilterOperator.All](https://sdk.openui5.org/api/sap.ui.model.FilterOperator/properties). - -Example: - -``` -sap.ui.model.Filter({ - // the path of the collection for which the condition needs to be evaluated - path : "TEAM_2_EMPLOYEES", - // either sap.ui.model.FilterOperator.Any or sap.ui.model.FilterOperator.All - operator : sap.ui.model.FilterOperator.Any, - // any OData identifier which is a variable for the current element of the collection referenced by path - variable : "employee", - // the filter condition; the path of the nested filter contains the variable as prefix to reference current element of the collection - condition : new sap.ui.model.Filter("employee/AGE", sap.ui.model.FilterOperator.GT, 42) - }) -``` - -The path of the filter object is the path of the collection for which the boolean condition needs to be evaluated. The variable can be any OData identifier and it needs to be part of the path of a nested filter condition. - -*** - -#### Filter Operator any - -The filter operator Any applies the `boolean` filter condition to each member of the collection referenced by `path`. If the condition is true for **at least one** member of the collection, the any-filter matches. The filter with the Any operator without a filter condition matches only if the collection referenced by path is not empty. - -Example 1: Get all teams that have at least one employee who is older than 42 - -``` - -oTeamsBinding.filter( - new sap.ui.model.Filter({ - path : "TEAM_2_EMPLOYEES", - operator : sap.ui.model.FilterOperator.Any, - variable : "employee", - condition : new sap.ui.model.Filter("employee/AGE", sap.ui.model.FilterOperator.GT, 42) - }) -); -``` - -The resulting request would be: **`http://host/service/TEAMS?$filter=TEAM_2_EMPLOYEES/any(employee:employee/AGE gt 42)`** - -Example 2: Get all teams that have at least one employee assigned - -``` -oTeamsBinding.filter( - new sap.ui.model.Filter({ - path : "TEAM_2_EMPLOYEES", - operator : sap.ui.model.FilterOperator.Any - }) +const bSelectAll = oListBinding.getHeaderContext().isSelected(); + +const aIDs = oListBinding.getAllCurrentContexts() + .filter((oContext) => oContext.isSelected() !== bSelectAll) + .map((oContext) => oContext.getProperty("ID")); +MessageBox.information((bSelectAll ? "All except " : "") + aIDs.join(", "), + {title : "Selected IDs"}); + +const aNames = await Promise.all( + oListBinding.getAllCurrentContexts() + .filter((oContext) => oContext.isSelected() !== bSelectAll) + .map((oContext) => oContext.requestProperty("Name")) ); +MessageBox.information((bSelectAll ? "All except " : "") + aNames.join(", "), + {title : "Selected Names"}); ``` -The resulting request would be: **`http://host/service/TEAMS?$filter=TEAM_2_EMPLOYEES/any()`** - -*** - -#### Filter Operator all - -The filter operator All applies the `boolean` filter condition to each member of the collection referenced by `path`. If the condition is true for **all** members of the collection, the all-filter matches. - -Example: Get all teams for which all employees are older than 42. - -``` - -oOrdersListBinding.filter( - new sap.ui.model.Filter({ - path : "TEAM_2_EMPLOYEES", - operator : sap.ui.model.FilterOperator.All, - variable : "employee", - condition : new sap.ui.model.Filter("employee/AGE", sap.ui.model.FilterOperator.GT, 42) - }) -); -``` - -The resulting request would be: **`http://host/service/TEAMS?$filter=TEAM_2_EMPLOYEES/all(employee:employee/AGE gt 42)`** - -**Related Information** - +A context's selection state can also be accessed via data binding to the `"@$ui5.context.isSelected"` client-side annotation, even as a two-way binding and also for a header context. Two-way binding means that updates to the binding are reflected as updates to that context's selection state, just like calls to [`v4.Context#setSelected`](https://sdk.openui5.org/api/sap.ui.model.odata.v4.Context%23methods/setSelected). -[sap.ui.model.odata.OperationMode.Server](https://sdk.openui5.org/api/sap.ui.model.odata.OperationMode/properties) +Note that list-based controls may use the OData V4 model's selection state implicitly; check the corresponding control documentation for more information. For advanced features, you can access the OData V4 model's APIs directly as outlined above. diff --git a/docs/Step_10_Automated_Testing_07c97a2.md b/docs/Step_10_Automated_Testing_07c97a2.md new file mode 100644 index 00000000..8b0b4b80 --- /dev/null +++ b/docs/Step_10_Automated_Testing_07c97a2.md @@ -0,0 +1,33 @@ + + +| loio | +| -----| +| 07c97a2e497d443eb6fa74bb9445ab9c | + +
+ +view on: [demo kit nightly build](https://sdk.openui5.org/nightly/#/topic/07c97a2e497d443eb6fa74bb9445ab9c) | [demo kit latest release](https://sdk.openui5.org/topic/07c97a2e497d443eb6fa74bb9445ab9c)
+ +## Step 10: Automated Testing + +In this step, we will step back from our tests and application features that we have implemented so far and take a closer look at another important piece of the test setup - the test automation. We will learn how to set up a basic test automation, which might be used in a continuous integration system or locally to run tests via shell. + +*** + +### Automated Testing + +Please, follow the steps described in [Test Automation](Test_Automation_ae44824.md#loioae448243822448d8ba04b4784f4b09a0) to configure an automated test setup. + +**Parent topic:**[Testing Tutorial](Testing_Tutorial_291c912.md "In this tutorial we will test application functionality with the testing tools that are delivered with OpenUI5. At different steps of this tutorial you will write tests using QUnit, OPA5, and the OData V2 mock server. Additionally, you will learn about testing strategies, Test Driven Development (TDD), and much more.") + +**Next:**[Step 9: Adding the Post Page](Step_9_Adding_the_Post_Page_4a9f063.md "Now that we have covered all kinds of tests for navigation, we introduce our Post page that shows details of a post in the bulletin board. To achieve this, we have to introduce a new view/controller pair and adjust the routing of the application.") + +**Previous:**[Step 11: Testing User Input](Step_11_Testing_User_Input_92959b1.md "In this step, we will write a test that simulates a user search. We will enter the search string into the search field and check if the correct results are shown in worklist table.") + +**Related Information** + + +[*Karma* Home Page](https://www.npmjs.com/package/karma) + +[Test Automation](Test_Automation_ae44824.md#loioae448243822448d8ba04b4784f4b09a0 "To make sure that the code is always tested thoroughly before it is included in a productive app, you should use a test runner that automates tests. The test runner can be included in your project setup so that it is called whenever code changes are submitted.") + diff --git a/docs/Step_10_Test_Suite_and_Automated_Testing_07c97a2.md b/docs/Step_10_Test_Suite_and_Automated_Testing_07c97a2.md deleted file mode 100644 index 7834a3e1..00000000 --- a/docs/Step_10_Test_Suite_and_Automated_Testing_07c97a2.md +++ /dev/null @@ -1,103 +0,0 @@ - - -| loio | -| -----| -| 07c97a2e497d443eb6fa74bb9445ab9c | - -
- -view on: [demo kit nightly build](https://sdk.openui5.org/nightly/#/topic/07c97a2e497d443eb6fa74bb9445ab9c) | [demo kit latest release](https://sdk.openui5.org/topic/07c97a2e497d443eb6fa74bb9445ab9c)
- -## Step 10: Test Suite and Automated Testing - -In this step, we will step back from our tests and application features that we have implemented so far and add another important piece of test code: The test suite page. A test suite can execute multiple tests and collect the results. This comes in handy for automatic tools in a continuous integration process. - -*** - -### Preview - - - -**A Selenium runner for the test suite of the bulletin board** - -![](images/loioa715577da0714787b4e7839cdc524991_LowRes.png "A Selenium runner for the test suite of the bulletin board") - -*** - -### Coding - -You can view and download all files in the *Samples* in the Demo Kit at [Testing - Step 10](https://sdk.openui5.org/entity/sap.m.tutorial.testing/sample/sap.m.tutorial.testing.10). - -*** - -
- -### webapp/test/testsuite.qunit.html \(New\) - -```html - - - - QUnit test suite for Bulletin Board - - - - - - - -``` - -Create a new `testsuite.qunit.html` file. Here, you add the `testsuite.qunit.js` script, which we will define next, as a source. - -*** - -### webapp/test/testsuite.qunit.js \(New\) - -```js -window.suite = function() { - "use strict"; - - var oSuite = new parent.jsUnitTestSuite(), - sContextPath = location.pathname.substring(0, location.pathname.lastIndexOf("/") + 1); - - oSuite.addTestPage(sContextPath + "unit/unitTests.qunit.html"); - oSuite.addTestPage(sContextPath + "integration/opaTests.qunit.html"); - - return oSuite; -}; -``` - -This new `testsuite.qunit.js` file contains the logic for the QUnit tests. The coding is quite straightforward: We require the relevant QUnit files for redirecting to the central test suite and provide a configuration function `suite()` that is called automatically by the testrunner. - -Inside this function, we add the QUnit pages for the app’s unit and integration tests. For technical reasons, we have to provide an absolute path to the HTML pages so that the testrunner can execute them centrally. You can now run the `webapp/test/testsuite.qunit.html` file to check if all unit and integration tests are running fine with one URL. - -> ### Note: -> A similar test suite can be configured as a pre-commit hook in local build environments or as a pre-submit hook in a continuous integration scenario on the central build server. Only when all tests run successfully, a new change is accepted and may be merged. -> -> Alternatively you can use a local test runner, such as Selenium or Karma, that automatically executes all tests whenever a file in the app project has been changed. All of these configurations run the tests and collect the resulting messages for further analysis. Therefore, it is very important to define meaningful test descriptions and success as well as error messages as you write your application tests. - -*** - -### Conventions - -- Create a test suite app that triggers all your tests at once - -- Run the test suite whenever you change the code of the app - - -**Parent topic:**[Testing Tutorial](Testing_Tutorial_291c912.md "In this tutorial we will test application functionality with the testing tools that are delivered with OpenUI5. At different steps of this tutorial you will write tests using QUnit, OPA5, and the OData V2 mock server. Additionally, you will learn about testing strategies, Test Driven Development (TDD), and much more.") - -**Next:**[Step 9: Adding the Post Page](Step_9_Adding_the_Post_Page_4a9f063.md "Now that we have covered all kinds of tests for navigation, we introduce our Post page that shows details of a post in the bulletin board. To achieve this, we have to introduce a new view/controller pair and adjust the routing of the application.") - -**Previous:**[Step 11: Testing User Input](Step_11_Testing_User_Input_92959b1.md "In this step, we will write a test that simulates a user search. We will enter the search string into the search field and check if the correct results are shown in worklist table.") - -**Related Information** - - -[*Karma* Home Page](https://www.npmjs.com/package/karma) - -[*Selenium* Home Page](http://docs.seleniumhq.org/) - -[Test Automation](Test_Automation_ae44824.md#loioae448243822448d8ba04b4784f4b09a0 "To make sure that the code is always tested thoroughly before it is included in a productive app, you should use a test runner that automates tests. The test runner can be included in your project setup so that it is called whenever code changes are submitted.") - diff --git a/docs/Step_11_Testing_User_Input_92959b1.md b/docs/Step_11_Testing_User_Input_92959b1.md index ed84437f..890e8788 100644 --- a/docs/Step_11_Testing_User_Input_92959b1.md +++ b/docs/Step_11_Testing_User_Input_92959b1.md @@ -30,9 +30,11 @@ You can view and download all files in the Demo Kit at [Testing - Step 11](https *** -### test/integration/WorklistJourney.js +### webapp/test/integration/WorklistJourney.js ```js + +/*global QUnit*/ sap.ui.define([ "sap/ui/test/opaQunit", "./pages/Worklist" @@ -50,6 +52,7 @@ sap.ui.define([ and.theTitleShouldDisplayTheTotalAmountOfItems(); }); + opaTest("Should be able to load more items", function (Given, When, Then) { //Actions When.onTheWorklistPage.iPressOnMoreData(); @@ -72,13 +75,13 @@ sap.ui.define([ ); ``` -In this example, we extend the `WorklistJourney.js` file with a new test `"Should be able to enter text into the search field"`. The action within this test simulates a user entering text into a search field, so we pass a search string `"Bear"` to this action. It is important to move the `Teardown` step to the last test, otherwise our app would be destroyed and the test would not be able to find the *Statistics* tab. +In this example, we extend the `WorklistJourney.js` file with a new test `"Should be able to search for items"`. The action within this test simulates a user entering text into a search field, so we pass a search string `"Bear"` to this action. It is important to move the `Teardown` step to the last test, otherwise our app would be destroyed and the test would not be able to find the *Statistics* tab. Delete `.and.iTeardownMyApp();` from the previous test in the file and add the new test case. *** -### test/integration/pages/Worklist.js +### webapp/test/integration/pages/Worklist.js ```js sap.ui.require([ @@ -155,7 +158,7 @@ Actions in OPA never contain a QUnit assertion. **Parent topic:**[Testing Tutorial](Testing_Tutorial_291c912.md "In this tutorial we will test application functionality with the testing tools that are delivered with OpenUI5. At different steps of this tutorial you will write tests using QUnit, OPA5, and the OData V2 mock server. Additionally, you will learn about testing strategies, Test Driven Development (TDD), and much more.") -**Next:**[Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md "In this step, we will step back from our tests and application features that we have implemented so far and add another important piece of test code: The test suite page. A test suite can execute multiple tests and collect the results. This comes in handy for automatic tools in a continuous integration process.") +**Next:**[Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md "In this step, we will step back from our tests and application features that we have implemented so far and take a closer look at another important piece of the test setup - the test automation. We will learn how to set up a basic test automation, which might be used in a continuous integration system or locally to run tests via shell.") **Previous:**[Step 12: Adding a Search](Step_12_Adding_a_Search_0c270b4.md "We now add a search field to our bulletin board and define a filter that represents the search term. This is done similarly as in step 24 of the Walkthrough tutorial.") diff --git a/docs/Step_13_Testing_User_Interaction_19ccd47.md b/docs/Step_13_Testing_User_Interaction_19ccd47.md index 6ba10b91..b851ab16 100644 --- a/docs/Step_13_Testing_User_Interaction_19ccd47.md +++ b/docs/Step_13_Testing_User_Interaction_19ccd47.md @@ -30,7 +30,7 @@ You can view and download all files in the *Samples* in the Demo Kit at [Testing *** -### test/integration/journeys/PostJourney.js +### webapp/test/integration/journeys/PostJourney.js ```js sap.ui.define([ @@ -40,21 +40,25 @@ sap.ui.define([ "./pages/Post" ], function (opaTest) { "use strict"; - … - opaTest(…) { + + // … + + opaTest("Should be on the post page again when the browser's forward button is pressed", function (Given, When, Then) { // Actions When.onTheBrowser.iPressOnTheForwardButton(); - - // Assertions - Then.onThePostPage.theTitleShouldDisplayTheName("Jeans"); - }); - opaTest("Should select the statistics tab", function (Given, When, Then) { - // Actions - When.onThePostPage.iPressOnTheTabWithTheKey("statistics"); - // Assertions - Then.onThePostPage.iShouldSeeTheViewCounter() - .and.iTeardownMyApp(); - }); + + // Assertions + Then.onThePostPage.theTitleShouldDisplayTheName("Jeans"); + }); + + opaTest("Should select the statistics tab", function (Given, When, Then) { + // Actions + When.onThePostPage.iPressOnTheTabWithTheKey("statistics"); + // Assertions + Then.onThePostPage.iShouldSeeTheViewCounter() + .and.iTeardownMyApp(); + }); +}); ``` We extend the `PostJourney.js` file with a new test. It is important to move the `Teardown` to the last test, otherwise our app would be removed and the test would not be able to find the *Statistics* tab. @@ -63,7 +67,7 @@ Delete `.and.iTeardownMyApp();` from the last test in the file and add the new t *** -### test/integration/pages/Post.js +### webapp/test/integration/pages/Post.js ```js sap.ui.define([ diff --git a/docs/Step_14_Adding_Tabs_6e9c6bd.md b/docs/Step_14_Adding_Tabs_6e9c6bd.md index d6087bd6..244d50de 100644 --- a/docs/Step_14_Adding_Tabs_6e9c6bd.md +++ b/docs/Step_14_Adding_Tabs_6e9c6bd.md @@ -30,7 +30,7 @@ You can view and download all files in the *Samples* in the Demo Kit at [Testing *** -### view/Post.view.xml +### webapp/view/Post.view.xml ```xml + ### Dependency Injection: +*** + + + +### webapp/test/unit/model/DateFormatter.js + ```js sap.ui.define([ "sap/ui/demo/bulletinboard/model/DateFormatter", @@ -260,16 +265,15 @@ sap.ui.define([ this.timeFormat = DateFormat.getTimeInstance({ style: "short" }, oProperties.locale); - }, + }, format: function(oDate) { if (!oDate) { return ""; } - return this.timeFormat.format(oDate); - } - }); - } -); + return this.timeFormat.format(oDate); + } + }); +}); ``` In the implementation we use the `DateFormat` of OpenUI5 to create a short date. The locale is passed on to the `getTimeInstance` function. @@ -283,8 +287,16 @@ In the implementation we use the `DateFormat` of OpenUI5 to create a short date. *** + + ### Refactoring: +*** + + + +### webapp/test/unit/model/DateFormatter.js + ```js sap.ui.define([ "sap/ui/demo/bulletinboard/model/DateFormatter", @@ -301,14 +313,14 @@ sap.ui.define([ }); QUnit.test("Should return empty string if no date is given", function(assert) { - /*Delete in your code: var oFormatter = new DateFormatter(); - ... + // Delete in your code: var oFormatter = new DateFormatter(); + // ... }); QUnit.test("Should return time if date from today", function(assert) { - /*Delete in your code: var oFormatter = new DateFormatter({ - /*Delete in your code: locale: new Locale("en-US") - /*Delete in your code: }); - ... + // Delete in your code: var oFormatter = new DateFormatter({ + // Delete in your code: locale: new Locale("en-US") + // Delete in your code: }); + // ... }); }); ``` @@ -317,8 +329,16 @@ Our tests are running so we can start refactoring our code. Since we need the `D *** + + ### Dependency Injection to Get Independent from System Time: +*** + + + +### webapp/test/unit/model/DateFormatter.js + ```js sap.ui.define([ "sap/ui/demo/bulletinboard/model/DateFormatter", @@ -336,7 +356,7 @@ sap.ui.define([ }); } }); - ... + // ... QUnit.test("Should return 'Yesterday' if date from yesterday", function(assert) { var oDate = UI5Date.getInstance(2015, 2, 13); var sFormattedDate = oFormatter.format(oDate); @@ -369,7 +389,7 @@ sap.ui.define([ } var iElapsedDays = this._getElapsedDays(oDate); if (iElapsedDays === 0) { - return this.timeFormat.format(oDate); + return this.timeFormat.format(oDate); } else if (iElapsedDays === 1) { return "Yesterday"; } @@ -387,8 +407,16 @@ In the implementation we add a calculation for determining how many days passed. *** + + ### Boundary Testing: +*** + + + +### webapp/test/unit/model/DateFormatter.js + ```js sap.ui.define([ "sap/ui/demo/bulletinboard/model/DateFormatter", @@ -439,7 +467,7 @@ sap.ui.define([ return this.weekdayFormat.format(oDate); } } - … + ``` Now we define a new format in our constructor, the `weekdayFormat`. In the format function we apply the format if the elapsed days are smaller than 7. @@ -455,7 +483,7 @@ sap.ui.define([ "sap/ui/core/date/UI5Date" ], function(DateFormatter, Locale, UI5Date) { var oFormatter = null; - ... + // ... QUnit.test("Should return date w/o time if date > 7 days ago", function(assert) { var oDate = UI5Date.getInstance(2015, 2, 7); var sFormattedDate = oFormatter.format(oDate); @@ -500,7 +528,7 @@ In the next test we verify that the date is formatted as date without time. Agai } }, - … + ``` In the implementation, we use a different `style` property for instantiating the `dateFormat` property. We call the format of this instance for dates that are more than 6 days in the past. diff --git a/docs/Step_16_Adding_the_Date_Formatter_2ca583d.md b/docs/Step_16_Adding_the_Date_Formatter_2ca583d.md index 15429059..ae7b8688 100644 --- a/docs/Step_16_Adding_the_Date_Formatter_2ca583d.md +++ b/docs/Step_16_Adding_the_Date_Formatter_2ca583d.md @@ -65,11 +65,11 @@ On the *Info* tab we bind the date field to a format method `.formatter.date` of ```js sap.ui.define([ "sap/ui/demo/bulletinboard/model/DateFormatter" ], function (DateFormatter) { - ... + // ... return { - ... + // ... numberUnit: function(sValue) { - ... + // ... }, date: function(date) { return new DateFormatter({now: Date.now}).format(date); @@ -79,7 +79,7 @@ sap.ui.define([ "sap/ui/demo/bulletinboard/model/DateFormatter" ], function (Dat }); ``` -In the `formatter.js file`, create an instance of the previously implemented `DateFormatter` and provide the necessary dependencies. +In the `formatter.js` file, create an instance of the previously implemented `DateFormatter` and provide the necessary dependencies. Now run the app again to see that the formatter is applied on the post date of the detail page. diff --git a/docs/Step_1_Overview_and_Testing_Strategy_ab134ef.md b/docs/Step_1_Overview_and_Testing_Strategy_ab134ef.md index 27f04452..aefb8007 100644 --- a/docs/Step_1_Overview_and_Testing_Strategy_ab134ef.md +++ b/docs/Step_1_Overview_and_Testing_Strategy_ab134ef.md @@ -41,7 +41,7 @@ After downloading *Step 1*, you should have the following files: **Folder structure with downloaded files** -![](images/loio80078484830540769b67f12a6b88bbd3_HiRes.png "Folder structure with downloaded files") +![](images/loio80078484830540769b67f12a6b88bbd3_LowRes.png "Folder structure with downloaded files") *** diff --git a/docs/Step_9_Adding_the_Post_Page_4a9f063.md b/docs/Step_9_Adding_the_Post_Page_4a9f063.md index 71a640b5..a2edc4cc 100644 --- a/docs/Step_9_Adding_the_Post_Page_4a9f063.md +++ b/docs/Step_9_Adding_the_Post_Page_4a9f063.md @@ -277,5 +277,5 @@ The controller of the `Post` page needs to take care of the data binding when a **Next:**[Step 8: Testing Navigation](Step_8_Testing_Navigation_10592af.md "So far, we have a list of posts on the home page of the app. But typically, a post comes with more details that should be displayed on a separate detail page. We call it the post page because it displays details of a post. In this step we will introduce a new journey to test the post page. We write tests that trigger typical navigation events with OPA. Testing navigation greatly helps in reducing manual testing efforts as it covers a lot of testing paths. It is good practice to cover every view of your application with at least one test, since OPA will check if an exception is thrown. In this way you can detect critical errors very fast.") -**Previous:**[Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md "In this step, we will step back from our tests and application features that we have implemented so far and add another important piece of test code: The test suite page. A test suite can execute multiple tests and collect the results. This comes in handy for automatic tools in a continuous integration process.") +**Previous:**[Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md "In this step, we will step back from our tests and application features that we have implemented so far and take a closer look at another important piece of the test setup - the test automation. We will learn how to set up a basic test automation, which might be used in a continuous integration system or locally to run tests via shell.") diff --git a/docs/Testing_Tutorial_291c912.md b/docs/Testing_Tutorial_291c912.md index c046a0ba..6ef0fa65 100644 --- a/docs/Testing_Tutorial_291c912.md +++ b/docs/Testing_Tutorial_291c912.md @@ -90,11 +90,11 @@ So far, we have a list of posts on the home page of the app. But typically, a po achieve this, we have to introduce a new view/controller pair and adjust the routing of the application.") Now that we have covered all kinds of tests for navigation, we introduce our *Post* page that shows details of a post in the bulletin board. To achieve this, we have to introduce a new view/controller pair and adjust the routing of the application. -10. [Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md "In this step, we will step back from our tests and application features that we have - implemented so far and add another important piece of test code: The test suite page. A test - suite can execute multiple tests and collect the results. This comes in handy for automatic - tools in a continuous integration process.") -In this step, we will step back from our tests and application features that we have implemented so far and add another important piece of test code: The test suite page. A test suite can execute multiple tests and collect the results. This comes in handy for automatic tools in a continuous integration process. +10. [Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md "In this step, we will step back from our tests and application features that we have + implemented so far and take a closer look at another important piece of the test setup - the + test automation. We will learn how to set up a basic test automation, which might be used in + a continuous integration system or locally to run tests via shell.") +In this step, we will step back from our tests and application features that we have implemented so far and take a closer look at another important piece of the test setup - the test automation. We will learn how to set up a basic test automation, which might be used in a continuous integration system or locally to run tests via shell. 11. [Step 11: Testing User Input](Step_11_Testing_User_Input_92959b1.md "In this step, we will write a test that simulates a user search. We will enter the search string into the search field and check if the correct results are shown in worklist table.") diff --git a/docs/images/loio80078484830540769b67f12a6b88bbd3_HiRes.png b/docs/images/loio80078484830540769b67f12a6b88bbd3_HiRes.png deleted file mode 100644 index 9011b76e078f7b38f71320b2fb63c4071e4829b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18864 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 diff --git a/docs/images/loio80078484830540769b67f12a6b88bbd3_LowRes.png b/docs/images/loio80078484830540769b67f12a6b88bbd3_LowRes.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbcbe1ba9f56e5cc1a978b39f79206c90e3a997 GIT binary patch literal 28468 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 G-~I>ZCX5{b literal 0 HcmV?d00001 diff --git a/docs/images/loioa715577da0714787b4e7839cdc524991_LowRes.png b/docs/images/loioa715577da0714787b4e7839cdc524991_LowRes.png deleted file mode 100644 index b472202b0f1637cfff8249448c1c88f970f3027c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54700 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 diff --git a/docs/index.json b/docs/index.json index 6c1d8649..fc2b2cb7 100644 --- a/docs/index.json +++ b/docs/index.json @@ -806,8 +806,8 @@ "Step 9: Adding the Post Page": { "link": "Step_9_Adding_the_Post_Page_4a9f063.md" }, - "Step 10: Test Suite and Automated Testing": { - "link": "Step_10_Test_Suite_and_Automated_Testing_07c97a2.md" + "Step 10: Automated Testing": { + "link": "Step_10_Automated_Testing_07c97a2.md" }, "Step 11: Testing User Input": { "link": "Step_11_Testing_User_Input_92959b1.md" diff --git a/docs/index.md b/docs/index.md index 493f54df..fba66d6e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -263,7 +263,7 @@ OpenUI5 Version for the OpenUI5 Demo Kit - [Step 7: Changing the Table to a Growing Table](Step_7_Changing_the_Table_to_a_Growing_Table_016e0d4.md) - [Step 8: Testing Navigation](Step_8_Testing_Navigation_10592af.md) - [Step 9: Adding the Post Page](Step_9_Adding_the_Post_Page_4a9f063.md) - - [Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md) + - [Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md) - [Step 11: Testing User Input](Step_11_Testing_User_Input_92959b1.md) - [Step 12: Adding a Search](Step_12_Adding_a_Search_0c270b4.md) - [Step 13: Testing User Interaction](Step_13_Testing_User_Interaction_19ccd47.md) diff --git a/docs/sidebar.md b/docs/sidebar.md index cb36d59d..fefe7dfa 100644 --- a/docs/sidebar.md +++ b/docs/sidebar.md @@ -257,7 +257,7 @@ - [Step 7: Changing the Table to a Growing Table](Step_7_Changing_the_Table_to_a_Growing_Table_016e0d4.md) - [Step 8: Testing Navigation](Step_8_Testing_Navigation_10592af.md) - [Step 9: Adding the Post Page](Step_9_Adding_the_Post_Page_4a9f063.md) - - [Step 10: Test Suite and Automated Testing](Step_10_Test_Suite_and_Automated_Testing_07c97a2.md) + - [Step 10: Automated Testing](Step_10_Automated_Testing_07c97a2.md) - [Step 11: Testing User Input](Step_11_Testing_User_Input_92959b1.md) - [Step 12: Adding a Search](Step_12_Adding_a_Search_0c270b4.md) - [Step 13: Testing User Interaction](Step_13_Testing_User_Interaction_19ccd47.md)