@openui5/sap.ui.core 1.112.2 → 1.114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dtsgenrc +102 -1
- package/THIRDPARTY.txt +1 -1
- package/package.json +1 -1
- package/src/jquery.sap.global.js +10 -4
- package/src/jquery.sap.properties.js +1 -1
- package/src/jquery.sap.resources.js +1 -1
- package/src/jquery.sap.script.js +1 -1
- package/src/jquery.sap.storage.js +7 -7
- package/src/jquery.sap.trace.js +14 -14
- package/src/sap/base/Log.js +92 -8
- package/src/sap/base/assert.js +1 -1
- package/src/sap/base/config/MemoryConfigurationProvider.js +22 -0
- package/src/sap/base/config.js +54 -0
- package/src/sap/base/security/URLWhitelist.js +1 -1
- package/src/sap/base/util/Deferred.js +3 -2
- package/src/sap/base/util/restricted/_CancelablePromise.js +2 -2
- package/src/sap/base/util/restricted/_castArray.js +1 -1
- package/src/sap/base/util/restricted/_compact.js +1 -1
- package/src/sap/base/util/restricted/_curry.js +1 -1
- package/src/sap/base/util/restricted/_debounce.js +1 -1
- package/src/sap/base/util/restricted/_difference.js +1 -1
- package/src/sap/base/util/restricted/_differenceBy.js +1 -1
- package/src/sap/base/util/restricted/_differenceWith.js +1 -1
- package/src/sap/base/util/restricted/_flatMap.js +1 -1
- package/src/sap/base/util/restricted/_flatMapDeep.js +1 -1
- package/src/sap/base/util/restricted/_flatMapDepth.js +1 -1
- package/src/sap/base/util/restricted/_flatten.js +1 -1
- package/src/sap/base/util/restricted/_flattenDeep.js +1 -1
- package/src/sap/base/util/restricted/_flattenDepth.js +1 -1
- package/src/sap/base/util/restricted/_intersection.js +1 -1
- package/src/sap/base/util/restricted/_intersectionBy.js +1 -1
- package/src/sap/base/util/restricted/_intersectionWith.js +1 -1
- package/src/sap/base/util/restricted/_isEqual.js +1 -1
- package/src/sap/base/util/restricted/_isEqualWith.js +1 -1
- package/src/sap/base/util/restricted/_isNil.js +1 -1
- package/src/sap/base/util/restricted/_max.js +1 -1
- package/src/sap/base/util/restricted/_merge.js +1 -1
- package/src/sap/base/util/restricted/_mergeWith.js +1 -1
- package/src/sap/base/util/restricted/_min.js +1 -1
- package/src/sap/base/util/restricted/_omit.js +1 -1
- package/src/sap/base/util/restricted/_pick.js +1 -1
- package/src/sap/base/util/restricted/_pickBy.js +1 -1
- package/src/sap/base/util/restricted/_throttle.js +1 -1
- package/src/sap/base/util/restricted/_toArray.js +1 -1
- package/src/sap/base/util/restricted/_union.js +1 -1
- package/src/sap/base/util/restricted/_unionBy.js +1 -1
- package/src/sap/base/util/restricted/_unionWith.js +1 -1
- package/src/sap/base/util/restricted/_uniq.js +1 -1
- package/src/sap/base/util/restricted/_uniqBy.js +1 -1
- package/src/sap/base/util/restricted/_uniqWith.js +1 -1
- package/src/sap/base/util/restricted/_without.js +1 -1
- package/src/sap/base/util/restricted/_xor.js +1 -1
- package/src/sap/base/util/restricted/_xorBy.js +1 -1
- package/src/sap/base/util/restricted/_xorWith.js +1 -1
- package/src/sap/base/util/restricted/_zipObject.js +1 -1
- package/src/sap/base/util/restricted/_zipObjectDeep.js +1 -1
- package/src/sap/ui/Device.js +8 -3
- package/src/sap/ui/Global.js +4 -4
- package/src/sap/ui/base/BindingParser.js +79 -18
- package/src/sap/ui/base/Event.js +1 -1
- package/src/sap/ui/base/EventProvider.js +1 -1
- package/src/sap/ui/base/ExpressionParser.js +15 -5
- package/src/sap/ui/base/Interface.js +1 -1
- package/src/sap/ui/base/ManagedObject.js +16 -13
- package/src/sap/ui/base/ManagedObjectMetadata.js +35 -35
- package/src/sap/ui/base/Metadata.js +23 -12
- package/src/sap/ui/base/Object.js +1 -1
- package/src/sap/ui/base/ObjectPool.js +1 -1
- package/src/sap/ui/core/.library +1 -1
- package/src/sap/ui/core/BusyIndicator.js +4 -4
- package/src/sap/ui/core/Component.js +10 -7
- package/src/sap/ui/core/ComponentContainer.js +1 -1
- package/src/sap/ui/core/ComponentMetadata.js +3 -1
- package/src/sap/ui/core/ComponentSupport.js +1 -1
- package/src/sap/ui/core/Configuration.js +104 -45
- package/src/sap/ui/core/Control.js +23 -6
- package/src/sap/ui/core/Core.js +36 -15
- package/src/sap/ui/core/CustomData.js +1 -1
- package/src/sap/ui/core/CustomStyleClassSupport.js +5 -2
- package/src/sap/ui/core/DeclarativeSupport.js +1 -1
- package/src/sap/ui/core/Element.js +1 -1
- package/src/sap/ui/core/ElementMetadata.js +19 -4
- package/src/sap/ui/core/EnabledPropagator.js +1 -1
- package/src/sap/ui/core/EventBus.js +4 -4
- package/src/sap/ui/core/Fragment.js +1 -1
- package/src/sap/ui/core/HTML.js +1 -1
- package/src/sap/ui/core/History.js +1 -1
- package/src/sap/ui/core/Icon.js +1 -1
- package/src/sap/ui/core/IconPool.js +17 -2
- package/src/sap/ui/core/IndicationColorSupport.js +1 -1
- package/src/sap/ui/core/IntervalTrigger.js +1 -1
- package/src/sap/ui/core/InvisibleMessage.js +1 -1
- package/src/sap/ui/core/InvisibleRenderer.js +1 -1
- package/src/sap/ui/core/InvisibleText.js +1 -1
- package/src/sap/ui/core/Item.js +1 -1
- package/src/sap/ui/core/LabelEnablement.js +10 -2
- package/src/sap/ui/core/LayoutData.js +1 -1
- package/src/sap/ui/core/Lib.js +28 -2
- package/src/sap/ui/core/ListItem.js +1 -1
- package/src/sap/ui/core/LocalBusyIndicator.js +1 -1
- package/src/sap/ui/core/Locale.js +2 -2
- package/src/sap/ui/core/LocaleData.js +87 -19
- package/src/sap/ui/core/Manifest.js +5 -5
- package/src/sap/ui/core/Message.js +1 -1
- package/src/sap/ui/core/Popup.js +34 -36
- package/src/sap/ui/core/RenderManager.js +8 -2
- package/src/sap/ui/core/Renderer.js +1 -1
- package/src/sap/ui/core/Rendering.js +2 -3
- package/src/sap/ui/core/ResizeHandler.js +2 -2
- package/src/sap/ui/core/ScrollBar.js +1 -1
- package/src/sap/ui/core/SeparatorItem.js +1 -1
- package/src/sap/ui/core/Title.js +1 -1
- package/src/sap/ui/core/TooltipBase.js +1 -1
- package/src/sap/ui/core/UIArea.js +9 -2
- package/src/sap/ui/core/UIComponent.js +16 -13
- package/src/sap/ui/core/UIComponentMetadata.js +1 -1
- package/src/sap/ui/core/ValueStateSupport.js +1 -1
- package/src/sap/ui/core/VariantLayoutData.js +1 -1
- package/src/sap/ui/core/XMLComposite.js +1 -1
- package/src/sap/ui/core/XMLCompositeMetadata.js +1 -1
- package/src/sap/ui/core/XMLTemplateProcessor.js +30 -6
- package/src/sap/ui/core/cache/CacheManager.js +1 -1
- package/src/sap/ui/core/cache/LRUPersistentCache.js +1 -1
- package/src/sap/ui/core/date/CalendarUtils.js +14 -26
- package/src/sap/ui/core/date/CalendarWeekNumbering.js +32 -0
- package/src/sap/ui/core/date/UI5Date.js +14 -8
- package/src/sap/ui/core/date/UniversalDate.js +15 -53
- package/src/sap/ui/core/date/UniversalDateUtils.js +4 -4
- package/src/sap/ui/core/date/_Calendars.js +1 -1
- package/src/sap/ui/core/delegate/ItemNavigation.js +1 -1
- package/src/sap/ui/core/delegate/ScrollEnablement.js +1 -1
- package/src/sap/ui/core/dnd/DragDropBase.js +1 -1
- package/src/sap/ui/core/dnd/DragDropInfo.js +1 -1
- package/src/sap/ui/core/dnd/DragInfo.js +1 -1
- package/src/sap/ui/core/dnd/DropInfo.js +1 -1
- package/src/sap/ui/core/format/DateFormat.js +166 -59
- package/src/sap/ui/core/format/NumberFormat.js +40 -5
- package/src/sap/ui/core/format/TimezoneUtil.js +1 -1
- package/src/sap/ui/core/hyphenation/Hyphenation.js +1 -1
- package/src/sap/ui/core/library.js +3 -3
- package/src/sap/ui/core/message/ControlMessageProcessor.js +1 -1
- package/src/sap/ui/core/message/Message.js +1 -1
- package/src/sap/ui/core/message/MessageManager.js +1 -1
- package/src/sap/ui/core/message/MessageParser.js +1 -1
- package/src/sap/ui/core/message/MessageProcessor.js +1 -1
- package/src/sap/ui/core/messagebundle.properties +2 -0
- package/src/sap/ui/core/messagebundle_ar.properties +2 -1
- package/src/sap/ui/core/messagebundle_bg.properties +1 -0
- package/src/sap/ui/core/messagebundle_ca.properties +1 -0
- package/src/sap/ui/core/messagebundle_cs.properties +2 -1
- package/src/sap/ui/core/messagebundle_cy.properties +2 -1
- package/src/sap/ui/core/messagebundle_da.properties +2 -1
- package/src/sap/ui/core/messagebundle_de.properties +2 -1
- package/src/sap/ui/core/messagebundle_el.properties +2 -1
- package/src/sap/ui/core/messagebundle_en.properties +2 -1
- package/src/sap/ui/core/messagebundle_en_GB.properties +2 -1
- package/src/sap/ui/core/messagebundle_en_US_sappsd.properties +1 -0
- package/src/sap/ui/core/messagebundle_en_US_saprigi.properties +1 -0
- package/src/sap/ui/core/messagebundle_es.properties +5 -4
- package/src/sap/ui/core/messagebundle_es_MX.properties +2 -1
- package/src/sap/ui/core/messagebundle_et.properties +2 -1
- package/src/sap/ui/core/messagebundle_fi.properties +2 -1
- package/src/sap/ui/core/messagebundle_fr.properties +2 -1
- package/src/sap/ui/core/messagebundle_fr_CA.properties +2 -1
- package/src/sap/ui/core/messagebundle_hi.properties +2 -1
- package/src/sap/ui/core/messagebundle_hr.properties +2 -1
- package/src/sap/ui/core/messagebundle_hu.properties +2 -1
- package/src/sap/ui/core/messagebundle_id.properties +2 -1
- package/src/sap/ui/core/messagebundle_it.properties +2 -1
- package/src/sap/ui/core/messagebundle_iw.properties +2 -1
- package/src/sap/ui/core/messagebundle_ja.properties +1 -0
- package/src/sap/ui/core/messagebundle_kk.properties +2 -1
- package/src/sap/ui/core/messagebundle_ko.properties +2 -1
- package/src/sap/ui/core/messagebundle_lt.properties +2 -1
- package/src/sap/ui/core/messagebundle_lv.properties +2 -1
- package/src/sap/ui/core/messagebundle_ms.properties +2 -1
- package/src/sap/ui/core/messagebundle_nl.properties +2 -1
- package/src/sap/ui/core/messagebundle_no.properties +2 -1
- package/src/sap/ui/core/messagebundle_pl.properties +2 -1
- package/src/sap/ui/core/messagebundle_pt.properties +2 -1
- package/src/sap/ui/core/messagebundle_pt_PT.properties +2 -1
- package/src/sap/ui/core/messagebundle_ro.properties +2 -1
- package/src/sap/ui/core/messagebundle_ru.properties +3 -2
- package/src/sap/ui/core/messagebundle_sh.properties +2 -1
- package/src/sap/ui/core/messagebundle_sk.properties +2 -1
- package/src/sap/ui/core/messagebundle_sl.properties +2 -1
- package/src/sap/ui/core/messagebundle_sv.properties +2 -1
- package/src/sap/ui/core/messagebundle_th.properties +2 -1
- package/src/sap/ui/core/messagebundle_tr.properties +2 -1
- package/src/sap/ui/core/messagebundle_uk.properties +2 -1
- package/src/sap/ui/core/messagebundle_vi.properties +2 -1
- package/src/sap/ui/core/messagebundle_zh_CN.properties +2 -1
- package/src/sap/ui/core/messagebundle_zh_TW.properties +2 -1
- package/src/sap/ui/core/mvc/Controller.js +2 -3
- package/src/sap/ui/core/mvc/ControllerExtension.js +1 -1
- package/src/sap/ui/core/mvc/HTMLView.js +1 -1
- package/src/sap/ui/core/mvc/JSONView.js +1 -1
- package/src/sap/ui/core/mvc/JSView.js +1 -1
- package/src/sap/ui/core/mvc/TemplateView.js +1 -1
- package/src/sap/ui/core/mvc/View.js +24 -17
- package/src/sap/ui/core/mvc/XMLView.js +2 -2
- package/src/sap/ui/core/plugin/DeclarativeSupport.js +1 -1
- package/src/sap/ui/core/plugin/LessSupport.js +1 -1
- package/src/sap/ui/core/plugin/TemplatingSupport.js +1 -1
- package/src/sap/ui/core/postmessage/Bus.js +1 -1
- package/src/sap/ui/core/postmessage/confirmationDialog.js +1 -1
- package/src/sap/ui/core/routing/Route.js +30 -22
- package/src/sap/ui/core/routing/Router.js +5 -3
- package/src/sap/ui/core/routing/Target.js +170 -3
- package/src/sap/ui/core/routing/Targets.js +5 -214
- package/src/sap/ui/core/routing/Views.js +1 -1
- package/src/sap/ui/core/search/OpenSearchProvider.js +1 -1
- package/src/sap/ui/core/search/SearchProvider.js +1 -1
- package/src/sap/ui/core/service/Service.js +1 -1
- package/src/sap/ui/core/service/ServiceFactory.js +1 -1
- package/src/sap/ui/core/service/ServiceFactoryRegistry.js +1 -1
- package/src/sap/ui/core/support/Plugin.js +1 -1
- package/src/sap/ui/core/support/Support.js +1 -1
- package/src/sap/ui/core/support/controls/InteractionTree.js +5 -3
- package/src/sap/ui/core/support/plugins/Breakpoint.js +2 -2
- package/src/sap/ui/core/support/plugins/ControlTree.js +1 -1
- package/src/sap/ui/core/support/plugins/Interaction.js +6 -4
- package/src/sap/ui/core/support/plugins/LocalStorage.js +1 -1
- package/src/sap/ui/core/support/plugins/Performance.js +1 -1
- package/src/sap/ui/core/support/plugins/Selector.js +1 -1
- package/src/sap/ui/core/support/plugins/TechInfo.js +1 -1
- package/src/sap/ui/core/support/plugins/Trace.js +4 -3
- package/src/sap/ui/core/support/plugins/ViewInfo.js +1 -1
- package/src/sap/ui/core/themes/base/base.less +4358 -78
- package/src/sap/ui/core/themes/base/global.less +114 -8
- package/src/sap/ui/core/themes/sap_hcb/global.less +114 -8
- package/src/sap/ui/core/theming/Parameters.js +10 -2
- package/src/sap/ui/core/theming/ThemeManager.js +16 -12
- package/src/sap/ui/core/tmpl/DOMAttribute.js +1 -1
- package/src/sap/ui/core/tmpl/DOMElement.js +1 -1
- package/src/sap/ui/core/tmpl/HandlebarsTemplate.js +1 -1
- package/src/sap/ui/core/tmpl/Template.js +1 -1
- package/src/sap/ui/core/tmpl/TemplateControl.js +1 -1
- package/src/sap/ui/core/util/AsyncHintsHelper.js +1 -1
- package/src/sap/ui/core/util/Export.js +1 -1
- package/src/sap/ui/core/util/ExportCell.js +1 -1
- package/src/sap/ui/core/util/ExportColumn.js +1 -1
- package/src/sap/ui/core/util/ExportRow.js +1 -1
- package/src/sap/ui/core/util/ExportType.js +1 -1
- package/src/sap/ui/core/util/ExportTypeCSV.js +1 -1
- package/src/sap/ui/core/util/File.js +1 -1
- package/src/sap/ui/core/util/LibraryInfo.js +1 -1
- package/src/sap/ui/core/util/MockServer.js +1 -1
- package/src/sap/ui/core/util/PasteHelper.js +1 -1
- package/src/sap/ui/core/util/serializer/HTMLViewSerializer.js +1 -1
- package/src/sap/ui/core/util/serializer/Serializer.js +1 -1
- package/src/sap/ui/core/util/serializer/ViewSerializer.js +1 -1
- package/src/sap/ui/core/util/serializer/XMLViewSerializer.js +1 -1
- package/src/sap/ui/core/util/serializer/delegate/Delegate.js +1 -1
- package/src/sap/ui/core/util/serializer/delegate/HTML.js +1 -1
- package/src/sap/ui/core/util/serializer/delegate/XML.js +1 -1
- package/src/sap/ui/core/ws/ReadyState.js +1 -1
- package/src/sap/ui/core/ws/SapPcpWebSocket.js +1 -1
- package/src/sap/ui/core/ws/WebSocket.js +1 -1
- package/src/sap/ui/debug/ControlTree.js +1 -1
- package/src/sap/ui/debug/DebugEnv.js +1 -1
- package/src/sap/ui/debug/PropertyList.js +1 -1
- package/src/sap/ui/dom/includeScript.js +3 -3
- package/src/sap/ui/dom/includeStylesheet.js +3 -3
- package/src/sap/ui/events/ControlEvents.js +2 -2
- package/src/sap/ui/events/PseudoEvents.js +4 -2
- package/src/sap/ui/model/ClientModel.js +1 -1
- package/src/sap/ui/model/CompositeBinding.js +1 -1
- package/src/sap/ui/model/CompositeDataState.js +1 -1
- package/src/sap/ui/model/CompositeType.js +1 -1
- package/src/sap/ui/model/DataState.js +1 -1
- package/src/sap/ui/model/ManagedObjectBindingSupport.js +19 -2
- package/src/sap/ui/model/MetaModel.js +1 -1
- package/src/sap/ui/model/Model.js +1 -1
- package/src/sap/ui/model/SelectionModel.js +1 -1
- package/src/sap/ui/model/SimpleType.js +7 -3
- package/src/sap/ui/model/TreeAutoExpandMode.js +1 -1
- package/src/sap/ui/model/Type.js +1 -1
- package/src/sap/ui/model/base/ManagedObjectModel.js +12 -4
- package/src/sap/ui/model/controlhelper/TreeBindingProxy.js +2 -0
- package/src/sap/ui/model/json/JSONModel.js +1 -1
- package/src/sap/ui/model/message/MessageModel.js +1 -1
- package/src/sap/ui/model/odata/ODataAnnotations.js +1 -1
- package/src/sap/ui/model/odata/ODataMessageParser.js +1 -1
- package/src/sap/ui/model/odata/ODataMetaModel.js +1 -1
- package/src/sap/ui/model/odata/ODataMetadata.js +1 -1
- package/src/sap/ui/model/odata/ODataModel.js +1 -1
- package/src/sap/ui/model/odata/ODataTreeBindingFlat.js +1 -1
- package/src/sap/ui/model/odata/type/Boolean.js +1 -1
- package/src/sap/ui/model/odata/type/Byte.js +1 -1
- package/src/sap/ui/model/odata/type/Currency.js +1 -1
- package/src/sap/ui/model/odata/type/Date.js +67 -21
- package/src/sap/ui/model/odata/type/DateTime.js +51 -8
- package/src/sap/ui/model/odata/type/DateTimeBase.js +55 -26
- package/src/sap/ui/model/odata/type/DateTimeOffset.js +42 -1
- package/src/sap/ui/model/odata/type/DateTimeWithTimezone.js +37 -21
- package/src/sap/ui/model/odata/type/Decimal.js +28 -33
- package/src/sap/ui/model/odata/type/Double.js +21 -26
- package/src/sap/ui/model/odata/type/Guid.js +1 -1
- package/src/sap/ui/model/odata/type/Int.js +15 -20
- package/src/sap/ui/model/odata/type/Int16.js +1 -1
- package/src/sap/ui/model/odata/type/Int32.js +1 -1
- package/src/sap/ui/model/odata/type/Int64.js +16 -21
- package/src/sap/ui/model/odata/type/ODataType.js +33 -6
- package/src/sap/ui/model/odata/type/Raw.js +1 -1
- package/src/sap/ui/model/odata/type/SByte.js +1 -1
- package/src/sap/ui/model/odata/type/Single.js +20 -25
- package/src/sap/ui/model/odata/type/Stream.js +1 -1
- package/src/sap/ui/model/odata/type/String.js +1 -1
- package/src/sap/ui/model/odata/type/Time.js +91 -21
- package/src/sap/ui/model/odata/type/TimeOfDay.js +70 -24
- package/src/sap/ui/model/odata/type/Unit.js +1 -1
- package/src/sap/ui/model/odata/v2/Context.js +72 -28
- package/src/sap/ui/model/odata/v2/ODataAnnotations.js +5 -4
- package/src/sap/ui/model/odata/v2/ODataListBinding.js +29 -10
- package/src/sap/ui/model/odata/v2/ODataModel.js +92 -36
- package/src/sap/ui/model/odata/v2/ODataTreeBinding.js +8 -1
- package/src/sap/ui/model/odata/v4/Context.js +36 -21
- package/src/sap/ui/model/odata/v4/ODataBinding.js +50 -21
- package/src/sap/ui/model/odata/v4/ODataContextBinding.js +7 -25
- package/src/sap/ui/model/odata/v4/ODataListBinding.js +208 -74
- package/src/sap/ui/model/odata/v4/ODataMetaModel.js +4 -1
- package/src/sap/ui/model/odata/v4/ODataModel.js +4 -3
- package/src/sap/ui/model/odata/v4/ODataParentBinding.js +42 -28
- package/src/sap/ui/model/odata/v4/ODataPropertyBinding.js +1 -1
- package/src/sap/ui/model/odata/v4/lib/_AggregationCache.js +100 -21
- package/src/sap/ui/model/odata/v4/lib/_AggregationHelper.js +1 -1
- package/src/sap/ui/model/odata/v4/lib/_Cache.js +99 -64
- package/src/sap/ui/model/odata/v4/lib/_Helper.js +75 -2
- package/src/sap/ui/model/odata/v4/lib/_Requestor.js +6 -0
- package/src/sap/ui/model/odata/v4/lib/_V2Requestor.js +3 -0
- package/src/sap/ui/model/resource/ResourceModel.js +1 -1
- package/src/sap/ui/model/type/Boolean.js +1 -1
- package/src/sap/ui/model/type/Currency.js +1 -1
- package/src/sap/ui/model/type/Date.js +15 -1
- package/src/sap/ui/model/type/DateInterval.js +15 -1
- package/src/sap/ui/model/type/DateTime.js +1 -1
- package/src/sap/ui/model/type/DateTimeInterval.js +1 -1
- package/src/sap/ui/model/type/FileSize.js +1 -1
- package/src/sap/ui/model/type/Float.js +1 -1
- package/src/sap/ui/model/type/Integer.js +1 -1
- package/src/sap/ui/model/type/String.js +1 -1
- package/src/sap/ui/model/type/Time.js +1 -1
- package/src/sap/ui/model/type/TimeInterval.js +1 -1
- package/src/sap/ui/model/type/Unit.js +1 -1
- package/src/sap/ui/model/xml/XMLModel.js +1 -1
- package/src/sap/ui/performance/Measurement.js +9 -9
- package/src/sap/ui/performance/trace/Interaction.js +50 -4
- package/src/sap/ui/performance/trace/initTraces.js +20 -14
- package/src/sap/ui/qunit/qunit-coverage-istanbul.js +180 -0
- package/src/sap/ui/qunit/qunit-coverage.js +9 -4
- package/src/sap/ui/qunit/utils/ControlIterator.js +1 -1
- package/src/sap/ui/qunit/utils/MemoryLeakCheck.js +1 -1
- package/src/sap/ui/test/Opa.js +54 -21
- package/src/sap/ui/test/Opa5.js +181 -131
- package/src/sap/ui/test/OpaBuilder.js +106 -73
- package/src/sap/ui/test/OpaPlugin.js +27 -28
- package/src/sap/ui/test/PageObjectFactory.js +17 -7
- package/src/sap/ui/test/RecordReplay.js +7 -3
- package/src/sap/ui/test/_ParameterValidator.js +3 -3
- package/src/sap/ui/test/_UsageReport.js +3 -3
- package/src/sap/ui/test/_ValidationParameters.js +8 -10
- package/src/sap/ui/test/actions/Action.js +3 -3
- package/src/sap/ui/test/actions/EnterText.js +3 -2
- package/src/sap/ui/test/actions/Press.js +4 -4
- package/src/sap/ui/test/autowaiter/WaiterBase.js +5 -3
- package/src/sap/ui/test/autowaiter/_autoWaiter.js +6 -3
- package/src/sap/ui/test/autowaiter/_cssAnimationWaiter.js +3 -3
- package/src/sap/ui/test/autowaiter/_cssTransitionWaiter.js +3 -3
- package/src/sap/ui/test/autowaiter/_fetchWaiter.js +73 -0
- package/src/sap/ui/test/autowaiter/_moduleWaiter.js +2 -2
- package/src/sap/ui/test/autowaiter/_promiseWaiter.js +4 -4
- package/src/sap/ui/test/autowaiter/_resourceWaiter.js +2 -2
- package/src/sap/ui/test/autowaiter/_timeoutWaiter.js +4 -4
- package/src/sap/ui/test/generic/TestBase.js +1 -1
- package/src/sap/ui/test/generic/_EnforceSemanticRendering.js +3 -1
- package/src/sap/ui/test/gherkin/GherkinTestGenerator.js +424 -423
- package/src/sap/ui/test/gherkin/StepDefinitions.js +160 -158
- package/src/sap/ui/test/gherkin/dataTableUtils.js +387 -385
- package/src/sap/ui/test/gherkin/opa5TestHarness.js +188 -189
- package/src/sap/ui/test/gherkin/qUnitTestHarness.js +74 -71
- package/src/sap/ui/test/gherkin/simpleGherkinParser.js +195 -193
- package/src/sap/ui/test/launchers/componentLauncher.js +11 -9
- package/src/sap/ui/test/launchers/iFrameLauncher.js +34 -20
- package/src/sap/ui/test/matchers/Descendant.js +1 -1
- package/src/sap/ui/test/matchers/Interactable.js +2 -2
- package/src/sap/ui/test/matchers/LabelFor.js +2 -2
- package/src/sap/ui/test/matchers/MatcherFactory.js +10 -9
- package/src/sap/ui/test/matchers/Properties.js +5 -4
- package/src/sap/ui/test/matchers/Sibling.js +1 -1
- package/src/sap/ui/test/matchers/matchers.js +35 -3
- package/src/sap/ui/test/pipelines/PipelineFactory.js +2 -2
- package/src/sap/ui/test/qunitPause.js +3 -2
- package/src/sap/ui/test/starter/_configureLoader.js +7 -5
- package/src/sap/ui/test/starter/_setupAndStart.js +113 -27
- package/src/sap/ui/test/starter/_utils.js +4 -1
- package/src/sap/ui/util/Mobile.js +8 -1
- package/src/sap/ui/util/Storage.js +1 -1
- package/src/ui5loader-autoconfig.js +661 -49
- package/src/ui5loader.js +18 -5
|
@@ -5,430 +5,431 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
sap.ui.define([
|
|
8
|
+
"sap/base/util/deepExtend",
|
|
9
|
+
"sap/base/util/each",
|
|
8
10
|
"sap/ui/base/Object",
|
|
9
11
|
"sap/ui/test/gherkin/dataTableUtils",
|
|
10
12
|
"sap/ui/test/gherkin/simpleGherkinParser",
|
|
11
|
-
"sap/base/strings/escapeRegExp"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
return GherkinTestGenerator;
|
|
13
|
+
"sap/base/strings/escapeRegExp"
|
|
14
|
+
], function(deepExtend, each, UI5Object, dataTableUtils, simpleGherkinParser, escapeRegExp) {
|
|
15
|
+
"use strict";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Generates a generic FeatureTest object based on a Gherkin feature file and a steps definition object. This
|
|
19
|
+
* FeatureTest object can then be used to easily generate tests in any test framework, e.g. QUnit.
|
|
20
|
+
*
|
|
21
|
+
* Full details on how Gherkin is supposed to work are provided on the Gherkin home page:
|
|
22
|
+
* https://github.com/cucumber/cucumber/wiki/Gherkin
|
|
23
|
+
*
|
|
24
|
+
* The standard implementation of Gherkin is in Ruby. This is a JavaScript implementation for English only.
|
|
25
|
+
*
|
|
26
|
+
* This class generates a FeatureTest object. The FeatureTest object is composed of a series of TestScenarios, each of
|
|
27
|
+
* which is composed of a series of TestSteps. Each TestStep is created by matching a Gherkin test step with a step
|
|
28
|
+
* definition.
|
|
29
|
+
*
|
|
30
|
+
* A FeatureTest object looks like this:
|
|
31
|
+
* <pre>
|
|
32
|
+
* { // {FeatureTest} an executable object for testing a Gherkin feature
|
|
33
|
+
* name: "Feature: Serve expensive coffee", // {string} the feature name from the Gherkin file
|
|
34
|
+
* skip: false, // {boolean} true if the feature should not be executed
|
|
35
|
+
* wip: false, // {boolean} true if the feature is a work in progress
|
|
36
|
+
* testScenarios: [{ // {[TestScenario]} test scenarios to be run in this FeatureTest
|
|
37
|
+
* name: "Scenario: Buy first coffee", // {string} the scenario name from the Gherkin file
|
|
38
|
+
* skip: false, // {boolean} true if the scenario should not be executed
|
|
39
|
+
* wip: false, // {boolean} true if the scenario is a work in progress
|
|
40
|
+
* testSteps: [{ // {[TestStep]} test steps that are part of this TestScenario
|
|
41
|
+
* isMatch: true, // {boolean} true if the Gherkin scenario matched a step definition
|
|
42
|
+
* skip: false, // {boolean} true if the test step should not be executed
|
|
43
|
+
* text: "coffee costs $18 per cup", // {string} the test step's text as defined in the Gherkin file
|
|
44
|
+
* regex: /regex/, // {RegExp} the matching regular expression from step definitions
|
|
45
|
+
* parameters: [], // {[object]} parameters derived from regular expression match
|
|
46
|
+
* func: function(){} // {function} the matching step definition function
|
|
47
|
+
* },{
|
|
48
|
+
* isMatch: true,
|
|
49
|
+
* skip: false,
|
|
50
|
+
* text: "I should be served a coffee",
|
|
51
|
+
* regex: /regex/,
|
|
52
|
+
* parameters: [],
|
|
53
|
+
* func: function(){}
|
|
54
|
+
* }]},{
|
|
55
|
+
* name: "Scenario: Buy second coffee",
|
|
56
|
+
* skip: false,
|
|
57
|
+
* wip: false,
|
|
58
|
+
* testSteps: [{
|
|
59
|
+
* isMatch: true,
|
|
60
|
+
* skip: false,
|
|
61
|
+
* text: "coffee costs $18 per cup",
|
|
62
|
+
* regex: /regex/,
|
|
63
|
+
* parameters: [],
|
|
64
|
+
* func: function(){}
|
|
65
|
+
* },{
|
|
66
|
+
* isMatch: true,
|
|
67
|
+
* skip: false,
|
|
68
|
+
* text: "I should be served a second coffee",
|
|
69
|
+
* regex: /regex/,
|
|
70
|
+
* parameters: [],
|
|
71
|
+
* func: function(){}
|
|
72
|
+
* }]}]
|
|
73
|
+
* }
|
|
74
|
+
* </pre>
|
|
75
|
+
*
|
|
76
|
+
* @param {(object|string)} vFeature - a feature object generated by sap.ui.test.gherkin.simpleGherkinParser.
|
|
77
|
+
* Alternatively, this could be the {string} path pointing to a feature file.
|
|
78
|
+
* @param {function} fnStepDefsConstructor - the constructor for a child class of type
|
|
79
|
+
* sap.ui.test.gherkin.StepDefinitions
|
|
80
|
+
* @param {function} [fnAlternateTestStepGenerator] - Optional. If it's specified, this function will be executed
|
|
81
|
+
* whenever a Gherkin test step has no matching Step Definition. The
|
|
82
|
+
* function accepts one parameter, a Gherkin test step object with
|
|
83
|
+
* two {string} attributes "text" and "keyword". The function
|
|
84
|
+
* returns a TestStep object, as defined above. It is the function
|
|
85
|
+
* writer's responsibility to prepend "(NOT FOUND)" to the "text" if
|
|
86
|
+
* the attribute "isMatch" is set to "false".
|
|
87
|
+
*
|
|
88
|
+
* @class
|
|
89
|
+
* @author Rodrigo Jordao
|
|
90
|
+
* @author Jonathan Benn
|
|
91
|
+
* @extends sap.ui.base.Object
|
|
92
|
+
* @alias sap.ui.test.gherkin.GherkinTestGenerator
|
|
93
|
+
* @since 1.40
|
|
94
|
+
* @private
|
|
95
|
+
*/
|
|
96
|
+
var GherkinTestGenerator = UI5Object.extend("sap.ui.test.gherkin.GherkinTestGenerator",
|
|
97
|
+
/** @lends sap.ui.test.gherkin.GherkinTestGenerator.prototype */ {
|
|
98
|
+
|
|
99
|
+
constructor : function(vFeature, fnStepDefsConstructor, fnAlternateTestStepGenerator) {
|
|
100
|
+
UI5Object.apply(this, arguments);
|
|
101
|
+
|
|
102
|
+
if (typeof vFeature === "string" || vFeature instanceof String) {
|
|
103
|
+
vFeature = simpleGherkinParser.parseFile(vFeature);
|
|
104
|
+
|
|
105
|
+
// else if the type is not a String and not a Feature object (or not given)
|
|
106
|
+
} else if (!vFeature || (typeof vFeature !== "object") || !vFeature.scenarios) {
|
|
107
|
+
throw new Error("GherkinTestGenerator constructor: parameter 'vFeature' must be a valid String or a valid Feature object");
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if ((typeof fnStepDefsConstructor !== "function") || !((new fnStepDefsConstructor())._generateTestStep)) {
|
|
111
|
+
throw new Error("GherkinTestGenerator constructor: parameter 'fnStepDefsConstructor' must be a valid StepDefinitions constructor");
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (fnAlternateTestStepGenerator && typeof fnAlternateTestStepGenerator !== "function") {
|
|
115
|
+
throw new Error("GherkinTestGenerator constructor: if specified, parameter 'fnAlternateTestStepGenerator' must be a valid Function");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* {Feature} a feature object generated by sap.ui.test.gherkin.simpleGherkinParser
|
|
120
|
+
*
|
|
121
|
+
* @see sap.ui.test.gherkin.simpleGherkinParser
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
this._oFeature = vFeature;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* {function} the constructor for a child class of type sap.ui.test.gherkin.StepDefinitions
|
|
128
|
+
*
|
|
129
|
+
* @see sap.ui.test.gherkin.StepDefinitions
|
|
130
|
+
* @private
|
|
131
|
+
*/
|
|
132
|
+
this._fnStepDefsConstructor = fnStepDefsConstructor;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* {StepDefinitions} the concrete StepDefinitions object that holds an array of step definitions
|
|
136
|
+
*
|
|
137
|
+
* @see sap.ui.test.gherkin.StepDefinitions
|
|
138
|
+
* @private
|
|
139
|
+
*/
|
|
140
|
+
this._oStepDefs = null;
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* {function} generates and returns a TestStep object. If this function is defined, it will be executed whenever
|
|
144
|
+
* we fail to find a matching Step Definition for a Gherkin step.
|
|
145
|
+
*
|
|
146
|
+
* @private
|
|
147
|
+
*/
|
|
148
|
+
this._fnAlternateTestStepGenerator = fnAlternateTestStepGenerator || null;
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Creates a new shared context for running tests. Execute this method before testing a new scenario.
|
|
153
|
+
*
|
|
154
|
+
* @public
|
|
155
|
+
*/
|
|
156
|
+
setUp: function() {
|
|
157
|
+
this._oStepDefs = new this._fnStepDefsConstructor();
|
|
158
|
+
},
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* If any tests were run, executes the Step Definitions' "closeApplication" method. Also clears the shared
|
|
162
|
+
* context for running tests.
|
|
163
|
+
*
|
|
164
|
+
* @public
|
|
165
|
+
*/
|
|
166
|
+
tearDown: function() {
|
|
167
|
+
if (this._oStepDefs && this._oStepDefs._needsTearDown) {
|
|
168
|
+
this._oStepDefs.closeApplication();
|
|
169
|
+
}
|
|
170
|
+
this._oStepDefs = null;
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Creates a FeatureTest object, which is generated by stitching together the Gherkin Feature File and Step
|
|
175
|
+
* Definitions file inputed to the constructor.
|
|
176
|
+
*
|
|
177
|
+
* @returns {FeatureTest} an executable test object
|
|
178
|
+
* @public
|
|
179
|
+
*/
|
|
180
|
+
generate : function() {
|
|
181
|
+
if (!this._oStepDefs) {
|
|
182
|
+
this.setUp();
|
|
183
|
+
}
|
|
184
|
+
return this._generateFeatureTest();
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Executes the given TestStep in the shared context of the Step Definitions, with the correct parameters. The
|
|
189
|
+
* TestStep will not be executed if it should be skipped, in which case this method will return "false".
|
|
190
|
+
*
|
|
191
|
+
* @param {TestStep} oTestStep - the test step to execute, obtained from the result of "generate".
|
|
192
|
+
* @param {boolean} oTestStep.skip - false if the test step should be executed, otherwise true
|
|
193
|
+
* @param {function} [oTestStep.func] - the step definition function to execute (ignored if "oTestStep.skip" is
|
|
194
|
+
* true)
|
|
195
|
+
* @param {any[]} [oTestStep.parameters] - the parameters to pass to "oTestStep.func" during its execution
|
|
196
|
+
* (ignored if "oTestStep.skip" is true)
|
|
197
|
+
* @param {object} [assert] - (optional) the QUnit local assert object for this test
|
|
198
|
+
* @returns {boolean} true if the test step was executed, otherwise false
|
|
199
|
+
* @throws {Error} if you attempt to call this method before calling "generate" or after calling "tearDown", or if
|
|
200
|
+
* oTestStep is an invalid TestStep object
|
|
201
|
+
* @public
|
|
202
|
+
*/
|
|
203
|
+
execute: function(oTestStep, assert) {
|
|
204
|
+
if (!this._oStepDefs) {
|
|
205
|
+
throw new Error("Run 'generate' before calling 'execute'");
|
|
206
|
+
}
|
|
207
|
+
if (!oTestStep ||
|
|
208
|
+
(!oTestStep.skip && ((typeof oTestStep.func !== "function") || !Array.isArray(oTestStep.parameters)))) {
|
|
209
|
+
throw new Error("Input parameter 'oTestStep' is not a valid TestStep object.");
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// If this test step should not be skipped
|
|
213
|
+
if (!oTestStep.skip) {
|
|
214
|
+
// then execute the test step in the Step Definitions shared context
|
|
215
|
+
this._oStepDefs.assert = assert;
|
|
216
|
+
oTestStep.func.apply(this._oStepDefs, oTestStep.parameters);
|
|
217
|
+
this._oStepDefs._needsTearDown = true;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return (!oTestStep.skip);
|
|
221
|
+
},
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Creates an executable feature test, composed of 0 or more test scenarios, each of which is composed of 0 or more
|
|
225
|
+
* basic test steps. The generated feature test is based on Gherkin document and step definitions fed into the
|
|
226
|
+
* constructor.
|
|
227
|
+
*
|
|
228
|
+
* @private
|
|
229
|
+
*/
|
|
230
|
+
_generateFeatureTest: function() {
|
|
231
|
+
|
|
232
|
+
var aExpandedScenarios = [];
|
|
233
|
+
this._oFeature.scenarios.forEach(function(oScenario) {
|
|
234
|
+
aExpandedScenarios = aExpandedScenarios.concat(this._expandScenarioOutline(oScenario));
|
|
235
|
+
}, this);
|
|
236
|
+
|
|
237
|
+
var aTestScenarios = aExpandedScenarios.map(function(oScenario) {
|
|
238
|
+
return this._generateTestScenario(oScenario, this._oFeature.background);
|
|
239
|
+
}, this);
|
|
240
|
+
|
|
241
|
+
var bFeatureIsWip = this._isWip(this._oFeature);
|
|
242
|
+
var bAllScenariosAreSkipped = aTestScenarios.every(function(oTestScenario) {return oTestScenario.skip;});
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
name: ((bFeatureIsWip) ? "(WIP) " : "") + "Feature: " + this._oFeature.name,
|
|
246
|
+
skip: bFeatureIsWip || bAllScenariosAreSkipped,
|
|
247
|
+
wip: bFeatureIsWip,
|
|
248
|
+
testScenarios: aTestScenarios
|
|
249
|
+
};
|
|
250
|
+
},
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Expands a scenario outline into 1 or more concrete scenarios (one concrete scenario for each line in the examples).
|
|
254
|
+
*
|
|
255
|
+
* Each concrete scenario will have ": <Examples name> #1", ": <Examples name> #2", etc. appended to its text to
|
|
256
|
+
* differentiate it.
|
|
257
|
+
*
|
|
258
|
+
* @param {Scenario} oScenario - a Gherkin scenario that may or may not be a scenario outline
|
|
259
|
+
* @returns {Scenario[]} - an array of 1 or more scenarios. If the input was a scenario outline, then the output
|
|
260
|
+
* is an array of 1 or more concrete scenarios that implement that outline. One concrete
|
|
261
|
+
* scenario is generated per example line specified in the feature file. If the input was a
|
|
262
|
+
* regular scenario, then the return value is an array with 1 element: the inputed
|
|
263
|
+
* scenario.
|
|
264
|
+
* @private
|
|
265
|
+
*/
|
|
266
|
+
_expandScenarioOutline: function(oScenario) {
|
|
267
|
+
|
|
268
|
+
// if this is not a scenario outline OR it's a scenario outline with no active Examples
|
|
269
|
+
if (!this._isScenarioOutlineWithExamples(oScenario)) {
|
|
270
|
+
// then don't change anything
|
|
271
|
+
return [oScenario];
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// else this is a scenario outline with at least one set of Examples
|
|
275
|
+
var aConcreteScenarios = [];
|
|
276
|
+
|
|
277
|
+
// for each set of active Examples in the Scenario Outline
|
|
278
|
+
oScenario.examples.filter(this._isNotWip).forEach(function(oExample, i) {
|
|
279
|
+
|
|
280
|
+
var aConvertedExamples = this._convertScenarioExamplesToListOfObjects(oExample.data);
|
|
281
|
+
|
|
282
|
+
// create a concrete scenario from each example in the Examples
|
|
283
|
+
aConcreteScenarios = aConcreteScenarios.concat(aConvertedExamples.map(function(oConvertedExample, i) {
|
|
284
|
+
|
|
285
|
+
var oScenarioCopy = deepExtend({}, oScenario);
|
|
286
|
+
oScenarioCopy.name += (oExample.name) ? ": " + oExample.name : "";
|
|
287
|
+
oScenarioCopy.name += " #" + (i + 1);
|
|
288
|
+
|
|
289
|
+
// for each variable specified for this concrete example
|
|
290
|
+
each(oConvertedExample, function(sVariableName, sVariableValue) {
|
|
291
|
+
|
|
292
|
+
// for each test step in the scenario
|
|
293
|
+
oScenarioCopy.steps.forEach(function(oStep) {
|
|
294
|
+
// in the scenario text, replace all occurences of the variable with the concrete value
|
|
295
|
+
var sEscapedVariableName = escapeRegExp(sVariableName);
|
|
296
|
+
oStep.text = oStep.text.replace(new RegExp("<" + sEscapedVariableName + ">", "g"), sVariableValue);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
return oScenarioCopy;
|
|
301
|
+
}, this));
|
|
302
|
+
|
|
303
|
+
}, this);
|
|
304
|
+
|
|
305
|
+
return aConcreteScenarios;
|
|
306
|
+
},
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Prepares an executable test scenario based on a Gherkin document's scenario.
|
|
310
|
+
*
|
|
311
|
+
* @param {Scenario} oScenario - the Gherkin scenario for which to generate tests
|
|
312
|
+
* @param {Scenario} [oBackground] - the Gherkin background scenario that must be run before each regular scenario
|
|
313
|
+
* @returns {TestScenario} - the test scenario to be executed during testing
|
|
314
|
+
* @see sap.ui.test.gherkin.simpleGherkinParser#parse
|
|
315
|
+
* @private
|
|
316
|
+
*/
|
|
317
|
+
_generateTestScenario: function(oScenario, oBackground) {
|
|
318
|
+
var bWip = this._isWip(oScenario);
|
|
319
|
+
var sScenarioPrependText = this._isScenarioOutline(oScenario) ? "Scenario Outline: " : "Scenario: ";
|
|
320
|
+
var sScenarioName = (bWip ? "(WIP) " : "") + sScenarioPrependText + oScenario.name;
|
|
321
|
+
var aTestSteps = (oBackground) ? this._generateTestSteps(bWip, oBackground, false) : [];
|
|
322
|
+
var bNoActiveExamples = this._isScenarioOutline(oScenario) && !this._isScenarioOutlineWithExamples(oScenario);
|
|
323
|
+
var bSkip = bNoActiveExamples || aTestSteps.some(function(o) {return !o.isMatch;});
|
|
324
|
+
|
|
325
|
+
aTestSteps = aTestSteps.concat(this._generateTestSteps(bWip, oScenario, bSkip));
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
name: sScenarioName,
|
|
329
|
+
skip: bWip || bNoActiveExamples || aTestSteps.every(function(o) {return o.skip && o.isMatch;}),
|
|
330
|
+
wip: bWip,
|
|
331
|
+
testSteps: aTestSteps
|
|
332
|
+
};
|
|
333
|
+
},
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Creates all the tests for all of the given scenario's steps. It does this by stitching together the Gherkin
|
|
337
|
+
* specification's steps with the JavaScript step definitions. If any Gherkin step cannot be matched to a
|
|
338
|
+
* JavaScript step definition then that test and all remaining tests will be skipped.
|
|
339
|
+
*
|
|
340
|
+
* If the _fnAlternateTestStepGenerator is defined then it will be used to generate a TestStep if we fail to match
|
|
341
|
+
* a step definition.
|
|
342
|
+
*
|
|
343
|
+
* @param {boolean} bIsWip - true if this test is a work in progress that should be skipped
|
|
344
|
+
* @param {Scenario} oScenario - the Gherkin scenario on which to base these generated tests
|
|
345
|
+
* @param {boolean} bSkipping - true if this scenario and all of its steps should be skipped (e.g. because the
|
|
346
|
+
* background step was not found)
|
|
347
|
+
* @returns {TestStep[]} - the list of test step objects to be executed during testing
|
|
348
|
+
* @see sap.ui.test.gherkin.simpleGherkinParser#parse
|
|
349
|
+
* @private
|
|
350
|
+
*/
|
|
351
|
+
_generateTestSteps: function(bIsWip, oScenario, bSkipping) {
|
|
352
|
+
|
|
353
|
+
var aTestSteps = [];
|
|
354
|
+
|
|
355
|
+
for (var i = 0; i < oScenario.steps.length; ++i) {
|
|
356
|
+
var oStep = oScenario.steps[i];
|
|
357
|
+
var oTestStep = this._oStepDefs._generateTestStep(oStep);
|
|
358
|
+
|
|
359
|
+
// if there is no matching regular expression and there is an alternate TestStep generator
|
|
360
|
+
if (!oTestStep.isMatch && this._fnAlternateTestStepGenerator) {
|
|
361
|
+
// then use the alternate function to generate a TestStep
|
|
362
|
+
oTestStep = this._fnAlternateTestStepGenerator(oStep);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// If there is still not a match
|
|
366
|
+
if (!oTestStep.isMatch) {
|
|
367
|
+
// then we will skip this and all future test steps
|
|
368
|
+
bSkipping = true;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
oTestStep.skip = bSkipping || bIsWip;
|
|
372
|
+
if (oTestStep.isMatch && oTestStep.skip) {
|
|
373
|
+
oTestStep.text = "(SKIPPED) " + oTestStep.text;
|
|
374
|
+
}
|
|
375
|
+
aTestSteps.push(oTestStep);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return aTestSteps;
|
|
379
|
+
},
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Converts the given scenario outline examples into a list of objects
|
|
383
|
+
*
|
|
384
|
+
* @param {string[]} aExamples - scenario outline examples, can be a 1D or 2D array
|
|
385
|
+
* @returns {object[]} - a list of objects equivalent to the input data
|
|
386
|
+
* @see sap.ui.test.gherkin.dataTableUtils.toTable
|
|
387
|
+
* @private
|
|
388
|
+
*/
|
|
389
|
+
_convertScenarioExamplesToListOfObjects: function(aExamples) {
|
|
390
|
+
// if aExamples is a simple list then convert from simple list to list-of-lists before executing toTable
|
|
391
|
+
aExamples = aExamples.map(function(i){return (typeof i === "string" || i instanceof String) ? [i] : i;});
|
|
392
|
+
return dataTableUtils.toTable(aExamples);
|
|
393
|
+
},
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* @param {Scenario} oScenario - a Gherkin scenario (as created by the parser)
|
|
398
|
+
* @returns true if the given scenario is a scenario outline
|
|
399
|
+
* @private
|
|
400
|
+
*/
|
|
401
|
+
_isScenarioOutline: function(oScenario) {
|
|
402
|
+
return !!oScenario.examples;
|
|
403
|
+
},
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* @param {Scenario} oScenario - a Gherkin scenario (as created by the parser)
|
|
407
|
+
* @returns true if the given scenario is a scenario outline AND it has active (non-WIP) Examples
|
|
408
|
+
* @private
|
|
409
|
+
*/
|
|
410
|
+
_isScenarioOutlineWithExamples: function(oScenario) {
|
|
411
|
+
return !!oScenario.examples && (oScenario.examples.length !== 0) && oScenario.examples.some(this._isNotWip);
|
|
412
|
+
},
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* @param {object} oObject - any object with a 'tags' attribute (tags are of type array)
|
|
416
|
+
* @returns true if the given oObject does not have an '@wip' tag
|
|
417
|
+
* @private
|
|
418
|
+
*/
|
|
419
|
+
_isNotWip: function(oObject) {
|
|
420
|
+
return (oObject.tags == null || !oObject.tags.includes("@wip", oObject.tags));
|
|
421
|
+
},
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* @param {object} oObject - any object with a 'tags' attribute (tags are of type array)
|
|
425
|
+
* @returns true if the given oObject has an '@wip' tag
|
|
426
|
+
* @private
|
|
427
|
+
*/
|
|
428
|
+
_isWip: function(oObject) {
|
|
429
|
+
return !this._isNotWip(oObject);
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
return GherkinTestGenerator;
|
|
434
435
|
});
|