From ccfa2e2585dd93e6360c5ba3ca4fb631fddb8989 Mon Sep 17 00:00:00 2001 From: oblomov <102328295+oblomov-dev@users.noreply.github.com> Date: Thu, 27 Apr 2023 18:34:51 +0200 Subject: [PATCH] unit tests and bugfixes (#199) * unit tests * unit test * frontend messages update * scroll function * scroll * bugs scrolling * bugfix value help * abaplint fixes * unit tests * unit tests * unit tests * unit tests --- src/00/z2ui5_cl_app_demo_09.clas.abap | 2 +- src/00/z2ui5_cl_app_demo_10.clas.abap | 2 +- src/00/z2ui5_cl_app_demo_22.clas.abap | 38 +- src/z2ui5_cl_http_handler.clas.abap | 51 +- ...z2ui5_cl_http_handler.clas.locals_imp.abap | 280 ++------ ...2ui5_cl_http_handler.clas.testclasses.abap | 644 ++++++++++++++++-- src/z2ui5_if_client.intf.abap | 1 + 7 files changed, 696 insertions(+), 322 deletions(-) diff --git a/src/00/z2ui5_cl_app_demo_09.clas.abap b/src/00/z2ui5_cl_app_demo_09.clas.abap index 737cec2c..7ce91969 100644 --- a/src/00/z2ui5_cl_app_demo_09.clas.abap +++ b/src/00/z2ui5_cl_app_demo_09.clas.abap @@ -207,7 +207,7 @@ CLASS Z2UI5_CL_APP_DEMO_09 IMPLEMENTATION. METHOD z2ui5_on_rendering. - DATA(page) = Z2UI5_CL_XML_VIEW=>factory( + DATA(page) = Z2UI5_CL_XML_VIEW=>factory( )->shell( )->page( title = 'abap2UI5 - Value Help Examples' navbuttonpress = client->_event( 'BACK' ) diff --git a/src/00/z2ui5_cl_app_demo_10.clas.abap b/src/00/z2ui5_cl_app_demo_10.clas.abap index 80b46d34..be78e224 100644 --- a/src/00/z2ui5_cl_app_demo_10.clas.abap +++ b/src/00/z2ui5_cl_app_demo_10.clas.abap @@ -19,7 +19,7 @@ CLASS Z2UI5_CL_APP_DEMO_10 IMPLEMENTATION. client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). ENDCASE. - DATA(page) = Z2UI5_CL_XML_VIEW=>factory( + DATA(page) = Z2UI5_CL_XML_VIEW=>factory( )->shell( )->page( title = 'abap2UI5 - Demo Layout' navbuttonpress = client->_event( 'BACK' ) diff --git a/src/00/z2ui5_cl_app_demo_22.clas.abap b/src/00/z2ui5_cl_app_demo_22.clas.abap index 3a704e66..7f532943 100644 --- a/src/00/z2ui5_cl_app_demo_22.clas.abap +++ b/src/00/z2ui5_cl_app_demo_22.clas.abap @@ -34,14 +34,13 @@ ENDCLASS. -CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION. +CLASS z2ui5_cl_app_demo_22 IMPLEMENTATION. METHOD z2ui5_if_app~main. app-client = client. app-s_get = client->get( ). - app-view_popup = ``. IF app-check_initialized = abap_false. app-check_initialized = abap_true. @@ -60,6 +59,11 @@ CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION. ENDIF. + app-s_next-t_scroll_pos = VALUE #( + ( name = 'id_page' ) + ( name = 'id_text3' ) + ). + CASE client->get( )-event. WHEN 'BUTTON_SCROLL_TOP'. @@ -68,15 +72,16 @@ CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION. WHEN 'BUTTON_SCROLL_BOTTOM'. app-s_next-t_scroll_pos = VALUE #( ( name = 'id_page' value = '99999' ) ). - " WHEN 'BUTTON_SCROLL_UP'. - " DATA(lv_pos) = client->get( )-page_scroll_pos - 500. - " client->set( page_scroll_pos = COND #( WHEN lv_pos < 0 THEN 0 ELSE lv_pos ) ). + WHEN 'BUTTON_SCROLL_UP'. + DATA(lv_pos) = CONV i( app-s_get-t_scroll_pos[ name = `id_page` ]-value ) - 500. + app-s_next-t_scroll_pos = VALUE #( ( name = 'id_page' value = lv_pos ) ). - " WHEN 'BUTTON_SCROLL_DOWN'. - " client->set( page_scroll_pos = client->get( )-page_scroll_pos + 500 ). + WHEN 'BUTTON_SCROLL_DOWN'. + lv_pos = CONV i( app-s_get-t_scroll_pos[ name = `id_page` ]-value ) + 500. + app-s_next-t_scroll_pos = VALUE #( ( name = 'id_page' value = lv_pos ) ). - " WHEN 'BUTTON_SCROLL_HOLD'. - " client->set( page_scroll_pos = client->get( )-page_scroll_pos ). + WHEN 'BUTTON_SCROLL_HOLD'. + app-s_next-t_scroll_pos = app-s_get-t_scroll_pos. WHEN 'BUTTON_FOCUS_FIRST'. app-s_next-s_cursor_pos = VALUE #( id = 'id_text1' cursorpos = '3' selectionstart = '3' selectionend = '3' ). @@ -100,7 +105,7 @@ CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION. ENDCASE. - DATA(view) = Z2UI5_CL_XML_VIEW=>factory( )->shell( ). + DATA(view) = z2ui5_cl_xml_view=>factory( )->shell( ). DATA(page) = view->page( id = 'id_page' title = 'abap2ui5 - Scrolling and Cursor (use the browser Chrome to avoid incompatibilities)' @@ -108,7 +113,7 @@ CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION. shownavbutton = abap_true ). - page->header_content( )->link( text = 'Source_Code' target = '_blank' href = Z2UI5_CL_XML_VIEW=>hlp_get_source_code_url( app = me get = client->get( ) ) ). + page->header_content( )->link( text = 'Source_Code' target = '_blank' href = z2ui5_cl_xml_view=>hlp_get_source_code_url( app = me get = client->get( ) ) ). page->input( @@ -147,15 +152,18 @@ CLASS Z2UI5_CL_APP_DEMO_22 IMPLEMENTATION. page->footer( )->overflow_toolbar( )->button( text = 'Scroll Top' press = client->_event( 'BUTTON_SCROLL_TOP' ) - " )->button( text = 'Scroll 500 up' press = view->_event( 'BUTTON_SCROLL_UP' ) - " )->button( text = 'Scroll 500 down' press = view->_event( 'BUTTON_SCROLL_DOWN' ) + )->button( text = 'Scroll 500 up' press = client->_event( 'BUTTON_SCROLL_UP' ) + )->button( text = 'Scroll 500 down' press = client->_event( 'BUTTON_SCROLL_DOWN' ) )->button( text = 'Scroll Bottom' press = client->_event( 'BUTTON_SCROLL_BOTTOM' ) - " )->toolbar_spacer( - " )->button( text = 'Server Event and hold position' press = view->_event( 'BUTTON_SCROLL_HOLD' ) + )->toolbar_spacer( + )->button( text = 'Server Event and hold position' press = client->_event( 'BUTTON_SCROLL_HOLD' ) ). app-s_next-xml_main = page->get_root( )->xml_get( ). client->set_next( app-s_next ). + app-view_popup = ``. + CLEAR app-s_next. + ENDMETHOD. ENDCLASS. diff --git a/src/z2ui5_cl_http_handler.clas.abap b/src/z2ui5_cl_http_handler.clas.abap index a07b7f0a..5ad31812 100644 --- a/src/z2ui5_cl_http_handler.clas.abap +++ b/src/z2ui5_cl_http_handler.clas.abap @@ -123,27 +123,23 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. ` var oView = this.getView();` && |\n| && ` try {` && |\n| && ` if (sap.z2ui5.oResponse.oCursor) {` && |\n| && - ` var ofocus = oView.byId(sap.z2ui5.oResponse.oCursor.id).getFocusInfo();` && |\n| && - ` ofocus.cursorPos = sap.z2ui5.oResponse.oCursor.cursorPos;` && |\n| && - ` ofocus.selectionStart = sap.z2ui5.oResponse.oCursor.selectionStart;` && |\n| && - ` ofocus.selectionEnd = sap.z2ui5.oResponse.oCursor.selectionEnd;` && |\n| && + ` var ofocus = oView.byId(sap.z2ui5.oResponse.oCursor.ID).getFocusInfo();` && |\n| && + ` ofocus.cursorPos = parseInt( sap.z2ui5.oResponse.oCursor.CURSORPOS );` && |\n| && + ` ofocus.selectionStart = parseInt( sap.z2ui5.oResponse.oCursor.SELECTIONSTART );` && |\n| && + ` ofocus.selectionEnd = parseInt( sap.z2ui5.oResponse.oCursor.SELECTIONEND );` && |\n| && ` }` && |\n| && - ` oView.byId(sap.z2ui5.oResponse.oCursor.id).applyFocusInfo(ofocus);` && |\n| && + ` oView.byId(sap.z2ui5.oResponse.oCursor.ID).applyFocusInfo(ofocus);` && |\n| && ` } catch (error) { };` && |\n| && ` try {` && |\n| && - ` // oView.getContent()[0].getApp().scrollTo(sap.z2ui5.oResponse.PAGE_SCROLL_POS);` && |\n| && ` } catch (error) { };` && |\n| && - ` //todo` && |\n| && ` if (sap.z2ui5.oResponse.oScroll) {` && |\n| && - ` sap.z2ui5.oResponse.oScroll.forEach(item => Object.keys(item).forEach(function (key, index) {` && |\n| && - ` try {` && |\n| && - ` oView.byId(key).scrollTo(item[key]);` && |\n| && - ` } catch (e) {` && |\n| && - ` var ele = '#' + oView.byId(key).getId() + '-inner';` && |\n| && - ` $(ele).scrollTop(item[key]);` && |\n| && - ` }` && |\n| && - ` // index: the ordinal position of the key within the object ` && |\n| && - ` }));` && |\n| && + ` sap.z2ui5.oResponse.oScroll.forEach(` && |\n| && + ` item => { try { oView.byId(item.NAME).scrollTo( parseInt( item.VALUE ) ); ` && |\n| && + ` } catch (e) {` && |\n| && + ` var ele = '#' + oView.byId(item.NAME).getId() + '-inner';` && |\n| && + ` $(ele).scrollTop(item.VALUE); ` && |\n| && + ` } ` && |\n| && + ` } );` && |\n| && ` }` && |\n| && ` if (sap.z2ui5.oResponse.vViewPopup) {` && |\n| && ` ` && |\n| && @@ -163,9 +159,9 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. ` }` && |\n| && ` if (sap.z2ui5.oResponse.oTimer){ ` && |\n| && ` var oEvent = { 'EVENT' : 'BUTTON_CHECK', 'METHOD' : 'UPDATE' };` && |\n| && - ` oEvent.EVENT = sap.z2ui5.oResponse.oTimer.eventFinished;` && |\n| && + ` oEvent.EVENT = sap.z2ui5.oResponse.oTimer.EVENT_FINISHED;` && |\n| && ` sap.z2ui5.checkTimerActive = true;` && |\n| && - ` setTimeout( ( ) => { if ( sap.z2ui5.checkTimerActive ) { sap.z2ui5.oView.getController().onEvent( oEvent ); } }, sap.z2ui5.oResponse.oTimer.intervalMs, oEvent );` && |\n| && + ` setTimeout( ( ) => { if ( sap.z2ui5.checkTimerActive ) { sap.z2ui5.oView.getController().onEvent( oEvent ); } }, parseInt( sap.z2ui5.oResponse.oTimer.INTERVAL_MS ) , oEvent );` && |\n| && ` }` && |\n| && ` sap.ui.core.BusyIndicator.hide();` && |\n| && ` },` && |\n| && @@ -203,6 +199,19 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. ` this.oBody.oUpdate = sap.z2ui5.oView.getModel().oData.oUpdate;` && |\n| && ` }` && |\n| && |\n| && + ` if (sap.z2ui5.oResponse.oScroll) {` && |\n| && + ` this.oBody.oScroll = sap.z2ui5.oResponse.oScroll; ` && |\n| && + ` this.oBody.oScroll .forEach(` && |\n| && + ` item => { try { ` && |\n| && + ` item.VALUE = this.getView().byId( item.NAME ).getScrollDelegate().getScrollTop(); ` && |\n| && + ` } catch (e) {` && |\n| && + ` var ele = '#' + this.getView( ).byId(item.NAME).getId() + '-inner';` && |\n| && + ` item.VALUE = $(ele).scrollTop(); ` && |\n| && + ` } ` && |\n| && + ` } );` && |\n| && + ` }` && |\n| && + + ` this.oBody.oSystem = sap.z2ui5.oResponse.oSystem;` && |\n| && ` this.oBody.oEvent = oEvent;` && |\n| && ` this.oBody.oEvent.vData = vData;` && |\n| && @@ -251,9 +260,9 @@ CLASS Z2UI5_CL_HTTP_HANDLER IMPLEMENTATION. ` }` && |\n| && ` }` && |\n| && |\n| && - ` if (sap.z2ui5.oResponse.oAfter) {` && |\n| && - ` sap.z2ui5.oResponse.oAfter.forEach(item => sap.m[item[0]][item[1]](item[2]));` && |\n| && - ` }` && |\n| && + ` if (sap.z2ui5.oResponse.oMessage) {` && |\n| && + ` sap.m[sap.z2ui5.oResponse.oMessage.CONTROL][sap.z2ui5.oResponse.oMessage.TYPE](sap.z2ui5.oResponse.oMessage.TEXT);` && |\n| && + ` }` && |\n| && |\n| && ` if (sap.z2ui5.oResponse.vView) {` && |\n| && ` var oModel = new sap.ui.model.json.JSONModel(sap.z2ui5.oResponse.oViewModel);` && |\n| && diff --git a/src/z2ui5_cl_http_handler.clas.locals_imp.abap b/src/z2ui5_cl_http_handler.clas.locals_imp.abap index eb642152..5e32c0e5 100644 --- a/src/z2ui5_cl_http_handler.clas.locals_imp.abap +++ b/src/z2ui5_cl_http_handler.clas.locals_imp.abap @@ -14,8 +14,6 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. END OF ty_attri. TYPES ty_T_attri TYPE STANDARD TABLE OF ty_attri WITH EMPTY KEY. - TYPES ty_tt_string TYPE STANDARD TABLE OF string_table WITH EMPTY KEY. - DATA: BEGIN OF ms_error, x_root TYPE REF TO cx_root, @@ -65,12 +63,6 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. RETURNING VALUE(result) TYPE timestampl. - CLASS-METHODS trans_json_2_data - IMPORTING - iv_json TYPE clike - EXPORTING - ev_result TYPE REF TO data. - CLASS-METHODS trans_any_2_json IMPORTING any TYPE any @@ -83,14 +75,6 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. EXPORTING data TYPE data. - CLASS-METHODS get_attri_name_by_ref - IMPORTING - i_focus TYPE data - io_app TYPE REF TO object - t_attri TYPE ty_t_attri - RETURNING - VALUE(result) TYPE string ##NEEDED. - CLASS-METHODS get_t_attri_by_ref IMPORTING io_app TYPE REF TO object @@ -103,26 +87,6 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. RETURNING VALUE(result) TYPE string. - CLASS-METHODS get_params_by_url - IMPORTING - url TYPE string - name TYPE string - RETURNING - VALUE(result) TYPE string. - - CLASS-METHODS get_prev_when_no_handler - IMPORTING - val TYPE REF TO cx_root - RETURNING - VALUE(result) TYPE REF TO cx_root. - - CLASS-METHODS get_ref_data - IMPORTING - n TYPE clike - o TYPE REF TO object - RETURNING - VALUE(result) TYPE REF TO data. - CLASS-METHODS get_abap_2_json IMPORTING val TYPE any @@ -144,8 +108,8 @@ CLASS z2ui5_lcl_utility DEFINITION INHERITING FROM cx_no_check. CLASS-METHODS trans_ref_tab_2_tab IMPORTING ir_tab_from TYPE REF TO data - CHANGING - ct_to TYPE STANDARD TABLE. + EXPORTING + t_result TYPE STANDARD TABLE. CLASS-METHODS get_trim_upper IMPORTING @@ -230,51 +194,6 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ENDMETHOD. - METHOD get_params_by_url. - - DATA(url_segments) = segment( val = get_trim_upper( url ) index = 2 sep = `?` ). - SPLIT url_segments AT `&` INTO TABLE DATA(lt_params). - - DATA lt_url_params TYPE z2ui5_if_client=>ty_t_name_value. - - LOOP AT lt_params INTO DATA(lv_param). - - SPLIT lv_param AT `=` INTO DATA(lv_name) DATA(lv_value) DATA(lv_dummy). - - INSERT VALUE #( name = lv_name - value = lv_value ) INTO TABLE lt_url_params. - - ENDLOOP. - - result = lt_url_params[ name = get_trim_upper( name ) ]-value. - - ENDMETHOD. - - METHOD get_prev_when_no_handler. - - TRY. - result = CAST cx_sy_no_handler( val )->previous. - CATCH cx_root. - ENDTRY. - - IF result IS NOT BOUND. - result = val. - ENDIF. - - ENDMETHOD. - - - METHOD get_ref_data. - - FIELD-SYMBOLS TYPE data. - - ASSIGN o->(n) TO . - raise( when = xsdbool( sy-subrc <> 0 ) ). - - result = REF #( ). - - ENDMETHOD. - METHOD get_timestampl. @@ -343,31 +262,6 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ENDMETHOD. - METHOD get_attri_name_by_ref. - - CONSTANTS c_prefix TYPE string VALUE `IO_APP->`. - - DATA lr_in TYPE REF TO data. - GET REFERENCE OF i_focus INTO lr_in. - - LOOP AT t_attri REFERENCE INTO DATA(lr_attri). - - FIELD-SYMBOLS TYPE any. - DATA(lv_name) = c_prefix && to_upper( lr_attri->name ). - ASSIGN (lv_name) TO . - raise( when = xsdbool( sy-subrc <> 0 ) v = `Attribute in App with name ` && lv_name && ` not found` ). - - DATA lr_ref TYPE REF TO data. - GET REFERENCE OF INTO lr_ref. - - IF lr_in = lr_ref. - result = to_upper( lr_attri->name ). - EXIT. - ENDIF. - - ENDLOOP. - - ENDMETHOD. METHOD get_t_attri_by_ref. @@ -427,23 +321,6 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ENDMETHOD. - METHOD trans_json_2_data. - - CLEAR ev_result. - IF iv_json IS INITIAL. - RETURN. - ENDIF. - - /ui2/cl_json=>deserialize( - EXPORTING - json = CONV string( iv_json ) - assoc_arrays = abap_true - CHANGING - data = ev_result - ). - - ENDMETHOD. - METHOD trans_object_2_xml. @@ -467,10 +344,10 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ASSIGN ir_tab_from->* TO . raise( when = xsdbool( sy-subrc <> 0 ) ). - CLEAR ct_to. + CLEAR t_result. DATA lr_row TYPE REF TO data. - CREATE DATA lr_row LIKE LINE OF ct_to. + CREATE DATA lr_row LIKE LINE OF t_result. ASSIGN lr_row->* TO FIELD-SYMBOL(). DATA(lo_descr) = cl_abap_datadescr=>describe_by_data( ). @@ -504,7 +381,7 @@ CLASS z2ui5_lcl_utility IMPLEMENTATION. ENDIF. ENDLOOP. - INSERT INTO TABLE ct_to. + INSERT INTO TABLE t_result. ENDLOOP. ENDMETHOD. @@ -548,15 +425,6 @@ CLASS z2ui5_lcl_utility_tree_json DEFINITION. PUBLIC SECTION. - TYPES: - BEGIN OF ty_s_name, - n TYPE string, - v TYPE string, - no_apos TYPE abap_bool, - END OF ty_s_name. - - TYPES ty_t_name_value TYPE STANDARD TABLE OF ty_s_name. - DATA mo_root TYPE REF TO z2ui5_lcl_utility_tree_json. DATA mo_parent TYPE REF TO z2ui5_lcl_utility_tree_json. DATA mv_name TYPE string. @@ -595,10 +463,6 @@ CLASS z2ui5_lcl_utility_tree_json DEFINITION. RETURNING VALUE(result) TYPE string. - METHODS get_parent - RETURNING - VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - METHODS add_list_val IMPORTING v TYPE string @@ -613,18 +477,18 @@ CLASS z2ui5_lcl_utility_tree_json DEFINITION. RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - METHODS add_attributes_name_value_tab - IMPORTING - it_name_value TYPE ty_t_name_value - RETURNING - VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. - METHODS add_attribute_object IMPORTING name TYPE clike RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + METHODS add_attribute_struc + IMPORTING + val TYPE data + RETURNING + VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. + METHODS add_list_object RETURNING VALUE(result) TYPE REF TO z2ui5_lcl_utility_tree_json. @@ -649,9 +513,6 @@ CLASS z2ui5_lcl_utility_tree_json DEFINITION. RETURNING VALUE(result) TYPE string. - METHODS get_name - RETURNING - VALUE(result) TYPE string. PROTECTED SECTION. @@ -692,20 +553,6 @@ CLASS z2ui5_lcl_utility_tree_json IMPLEMENTATION. ENDMETHOD. - METHOD add_attributes_name_value_tab. - - LOOP AT it_name_value INTO DATA(ls_value). - add_attribute( - n = ls_value-n - v = ls_value-v - apos_active = xsdbool( ls_value-no_apos = abap_false ) ). - ENDLOOP. - - result = me. - - ENDMETHOD. - - METHOD add_attribute_instance. val->mo_root = mo_root. @@ -724,6 +571,21 @@ CLASS z2ui5_lcl_utility_tree_json IMPLEMENTATION. ENDMETHOD. + METHOD add_attribute_struc. + + FIELD-SYMBOLS TYPE any. + DATA(lo_struc) = CAST cl_abap_structdescr( cl_abap_datadescr=>describe_by_data( val ) ). + DATA(lt_comp) = lo_struc->get_components( ). + + LOOP AT lt_comp REFERENCE INTO DATA(lr_comp). + ASSIGN COMPONENT lr_comp->name OF STRUCTURE val TO . + add_attribute( n = lr_comp->name v = ). + ENDLOOP. + + result = me. + + ENDMETHOD. + METHOD add_attribute_object. DATA(lo_attri) = new( io_root = mo_root iv_name = name ). @@ -824,19 +686,6 @@ CLASS z2ui5_lcl_utility_tree_json IMPLEMENTATION. ENDMETHOD. - METHOD get_name. - - result = mv_name. - - ENDMETHOD. - - - METHOD get_parent. - - result = COND #( WHEN mo_parent IS NOT BOUND THEN me ELSE mo_parent ). - - ENDMETHOD. - METHOD get_root. @@ -914,8 +763,12 @@ CLASS z2ui5_lcl_fw_handler DEFINITION. BEGIN OF ty_s_next, check_app_leave TYPE abap_bool, o_call_app TYPE REF TO z2ui5_if_app, - t_after TYPE z2ui5_lcl_utility=>ty_tt_string, s_set TYPE z2ui5_if_client=>ty_S_next, + BEGIN OF s_msg, + control TYPE string, + type TYPE string, + text TYPE string, + END OF s_msg, END OF ty_s_next. DATA ms_actual TYPE z2ui5_if_client=>ty_s_get. @@ -1403,46 +1256,35 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. ENDIF. ENDIF. - z2ui5_lcl_utility=>raise( when = xsdbool( ms_next-s_set-check_set_prev_view = abap_false AND ms_next-s_set-xml_popup IS INITIAL AND ms_next-s_set-xml_main IS INITIAL ) - v = `No view or popup found. Check your view rendering!` ). + IF ms_next-s_set-check_set_prev_view = abap_false AND ms_next-s_set-xml_popup IS INITIAL AND ms_next-s_set-xml_main IS INITIAL. + z2ui5_lcl_utility=>raise( `No view or popup found. Check your view rendering!` ). + ENDIF. - lo_ui5_model->add_attribute_object( `oSystem` - )->add_attribute( n = `ID` v = ms_db-id - " )->add_attribute( n = `CHECK_DEBUG_ACTIVE` v = z2ui5_lcl_utility=>get_abap_2_json( abap_true ) apos_active = abap_false - ). + lo_ui5_model->add_attribute_object( `oSystem` )->add_attribute( n = `ID` v = ms_db-id ). - IF ms_next-t_after IS NOT INITIAL. - DATA(lo_list) = lo_ui5_model->add_attribute_list( `oAfter` ). - LOOP AT ms_next-t_after REFERENCE INTO DATA(lr_after). - DATA(lo_list2) = lo_list->add_list_list( ). - LOOP AT lr_after->* REFERENCE INTO DATA(lr_con). - lo_list2->add_list_val( lr_con->* ). - ENDLOOP. + IF ms_next-s_msg IS NOT INITIAL. + lo_ui5_model->add_attribute_object( `oMessage` )->add_attribute_struc( ms_next-s_msg ). + ENDIF. + + IF ms_next-s_set-t_scroll_pos IS NOT INITIAL. + DATA(lo_list) = lo_ui5_model->add_attribute_list( `oScroll` ). + LOOP AT ms_next-s_set-t_scroll_pos REFERENCE INTO DATA(lr_focus). + lo_list->add_list_object( )->add_attribute_struc( lr_focus->* ). ENDLOOP. ENDIF. - lo_list = lo_ui5_model->add_attribute_list( `oScroll` ). - LOOP AT ms_next-s_set-t_scroll_pos REFERENCE INTO DATA(lr_focus). - lo_list->add_list_object( )->add_attribute( n = lr_focus->name v = lr_focus->value apos_active = abap_false ). - ENDLOOP. - IF ms_next-s_set-s_cursor_pos IS NOT INITIAL. - lo_ui5_model->add_attribute_object( `oCursor` - )->add_attribute( n = `cursorPos` v = ms_next-s_set-s_cursor_pos-cursorpos apos_active = abap_false - )->add_attribute( n = `id` v = ms_next-s_set-s_cursor_pos-id - )->add_attribute( n = `selectionEnd` v = ms_next-s_set-s_cursor_pos-selectionend apos_active = abap_false - )->add_attribute( n = `selectionStart` v = ms_next-s_set-s_cursor_pos-selectionstart apos_active = abap_false ). + lo_ui5_model->add_attribute_object( `oCursor` )->add_attribute_struc( ms_next-s_set-s_cursor_pos ). ENDIF. IF ms_next-s_set-s_timer IS NOT INITIAL. - lo_ui5_model->add_attribute_object( `oTimer` - )->add_attribute( n = `eventFinished` v = ms_next-s_set-s_timer-event_finished - )->add_attribute( n = `intervalMs` v = ms_next-s_set-s_timer-interval_ms apos_active = abap_false ). + lo_ui5_model->add_attribute_object( `oTimer` )->add_attribute_struc( ms_next-s_set-s_timer ). ENDIF. IF ms_next-s_set-check_set_prev_view = abap_true. lo_ui5_model->add_attribute( n = `SET_PREV_VIEW` v = `true` apos_active = abap_false ). ENDIF. + result = lo_ui5_model->get_root( )->stringify( ). z2ui5_lcl_fw_db=>create( id = ms_db-id db = ms_db ). @@ -1496,7 +1338,7 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. WHEN `h`. z2ui5_lcl_utility=>trans_ref_tab_2_tab( EXPORTING ir_tab_from = lo_model->get_attribute( lr_attri->name )->mr_actual - CHANGING ct_to = ). + IMPORTING t_result = ). WHEN OTHERS. ENDCASE. @@ -1508,6 +1350,14 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. CATCH cx_root. ENDTRY. + TRY. + DATA(lo_scroll) = mo_body->get_attribute( `OSCROLL` ). + z2ui5_lcl_utility=>trans_ref_tab_2_tab( + EXPORTING ir_tab_from = lo_scroll->mr_actual + IMPORTING t_result = result->ms_actual-t_scroll_pos ). + CATCH cx_root. + ENDTRY. + ENDMETHOD. @@ -1568,7 +1418,7 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. result->ms_db-id_prev_app = ms_db-id. result->ms_db-id_prev_app_stack = ms_db-id. - result->ms_next-t_after = ms_next-t_after. + result->ms_next-s_msg = ms_next-s_msg. result->ms_db-t_attri = z2ui5_lcl_utility=>get_t_attri_by_ref( result->ms_db-o_app ). CLEAR ms_next. @@ -1679,10 +1529,7 @@ CLASS z2ui5_lcl_fw_handler IMPLEMENTATION. result->ms_db-id_prev_app = ms_db-id. result->ms_db-id_prev_app_stack = ms_db-id. - - result->ms_next-t_after = ms_next-t_after. - - + result->ms_next-s_msg = ms_next-s_msg. result->ms_db-id_prev_app = ms_db-id. ELSE. @@ -1763,14 +1610,22 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION. METHOD z2ui5_if_client~popup_message_toast. - INSERT VALUE #( ( `MessageToast` ) ( `show` ) ( text ) ) INTO TABLE mo_handler->ms_next-t_after. + mo_handler->ms_next-s_msg = VALUE #( + control = `MessageToast` + type = `show` + text = text + ). ENDMETHOD. METHOD z2ui5_if_client~popup_message_box. - INSERT VALUE #( ( `MessageBox` ) ( type ) ( text ) ) INTO TABLE mo_handler->ms_next-t_after. + mo_handler->ms_next-s_msg = VALUE #( + control = `MessageBox` + type = type + text = text + ). ENDMETHOD. @@ -1787,6 +1642,7 @@ CLASS z2ui5_lcl_fw_client IMPLEMENTATION. result = VALUE #( BASE CORRESPONDING #( mo_handler->ms_db ) event = mo_handler->ms_actual-event event_data = mo_handler->ms_actual-event_data + t_scroll_pos = mo_handler->ms_actual-t_scroll_pos t_req_header = z2ui5_cl_http_handler=>client-t_header t_req_param = z2ui5_cl_http_handler=>client-t_param ). diff --git a/src/z2ui5_cl_http_handler.clas.testclasses.abap b/src/z2ui5_cl_http_handler.clas.testclasses.abap index ddd1a891..39857c56 100644 --- a/src/z2ui5_cl_http_handler.clas.testclasses.abap +++ b/src/z2ui5_cl_http_handler.clas.testclasses.abap @@ -1,24 +1,19 @@ -CLASS ltcl_unit_test_basic DEFINITION FINAL FOR TESTING +CLASS ltcl_unit_01_json DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PUBLIC SECTION. - INTERFACES z2ui5_if_app. - - DATA product TYPE string. - DATA quantity TYPE string. - DATA check_initialized TYPE abap_bool. PRIVATE SECTION. - METHODS test_json_attri FOR TESTING RAISING cx_static_check. - METHODS test_json_object FOR TESTING RAISING cx_static_check. - METHODS test_index_html FOR TESTING RAISING cx_static_check. - METHODS test_app_start FOR TESTING RAISING cx_static_check. - METHODS test_app_change_value FOR TESTING RAISING cx_static_check. + METHODS test_json_attri FOR TESTING RAISING cx_static_check. + METHODS test_json_object FOR TESTING RAISING cx_static_check. + METHODS test_json_struc FOR TESTING RAISING cx_static_check. + METHODS test_json_trans FOR TESTING RAISING cx_static_check. + METHODS test_json_trans_gen FOR TESTING RAISING cx_static_check. ENDCLASS. -CLASS ltcl_unit_test_basic IMPLEMENTATION. +CLASS ltcl_unit_01_json IMPLEMENTATION. METHOD test_json_attri. @@ -47,6 +42,130 @@ CLASS ltcl_unit_test_basic IMPLEMENTATION. ENDMETHOD. + METHOD test_json_struc. + + DATA(lo_tree) = NEW z2ui5_lcl_utility_tree_json( ). + + TYPES: + BEGIN OF ty_s_test, + comp1 TYPE string, + comp2 TYPE string, + END OF ty_s_test. + + DATA(ls_test) = VALUE ty_S_test( comp1 = `AAA` comp2 = `BBB` ). + + lo_tree->add_attribute_object( `CCC` + )->add_attribute_struc( ls_test ). + + DATA(lv_result) = lo_tree->stringify( ). + IF `{"CCC":{"COMP1":"AAA","COMP2":"BBB"}}` <> lv_result. + cl_abap_unit_assert=>fail( 'json tree - wrong stringify structure' ). + ENDIF. + + ENDMETHOD. + + METHOD test_json_trans. + + TYPES: + BEGIN OF ty_row, + title TYPE string, + value TYPE string, + selected TYPE abap_bool, + END OF ty_row. + TYPES ty_t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. + + DATA(lt_tab) = VALUE ty_t_tab( + ( title = 'Test' value = 'this is a description' selected = abap_true ) + ( title = 'Test2' value = 'this is a new descr' selected = abap_false ) + ). + + DATA(lt_tab2) = VALUE ty_t_tab( ). + + DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( lt_tab ). + + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_tab + CHANGING + data = lt_tab2 + ). + + IF lt_tab <> lt_tab2. + cl_abap_unit_assert=>fail( msg = 'json serial - /ui2/cl_json wrong simple table' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_json_trans_gen. + + TYPES: + BEGIN OF ty_row, + title TYPE string, + value TYPE string, + selected TYPE abap_bool, + END OF ty_row. + TYPES ty_t_tab TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. + + DATA(lt_tab) = VALUE ty_t_tab( + ( title = 'Test' value = 'this is a description' selected = abap_true ) + ( title = 'Test2' value = 'this is a new descr' selected = abap_false ) + ). + + DATA(lt_tab2) = VALUE ty_t_tab( ). + + DATA(lv_tab) = z2ui5_lcl_utility=>trans_any_2_json( lt_tab ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_tab + CHANGING + data = lo_data + ). + + z2ui5_lcl_utility=>trans_ref_tab_2_tab( + EXPORTING + ir_tab_from = lo_data + IMPORTING + t_result = lt_tab2 + ). + + IF lt_tab <> lt_tab2. + cl_abap_unit_assert=>fail( msg = 'json serial - /ui2/cl_json wrong generic table' quit = 5 ). + ENDIF. + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_unit_02_app_start DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PUBLIC SECTION. + INTERFACES z2ui5_if_app. + + DATA product TYPE string. + DATA quantity TYPE string. + DATA check_initialized TYPE abap_bool. + + CLASS-DATA sv_state TYPE string. + + PRIVATE SECTION. + METHODS test_index_html FOR TESTING RAISING cx_static_check. + METHODS test_xml_view FOR TESTING RAISING cx_static_check. + METHODS test_id FOR TESTING RAISING cx_static_check. + METHODS test_xml_popup FOR TESTING RAISING cx_static_check. + METHODS test_bind_one_way FOR TESTING RAISING cx_static_check. + METHODS test_bind_two_way FOR TESTING RAISING cx_static_check. + METHODS test_message_toast FOR TESTING RAISING cx_static_check. + METHODS test_message_box FOR TESTING RAISING cx_static_check. + METHODS test_timer FOR TESTING RAISING cx_static_check. +ENDCLASS. + + +CLASS ltcl_unit_02_app_start IMPLEMENTATION. + METHOD test_index_html. z2ui5_cl_http_handler=>client = VALUE #( @@ -61,6 +180,393 @@ CLASS ltcl_unit_test_basic IMPLEMENTATION. ENDMETHOD. + METHOD z2ui5_if_app~main. + + IF check_initialized = abap_false. + check_initialized = abap_true. + product = 'tomato'. + quantity = '500'. + + ENDIF. + + CASE client->get( )-event. + WHEN 'BUTTON_POST'. + client->popup_message_toast( |{ product } { quantity } - send to the server| ). + WHEN 'BACK'. + client->nav_app_leave( client->get_app( client->get( )-id_prev_app_stack ) ). + ENDCASE. + + IF sv_state = 'TEST_MESSAGE_BOX'. + client->popup_message_box( + text = 'test message box' + ). + ENDIF. + + IF sv_state = 'TEST_MESSAGE_TOAST'. + client->popup_message_toast( + text = 'test message toast' + ). + ENDIF. + + CASE sv_state. + + WHEN 'TEST_ONE_WAY'. + client->set_next( VALUE #( xml_main = z2ui5_cl_xml_view=>factory( )->shell( + )->page( + title = 'abap2UI5 - First Example' + navbuttonpress = client->_event( 'BACK' ) + shownavbutton = abap_true + )->simple_form( title = 'Form Title' editable = abap_true + )->content( 'form' + )->title( 'Input' + )->label( 'quantity' + )->input( client->_bind_one( quantity ) + )->label( 'product' + )->input( + value = product + enabled = abap_false + )->button( + text = 'post' + press = client->_event( 'BUTTON_POST' ) + )->get_root( )->xml_get( ) ) ). + + WHEN 'TEST_POPUP'. + client->set_next( VALUE #( xml_popup = z2ui5_cl_xml_view=>factory( + )->dialog( + title = 'abap2UI5 - First Example' + )->simple_form( title = 'Form Title' editable = abap_true + )->content( 'form' + )->title( 'Input' + )->label( 'quantity' + )->input( client->_bind_one( quantity ) + )->label( 'product' + )->input( + value = product + enabled = abap_false + )->button( + text = 'post' + press = client->_event( 'BUTTON_POST' ) + )->get_root( )->xml_get( ) ) ). + + WHEN 'TEST_TIMER'. + client->set_next( VALUE #( + s_timer = VALUE #( + event_finished = 'TIMER_FINISHED' + interval_ms = `500` + ) + xml_main = z2ui5_cl_xml_view=>factory( )->shell( + )->page( + title = 'abap2UI5 - First Example' + navbuttonpress = client->_event( 'BACK' ) + shownavbutton = abap_true + )->simple_form( title = 'Form Title' editable = abap_true + )->content( 'form' + )->title( 'Input' + )->label( 'quantity' + )->input( client->_bind( quantity ) + )->label( 'product' + )->input( + value = product + enabled = abap_false + )->button( + text = 'post' + press = client->_event( 'BUTTON_POST' ) + )->get_root( )->xml_get( ) ) ). + + WHEN OTHERS. + client->set_next( VALUE #( xml_main = z2ui5_cl_xml_view=>factory( )->shell( + )->page( + title = 'abap2UI5 - First Example' + navbuttonpress = client->_event( 'BACK' ) + shownavbutton = abap_true + )->simple_form( title = 'Form Title' editable = abap_true + )->content( 'form' + )->title( 'Input' + )->label( 'quantity' + )->input( client->_bind( quantity ) + )->label( 'product' + )->input( + value = product + enabled = abap_false + )->button( + text = 'post' + press = client->_event( 'BUTTON_POST' ) + )->get_root( )->xml_get( ) ) ). + + ENDCASE. + + ENDMETHOD. + + METHOD test_xml_view. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = ``. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + UNASSIGN . + DATA(lv_assign) = `VVIEW->*`. + ASSIGN lo_data->(lv_assign) TO . + = shift_left( ). + IF (9) <> `fail( msg = 'xml view - intital view wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_id. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = ``. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + UNASSIGN . + DATA(lv_assign) = `OSYSTEM->ID->*`. + ASSIGN lo_data->(lv_assign) TO . + IF IS INITIAL. + cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_bind_one_way. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = `TEST_ONE_WAY`. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + UNASSIGN . + DATA(lv_assign) = `OVIEWMODEL->QUANTITY->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `500`. + cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_bind_two_way. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = ``. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + UNASSIGN . + DATA(lv_assign) = `OVIEWMODEL->OUPDATE->QUANTITY->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `500`. + cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_message_box. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = `TEST_MESSAGE_BOX`. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + + UNASSIGN . + DATA(lv_assign) = `OMESSAGE->CONTROL->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `MessageBox`. + cl_abap_unit_assert=>fail( msg = 'message box - control wrong' quit = 5 ). + ENDIF. + + UNASSIGN . + lv_assign = `OMESSAGE->TEXT->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `test message box`. + cl_abap_unit_assert=>fail( msg = 'message box - text wrong' quit = 5 ). + ENDIF. + + UNASSIGN . + lv_assign = `OMESSAGE->TYPE->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `information`. + cl_abap_unit_assert=>fail( msg = 'message box - type wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_message_toast. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = `TEST_MESSAGE_TOAST`. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + + UNASSIGN . + DATA(lv_assign) = `OMESSAGE->CONTROL->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `MessageToast`. + cl_abap_unit_assert=>fail( msg = 'message toast - control wrong' quit = 5 ). + ENDIF. + + UNASSIGN . + lv_assign = `OMESSAGE->TEXT->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `test message toast`. + cl_abap_unit_assert=>fail( msg = 'message toast - text wrong' quit = 5 ). + ENDIF. + + UNASSIGN . + lv_assign = `OMESSAGE->TYPE->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `show`. + cl_abap_unit_assert=>fail( msg = 'message toast - type wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_timer. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = `TEST_TIMER`. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + + UNASSIGN . + DATA(lv_assign) = `OTIMER->EVENT_FINISHED->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `TIMER_FINISHED`. + cl_abap_unit_assert=>fail( msg = 'timer - event wrong' quit = 5 ). + ENDIF. + + UNASSIGN . + lv_assign = `OTIMER->INTERVAL_MS->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `500`. + cl_abap_unit_assert=>fail( msg = 'timer - ms wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + + METHOD test_xml_popup. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + sv_state = `TEST_POPUP`. + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + UNASSIGN . + DATA(lv_assign) = `VVIEWPOPUP->*`. + ASSIGN lo_data->(lv_assign) TO . + = shift_left( ). + IF (9) <> `fail( msg = 'xml popup - intital popup wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + +ENDCLASS. + +CLASS ltcl_unit_03_app_ajax DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PUBLIC SECTION. + + INTERFACES z2ui5_if_app. + + DATA product TYPE string. + DATA quantity TYPE string. + DATA check_initialized TYPE abap_bool. + + PRIVATE SECTION. + METHODS test_app_change_value FOR TESTING RAISING cx_static_check. + METHODS test_app_event FOR TESTING RAISING cx_static_check. + +ENDCLASS. + +CLASS ltcl_unit_03_app_ajax IMPLEMENTATION. + METHOD z2ui5_if_app~main. IF check_initialized = abap_false. @@ -96,55 +602,12 @@ CLASS ltcl_unit_test_basic IMPLEMENTATION. press = client->_event( 'BUTTON_POST' ) )->get_root( )->xml_get( ) ) ). - - ENDMETHOD. - - METHOD test_app_start. - - z2ui5_cl_http_handler=>client = VALUE #( - t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_TEST_BASIC' ) ) - ). - - DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). - - DATA lo_data TYPE REF TO data. - /ui2/cl_json=>deserialize( - EXPORTING - json = lv_response - CHANGING - data = lo_data ). - - DATA lv_assign TYPE string. - FIELD-SYMBOLS TYPE any. - - UNASSIGN . - lv_assign = `OVIEWMODEL->OUPDATE->QUANTITY->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `500`. - cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). - ENDIF. - - UNASSIGN . - lv_assign = `VVIEW->*`. - ASSIGN lo_data->(lv_assign) TO . - = shift_left( ). - IF (9) <> `fail( msg = 'xml view - intital view wrong' quit = 5 ). - ENDIF. - - UNASSIGN . - lv_assign = `OSYSTEM->ID->*`. - ASSIGN lo_data->(lv_assign) TO . - IF IS INITIAL. - cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). - ENDIF. - ENDMETHOD. METHOD test_app_change_value. z2ui5_cl_http_handler=>client = VALUE #( - t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_TEST_BASIC' ) ) + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) ). DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). @@ -156,18 +619,10 @@ CLASS ltcl_unit_test_basic IMPLEMENTATION. CHANGING data = lo_data ). - DATA lv_assign TYPE string. FIELD-SYMBOLS TYPE any. UNASSIGN . - lv_assign = `OVIEWMODEL->OUPDATE->QUANTITY->*`. - ASSIGN lo_data->(lv_assign) TO . - IF <> `500`. - cl_abap_unit_assert=>fail( msg = 'data binding - initial set oUpdate wrong' quit = 5 ). - ENDIF. - - UNASSIGN . - lv_assign = `OSYSTEM->ID->*`. + DATA(lv_assign) = `OSYSTEM->ID->*`. ASSIGN lo_data->(lv_assign) TO . IF IS INITIAL. cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). @@ -178,7 +633,7 @@ CLASS ltcl_unit_test_basic IMPLEMENTATION. z2ui5_cl_http_handler=>client = VALUE #( body = lv_request ). lv_response = z2ui5_cl_http_handler=>http_post( ). - clear lo_data. + CLEAR lo_data. /ui2/cl_json=>deserialize( EXPORTING json = lv_response @@ -194,9 +649,54 @@ CLASS ltcl_unit_test_basic IMPLEMENTATION. ENDMETHOD. + METHOD test_app_event. + + z2ui5_cl_http_handler=>client = VALUE #( + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_02_APP_START' ) ) + ). + + DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). + + DATA lo_data TYPE REF TO data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + FIELD-SYMBOLS TYPE any. + + UNASSIGN . + DATA(lv_assign) = `OSYSTEM->ID->*`. + ASSIGN lo_data->(lv_assign) TO . + IF IS INITIAL. + cl_abap_unit_assert=>fail( msg = 'id - initial value is initial' quit = 5 ). + ENDIF. + DATA(lv_id) = CONV string( ). + + DATA(lv_request) = `{"oUpdate":{"QUANTITY":"700"},"oSystem":{"ID": "` && lv_id && `"},"oEvent":{"EVENT":"BUTTON_POST","METHOD":"UPDATE"}}`. + z2ui5_cl_http_handler=>client = VALUE #( body = lv_request ). + lv_response = z2ui5_cl_http_handler=>http_post( ). + + clear lo_data. + /ui2/cl_json=>deserialize( + EXPORTING + json = lv_response + CHANGING + data = lo_data ). + + UNASSIGN . + lv_assign = `OMESSAGE->TEXT->*`. + ASSIGN lo_data->(lv_assign) TO . + IF <> `tomato 700 - send to the server`. + cl_abap_unit_assert=>fail( msg = 'message toast - text wrong' quit = 5 ). + ENDIF. + + ENDMETHOD. + ENDCLASS. -CLASS ltcl_unit_test_deep_data DEFINITION FINAL FOR TESTING +CLASS ltcl_unit_04_deep_data DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. @@ -223,7 +723,7 @@ CLASS ltcl_unit_test_deep_data DEFINITION FINAL FOR TESTING ENDCLASS. -CLASS ltcl_unit_test_deep_data IMPLEMENTATION. +CLASS ltcl_unit_04_deep_data IMPLEMENTATION. METHOD z2ui5_if_app~main. @@ -264,7 +764,7 @@ CLASS ltcl_unit_test_deep_data IMPLEMENTATION. METHOD test_app_deep_data. z2ui5_cl_http_handler=>client = VALUE #( - t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_TEST_DEEP_DATA' ) ) + t_param = VALUE #( ( name = 'app' value = 'LTCL_UNIT_04_DEEP_DATA' ) ) ). DATA(lv_response) = z2ui5_cl_http_handler=>http_post( ). @@ -276,17 +776,16 @@ CLASS ltcl_unit_test_deep_data IMPLEMENTATION. CHANGING data = lo_data ). - DATA lv_assign TYPE string. FIELD-SYMBOLS TYPE any. UNASSIGN . FIELD-SYMBOLS TYPE STANDARD TABLE. FIELD-SYMBOLS TYPE any. - lv_assign = `OVIEWMODEL->T_TAB->*`. + DATA(lv_assign) = `OVIEWMODEL->T_TAB->*`. ASSIGN lo_data->(lv_assign) TO . ASSIGN [ 1 ] TO . - DATA ls_tab_test TYPE ltcl_unit_test_deep_data=>ty_row. + DATA ls_tab_test TYPE ltcl_unit_04_deep_data=>ty_row. ls_tab_test = VALUE #( title = 'Peter' info = 'completed' descr = 'this is a description' icon = 'sap-icon://account' ). lv_assign = `TITLE->*`. @@ -308,4 +807,5 @@ CLASS ltcl_unit_test_deep_data IMPLEMENTATION. ENDIF. ENDMETHOD. + ENDCLASS. diff --git a/src/z2ui5_if_client.intf.abap b/src/z2ui5_if_client.intf.abap index b3e8f254..f159c7aa 100644 --- a/src/z2ui5_if_client.intf.abap +++ b/src/z2ui5_if_client.intf.abap @@ -16,6 +16,7 @@ INTERFACE z2ui5_if_client id_prev TYPE string, id_prev_app TYPE string, id_prev_app_stack TYPE string, + t_scroll_pos TYPE ty_t_name_value, t_req_param type ty_t_name_value, t_req_header type ty_t_name_value, END OF ty_s_get.