From 717727bf5a2e69c5b02e5aba0b34e3a67e578e78 Mon Sep 17 00:00:00 2001 From: Renaud Walder Date: Fri, 22 May 2026 22:54:14 +0200 Subject: [PATCH 1/4] Unified let syntax to be a list of objects --- doc/manual/sphinx/source/test_items/let_test_item.rst | 6 +++--- doc/manual/sphinx/source/tum_syntax.rst | 4 ++-- test/validation/items/let/test.tum | 4 ++-- test/validation/items/lua_func/test.tum | 2 +- test/validation/items/py_func/test.tum | 2 +- test/validation/main.tum | 6 +++++- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/doc/manual/sphinx/source/test_items/let_test_item.rst b/doc/manual/sphinx/source/test_items/let_test_item.rst index f896259..e1eb6f3 100644 --- a/doc/manual/sphinx/source/test_items/let_test_item.rst +++ b/doc/manual/sphinx/source/test_items/let_test_item.rst @@ -9,9 +9,9 @@ This element is of the following form: - let: name: Let Item values: - key1: value1 - key2: value2 - key3: <| $(variable)[$(loop_index)] |> + - key1: value1 + - key2: value2 + - key3: <| $(variable)[$(loop_index)] |> The ``let`` element is used to set values in the global directory. diff --git a/doc/manual/sphinx/source/tum_syntax.rst b/doc/manual/sphinx/source/tum_syntax.rst index e3d10b5..7e059ed 100644 --- a/doc/manual/sphinx/source/tum_syntax.rst +++ b/doc/manual/sphinx/source/tum_syntax.rst @@ -51,8 +51,8 @@ The parameter file can be specified in the `.tum` file root: :caption: configuration files definition in the main `.tum` test file config_file: - config1.yaml - config2.yaml + - config1.yaml + - config2.yaml main: name: Test example diff --git a/test/validation/items/let/test.tum b/test/validation/items/let/test.tum index 83d4252..47a6070 100644 --- a/test/validation/items/let/test.tum +++ b/test/validation/items/let/test.tum @@ -11,8 +11,8 @@ - let: name: Let it be values: - it: $(loop_param) - be: <| $(loop_param) == $(it) |> + - it: $(loop_param) + - be: <| $(loop_param) == $(it) |> - loop: name: Cycle iterating on list diff --git a/test/validation/items/lua_func/test.tum b/test/validation/items/lua_func/test.tum index e87128d..ccef4b5 100644 --- a/test/validation/items/lua_func/test.tum +++ b/test/validation/items/lua_func/test.tum @@ -1,7 +1,7 @@ - let: name: lua_func test constants, values: - lua_func test parameter: test parameter lua_func + - lua_func test parameter: test parameter lua_func - lua_func: name: fail lua_func diff --git a/test/validation/items/py_func/test.tum b/test/validation/items/py_func/test.tum index e67b564..c4ba269 100644 --- a/test/validation/items/py_func/test.tum +++ b/test/validation/items/py_func/test.tum @@ -1,7 +1,7 @@ - let: name: py_func test constants, values: - py_func test parameter: test parameter + - py_func test parameter: test parameter - py_func: name: pass py_func diff --git a/test/validation/main.tum b/test/validation/main.tum index aa15916..e73e99f 100644 --- a/test/validation/main.tum +++ b/test/validation/main.tum @@ -31,7 +31,11 @@ main: {% for item in items %} # item test - - let: {name: {{ item }} test constants, values: {test: {{ item }}, test_path: items/$(test)}} + - let: + name: {{ item }} test constants + values: + - test: {{ item }} + - test_path: items/$(test) - group: name: {{ item }} test steps: -- 2.47.3 From 53553dc1fa96e11b2e02098359e1e85dfbbbdeaf Mon Sep 17 00:00:00 2001 From: Renaud Walder Date: Fri, 22 May 2026 22:55:10 +0200 Subject: [PATCH 2/4] Allow floating number for console timeout --- .../interpreter/test_items/test_item_console.py | 2 +- test/validation/items/console/test.tum | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/testium/interpreter/test_items/test_item_console.py b/src/testium/interpreter/test_items/test_item_console.py index b339eed..34c1411 100644 --- a/src/testium/interpreter/test_items/test_item_console.py +++ b/src/testium/interpreter/test_items/test_item_console.py @@ -344,7 +344,7 @@ class TestItemConsoleReadUntil(TestItemConsoleAction): def execute(self): cons = self.get_console() ru = self._prms.expanse(self._read_until) - read_timeout = int(self._prms.getParam("timeout", default=-1, processed=True)) + read_timeout = float(self._prms.getParam("timeout", default=-1, processed=True)) mute = self._prms.getParam("mute", default=False, processed=True) if read_timeout < 0: read_timeout = None diff --git a/test/validation/items/console/test.tum b/test/validation/items/console/test.tum index 5e84ad7..985abd7 100644 --- a/test/validation/items/console/test.tum +++ b/test/validation/items/console/test.tum @@ -84,7 +84,18 @@ - read_until: {expected: HelloConsole, timeout: 1, mute: true} - console: - name: Console read_until muted + name: Console read_until float timeout + console_name: term + key: $(test)_PASS + steps: + - writeln: echo "HelloConsole" +{% if os == "Windows" %} + - read_until: {expected: echo "HelloConsole", timeout: 0.2} +{% endif %} + - read_until: {expected: HelloConsole, timeout: 0.2} + +- console: + name: Console read_until process result console_name: term key: $(test)_PASS steps: -- 2.47.3 From 3fb982b057979118456b2404e7d3673137fdbdd4 Mon Sep 17 00:00:00 2001 From: Renaud Walder Date: Thu, 4 Jun 2026 22:13:54 +0200 Subject: [PATCH 3/4] Solving refresh bug which disables every tests --- src/testium/main_win/test_file_manager.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/testium/main_win/test_file_manager.py b/src/testium/main_win/test_file_manager.py index 59c49fa..99b19c6 100644 --- a/src/testium/main_win/test_file_manager.py +++ b/src/testium/main_win/test_file_manager.py @@ -51,14 +51,18 @@ class TestFileManager: w.disconnect_signals() # Snapshot user-selected checkboxes and fold state so they survive a # reload of the same file (same logic as session-restore through prefs). + # checkList works only if show_checkboxes is True previous_check_list = w.treeTests.getCheckList() previous_fold_list = w.treeTests.getFoldList() previous_count = w.treeTests.getItemCount() self.clear_process() - if self.load(file_name) and w.test_service is not None: - if w.treeTests.getItemCount() == previous_count: - w.treeTests.restoreCheckList(previous_check_list, w.test_service) + if self.load(file_name) and \ + w.test_service is not None and \ + w.treeTests.getItemCount() == previous_count: + if prefs.settings.show_checkboxes : + w.treeTests.restoreCheckList(previous_check_list, w.test_service) w.treeTests.restoreFoldList(previous_fold_list) + w.reconnect_signals() def _make_progress(self, w): -- 2.47.3 From 811e3d356ed726bd2ca7d0105fb1bc9ff208ba00 Mon Sep 17 00:00:00 2001 From: Renaud Walder Date: Fri, 5 Jun 2026 01:47:00 +0200 Subject: [PATCH 4/4] Solve a tuple error in Lua and unify Lua and Python tests --- src/testium/lua_func/handle.lua | 10 +- test/validation/items/lua_func/lua_func.lua | 8 +- test/validation/items/lua_func/param.yaml | 2 +- test/validation/items/lua_func/test.tum | 248 +++++++++++++------- test/validation/items/py_func/param.yaml | 7 +- test/validation/items/py_func/py_func.py | 4 +- test/validation/items/py_func/test.tum | 145 +++++++++--- 7 files changed, 298 insertions(+), 126 deletions(-) diff --git a/src/testium/lua_func/handle.lua b/src/testium/lua_func/handle.lua index 6c176ac..916538b 100644 --- a/src/testium/lua_func/handle.lua +++ b/src/testium/lua_func/handle.lua @@ -56,9 +56,17 @@ function handle.func_call(params) if err == nil then print(string.format("Function executed from '%s'", pfile)) utils.log("func_call function found '%s', '%s'", file, fname) - succ, ret = pcall(func, unpack(prms)) + err_res = {pcall(func, unpack(prms))} utils.log("func_call returned '%s', '%s'", tostring(succ), tostring(ret)) + -- manage tuple ouput of a lua function + succ = table.remove(err_res, 1) + if #err_res > 1 then + ret = err_res + else + ret = unpack(err_res) + end + if succ then res = ret else diff --git a/test/validation/items/lua_func/lua_func.lua b/test/validation/items/lua_func/lua_func.lua index a408bc8..86a3631 100644 --- a/test/validation/items/lua_func/lua_func.lua +++ b/test/validation/items/lua_func/lua_func.lua @@ -12,12 +12,12 @@ function module.assertparam(param) end function module.checkglobal(param) - local res = tm.gd(param) - return res + assert(param=='test parameter') + return 0 end function module.checkglobal2(index) - return tm.gd("lua_data_to_be_returned")[index] + return tm.gd("data_to_be_returned")[index+1] end function module.should_not_be_called(param) @@ -53,7 +53,7 @@ function module.return_nothing() -- Returns no value: ret is nil but no error. end -function module.return_explicit_nil() +function module.return_explicit_none() return nil end diff --git a/test/validation/items/lua_func/param.yaml b/test/validation/items/lua_func/param.yaml index 3caeeaf..479a911 100644 --- a/test/validation/items/lua_func/param.yaml +++ b/test/validation/items/lua_func/param.yaml @@ -1,6 +1,6 @@ skipped_test_item: ['skipped_checkglobal'] -lua_data_to_be_returned: +data_to_be_returned: - 1 - {a: 1, b: 2} - ["a", 1, 2.1, True] \ No newline at end of file diff --git a/test/validation/items/lua_func/test.tum b/test/validation/items/lua_func/test.tum index ccef4b5..a24977c 100644 --- a/test/validation/items/lua_func/test.tum +++ b/test/validation/items/lua_func/test.tum @@ -1,7 +1,15 @@ - let: name: lua_func test constants, values: - - lua_func test parameter: test parameter lua_func + - func_test_parameter: test parameter + +- lua_func: + name: pass lua_func + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: assertparam + param: + - true - lua_func: name: fail lua_func @@ -12,7 +20,7 @@ - false - lua_func: - name: fail lua_func with expected result FAIL + name: fail lua_func with expected result "FAIL" key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: assertparam @@ -62,35 +70,7 @@ file: $(test_path)$(psep)lua_func.lua func_name: checkglobal param: - - lua_func test parameter - expected_result: $(lua_func test parameter) - -- lua_func: - name: global param lua_func 1 - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: checkglobal2 - param: - - 1 - expected_result: ($(lua_data_to_be_returned))[0] - -- lua_func: - name: global param lua_func 2 - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: checkglobal2 - param: - - 2 - expected_result: ($(lua_data_to_be_returned))[1] - -- lua_func: - name: global param lua_func 3 - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: checkglobal2 - param: - - 3 - expected_result: ($(lua_data_to_be_returned))[2] + - $(func_test_parameter) - let: name: python2func @@ -98,88 +78,189 @@ values: - py: $(test_path)$(psep)lua_func.lua +- lua_func: + name: global param int + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: checkglobal2 + param: + - 0 + expected_result: ($(data_to_be_returned))[0] + +- lua_func: + name: global param dict + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: checkglobal2 + param: + - 1 + expected_result: ($(data_to_be_returned))[1] + +- lua_func: + name: global param list + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: checkglobal2 + param: + - 2 + expected_result: ($(data_to_be_returned))[2] + + + +- lua_func: + name: global param lua_func + key: $(test)_PASS + file: $(py) + func_name: checkglobal + param: + - $(func_test_parameter) - lua_func: name: skipped_checkglobal + key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: should_not_be_called param: - - $(test parameter) + - $(func_test_parameter) - lua_func: name: skipped true + key: $(test)_FAIL file: $(test_path)$(psep)lua_func.lua - func_name: checkglobal + func_name: echo skipped: true param: - - $(test parameter) + - "skipped" - lua_func: name: skipped 1 + key: $(test)_FAIL file: $(test_path)$(psep)lua_func.lua - func_name: checkglobal + func_name: echo skipped: 1 param: - - $(test parameter) + - "skipped" - group: name: Function results check steps: - group: - name: Function result failure + name: Functions result steps: - lua_func: - name: int failure + name: int key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: echo param: [-1] - lua_func: - name: float failure + name: float key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: echo - param: [-1.3] + param: [-20.3] - lua_func: - name: String failure + name: String key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: echo param: [ "FAIL" ] - lua_func: - name: Tuple int,str failure - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: tuple_return - param: [ -1, "Got a failure" ] - - group: - name: Functions result success - steps: - - lua_func: - name: int success - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: echo - param: [0] - - lua_func: - name: float success - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: echo - param: [0.3] - - lua_func: - name: String success - key: $(test)_PASS - file: $(test_path)$(psep)lua_func.lua - func_name: echo - param: [ "Something that is not only strictly FAIL" ] - - lua_func: - name: Tuple int,str success + name: Tuple int,str key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: tuple_return param: [ 0, "OK" ] - + - group: + name: Functions result expected + steps: + - lua_func: + name: int expected + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [18] + expected_result: 18 + - lua_func: + name: float expected + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [0.3] + expected_result: 0.3 + - lua_func: + name: String expected + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [ "Something" ] + expected_result: Something + - lua_func: + name: Tuple int,str expected + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: tuple_return + param: [ 0, "OK" ] + expected_result: [0, "OK"] + - lua_func: + name: small list expected + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [ [-23] ] + expected_result: [-23] + - lua_func: + name: big list expected + key: $(test)_PASS + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [ [-23, 17, 67] ] + expected_result: [-23, 17, 67] + - group: + name: Function result not expected + steps: + - lua_func: + name: int not expected + key: $(test)_FAIL + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [18] + expected_result: 17 + - lua_func: + name: float not expected + key: $(test)_FAIL + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [0.3] + expected_result: 0.5 + - lua_func: + name: String not expected + key: $(test)_FAIL + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [ "Something" ] + expected_result: Nothing + - lua_func: + name: Tuple int,str not expected + key: $(test)_FAIL + file: $(test_path)$(psep)lua_func.lua + func_name: tuple_return + param: [ 0, "OK" ] + expected_result: [0, "OUPS"] + - lua_func: + name: small list not expected + key: $(test)_FAIL + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [ [-23] ] + expected_result: [-22] + - lua_func: + name: big list not expected + key: $(test)_FAIL + file: $(test_path)$(psep)lua_func.lua + func_name: echo + param: [ [-23, 17, 67] ] + expected_result: [-23, 16, 67] - lua_func: name: delgd test key: $(test)_PASS @@ -193,40 +274,39 @@ func_name: return_nothing - lua_func: - name: function returning explicit nil should succeed + name: function returning explicit None should succeed key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua - func_name: return_explicit_nil + func_name: return_explicit_none - group: name: context_id tests steps: - lua_func: - name: set context value + name: set serializable value key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: set_context_value - context_id: lua_ctx_test param: - - hello lua - expected_result: hello lua + - hello context + expected_result: hello context - lua_func: - name: get context value (same context_id) + name: get serializable value (same context_id) key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: get_context_value - context_id: lua_ctx_test - expected_result: hello lua + context_id: ctx_test + expected_result: hello context - lua_func: - name: get context value (no context_id, from main gd) + name: get serializable value (no context_id, from main gd) key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: get_context_value - expected_result: hello lua + expected_result: hello context - lua_func: - name: get context value (different context_id) + name: get serializable value (different context_id) key: $(test)_PASS file: $(test_path)$(psep)lua_func.lua func_name: get_context_value - context_id: lua_ctx_other - expected_result: hello lua + context_id: ctx_other + expected_result: hello context diff --git a/test/validation/items/py_func/param.yaml b/test/validation/items/py_func/param.yaml index 21d4048..479a911 100644 --- a/test/validation/items/py_func/param.yaml +++ b/test/validation/items/py_func/param.yaml @@ -1 +1,6 @@ -skipped_test_item: ['skipped_checkglobal'] \ No newline at end of file +skipped_test_item: ['skipped_checkglobal'] + +data_to_be_returned: + - 1 + - {a: 1, b: 2} + - ["a", 1, 2.1, True] \ No newline at end of file diff --git a/test/validation/items/py_func/py_func.py b/test/validation/items/py_func/py_func.py index 6b5ec50..c054c9f 100644 --- a/test/validation/items/py_func/py_func.py +++ b/test/validation/items/py_func/py_func.py @@ -16,8 +16,8 @@ def checkglobal(param): assert param=='test parameter' return 0 -def checkglobal2(): - return tm.gd("py_func test parameter") +def checkglobal2(index): + return tm.gd("data_to_be_returned")[index] def should_not_be_called(param): raise diff --git a/test/validation/items/py_func/test.tum b/test/validation/items/py_func/test.tum index c4ba269..9893337 100644 --- a/test/validation/items/py_func/test.tum +++ b/test/validation/items/py_func/test.tum @@ -1,7 +1,7 @@ - let: name: py_func test constants, values: - - py_func test parameter: test parameter + - func_test_parameter: test parameter - py_func: name: pass py_func @@ -70,7 +70,7 @@ file: $(test_path)$(psep)py_func.py func_name: checkglobal param: - - $(py_func test parameter) + - $(func_test_parameter) - let: name: python2func @@ -79,11 +79,32 @@ - py: $(test_path)$(psep)py_func.py - py_func: - name: global param py_func 2 + name: global param int key: $(test)_PASS - file: $(py) + file: $(test_path)$(psep)py_func.py func_name: checkglobal2 - expected_result: $(py_func test parameter) + param: + - 0 + expected_result: ($(data_to_be_returned))[0] + +- py_func: + name: global param dict + key: $(test)_PASS + file: $(test_path)$(psep)py_func.py + func_name: checkglobal2 + param: + - 1 + expected_result: ($(data_to_be_returned))[1] + +- py_func: + name: global param list + key: $(test)_PASS + file: $(test_path)$(psep)py_func.py + func_name: checkglobal2 + param: + - 2 + expected_result: ($(data_to_be_returned))[2] + - py_func: @@ -92,104 +113,162 @@ file: $(py) func_name: checkglobal param: - - $(py_func test parameter) + - $(func_test_parameter) - py_func: name: skipped_checkglobal + key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: should_not_be_called param: - - $(py_func test parameter) + - $(func_test_parameter) - py_func: name: skipped true + key: $(test)_FAIL file: $(test_path)$(psep)py_func.py - func_name: checkglobal + func_name: echo skipped: true param: - - $(py_func test parameter) + - "skipped" - py_func: name: skipped 1 + key: $(test)_FAIL file: $(test_path)$(psep)py_func.py - func_name: checkglobal + func_name: echo skipped: 1 param: - - $(py_func test parameter) + - "skipped" - py_func: name: FunctionItem test + key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: ValidationTest param: - - $(py_func test parameter) + - $(func_test_parameter) - group: name: Function results check steps: - group: - name: Function result 1 + name: Functions result steps: - py_func: - name: int failure + name: int key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: echo param: [-1] - expected_result: -1 - py_func: - name: float failure + name: float key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: echo - param: [-1.3] - expected_result: -1.3 + param: [-20.3] - py_func: - name: String failure + name: String key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: echo param: [ "FAIL" ] - expected_result: FAIL - py_func: - name: Tuple int,str failure + name: Tuple int,str key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: tuple_return - param: [ -1, "Got a failure" ] - expected_result: [-1, "Got a failure"] + param: [ 0, "OK" ] - group: - name: Functions result 2 + name: Functions result expected steps: - py_func: - name: int success + name: int expected key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: echo - param: [0] - expected_result: 0 + param: [18] + expected_result: 18 - py_func: - name: float success + name: float expected key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: echo param: [0.3] expected_result: 0.3 - py_func: - name: String success + name: String expected key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: echo - param: [ "Something that is not only strictly FAIL" ] - expected_result: Something that is not only strictly FAIL + param: [ "Something" ] + expected_result: Something - py_func: - name: Tuple int,str success + name: Tuple int,str expected key: $(test)_PASS file: $(test_path)$(psep)py_func.py func_name: tuple_return param: [ 0, "OK" ] expected_result: [0, "OK"] - + - py_func: + name: small list expected + key: $(test)_PASS + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [ [-23] ] + expected_result: [-23] + - py_func: + name: big list expected + key: $(test)_PASS + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [ [-23, 17, 67] ] + expected_result: [-23, 17, 67] + - group: + name: Function result not expected + steps: + - py_func: + name: int not expected + key: $(test)_FAIL + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [18] + expected_result: 17 + - py_func: + name: float not expected + key: $(test)_FAIL + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [0.3] + expected_result: 0.5 + - py_func: + name: String not expected + key: $(test)_FAIL + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [ "Something" ] + expected_result: Nothing + - py_func: + name: Tuple int,str not expected + key: $(test)_FAIL + file: $(test_path)$(psep)py_func.py + func_name: tuple_return + param: [ 0, "OK" ] + expected_result: [0, "OUPS"] + - py_func: + name: small list not expected + key: $(test)_FAIL + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [ [-23] ] + expected_result: [-22] + - py_func: + name: big list not expected + key: $(test)_FAIL + file: $(test_path)$(psep)py_func.py + func_name: echo + param: [ [-23, 17, 67] ] + expected_result: [-23, 16, 67] - py_func: name: delgd test key: $(test)_PASS -- 2.47.3