diff --git a/ci-reports/markdown/TEST-REPORT.md b/ci-reports/markdown/TEST-REPORT.md
index 04c8bb66..93384bd7 100644
--- a/ci-reports/markdown/TEST-REPORT.md
+++ b/ci-reports/markdown/TEST-REPORT.md
@@ -1,8 +1,640 @@
+โ **Unknown pytest exit code: 1**
+
+> Unexpected result during test execution.
+
+
+๐ Short test summary info
+
+```python
+=========================== short test summary info ============================
+FAILED tests/test_io_utils.py::test_cause_io_error - OSError: Forced IO Error for testing
+FAILED tests/test_io_utils.py::test_file_not_found - FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.file'
+FAILED tests/test_io_utils.py::test_permission_error - PermissionError: Permission denied
+FAILED tests/test_io_utils.py::test_mock_open_error - OSError: Mocked IOError
+FAILED tests/test_io_utils.py::test_file_handle_closed_error - ValueError: I/O operation on closed file
+FAILED tests/test_io_utils.py::test_os_error - OSError: Simulated OSError
+FAILED tests/test_io_utils.py::test_file_not_found_error - FileNotFoundError: [Errno 2] No such file or directory: 'no_such_file.txt'
+FAILED tests/test_math_utils.py::test_broken - NameError: name 'want_the_test_to_fail' is not defined
+FAILED tests/test_math_utils.py::test_call_missing_function - AttributeError: module 'functions.math_utils' has no attribute 'non_existent_function'
+FAILED tests/test_math_utils.py::test_addition_fail - assert 4 == 5
+ + where 4 = addition(2, 2)
+FAILED tests/test_math_utils.py::test_division_zero - ZeroDivisionError: division by zero
+FAILED tests/test_math_utils.py::test_runtime_error - RuntimeError: Forced runtime error
+FAILED tests/test_math_utils.py::test_memory_error - MemoryError: Simulated memory error
+FAILED tests/test_math_utils.py::test_timeout_error - TimeoutError: Simulated timeout error
+FAILED tests/test_math_utils.py::test_recursion_error - RecursionError: maximum recursion depth exceeded
+FAILED tests/test_math_utils.py::test_floating_point_error - FloatingPointError: Simulated floating point error
+FAILED tests/test_math_utils.py::test_floating_point_overflow - OverflowError: math range error
+FAILED tests/test_math_utils.py::test_value_error - ValueError: invalid literal for int() with base 10: 'invalid'
+FAILED tests/test_math_utils.py::test_wrong_argument_error - TypeError: 'int' object is not iterable
+FAILED tests/test_math_utils.py::test_unhandled_exception - Exception: Generic unhandled exception
+FAILED tests/test_math_utils.py::test_custom_error - test_math_utils.CustomError: Custom error simulation
+FAILED tests/test_math_utils.py::test_stop_iteration_direct - RuntimeError: generator raised StopIteration
+FAILED tests/test_math_utils.py::test_generator_exit_direct - GeneratorExit
+FAILED tests/test_math_utils.py::test_malformed_code - File "", line 1
+ def bad(:
+ ^
+SyntaxError: invalid syntax
+FAILED tests/test_math_utils.py::test_sys_exit - SystemExit: 1
+FAILED tests/test_math_utils.py::test_broken_function - TypeError: Broken function
+FAILED tests/test_math_utils.py::test_import_error - ImportError: Simulated ImportError
+FAILED tests/test_math_utils.py::test_module_not_found_error - ModuleNotFoundError: No module named 'non_existent_module_xyz'
+FAILED tests/test_param.py::test_sum_positive[edge] - assert (-1 + -1) >= 0
+FAILED tests/test_param.py::test_addition - NameError: name 'addition' is not defined
+FAILED tests/test_string_utils.py::test_uppercase_type_error - TypeError: Input cannot be None
+FAILED tests/test_string_utils.py::test_unicode_decode_error - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
+FAILED tests/test_string_utils.py::test_unicode_decode_surrogateescape - UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
+ERROR tests/test_broken_fct.py
+ERROR tests/test_collector_error.py
+ERROR tests/test_param.py::test_basic_error
+== 33 failed, 37 passed, 1 skipped, 2 xfailed, 2 warnings, 3 errors in 0.68s ===
+```
+
+
+
+๐ชต Full raw pytest log
+
+```python
+============================= test session starts ==============================
+platform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0
+rootdir: /workspace/tligui_y/slic
+plugins: metadata-3.1.1, html-4.1.1, cov-5.0.0, allure-pytest-2.13.5, json-report-1.5.0
+collected 74 items / 2 errors
+
+tests/test_io_utils.py ..FFFFFF.F
+tests/test_math_utils.py FF........FFxFFFFFFFFFFFFFFFFF
+tests/test_param.py ...s.......F............FE
+tests/test_string_utils.py .F..FF.x
+
+==================================== ERRORS ====================================
+__________________ ERROR collecting tests/test_broken_fct.py ___________________
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/python.py:493: in importtestmodule
+ mod = import_path(
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/pathlib.py:587: in import_path
+ importlib.import_module(module_name)
+.pixi/envs/default/lib/python3.8/importlib/__init__.py:127: in import_module
+ return _bootstrap._gcd_import(name[level:], package, level)
+:1014: in _gcd_import
+ ???
+:991: in _find_and_load
+ ???
+:975: in _find_and_load_unlocked
+ ???
+:671: in _load_unlocked
+ ???
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/assertion/rewrite.py:175: in exec_module
+ source_stat, co = _rewrite_test(fn, self.config)
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/assertion/rewrite.py:355: in _rewrite_test
+ tree = ast.parse(source, filename=strfn)
+.pixi/envs/default/lib/python3.8/ast.py:47: in parse
+ return compile(source, filename, mode, flags,
+E File "/workspace/tligui_y/slic/tests/test_broken_fct.py", line 8
+E def test_valid_2():
+E ^
+E SyntaxError: invalid syntax
+________________ ERROR collecting tests/test_collector_error.py ________________
+ImportError while importing test module '/workspace/tligui_y/slic/tests/test_collector_error.py'.
+Hint: make sure your test modules/packages have valid Python names.
+Traceback:
+.pixi/envs/default/lib/python3.8/importlib/__init__.py:127: in import_module
+ return _bootstrap._gcd_import(name[level:], package, level)
+tests/test_collector_error.py:1: in
+ from no_existing_module.math_utils import *
+E ModuleNotFoundError: No module named 'no_existing_module'
+______________________ ERROR at setup of test_basic_error ______________________
+file /workspace/tligui_y/slic/tests/test_param.py, line 100
+ def test_basic_error(x):
+E fixture 'x' not found
+> available fixtures: cache, capfd, capfdbinary, caplog, capsys, capsysbinary, complex_setup, cov, doctest_namespace, element, extra, extras, include_metadata_in_junit_xml, json_metadata, metadata, monkeypatch, no_cover, pytestconfig, record_property, record_testsuite_property, record_xml_attribute, recwarn, tmp_path, tmp_path_factory, tmpdir, tmpdir_factory
+> use 'pytest --fixtures [testpath]' for help on them.
+
+/workspace/tligui_y/slic/tests/test_param.py:100
+=================================== FAILURES ===================================
+_____________________________ test_cause_io_error ______________________________
+
+ def test_cause_io_error():
+ # Raises manual IOError to simulate IO failure
+> cause_io_error()
+
+tests/test_io_utils.py:25:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+ def cause_io_error():
+> raise IOError("Forced IO Error for testing")
+E OSError: Forced IO Error for testing
+
+functions/io_utils.py:10: OSError
+_____________________________ test_file_not_found ______________________________
+
+ def test_file_not_found():
+ # Reading non-existing file raises FileNotFoundError
+> read_file("nonexistent.file")
+
+tests/test_io_utils.py:29:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+path = 'nonexistent.file'
+
+ def read_file(path):
+> with open(path, "r", encoding="utf-8") as f:
+E FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.file'
+
+functions/io_utils.py:2: FileNotFoundError
+____________________________ test_permission_error _____________________________
+
+monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f94644dd880>
+
+ def test_permission_error(monkeypatch):
+ # Patch open to raise PermissionError simulating access denial
+ def raise_perm_error(*args, **kwargs):
+ raise PermissionError("Permission denied")
+ monkeypatch.setattr("builtins.open", raise_perm_error)
+> read_file("anyfile.txt")
+
+tests/test_io_utils.py:36:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+functions/io_utils.py:2: in read_file
+ with open(path, "r", encoding="utf-8") as f:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+args = ('anyfile.txt', 'r'), kwargs = {'encoding': 'utf-8'}
+
+ def raise_perm_error(*args, **kwargs):
+> raise PermissionError("Permission denied")
+E PermissionError: Permission denied
+
+tests/test_io_utils.py:34: PermissionError
+_____________________________ test_mock_open_error _____________________________
+
+monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f946688ee20>
+
+ def test_mock_open_error(monkeypatch):
+ # Mock open() to raise IOError simulating read error
+ mocked_open = mock.mock_open()
+ mocked_open.side_effect = IOError("Mocked IOError")
+ monkeypatch.setattr("builtins.open", mocked_open)
+> with open("file.txt", "r") as f:
+
+tests/test_io_utils.py:43:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+.pixi/envs/default/lib/python3.8/unittest/mock.py:1081: in __call__
+ return self._mock_call(*args, **kwargs)
+.pixi/envs/default/lib/python3.8/unittest/mock.py:1085: in _mock_call
+ return self._execute_mock_call(*args, **kwargs)
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+self =
+args = ('file.txt', 'r'), kwargs = {}, effect = OSError('Mocked IOError')
+
+ def _execute_mock_call(self, /, *args, **kwargs):
+ # separate from _increment_mock_call so that awaited functions are
+ # executed separately from their call, also AsyncMock overrides this method
+
+ effect = self.side_effect
+ if effect is not None:
+ if _is_exception(effect):
+> raise effect
+E OSError: Mocked IOError
+
+.pixi/envs/default/lib/python3.8/unittest/mock.py:1140: OSError
+________________________ test_file_handle_closed_error _________________________
+
+ def test_file_handle_closed_error():
+ # Accessing closed file raises ValueError
+ f = io.StringIO("content")
+ f.close()
+> f.read()
+E ValueError: I/O operation on closed file
+
+tests/test_io_utils.py:50: ValueError
+________________________________ test_os_error _________________________________
+
+monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f94643b4670>
+
+ def test_os_error(monkeypatch):
+ # Patch os.remove to raise OSError simulating filesystem error
+ def raise_os_error(path):
+ raise OSError("Simulated OSError")
+ monkeypatch.setattr("os.remove", raise_os_error)
+> os.remove("file.txt")
+
+tests/test_io_utils.py:57:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+path = 'file.txt'
+
+ def raise_os_error(path):
+> raise OSError("Simulated OSError")
+E OSError: Simulated OSError
+
+tests/test_io_utils.py:55: OSError
+__________________________ test_file_not_found_error ___________________________
+
+ def test_file_not_found_error():
+ # Raises FileNotFoundError when opening a non-existent file
+> open("no_such_file.txt", "r")
+E FileNotFoundError: [Errno 2] No such file or directory: 'no_such_file.txt'
+
+tests/test_io_utils.py:70: FileNotFoundError
+_________________________________ test_broken __________________________________
+
+ def test_broken():
+ # simulating a broken or faulty test implementation that will cause the test to error
+> want_the_test_to_fail
+E NameError: name 'want_the_test_to_fail' is not defined
+
+tests/test_math_utils.py:16: NameError
+__________________________ test_call_missing_function __________________________
+
+ def test_call_missing_function():
+ # Accessing a missing function attribute raises AttributeError
+> getattr(math_utils, "non_existent_function")()
+E AttributeError: module 'functions.math_utils' has no attribute 'non_existent_function'
+
+tests/test_math_utils.py:20: AttributeError
+______________________________ test_addition_fail ______________________________
+
+ def test_addition_fail():
+ # Assertion failure: expected incorrect result
+> assert addition(2, 2) == 5
+E assert 4 == 5
+E + where 4 = addition(2, 2)
+
+tests/test_math_utils.py:51: AssertionError
+______________________________ test_division_zero ______________________________
+
+ def test_division_zero():
+ # Will raise ZeroDivisionError if not handled in division
+> division(1, 0)
+
+tests/test_math_utils.py:55:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+a = 1, b = 0
+
+ def division(a, b):
+> return a / b
+E ZeroDivisionError: division by zero
+
+functions/math_utils.py:5: ZeroDivisionError
+______________________________ test_runtime_error ______________________________
+
+ def test_runtime_error():
+ # Test raises an uncaught RuntimeError
+> raise RuntimeError("Forced runtime error")
+E RuntimeError: Forced runtime error
+
+tests/test_math_utils.py:64: RuntimeError
+______________________________ test_memory_error _______________________________
+
+ def test_memory_error():
+ # Manually raise MemoryError to simulate out-of-memory condition
+> raise MemoryError("Simulated memory error")
+E MemoryError: Simulated memory error
+
+tests/test_math_utils.py:68: MemoryError
+______________________________ test_timeout_error ______________________________
+
+ def test_timeout_error():
+ # Manually raise TimeoutError simulating timeout conditions
+> raise TimeoutError("Simulated timeout error")
+E TimeoutError: Simulated timeout error
+
+tests/test_math_utils.py:72: TimeoutError
+_____________________________ test_recursion_error _____________________________
+
+ def test_recursion_error():
+ # Infinite recursion triggers RecursionError
+ def recursive():
+ return recursive()
+> recursive()
+
+tests/test_math_utils.py:78:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+tests/test_math_utils.py:77: in recursive
+ return recursive()
+tests/test_math_utils.py:77: in recursive
+ return recursive()
+E RecursionError: maximum recursion depth exceeded
+!!! Recursion detected (same locals & position)
+__________________________ test_floating_point_error ___________________________
+
+ def test_floating_point_error():
+ # Manually raise FloatingPointError
+> raise FloatingPointError("Simulated floating point error")
+E FloatingPointError: Simulated floating point error
+
+tests/test_math_utils.py:82: FloatingPointError
+_________________________ test_floating_point_overflow _________________________
+
+ def test_floating_point_overflow():
+ # Exponential overflow triggers OverflowError
+> math.exp(1000)
+E OverflowError: math range error
+
+tests/test_math_utils.py:86: OverflowError
+_______________________________ test_value_error _______________________________
+
+ def test_value_error():
+ # ValueError on invalid integer conversion
+> int("invalid")
+E ValueError: invalid literal for int() with base 10: 'invalid'
+
+tests/test_math_utils.py:90: ValueError
+__________________________ test_wrong_argument_error ___________________________
+
+ def test_wrong_argument_error():
+ # TypeError when passing wrong argument type to sum
+> sum(5)
+E TypeError: 'int' object is not iterable
+
+tests/test_math_utils.py:94: TypeError
+___________________________ test_unhandled_exception ___________________________
+
+ def test_unhandled_exception():
+ # Raises generic unhandled Exception
+> raise Exception("Generic unhandled exception")
+E Exception: Generic unhandled exception
+
+tests/test_math_utils.py:98: Exception
+______________________________ test_custom_error _______________________________
+
+ def test_custom_error():
+ # Raises user-defined CustomError exception
+> raise CustomError("Custom error simulation")
+E test_math_utils.CustomError: Custom error simulation
+
+tests/test_math_utils.py:102: CustomError
+__________________________ test_stop_iteration_direct __________________________
+
+ def test_stop_iteration_direct():
+ # Directly raise StopIteration exception
+> raise StopIteration()
+E StopIteration
+
+tests/test_math_utils.py:106: StopIteration
+
+The above exception was the direct cause of the following exception:
+
+cls =
+func = . at 0x7f9464578670>
+when = 'call'
+reraise = (, )
+
+ @classmethod
+ def from_call(
+ cls,
+ func: Callable[[], TResult],
+ when: Literal["collect", "setup", "call", "teardown"],
+ reraise: type[BaseException] | tuple[type[BaseException], ...] | None = None,
+ ) -> CallInfo[TResult]:
+ """Call func, wrapping the result in a CallInfo.
+
+ :param func:
+ The function to call. Called without arguments.
+ :type func: Callable[[], _pytest.runner.TResult]
+ :param when:
+ The phase in which the function is called.
+ :param reraise:
+ Exception or exceptions that shall propagate if raised by the
+ function, instead of being wrapped in the CallInfo.
+ """
+ excinfo = None
+ start = timing.time()
+ precise_start = timing.perf_counter()
+ try:
+> result: TResult | None = func()
+
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/runner.py:341:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/runner.py:242: in
+ lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
+.pixi/envs/default/lib/python3.8/site-packages/pluggy/_hooks.py:513: in __call__
+ return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
+.pixi/envs/default/lib/python3.8/site-packages/pluggy/_manager.py:120: in _hookexec
+ return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/threadexception.py:92: in pytest_runtest_call
+ yield from thread_exception_runtest_hook()
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/threadexception.py:68: in thread_exception_runtest_hook
+ yield
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/unraisableexception.py:95: in pytest_runtest_call
+ yield from unraisable_exception_runtest_hook()
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/unraisableexception.py:70: in unraisable_exception_runtest_hook
+ yield
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/logging.py:846: in pytest_runtest_call
+ yield from self._runtest_for(item, "call")
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/logging.py:829: in _runtest_for
+ yield
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+self = _capture_fixture=None>
+item =
+
+ @hookimpl(wrapper=True)
+ def pytest_runtest_call(self, item: Item) -> Generator[None]:
+ with self.item_capture("call", item):
+> return (yield)
+E RuntimeError: generator raised StopIteration
+
+.pixi/envs/default/lib/python3.8/site-packages/_pytest/capture.py:880: RuntimeError
+__________________________ test_generator_exit_direct __________________________
+
+ def test_generator_exit_direct():
+ # Directly raise GeneratorExit exception
+> raise GeneratorExit()
+E GeneratorExit
+
+tests/test_math_utils.py:110: GeneratorExit
+_____________________________ test_malformed_code ______________________________
+
+ def test_malformed_code():
+ # SyntaxError when executing malformed Python code
+> exec("def bad(:\n pass")
+E File "", line 1
+E def bad(:
+E ^
+E SyntaxError: invalid syntax
+
+tests/test_math_utils.py:114: SyntaxError
+________________________________ test_sys_exit _________________________________
+
+ def test_sys_exit():
+ # Simulate SystemExit via sys.exit
+> sys.exit(1)
+E SystemExit: 1
+
+tests/test_math_utils.py:118: SystemExit
+_____________________________ test_broken_function _____________________________
+
+ def test_broken_function():
+ # Simulate broken function raising TypeError
+ def broken_func(*args, **kwargs):
+ raise TypeError("Broken function")
+> broken_func()
+
+tests/test_math_utils.py:124:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+args = (), kwargs = {}
+
+ def broken_func(*args, **kwargs):
+> raise TypeError("Broken function")
+E TypeError: Broken function
+
+tests/test_math_utils.py:123: TypeError
+______________________________ test_import_error _______________________________
+
+ def test_import_error():
+ # Directly raise ImportError exception
+> raise ImportError("Simulated ImportError")
+E ImportError: Simulated ImportError
+
+tests/test_math_utils.py:128: ImportError
+_________________________ test_module_not_found_error __________________________
+
+ def test_module_not_found_error():
+ # Raises ModuleNotFoundError (subclass of ImportError) for missing module
+> importlib.import_module("non_existent_module_xyz")
+
+tests/test_math_utils.py:132:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+.pixi/envs/default/lib/python3.8/importlib/__init__.py:127: in import_module
+ return _bootstrap._gcd_import(name[level:], package, level)
+:1014: in _gcd_import
+ ???
+:991: in _find_and_load
+ ???
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+name = 'non_existent_module_xyz'
+import_ =
+
+> ???
+E ModuleNotFoundError: No module named 'non_existent_module_xyz'
+
+:973: ModuleNotFoundError
+___________________________ test_sum_positive[edge] ____________________________
+
+x = -1, y = -1
+
+ @pytest.mark.parametrize("x, y", [(param["x"], param["y"]) for _, param in scenarios], ids=[name for name, _ in scenarios])
+ def test_sum_positive(x, y):
+> assert (x + y) >= 0
+E assert (-1 + -1) >= 0
+
+tests/test_param.py:58: AssertionError
+________________________________ test_addition _________________________________
+
+a = 5, b = 5, expected = 10
+
+ def test_addition(a = 5, b = 5, expected = 10):
+ # Has to pass
+> assert addition(a, b) == expected
+E NameError: name 'addition' is not defined
+
+tests/test_param.py:97: NameError
+__________________________ test_uppercase_type_error ___________________________
+
+ def test_uppercase_type_error():
+ # TypeError when input is None (invalid input)
+> uppercase(None)
+
+tests/test_string_utils.py:16:
+_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
+
+s = None
+
+ def uppercase(s):
+ if s is None:
+> raise TypeError("Input cannot be None")
+E TypeError: Input cannot be None
+
+functions/string_utils.py:3: TypeError
+__________________________ test_unicode_decode_error ___________________________
+
+ def test_unicode_decode_error():
+ # UnicodeDecodeError when decoding invalid byte sequence
+> b'\xff'.decode('utf-8')
+E UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
+
+tests/test_string_utils.py:28: UnicodeDecodeError
+_____________________ test_unicode_decode_surrogateescape ______________________
+
+ def test_unicode_decode_surrogateescape():
+ # UnicodeDecodeError with strict error handler on invalid byte
+> b"\x80".decode("utf-8", errors="strict")
+E UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
+
+tests/test_string_utils.py:32: UnicodeDecodeError
+=============================== warnings summary ===============================
+tests/test_string_utils.py::test_warning_emit
+ /workspace/tligui_y/slic/tests/test_string_utils.py:24: UserWarning: Test warning
+ warnings.warn("Test warning", UserWarning)
+
+tests/test_string_utils.py::test_syntax_warning
+ /workspace/tligui_y/slic/tests/test_string_utils.py:36: SyntaxWarning: This is a syntax warning
+ warnings.warn("This is a syntax warning", SyntaxWarning)
+
+-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
+--------------------------------- JSON report ----------------------------------
+report saved to: ci-reports/markdown/pytest-report.json
+
+---------- coverage: platform linux, python 3.8.20-final-0 -----------
+Coverage HTML written to dir ci-reports/coverage/
+Coverage XML written to file ci-reports/coverage/coverage.xml
+
+=========================== short test summary info ============================
+FAILED tests/test_io_utils.py::test_cause_io_error - OSError: Forced IO Error for testing
+FAILED tests/test_io_utils.py::test_file_not_found - FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.file'
+FAILED tests/test_io_utils.py::test_permission_error - PermissionError: Permission denied
+FAILED tests/test_io_utils.py::test_mock_open_error - OSError: Mocked IOError
+FAILED tests/test_io_utils.py::test_file_handle_closed_error - ValueError: I/O operation on closed file
+FAILED tests/test_io_utils.py::test_os_error - OSError: Simulated OSError
+FAILED tests/test_io_utils.py::test_file_not_found_error - FileNotFoundError: [Errno 2] No such file or directory: 'no_such_file.txt'
+FAILED tests/test_math_utils.py::test_broken - NameError: name 'want_the_test_to_fail' is not defined
+FAILED tests/test_math_utils.py::test_call_missing_function - AttributeError: module 'functions.math_utils' has no attribute 'non_existent_function'
+FAILED tests/test_math_utils.py::test_addition_fail - assert 4 == 5
+ + where 4 = addition(2, 2)
+FAILED tests/test_math_utils.py::test_division_zero - ZeroDivisionError: division by zero
+FAILED tests/test_math_utils.py::test_runtime_error - RuntimeError: Forced runtime error
+FAILED tests/test_math_utils.py::test_memory_error - MemoryError: Simulated memory error
+FAILED tests/test_math_utils.py::test_timeout_error - TimeoutError: Simulated timeout error
+FAILED tests/test_math_utils.py::test_recursion_error - RecursionError: maximum recursion depth exceeded
+FAILED tests/test_math_utils.py::test_floating_point_error - FloatingPointError: Simulated floating point error
+FAILED tests/test_math_utils.py::test_floating_point_overflow - OverflowError: math range error
+FAILED tests/test_math_utils.py::test_value_error - ValueError: invalid literal for int() with base 10: 'invalid'
+FAILED tests/test_math_utils.py::test_wrong_argument_error - TypeError: 'int' object is not iterable
+FAILED tests/test_math_utils.py::test_unhandled_exception - Exception: Generic unhandled exception
+FAILED tests/test_math_utils.py::test_custom_error - test_math_utils.CustomError: Custom error simulation
+FAILED tests/test_math_utils.py::test_stop_iteration_direct - RuntimeError: generator raised StopIteration
+FAILED tests/test_math_utils.py::test_generator_exit_direct - GeneratorExit
+FAILED tests/test_math_utils.py::test_malformed_code - File "", line 1
+ def bad(:
+ ^
+SyntaxError: invalid syntax
+FAILED tests/test_math_utils.py::test_sys_exit - SystemExit: 1
+FAILED tests/test_math_utils.py::test_broken_function - TypeError: Broken function
+FAILED tests/test_math_utils.py::test_import_error - ImportError: Simulated ImportError
+FAILED tests/test_math_utils.py::test_module_not_found_error - ModuleNotFoundError: No module named 'non_existent_module_xyz'
+FAILED tests/test_param.py::test_sum_positive[edge] - assert (-1 + -1) >= 0
+FAILED tests/test_param.py::test_addition - NameError: name 'addition' is not defined
+FAILED tests/test_string_utils.py::test_uppercase_type_error - TypeError: Input cannot be None
+FAILED tests/test_string_utils.py::test_unicode_decode_error - UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
+FAILED tests/test_string_utils.py::test_unicode_decode_surrogateescape - UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
+ERROR tests/test_broken_fct.py
+ERROR tests/test_collector_error.py
+ERROR tests/test_param.py::test_basic_error
+== 33 failed, 37 passed, 1 skipped, 2 xfailed, 2 warnings, 3 errors in 0.68s ===
+```
+
+
+---
+
# ๐งช Test Report
-*Generated on 2025-07-21 10:47:56 CEST*
+*Generated on 2025-07-21 10:55:06 CEST*
## ๐งพ General Info
-- **duration**: 0.5865132808685303
+- **duration**: 0.6685476303100586
- **root**: /workspace/tligui_y/slic
- **environment**: {}
@@ -32,7 +664,7 @@
**duration:**
```python
- 0.003428531112149358
+ 0.003856702009215951
```
**outcome:**
@@ -46,7 +678,7 @@
**duration:**
```python
- 0.0004314000252634287
+ 0.0005525858141481876
```
**outcome:**
@@ -60,7 +692,7 @@
**duration:**
```python
- 0.0002483499702066183
+ 0.00030047004111111164
```
**outcome:**
@@ -78,7 +710,7 @@
**duration:**
```python
- 0.0004535750485956669
+ 0.0005150521174073219
```
**outcome:**
@@ -92,7 +724,7 @@
**duration:**
```python
- 0.00029062386602163315
+ 0.0003016199916601181
```
**outcome:**
@@ -106,7 +738,7 @@
**duration:**
```python
- 0.0001445699017494917
+ 0.00013776496052742004
```
**outcome:**
@@ -124,7 +756,7 @@
**duration:**
```python
- 0.0006845961324870586
+ 0.0006900650914758444
```
**outcome:**
@@ -138,7 +770,7 @@
**duration:**
```python
- 0.0009522500913590193
+ 0.0009528270456939936
```
**outcome:**
@@ -152,7 +784,7 @@
**duration:**
```python
- 0.00015838607214391232
+ 0.00016214605420827866
```
**outcome:**
@@ -185,7 +817,7 @@
**duration:**
```python
- 0.00030992995016276836
+ 0.0003491109237074852
```
**outcome:**
@@ -199,7 +831,7 @@
**duration:**
```python
- 0.00014565791934728622
+ 0.0001570531167089939
```
**outcome:**
@@ -213,7 +845,7 @@
**duration:**
```python
- 0.00015012500807642937
+ 0.00015607522800564766
```
**outcome:**
@@ -240,7 +872,7 @@
**duration:**
```python
- 0.00025536795146763325
+ 0.00026477500796318054
```
**outcome:**
@@ -254,7 +886,7 @@
**duration:**
```python
- 0.00014866888523101807
+ 0.00014081993140280247
```
**outcome:**
@@ -268,7 +900,7 @@
**duration:**
```python
- 0.00014038500376045704
+ 0.00015572807751595974
```
**outcome:**
@@ -295,7 +927,7 @@
**duration:**
```python
- 0.00024071987718343735
+ 0.0002384418621659279
```
**outcome:**
@@ -309,7 +941,7 @@
**duration:**
```python
- 0.00013635307550430298
+ 0.00012684985995292664
```
**outcome:**
@@ -323,7 +955,7 @@
**duration:**
```python
- 0.00013328692875802517
+ 0.0001454218290746212
```
**outcome:**
@@ -350,7 +982,7 @@
**duration:**
```python
- 0.0002323170192539692
+ 0.0002366490662097931
```
**outcome:**
@@ -364,7 +996,7 @@
**duration:**
```python
- 0.00013921898789703846
+ 0.00013164803385734558
```
**outcome:**
@@ -378,7 +1010,7 @@
**duration:**
```python
- 0.00013553816825151443
+ 0.00014750403352081776
```
**outcome:**
@@ -405,7 +1037,7 @@
**duration:**
```python
- 0.0002423140686005354
+ 0.00024665682576596737
```
**outcome:**
@@ -419,7 +1051,7 @@
**duration:**
```python
- 0.00013125804252922535
+ 0.00013206806033849716
```
**outcome:**
@@ -433,7 +1065,7 @@
**duration:**
```python
- 0.0001350699458271265
+ 0.00013701897114515305
```
**outcome:**
@@ -461,7 +1093,7 @@
**duration:**
```python
- 0.00023363297805190086
+ 0.0002676299773156643
```
**outcome:**
@@ -475,7 +1107,7 @@
**duration:**
```python
- 0.00012576114386320114
+ 0.00012983707711100578
```
**outcome:**
@@ -489,7 +1121,7 @@
**duration:**
```python
- 0.0001364590134471655
+ 0.00014057080261409283
```
**outcome:**
@@ -516,7 +1148,7 @@
**duration:**
```python
- 0.00023854197934269905
+ 0.00024703494273126125
```
**outcome:**
@@ -530,7 +1162,7 @@
**duration:**
```python
- 0.00012773904018104076
+ 0.00013828417286276817
```
**outcome:**
@@ -544,7 +1176,7 @@
**duration:**
```python
- 0.0001322960015386343
+ 0.00013383198529481888
```
**outcome:**
@@ -571,7 +1203,7 @@
**duration:**
```python
- 0.00024613714776933193
+ 0.00023342808708548546
```
**outcome:**
@@ -585,7 +1217,7 @@
**duration:**
```python
- 0.00013018911704421043
+ 0.00013335701078176498
```
**outcome:**
@@ -599,7 +1231,7 @@
**duration:**
```python
- 0.00014120107516646385
+ 0.00014397618360817432
```
**outcome:**
@@ -630,7 +1262,7 @@
**duration:**
```python
- 0.0002511159982532263
+ 0.00030287005938589573
```
**outcome:**
@@ -644,7 +1276,7 @@
**duration:**
```python
- 0.00013981712982058525
+ 0.00015990808606147766
```
**outcome:**
@@ -658,7 +1290,7 @@
**duration:**
```python
- 0.00013118796050548553
+ 0.00013053696602582932
```
**outcome:**
@@ -683,7 +1315,7 @@
**duration:**
```python
- 0.00018339906819164753
+ 0.00019052880816161633
```
**outcome:**
@@ -697,7 +1329,7 @@
**duration:**
```python
- 0.00013373605906963348
+ 0.0001276989933103323
```
**outcome:**
@@ -711,7 +1343,7 @@
**duration:**
```python
- 0.00011961697600781918
+ 0.00011281715705990791
```
**outcome:**
@@ -737,7 +1369,7 @@
**duration:**
```python
- 0.00016549089923501015
+ 0.00016922783106565475
```
**outcome:**
@@ -751,7 +1383,7 @@
**duration:**
```python
- 0.00012395507656037807
+ 0.0001225820742547512
```
**outcome:**
@@ -765,7 +1397,7 @@
**duration:**
```python
- 0.00011027185246348381
+ 0.00011446606367826462
```
**outcome:**
@@ -792,7 +1424,7 @@
**duration:**
```python
- 0.00023847399279475212
+ 0.00022603501565754414
```
**outcome:**
@@ -806,7 +1438,7 @@
**duration:**
```python
- 0.00012814300134778023
+ 0.00013117492198944092
```
**outcome:**
@@ -820,7 +1452,7 @@
**duration:**
```python
- 0.0001284969039261341
+ 0.00013003195635974407
```
**outcome:**
@@ -846,7 +1478,7 @@
**duration:**
```python
- 0.00020979996770620346
+ 0.00020632101222872734
```
**outcome:**
@@ -860,7 +1492,7 @@
**duration:**
```python
- 0.00012306193821132183
+ 0.00012446008622646332
```
**outcome:**
@@ -874,7 +1506,7 @@
**duration:**
```python
- 0.0001283818855881691
+ 0.00012199394404888153
```
**outcome:**
@@ -885,13 +1517,13 @@
โณ Function: test_non_literal_with_id
-
- โ
Test 47
(params: data=(object object at 0x7ff957cb4510))
+ โ
Test 47
(params: data=(object object at 0x7f94677b7d40))
**_*๐ Runtime Parameters*_**
```python
params:
- data: