Files
testium/src/testium/interpreter/test_items/test_item_group.py
François 4529da7aee Restructure: consolidate everything inside testium/ package
Move src/lib/ → src/testium/runtime/ (internal plumbing)
Move src/testium/libs/ → src/testium/api/ (public SDK for test scripts)
Move src/py_func/ → src/testium/py_func/ (Python subprocess)
Move src/lua_func/ → src/testium/lua_func/ (Lua subprocess data)

The package now ships as a single coherent unit instead of four sibling
top-level packages (testium, lib, py_func, lua_func) — pip install
gives a clean site-packages/testium/ with no namespace pollution; .lua
files travel with the wheel via package_data; the wheel installs
cleanly and `testium -b` runs end-to-end including py_func subprocesses
and entry-point exporter plugins.

Naming:
- runtime/ (internal, no API guarantees) clearer than lib/
- api/ (public SDK consumed as `import api.testium as tm`) clearer than libs/

Imports updated en masse: from lib. → from runtime. and from libs. →
from api., plus the importlib.import_module("libs.*") strings in
test_item_console.py and test_item_runtime_plot.py. Test/example
scripts (helper_lib.py, parallel.py, post_execution.py) and the
fake_exporter test suite migrated too.

paths.py: subproc_path() now returns testium_path() — both point at
the testium package directory since the subprocesses live inside.

pyproject.toml: removed exclude=["lua_func", "py_func"] (no longer
needed), added package-data for testium.lua_func/*.lua, removed the
license classifier (PEP 639 conflict with license expression).

Subprocess isolation contract: py_func/ and lua_func/ may only import
runtime/ and their own modules — never interpreter/, main_win/, api/,
or testium/. Enforced by test/validation/items/isolation/ which runs a
py_func that statically scans subprocess source files for forbidden
imports. The contract holds today; the test prevents future drift.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-02 09:28:40 +02:00

63 lines
2.3 KiB
Python

from interpreter.test_items.test_item import (TestItem, test_run)
from interpreter.test_items.test_result import (TestResult, TestValue)
from interpreter.utils.constants import TestItemType as cst
from runtime.tum_except import ETUMSyntaxError
import api.testium as tm
class TestItemGroup(TestItem):
def __init__(self, dict_cycle, parent = None, status_queue=None, filename=""):
self._name = cst.TYPE_GROUP.item_name
super().__init__(dict_cycle, parent, status_queue, filename=filename)
self._type = cst.TYPE_GROUP
self.is_container = True
def __runALoop(self):
results = []
i = 0
to_be_stopped = False
while (not self.isStopped()) and (i < self.childCount()) and (not to_be_stopped):
result = self.child(i).execute()
results.append(result)
if result.test_result == TestValue.FAILURE and self._stop_on_failure:
to_be_stopped = True
i = i + 1
if self.isStopped() or to_be_stopped:
for j in range(self.childCount()):
if self.child(j).executedOnStop() and (j >= i):
self.child(j).execute()
test_success = TestValue.SUCCESS
for res in results:
if res.test_result == TestValue.FAILURE:
test_success = TestValue.FAILURE
break
result = TestResult(None, test_success, 'Group iteration')
return result
@test_run
def execute(self):
results = []
to_be_stopped = False
if (not self.isStopped()) and (not to_be_stopped):
result = self.__runALoop()
# Test results
results.append(result)
if result.test_result == TestValue.FAILURE and self._stop_on_failure:
to_be_stopped = True
# end of loop test
if self.isStopped() or to_be_stopped:
if to_be_stopped:
self.result.set(TestValue.FAILURE, 'Group execution aborted on failure')
else:
self.result.set(TestValue.NORUN, 'Group execution aborted on user request')
else:
self.result.set(TestValue.SUCCESS, '')
for res in results:
if not res.success:
self.result.set(TestValue.FAILURE, '')