From 336801fb900bf2b541219d6690053b18e97011e9 Mon Sep 17 00:00:00 2001 From: Ahmed ElShreif Date: Mon, 1 Jul 2019 17:42:53 +0200 Subject: uitest: start the implementation of the new DSL compiler 1) finish the functions that will parse inputs 2) add function to initialize the UI test Case 3) add function to print the ui new test case 4) add the UNO caommands handler 5) add the Dialog commands handler 6) add the Starter commands handler Change-Id: Ided1c050023c5284457f62c4b8d5ea1cfa38c043 --- uitest/ui_logger_dsl/dsl_core.py | 142 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 137 insertions(+), 5 deletions(-) (limited to 'uitest') diff --git a/uitest/ui_logger_dsl/dsl_core.py b/uitest/ui_logger_dsl/dsl_core.py index 7c324083e2b7..94dc4c8b716e 100644 --- a/uitest/ui_logger_dsl/dsl_core.py +++ b/uitest/ui_logger_dsl/dsl_core.py @@ -1,10 +1,142 @@ +#!/usr/bin/env python3 +# This file is part of the LibreOffice UI_logger project. +# +# This file contain the implementation of the Compiler +# for the new logger grammar +# +# ul stands for Ui_Logger + +import os +import sys +import argparse from textx.metamodel import metamodel_from_file -ui_dsl_mm = metamodel_from_file('ui_logger_dsl_grammar.tx') +def parse_args(): + """ + This function parses the command-line arguments + to get the input and output file details + """ + parser = argparse.ArgumentParser(description = "Generate a UI test file from log") + parser.add_argument("input_address", type = str, help = "The log file address") + parser.add_argument("output_address", type = str, help = "The test file address") + args = parser.parse_args() + return args + +class ul_Compiler: + variables=[] + def __init__(self , input_address , output_address): + self.ui_dsl_mm = metamodel_from_file('ui_logger_dsl_grammar.tx') + self.output_stream=self.initiate_test_generation(output_address) + self.input_address=input_address + + def get_log_file(self , input_address): + try: + # load the program + content = self.ui_dsl_mm.model_from_file(input_address) + except IOError as err: + print("IO error: {0}".format(err)) + print("Use " + os.path.basename(sys.argv[0]) + " -h to get usage instructions") + sys.exit(1) + + return content + + def initiate_test_generation(self,output_address): + try: + f = open(output_address,"w") + except IOError as err: + print("IO error: {0}".format(err)) + print("Use " + os.path.basename(sys.argv[0]) + " -h to get usage instructions") + sys.exit(1) + line="# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*-\n\n" + \ + "from uitest.framework import UITestCase\n" + \ + "from libreoffice.uno.propertyvalue import mkPropertyValues\n" + \ + "import importlib\n\n" + \ + "class TestClass(UITestCase):\n" + \ + "\tdef test_function(self):\n" + + self.variables.append(line) + + return f + + def compile(self): + self.ui_dsl_mm.register_obj_processors({ + 'UNOCommand': self.handle_uno, + 'StarterCommand': self.handle_start, + 'CloseDialog': self.handle_Dialog, + 'OpenModelessDialog': self.handle_Dialog, + 'OpenModalDialog':self.handle_Dialog, + }) + + self.log_lines=self.get_log_file(self.input_address) + + def handle_uno(self, UNOCommand): + if(UNOCommand.prameters==None): + line = "\t\tself.xUITest.executeCommand(\"" + \ + UNOCommand.uno_command_name +"\")\n" + else: + paramaters="" + for p in UNOCommand.prameters.parameter_data : + paramaters = paramaters + "\"" + p.key + "\" : " + str(p.value) + " ," + paramaters = paramaters[:-1] + + line = "\t\tself.xUITest.executeCommandWithParameters(\"" + \ + UNOCommand.uno_command_name +"\", mkPropertyValues({"+ paramaters +"}) )\n" + + self.variables.append(line) + + def handle_start(self, StarterCommand): + line="\t\tMainDoc = self.ui_test.create_doc_in_start_center(\""+\ + StarterCommand.program_name+"\")\n" + self.variables.append(line) + + line="\t\tMainWindow = self.xUITest.getTopFocusWindow()\n" + self.variables.append(line) + + def handle_Dialog(self, DialogCommand): + + if (DialogCommand.__class__.__name__ == "OpenModalDialog"): + old_line = self.variables.pop() + + key_word=old_line[-9:-3] + if ( key_word == "Dialog"): + old_line="\t\tself.ui_test.execute_dialog_through_command(\""+\ + old_line[31:-3]+"\")\n" + self.variables.append(old_line) + line = "\t\t" + DialogCommand.dialog_name + " = self.xUITest.getTopFocusWindow()\n" + + elif (DialogCommand.__class__.__name__ == "OpenModelessDialog"): + old_line = self.variables.pop() + + key_word=old_line[-9:-3] + if ( key_word == "Dialog"): + old_line="\t\tself.ui_test.execute_modeless_dialog_through_command(\""+\ + old_line[31:-3]+"\")\n" + self.variables.append(old_line) + line = "\t\t" + DialogCommand.dialog_name + " = self.xUITest.getTopFocusWindow()\n" + + elif (DialogCommand.__class__.__name__ == "CloseDialog"): + line="\t\tto be implemented after ui Objects\n" + + self.variables.append(line) + + def Generate_UI_test(self): + line="\t\tself.ui_test.close_doc()" + self.variables.append(line) + + for line in self.variables: + self.output_stream.write(str(line)) -# Load the program: -actions = ui_dsl_mm.model_from_file('example.ul') + def __del__(self): + self.output_stream.close() -for statement in actions.commands: +def main(): + args = parse_args() + ui_logger = ul_Compiler(args.input_address,args.output_address) + ui_logger.compile() + for statement in (ui_logger.log_lines.commands): + print(statement) + ui_logger.Generate_UI_test() + del ui_logger - print(statement) +if __name__ == '__main__': + main() -- cgit