Index: shared/scripts/configuration/config.py =================================================================== diff -u -r1831753ec20fe00bc9e67466c6b15e58568e98ff -r0c2ceabc7a0a2270006f1a210be811658d849c4c --- shared/scripts/configuration/config.py (.../config.py) (revision 1831753ec20fe00bc9e67466c6b15e58568e98ff) +++ shared/scripts/configuration/config.py (.../config.py) (revision 0c2ceabc7a0a2270006f1a210be811658d849c4c) @@ -14,7 +14,6 @@ ############################################################################ import os -from dialin.dialin.common import alarm_priorities AUT_NAME = "denaliSquish" @@ -315,6 +314,7 @@ 287: "HD processor clock speed checks against FPGA clock failure.", 288: "DG trimmer heater on with flow timeout.", 289: "Total number of alarms.", + 290: "ALARM_ID_UNDEFINED [{}]", } ALARM_PRIORITIES = {1: "LOW", 2: "MEDIUM", 3: "HIGH"} @@ -368,4 +368,53 @@ UNDEFINED_ALARM_ID_MSG = "ALARM_ID_UNDEFINED" ALARM_TITLE = "Alarm" - \ No newline at end of file + + +ALARM_ID_NO_ALARM = 0 +ALARM_ID_OUT_OF_RANGE = 290 + +ALARM_PRIORITY_OPTIONS = { + 0 : 'ALARM_PRIORITY_NONE' , + 1 : 'ALARM_PRIORITY_LOW' , + 2 : 'ALARM_PRIORITY_MEDIUM', + 3 : 'ALARM_PRIORITY_HIGH', +} + +# alarm colors +ALARMS_COLORS_HEADER = { + "ALARM_PRIORITY_NONE" : "#438feb", + "ALARM_PRIORITY_LOW" : "#db8f00", + "ALARM_PRIORITY_MEDIUM" : "#db8f00", + "ALARM_PRIORITY_HIGH" : "#831913" +} + +ALARMS_COLORS_BODY = { + "ALARM_PRIORITY_NONE" : "#254670", + "ALARM_PRIORITY_LOW" : "#f5a623", + "ALARM_PRIORITY_MEDIUM" : "#f5a623", + "ALARM_PRIORITY_HIGH" : "#c53b33" +} + +ALARM_MUTE_FLAG = 0B0000001000000000 +ALARM_UNMUTE_FLAG = 0B0000000000000000 + +ALARM_BUTTONS_OK = 0B0000000010111000 + +ALARM_BUTTONS_RESUME = 0B0000000000110000 +ALARM_BUTTONS_RESUME_RINSEBACK = 0B0000000000100000 +ALARM_BUTTONS_RESUME_END = 0B0000000000010000 + +ALARM_BUTTONS_RINSEBACK = 0B0000000000101000 +ALARM_BUTTONS_RINSEBACK_RESUME = ALARM_BUTTONS_RESUME_RINSEBACK +ALARM_BUTTONS_RINSEBACK_END = 0B0000000000001000 + +ALARM_BUTTONS_END = 0B0000000000011000 +ALARM_BUTTONS_END_RESUME = ALARM_BUTTONS_RESUME_END +ALARM_BUTTONS_END_RINSEBACK = ALARM_BUTTONS_RINSEBACK_END + +ALARM_BUTTONS_RESUME_RINSEBACK_END = 0B0000000000000000 +ALARM_BUTTONS_RINSEBACK_RESUME_END = ALARM_BUTTONS_RESUME_RINSEBACK_END +ALARM_BUTTONS_END_RESUME_RINSEBACK = ALARM_BUTTONS_RESUME_RINSEBACK_END + + + Index: shared/scripts/configuration/utility.py =================================================================== diff -u -r90872d7586fbd455104384dddf0d81a7ce7c88bc -r0c2ceabc7a0a2270006f1a210be811658d849c4c --- shared/scripts/configuration/utility.py (.../utility.py) (revision 90872d7586fbd455104384dddf0d81a7ce7c88bc) +++ shared/scripts/configuration/utility.py (.../utility.py) (revision 0c2ceabc7a0a2270006f1a210be811658d849c4c) @@ -14,8 +14,7 @@ # ############################################################################ -import object -import names + import sys import squish import test @@ -25,9 +24,8 @@ from builtins import int as pyInt from configuration import config from dialin.ui.hd_simulator import HDSimulator -#from builtins import str as pyStr -#from builtins import float as pyFloat + hd = HDSimulator() @@ -46,7 +44,7 @@ try: counter += 1 test.log("Starting {}".format(app_name)) - squish.startApplication(config.Application_name) + squish.startApplication(app_name) if counter == 1: test.log(f"Application launched at the {counter}'st try.") elif counter == 2: @@ -55,7 +53,6 @@ test.log(f"Application launched at the {counter}'rd try.") else: test.log(f"Application launched at the {counter}'th try.") - squish.snooze(20) break except RuntimeError: if counter == 1: @@ -66,30 +63,17 @@ else: test.log(f"Application failed to launch after {counter} tries - Please refer logs") except: - logErrorDetails("Failed to start the application") + test.log("Failed to start the application") sys.exit(1) - -def color_verification(exp_val = "Red", act_val = "#c53b33"): - """ - Function to verify item color verification - Argument: - exp_val - Expected required value - act_val - Color displayed on UI - Return: - handle the application for log - """ - test.compare(config.COLOR_CODES[color_name],(act_val.color[name])) - - + + def check_if_object_is_within_the_container(obj=None, container=None): """ check if an object is inside a container - Arguments: - obj - child UI object - container - container UI object - Return: - bool + @param obj - child UI object + @param container - container UI object + @return boolean true and false """ container = squish.findObject(container) containerPos = container.mapToGlobal(squish.QPoint(0, 0)) @@ -107,16 +91,13 @@ return False - - + def scroll_to_zone(zone=None, screen_object=None): """ scroll to the zone if object is hidden - Arguments: - zone - UI object - screen_object - UI object - Return: - bool + @param zone - UI object + @param screen_object - UI object + @return boolean true and false """ counter = 0 while counter <= 100: @@ -142,11 +123,9 @@ def scroll_to_value_on_pop_up(value=None, container=None): """ scroll to the to the value if object is hidden - Arguments: - value - value object - container - Container of the value - Return: - bool + @param value - value object + @param container - Container of the value + @return boolean true and false """ counter = 0 while counter <= 100: Index: shared/scripts/names.py =================================================================== diff -u -r1831753ec20fe00bc9e67466c6b15e58568e98ff -r0c2ceabc7a0a2270006f1a210be811658d849c4c --- shared/scripts/names.py (.../names.py) (revision 1831753ec20fe00bc9e67466c6b15e58568e98ff) +++ shared/scripts/names.py (.../names.py) (revision 0c2ceabc7a0a2270006f1a210be811658d849c4c) @@ -3,6 +3,14 @@ from objectmaphelper import * +# Top Parents +o_QQuickView = { "type": "QQuickView"} +o_Overlay = {"container": o_QQuickView, "type": "Overlay" } + +# Modal Dialog +o_modalDialog = {"container": o_Overlay , "id": "_backgroundRect", "type": "Rectangle", "unnamed": 1, "visible": True} + + o_Gui_MainView = {"type": "Gui::MainView", "unnamed": 1, "visible": True} o_Overlay = {"container": o_Gui_MainView, "type": "Overlay", "unnamed": 1, "visible": True} o_borderRect_Rectangle = {"container": o_Overlay, "gradient": 0, "id": "_borderRect", "type": "Rectangle", "unnamed": 1, "visible": True} @@ -88,4 +96,35 @@ def get_alarm_msg_obj(msg): o_alarm_message["text"] = msg return o_alarm_message + +#alarm dialog +o_alarm_dialog_content = {"container": o_Overlay , "objectName": "_NotificationDialog" , "type": "ContentItem" } +o_alarm_dialog_titleBar = {"container": o_alarm_dialog_content , "id" : "_titleBar" , "type": "Rectangle" } +o_alarm_button_minimize = {"container": o_alarm_dialog_content , "id" : "_minimizeButton" , "type": "UpDownButton" ,"visible": True } +o_alarm_button_mute = {"container": o_alarm_dialog_content , "id" : "_muteButton" , "type": "MuteButton" ,"visible": True } +o_alarm_button_mute_img = {"container": o_alarm_button_mute , "id" : "_image" , "type": "Image", "unnamed": 1, "visible": True} +o_alarm_button_mute_min = {"container": o_alarm_button_mute , "id" : "_hourText" , "type": "Text" } +o_alarm_button_mute_sec = {"container": o_alarm_button_mute , "id" : "_minuteText" , "type": "Text" } +o_alarm_button_row = {"container": o_alarm_dialog_content , "id" : "_buttonGroup" , "type": "Row" } +o_alarm_button_resume = {"container": o_alarm_button_row , "id" : "_resumeTouchRect" , "type": "TouchRect" } +o_alarm_button_rinseback = {"container": o_alarm_button_row , "id" : "_rinsebackTouchRect" , "type": "TouchRect" } +o_alarm_button_end = {"container": o_alarm_button_row , "id" : "_endTouchRect" , "type": "TouchRect" } +o_alarm_button_ok = {"container": o_alarm_button_row , "id" : "_okTouchRect" , "type": "TouchRect" } +o_alarm_text_description = {"container": o_alarm_dialog_content , "id" : "_desc" , "type": "Text" } +o_alarm_bar = {"container": o_QQuickView , "id" : "_alarmBar" , "type": "NotificationBar" } +o_alarm_bar_text = {"container": o_alarm_bar , "id" : "_text" , "type": "Text" } +o_alarm_bar_mute_img = {"container": o_alarm_bar , "id" : "_image" , "type": "Image", "unnamed": 1, "visible": True} +o_alarm_bar_mute_min = {"container": o_alarm_bar , "id" : "_hourText" , "type": "Text" } +o_alarm_bar_mute_sec = {"container": o_alarm_bar , "id" : "_minuteText" , "type": "Text" } +o_alarm_bar_maximize = {"container": o_alarm_bar , "id" : "_updownButton" , "type": "UpDownButton" } +o_qquickview_alarm = {"type": "QQuickView", "unnamed": 1, "visible": True} +o_okay_alarm = {"container": o_Overlay, "id": "_okay", "type": "TouchRect", "unnamed": 1, "visible": True} +o_dismiss_alarm = {"container": o_Overlay, "id": "_silence", "type": "TouchRect", "unnamed": 1, "visible": True} + + + + + + + \ No newline at end of file Index: suite.conf =================================================================== diff -u -ra5da4d62892a9f9d464b6550c84e0d1672353ec7 -r0c2ceabc7a0a2270006f1a210be811658d849c4c --- suite.conf (.../suite.conf) (revision a5da4d62892a9f9d464b6550c84e0d1672353ec7) +++ suite.conf (.../suite.conf) (revision 0c2ceabc7a0a2270006f1a210be811658d849c4c) @@ -4,6 +4,6 @@ IMPLICITAUTSTART=0 LANGUAGE=Python OBJECTMAPSTYLE=script -TEST_CASES=tst_post tst_standbymode tst_In_treatment tst_ui_alarms_list +TEST_CASES=tst_post tst_standbymode tst_In_treatment tst_ui_alarms_list tst_ui_alarms_dialog VERSION=3 WRAPPERS=Qt Index: tst_ui_alarms_dialog/test.py =================================================================== diff -u --- tst_ui_alarms_dialog/test.py (revision 0) +++ tst_ui_alarms_dialog/test.py (revision 0c2ceabc7a0a2270006f1a210be811658d849c4c) @@ -0,0 +1,283 @@ +# -*- coding: utf-8 -*-" +# Copyright (c) 2019-2020 Diality Inc. - All Rights Reserved. +# copyright +# THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, +# IN PART OR IN WHOLE, +# WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. +# +# file tst_post +# @author (last) Joseph varghese +# @date (last) 02-Feb-2022 +# + + +import names +import logging + +from dialin.ui import utils + +from configuration import utility +from configuration import config +from dialin.ui.hd_simulator import HDSimulator +from dialin.protocols.CAN import DenaliCanMessenger +from dialin.ui.hd_simulator_alarms import HDAlarmsSimulator + +ALARM_EXPIRES_TIME = (0, 10, 20, 30, 30, 100) + + +def minimize(): + """ + Method to minimize alarm dialog box + @param N/A + @output N/A + """ + mouseClick(waitForObject(names.o_alarm_button_minimize)) + utils.waitForGUI(0.5) # this wait is necessary. Due to dialog animation it will be hide until the animation is done. + + +def maximize(): + """ + Method to maximize alarm dialog box + @param N/A + @output N/A + """ + mouseClick(waitForObject(names.o_alarm_bar_maximize)) + utils.waitForGUI(0.5) # this wait is necessary. Due to dialog animation it will be hide until the animation is done. + + +def test_buttons(alarm_instance, flag, vButtons): + """ + Method to verify buttons on alarm dialog box + @param alarm_instance - instance for hd + @param flag - alarm flag to be set + @param vButtons - button binary + """ + alarm_instance.cmd_activate_alarm_id(state = 1, alarm = 1, flags = flag) + test.compare(waitForObjectExists(names.o_alarm_button_ok ).visible, + vButtons == config.ALARM_BUTTONS_OK, + "Button visible [OK]") + test.compare(waitForObjectExists(names.o_alarm_button_resume ).visible, + vButtons == config.ALARM_BUTTONS_RESUME or + vButtons == config.ALARM_BUTTONS_RESUME_RINSEBACK or + vButtons == config.ALARM_BUTTONS_RESUME_END or + vButtons == config.ALARM_BUTTONS_RESUME_RINSEBACK_END , + "Button visible [Resume]") + test.compare(waitForObjectExists(names.o_alarm_button_rinseback ).visible, + vButtons == config.ALARM_BUTTONS_RINSEBACK or + vButtons == config.ALARM_BUTTONS_RINSEBACK_RESUME or + vButtons == config.ALARM_BUTTONS_RINSEBACK_END or + vButtons == config.ALARM_BUTTONS_RINSEBACK_RESUME_END , + "Button visible [RINSEBACK]") + test.compare(waitForObjectExists(names.o_alarm_button_end ).visible, + vButtons == config.ALARM_BUTTONS_END or + vButtons == config.ALARM_BUTTONS_END_RESUME or + vButtons == config.ALARM_BUTTONS_END_RINSEBACK or + vButtons == config.ALARM_BUTTONS_END_RESUME_RINSEBACK , + "Button visible [End]") + + obj = waitForObjectExists(names.o_alarm_button_ok) + if obj.visible : mouseClick(obj) + + obj = waitForObjectExists(names.o_alarm_button_resume) + if obj.visible : mouseClick(obj) + + obj = waitForObjectExists(names.o_alarm_button_rinseback) + if obj.visible : mouseClick(obj) + + obj = waitForObjectExists(names.o_alarm_button_end) + if obj.visible : mouseClick(obj) + + utils.waitForGUI(1) + + alarm_instance.cmd_alarm_condition_cleared(alarm_id = 1) + + +def verification_of_alarm_flag(alarm): + """ + Method to verify alarm flag + @param alarm - instance for hd simulator + @output N/A + """ + test.startSection("verification of alarm flag.") + + flag_status = alarm.cmd_make_alarm_flags(no_resume=1, no_rinseback=1, no_end_treatment=1, user_must_ack=1) + test_buttons(alarm_instance = alarm, flag = flag_status, vButtons = config.ALARM_BUTTONS_OK) + flag_status = alarm.cmd_make_alarm_flags(no_resume=1, no_rinseback=1, no_end_treatment=0, user_must_ack=0) + test_buttons(alarm_instance = alarm, flag = flag_status, vButtons = config.ALARM_BUTTONS_END) + flag_status = alarm.cmd_make_alarm_flags(no_resume=1, no_rinseback=0, no_end_treatment=1, user_must_ack=0) + test_buttons(alarm_instance = alarm, flag = flag_status, vButtons = config.ALARM_BUTTONS_RINSEBACK) + flag_status = alarm.cmd_make_alarm_flags(no_resume=0, no_rinseback=1, no_end_treatment=1, user_must_ack=0) + test_buttons(alarm_instance = alarm, flag = flag_status, vButtons = config.ALARM_BUTTONS_RESUME) + + #enables all the flags at same time + flag_status = alarm.cmd_make_alarm_flags(no_resume=0, no_rinseback=0, no_end_treatment=0, user_must_ack=1) + alarm.cmd_activate_alarm_id(state = 1, alarm = 1, flags = flag_status) + test.compare(waitForObjectExists(names.o_alarm_button_ok ).visible, True , + "Button visible [OK]") + test.compare(waitForObjectExists(names.o_alarm_button_resume ).visible, True , + "Button visible [Resume]") + test.compare(waitForObjectExists(names.o_alarm_button_rinseback ).visible, True , + "Button visible [RINSEBACK]") + test.compare(waitForObjectExists(names.o_alarm_button_end ).visible, True , + "Button visible [End]") + + test.endSection() + + +def test_color_based_on_alarm_priority(alarm_priority): + """ + Method to verify alarm dialog box color based on alarm priority + @param alarm_priority - alarm priority level + @output N/A + """ + test.startSection("verification of alarm dialog box color based on alarm priority -> " + config.ALARM_PRIORITY_OPTIONS[alarm_priority]) + + test.compare(str(waitForObjectExists(names.o_modalDialog ).color.name), config.ALARMS_COLORS_BODY[(config.ALARM_PRIORITY_OPTIONS[alarm_priority])]) + test.compare(str(waitForObjectExists(names.o_alarm_dialog_titleBar).color.name), config.ALARMS_COLORS_HEADER[(config.ALARM_PRIORITY_OPTIONS[alarm_priority])]) + + minimize() + test.compare(str(waitForObject (names.o_alarm_bar ).color.name), config.ALARMS_COLORS_BODY[(config.ALARM_PRIORITY_OPTIONS[alarm_priority])]) + + maximize() + test.endSection() + + +def test_message_based_on_alarm_id(alarm_id): + """ + Method to verify alarm message based on alarm id + @param alarm id + @output N/A + """ + test.startSection("verification of alarm message based on alarm id -> " + str(alarm_id)) + + if alarm_id == config.ALARM_ID_OUT_OF_RANGE: + test.compare(str(waitForObjectExists(names.o_alarm_text_description).text), config.ALARM_ID_UNDEFINED_STRING.format(alarm_id), + "verified alarm message for exceeded alarm id's") + minimize() + test.compare(str(waitForObjectExists(names.o_alarm_bar_text ).text), config.ALARM_ID_UNDEFINED_STRING.format(alarm_id), + "verified alarm message for exceeded alarm id's") + else: + test.compare(str(waitForObjectExists(names.o_alarm_text_description).text), config.ALARM_ID_AND_MESSAGES[alarm_id], + "Alarm message is verified from alarm dialog box") + minimize() + test.compare(str(waitForObjectExists(names.o_alarm_bar_text ).text), config.ALARM_ID_AND_MESSAGES[alarm_id], + "Alarm message is verified from alarm bar") + maximize() + + test.endSection() + + +def test_verify_alarm_mute(alarm_timeout = 0, v_flags = 0, alarm_status = "Mute"): + """ + Method to verify alarm mute and unmute characteristics. + @param alarm_timeout - timeout delay for alarm + @param v_flag - flag for mute and unmute operation. + @output N/A + """ + test.startSection("verification of alarm " + str(alarm_status) + "condition for timeout " + str(alarm_timeout)) + test.compare(waitForObjectExists(names.o_alarm_button_mute).timeout, alarm_timeout) + + muted = v_flags == config.ALARM_MUTE_FLAG + test.compare(waitForObjectExists(names.o_alarm_button_mute_min).visible, muted, "Mute min button is visible") + test.compare(waitForObjectExists(names.o_alarm_button_mute_sec).visible, muted, "Mute sec button is visible") + + muteTimeout_min,muteTimeout_sec = divmod(alarm_timeout, 60) + if muted: + test.compare(str(waitForObjectExists(names.o_alarm_button_mute_img).source.path), "/images/iBellOff") + test.compare(str(waitForObjectExists(names.o_alarm_button_mute_min).text), "{}" .format(muteTimeout_min)) + test.compare(str(waitForObjectExists(names.o_alarm_button_mute_sec).text), "{0:02}".format(muteTimeout_sec)) + minimize() + test.compare(str(waitForObjectExists(names.o_alarm_bar_mute_img ).source.path), "/images/iBellOff" ) + test.compare(str(waitForObjectExists(names.o_alarm_bar_mute_min ).text), "{}" .format(muteTimeout_min)) + test.compare(str(waitForObjectExists(names.o_alarm_bar_mute_sec ).text), "{0:02}".format(muteTimeout_sec)) + + else: + test.compare(str(waitForObjectExists(names.o_alarm_button_mute_img).source.path), "/images/iBellOn" ) + minimize() + test.compare(str(waitForObjectExists(names.o_alarm_bar_mute_img ).source.path), "/images/iBellOn" ) + + maximize() + test.endSection() + + +def verification_of_alarm_messages(alarm): + + test.startSection("verification of alarm bar parameters") + + for alarm_id in range(len(config.ALARM_ID_AND_MESSAGES)): + + if alarm_id == config.ALARM_ID_NO_ALARM: + test.log("validate alarm condition for alarm id : 0") + alarm.cmd_activate_alarm_id( alarm = alarm_id) + utils.waitForGUI() + dlg = names.o_modalDialog + bar = names.o_alarm_bar + dlg_exists = object.exists(dlg) + bar_exists = object.exists(bar) + if not dlg_exists: + test.compare(dlg_exists, False) + else: + test.compare(waitForObjectExists(dlg).visible, False) + + if not bar_exists: + test.compare(True, True) + else: + test.compare(waitForObjectExists(bar).visible, False) + else: + alarm.cmd_activate_alarm_id( alarm = alarm_id) + + #verify alarm message based on id on alarm bar section. + test_message_based_on_alarm_id(alarm_id) + + test.endSection() + + +def verification_of_alarm_parameters(alarm): + + test.startSection("verification of alarm parameters") + + flag_mute = alarm.cmd_make_alarm_flags(alarms_silenced=1) + flag_unmute = alarm.cmd_make_alarm_flags(alarms_silenced=0) + + for alarm_id in (2, 3, 5, 7, 10, 15): + for alarm_index in range(config.NUM_OF_ALARM_PRIORITIES): + alarm.cmd_activate_alarm_id(state = alarm_index, + alarm = alarm_id, + silence_expires = ALARM_EXPIRES_TIME[alarm_index], + flags = flag_mute) + + #verify mute feature in application. + test_verify_alarm_mute(alarm_timeout=ALARM_EXPIRES_TIME[alarm_index], v_flags=config.ALARM_MUTE_FLAG, + alarm_status = "Mute") + + alarm.cmd_activate_alarm_id(state = alarm_index, + alarm = alarm_id, + flags = flag_unmute) + + #verify un-mute feature in application. + test_verify_alarm_mute(v_flags=config.ALARM_UNMUTE_FLAG, + alarm_status = "UnMute") + + #verify coloring based on priority. + test_color_based_on_alarm_priority(alarm_index) + + test.endSection() + + +def main(): + + utils.tstStart(__file__) + utility.start_application(config.AUT_NAME) + + hd = HDSimulator() + + messenger = DenaliCanMessenger('can0') + + alarm = HDAlarmsSimulator(can_interface=messenger, logger=None) + + verification_of_alarm_messages(alarm) + verification_of_alarm_parameters(alarm) + verification_of_alarm_flag(alarm) + + snooze(10) + \ No newline at end of file