Skip to content

Commit bcb62cf

Browse files
Merge branch '216-black-lambda-parsing-2' into 'main'
Handle unnamed lambdas in function analysis to avoid crash on export Closes #216 See merge request se2/pynguin/pynguin!254
2 parents f824f58 + 8bc1004 commit bcb62cf

2 files changed

Lines changed: 40 additions & 11 deletions

File tree

src/pynguin/analyses/module.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,17 +1146,17 @@ def __analyse_function(
11461146
description = get_function_description(func_ast)
11471147
raised_exceptions = description.raises if description is not None else set()
11481148
cyclomatic_complexity = __get_mccabe_complexity(func_ast)
1149-
if (
1150-
getattr(func, "__name__", None) == "<lambda>"
1151-
and (
1152-
lambda_assigned_name := _get_lambda_assigned_name(
1153-
module_tree, func.__code__.co_firstlineno
1154-
)
1155-
)
1156-
is not None
1157-
):
1158-
func_name = lambda_assigned_name
1159-
func.__name__ = lambda_assigned_name
1149+
if getattr(func, "__name__", None) == "<lambda>":
1150+
if lambda_assigned_name := _get_lambda_assigned_name(
1151+
module_tree, func.__code__.co_firstlineno
1152+
):
1153+
func_name = lambda_assigned_name
1154+
func.__name__ = lambda_assigned_name
1155+
else:
1156+
# If the lambda itself has no name, we must not add it to the test cluster
1157+
# or else it will cause an exception during test export.
1158+
return
1159+
11601160
generic_function = GenericFunction(func, inferred_signature, raised_exceptions, func_name)
11611161

11621162
if config.configuration.pynguinml.ml_testing_enabled and module_tree is not None:

tests/analyses/test_module.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ def parsed_module_lambda() -> _ModuleParseResult:
6464
return parse_module("tests.fixtures.cluster.lambda")
6565

6666

67+
@pytest.fixture(scope="module")
68+
def parsed_module_unnamed_lambda() -> _ModuleParseResult:
69+
return parse_module("tests.fixtures.cluster.unnamed_lambda")
70+
71+
6772
@pytest.fixture
6873
def module_test_cluster() -> ModuleTestCluster:
6974
return ModuleTestCluster(linenos=-1)
@@ -572,3 +577,27 @@ def test_analyse_module_lambda(parsed_module_lambda):
572577
assert lambda2.function_name == "abc"
573578
lambda3 = cast("GenericFunction", objects[2])
574579
assert lambda3.function_name == "salam_aleykum"
580+
581+
582+
def test_analyse_function_lambda_no_name():
583+
"""Test that __analyse_function returns early when no name for a lambda is found."""
584+
# Create a test cluster
585+
test_cluster = ModuleTestCluster(linenos=-1)
586+
587+
# Create a lambda function
588+
lambda_func = lambda x: x # noqa: E731
589+
590+
# Mock the _get_lambda_assigned_name function to return None
591+
with patch("pynguin.analyses.module._get_lambda_assigned_name", return_value=None):
592+
# Call __analyse_function directly
593+
module.__analyse_function(
594+
func_name="<lambda>",
595+
func=lambda_func,
596+
type_inference_strategy=TypeInferenceStrategy.TYPE_HINTS,
597+
module_tree=None,
598+
test_cluster=test_cluster,
599+
add_to_test=True,
600+
)
601+
602+
# Verify that the lambda was not added to the test cluster
603+
assert test_cluster.num_accessible_objects_under_test() == 0

0 commit comments

Comments
 (0)