diff --git a/Tst/testing_library/testlib/tools.py b/Tst/testing_library/testlib/tools.py index b1104bd27e5385f697c7ecffc450643c4537f8d5..2d7ade68f3d4ad2524274658f552cbbff138ce3d 100644 --- a/Tst/testing_library/testlib/tools.py +++ b/Tst/testing_library/testlib/tools.py @@ -394,3 +394,9 @@ def compare_content(data_a, data_b): the_same = True return the_same + + +class TestVars: + + _desc = "This class can be used to define and share variables between test steps" + diff --git a/Tst/tst/data_model.py b/Tst/tst/data_model.py index 91cfdbb20f7af3ada65a72fabd0c4f0eeb990742..0dd1752ec18c797097ddf3fb9434b6ebbd67ae2c 100644 --- a/Tst/tst/data_model.py +++ b/Tst/tst/data_model.py @@ -910,6 +910,7 @@ class TestSpecification: self._postcon_code = '' self._postcon_descr = '' self._comment = '' + self._custom_imports = '' self.sequences = [] if json_data is not None: @@ -931,6 +932,7 @@ class TestSpecification: new_testspec.postcon_code = copy.copy(self.postcon_code) new_testspec.postcon_descr = copy.copy(self.postcon_descr) new_testspec.comment = copy.copy(self.comment) + new_testspec.custom_imports = copy.copy(self.custom_imports) return new_testspec @@ -1054,6 +1056,15 @@ class TestSpecification: assert isinstance(value, str) self._comment = value + @property + def custom_imports(self): + return self._custom_imports + + @custom_imports.setter + def custom_imports(self, value: str): + assert isinstance(value, str) + self._custom_imports = value + def encode_to_json(self, *args): """ Makes out of the TestSequence a JSON object. @@ -1079,6 +1090,7 @@ class TestSpecification: self.postcon_code = json_data['_postcon_code'] self.postcon_descr = json_data['_postcon_descr'] self.comment = json_data['_comment'] + self.custom_imports = json_data['_custom_imports'] except KeyError as keyerror: self.logger.error('KeyError: no {} could be found in the loaded data'.format(keyerror)) diff --git a/Tst/tst/generator.py b/Tst/tst/generator.py index dee547c4449c8455acf3b5c073de525a6d5e70c0..d9a54a5aaa4bb0be0befb01cfa87d3f16d66e3e8 100644 --- a/Tst/tst/generator.py +++ b/Tst/tst/generator.py @@ -93,7 +93,8 @@ def make_command_script(model, model_spec): header_template_str = header_file_obj.read() header_file_obj.close() header_str = string.Template(header_template_str) - header = header_str.substitute(testSpecFileName=create_file_name(model_spec.name)) + header = header_str.substitute(testSpecFileName=create_file_name(model_spec.name), + customImports=model_spec.custom_imports.strip()) # add the header string content += header @@ -266,8 +267,12 @@ def make_verification_script(model, model_spec): header_template_str = header_file_obj.read() header_file_obj.close() + header_str = string.Template(header_template_str) + header = header_str.substitute(testSpecFileName=create_file_name(model_spec.name), + customImports=model_spec.custom_imports.strip()) + # add the header string - content += header_template_str + content += header # add the class definition with open(ver_class_path, 'r') as class_file_obj: diff --git a/Tst/tst/generator_templates/co_header.py b/Tst/tst/generator_templates/co_header.py index b61b51380c6db11444f0e1d77b9fa0c14426827c..301967d46a6af2b768ed97416479f15013d87d46 100644 --- a/Tst/tst/generator_templates/co_header.py +++ b/Tst/tst/generator_templates/co_header.py @@ -14,6 +14,7 @@ sys.path.append(confignator.get_option('tst-paths', 'testing_library')) import ccs_function_lib as cfl from testlib import tools +from testlib.tools import TestVars as var from testlib import report from testlib import tm from testlib import tc @@ -22,6 +23,8 @@ from testlib import precond from testlib import testing_logger from testlib import sim +${customImports} + import ${testSpecFileName}_verification # create logger diff --git a/Tst/tst/generator_templates/co_post_condition.py b/Tst/tst/generator_templates/co_post_condition.py index f2a70372c8730dc9a7b9a75c5ae0d5ab39d06c0d..3b2901e4b796e655ac6be0ab8b34a561f193a8cc 100644 --- a/Tst/tst/generator_templates/co_post_condition.py +++ b/Tst/tst/generator_templates/co_post_condition.py @@ -1,5 +1,5 @@ # VERIFY EVERY STEP ------------------------------------------------------------------------------------------------ - def step_verification(self, pool_name, step_start_cuc, param, summary, ver_file, ver_class, ver_func, step_id): + def step_verification(self, pool_name, step_start_cuc, param, summary, ver_file, ver_class, ver_func, step_id, cvars): """ This functions does the verification for every step :param pool_name: str @@ -24,7 +24,7 @@ ver_instance_call = getattr(ver_file, ver_class) instance = ver_instance_call() ver_func_call = getattr(instance, ver_func) - success = ver_func_call(pool_name, start_cuc=step_start_cuc, run_id=self.run_id, step_id=step_id) + success = ver_func_call(pool_name, start_cuc=step_start_cuc, run_id=self.run_id, step_id=step_id, cvars=cvars) summary.result = success except: logger.exception('Exception in the Verification for Step {}'.format(param['step_no'])) diff --git a/Tst/tst/generator_templates/co_step.py b/Tst/tst/generator_templates/co_step.py index d1cb1e93c06c24372887a742910d9a7625653e00..ebb276460fce17113a5f1005b52a16993168b61a 100644 --- a/Tst/tst/generator_templates/co_step.py +++ b/Tst/tst/generator_templates/co_step.py @@ -24,6 +24,6 @@ summary = self.step_verification(pool_name=pool_name, step_start_cuc=step_start_cuc, param=param, summary=summary, ver_file=${testSpecFileName}_verification, ver_class="${testSpecClassName}Verification", - ver_func="step_${testStepNumber}", step_id=step_id) + ver_func="step_${testStepNumber}", step_id=step_id, cvars=locals()) return summary diff --git a/Tst/tst/generator_templates/run_header.py b/Tst/tst/generator_templates/run_header.py index d9540f3b5bd84c31809895e37a07f053069f69f3..739b66c3e2d95810ffc972228286dba9e323ea4e 100644 --- a/Tst/tst/generator_templates/run_header.py +++ b/Tst/tst/generator_templates/run_header.py @@ -13,6 +13,7 @@ sys.path.append(ccs_path) import ccs_function_lib as cfl cfl.add_tst_import_paths() from testlib import tools +from testlib.tools import TestVars as var from testlib import report from testlib import tm from testlib import tc diff --git a/Tst/tst/generator_templates/ver_header.py b/Tst/tst/generator_templates/ver_header.py index 20e02a993ca7d993902b85703c658a253c392cde..3232030b555e463a9d256e45522213a6b43c3047 100644 --- a/Tst/tst/generator_templates/ver_header.py +++ b/Tst/tst/generator_templates/ver_header.py @@ -2,6 +2,7 @@ """ The verification script """ +import time import logging import sys import os @@ -17,6 +18,9 @@ from datetime import datetime from testlib import report from testlib import analyse_command_log from testlib import testing_logger +from testlib.tools import TestVars as var + +${customImports} # create logger logger = logging.getLogger(__name__) diff --git a/Tst/tst/generator_templates/ver_step.py b/Tst/tst/generator_templates/ver_step.py index ef34a6a75b35e8bbe1bb65acf57bbda39f6953a2..d21427173dfa51f51c59b49915b66edebf8be3f9 100644 --- a/Tst/tst/generator_templates/ver_step.py +++ b/Tst/tst/generator_templates/ver_step.py @@ -1,5 +1,5 @@ # STEP $testStepNumber -------------------------------------------------------------------------------------------------------- - def step_$testStepNumber(self, pool_name, start_cuc=None, run_id=None, step_id=None): + def step_$testStepNumber(self, pool_name, start_cuc=None, run_id=None, step_id=None, cvars=None): testing_logger.ver_log_handler(__name__) param = { 'step_no': '$testStepNumber', diff --git a/Tst/tst/view.py b/Tst/tst/view.py index 0903df3efe97e67c91b093d3a7228dc120807a23..d923277430c5c34169857ccb9bea9014912294f7 100644 --- a/Tst/tst/view.py +++ b/Tst/tst/view.py @@ -95,7 +95,7 @@ class Board(Gtk.Box): self.test_meta_data_box.set_orientation(Gtk.Orientation.HORIZONTAL) self.test_meta_data_info = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) - self.test_meta_data_pre_post_con = Gtk.Box() + self.test_meta_data_pre_post_con = Gtk.Box(margin_start=10) self.test_meta_data_pre_post_con.set_orientation(Gtk.Orientation.VERTICAL) self.test_meta_data_pre_post_con_edit = Gtk.Box() self.test_meta_data_pre_post_con_edit.set_orientation(Gtk.Orientation.VERTICAL) @@ -175,9 +175,9 @@ class Board(Gtk.Box): self.test_meta_data_pre_post_con.pack_start(precon_line, False, True, 2) self.test_meta_data_pre_post_con.pack_start(self.postcon_selection_label, False, True, 2) self.test_meta_data_pre_post_con.pack_start(postcon_line, False, True, 0) - self.test_meta_data_box.set_spacing(20) + self.test_meta_data_box.set_spacing(10) - self.test_comment_box = Gtk.Box(spacing=2) + self.test_comment_box = Gtk.Box(spacing=2, margin_end=5) self.test_comment_box.set_orientation(Gtk.Orientation.VERTICAL) self.label_comment = Gtk.Label() self.label_comment.set_halign(Gtk.Align.START) @@ -201,6 +201,49 @@ class Board(Gtk.Box): self.test_meta_data_box.pack_start(self.test_comment_box, True, True, 0) self.pack_start(self.test_meta_data_box, False, True, 0) + # add a custom init code block + self.custom_import_box = Gtk.Box(spacing=5, margin_start=10, margin_end=10) + self.custom_import_box.set_orientation(Gtk.Orientation.VERTICAL) + + self.bar_custom_import = Gtk.Box() + self.bar_custom_import.set_orientation(Gtk.Orientation.HORIZONTAL) + self.bar_custom_import.set_tooltip_text('Statements that are executed at the beginning of a test.\n' + 'Define imports and variables used throughout the test here.') + self.label_custom_import = Gtk.Label() + self.label_custom_import.set_halign(Gtk.Align.START) + self.label_custom_import.set_markup('<b>Init code</b>') + + self.button_custom_import = Gtk.ToolButton() + self.button_custom_import.set_icon_name('pan-down-symbolic') + self.button_custom_import.connect('clicked', self.on_init_code_toggle) + + self.bar_custom_import.pack_start(self.button_custom_import, False, True, 0) + self.bar_custom_import.pack_start(self.label_custom_import, False, True, 0) + + self.custom_import_scrolled_window = Gtk.ScrolledWindow() + self.custom_import_scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + self.custom_import_scrolled_window.set_size_request(-1, 200) + self.test_custom_import = GtkSource.View() + self.test_custom_import.set_auto_indent(True) + self.test_custom_import.set_wrap_mode(Gtk.WrapMode.WORD) + self.test_custom_import.set_show_line_numbers(True) + self.test_custom_import.set_monospace(True) + self.test_custom_import.set_highlight_current_line(True) + self.test_custom_import.set_indent_on_tab(True) + self.test_custom_import.set_insert_spaces_instead_of_tabs(True) + self.test_custom_import.set_indent_width(4) + self.test_custom_import.set_auto_indent(True) + self.custom_import_buffer = self.test_custom_import.get_buffer() + + self.custom_import_buffer.set_language(lngg) + # self.custom_import_buffer.set_style_scheme(self.board.current_scheme) + self.custom_import_scrolled_window.add(self.test_custom_import) + + self.custom_import_box.pack_start(self.bar_custom_import, False, False, 0) + self.custom_import_box.pack_start(self.custom_import_scrolled_window, True, True, 0) + + self.pack_start(self.custom_import_box, False, True, 0) + # making the toolbar self.btn_add_step = Gtk.ToolButton() self.btn_add_step.set_label(_('Add step')) @@ -250,6 +293,7 @@ class Board(Gtk.Box): self.test_meta_data_iasw_version.connect('changed', self.on_test_iasw_version_change) self.text_meta_data_test_is_locked.connect('toggled', self.on_test_locked_toggled) self.test_meta_data_comment.get_buffer().connect('changed', self.on_comment_change) + self.custom_import_buffer.connect('changed', self.on_custom_import_change) Gtk.StyleContext.add_class(self.get_style_context(), 'board') @@ -332,6 +376,17 @@ class Board(Gtk.Box): # Set the Locked STep numeration self.text_meta_data_test_is_locked.set_active(self.model.primary_counter_locked) + # Set the init code block + self.custom_import_buffer.set_text(self.model.custom_imports) + + def on_init_code_toggle(self, widget): + if self.custom_import_scrolled_window.is_visible(): + self.custom_import_scrolled_window.set_visible(False) + widget.set_icon_name('pan-end-symbolic') + else: + self.custom_import_scrolled_window.set_visible(True) + widget.set_icon_name('pan-down-symbolic') + def collapse_all_steps(self, button): """ Close all expander of the steps """ steps = self.grid.get_children() @@ -509,6 +564,18 @@ class Board(Gtk.Box): # update the data model viewer self.app.update_model_viewer() + def on_custom_import_change(self, widget): + """ + update model if buffer changes + + :param widget: + :return: + """ + + custom_code = widget.get_text(widget.get_start_iter(), widget.get_end_iter(), True) + self.model.custom_imports = custom_code + self.app.update_model_viewer() + def destroy_all_step_widgets(self): """ Destroys all StepWidgets of the current grid