From bcb311f4a06000e01324a6643b7703a5b78ec93a Mon Sep 17 00:00:00 2001 From: chalmer lowe Date: Mon, 15 Sep 2025 07:26:41 -0400 Subject: [PATCH] test: Add basic structure tests for CodeAnalyzer Adds unit tests to verify that the CodeAnalyzer correctly identifies class and method definitions in Python code. - Tests for single and multiple classes. - Tests for single and multiple methods within a class. - Tests for code with no classes. - Tests for classes with no methods. All new tests pass and the test file conforms to linting standards. --- .../tests/unit/test_generate_analyzer.py | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 scripts/microgenerator/tests/unit/test_generate_analyzer.py diff --git a/scripts/microgenerator/tests/unit/test_generate_analyzer.py b/scripts/microgenerator/tests/unit/test_generate_analyzer.py new file mode 100644 index 000000000..ae3dcfb6e --- /dev/null +++ b/scripts/microgenerator/tests/unit/test_generate_analyzer.py @@ -0,0 +1,86 @@ +import ast +from autogen.scripts.microgenerator.generate import CodeAnalyzer + + +def test_codeanalyzer_finds_class(): + code = """ +class MyClass: + pass +""" + analyzer = CodeAnalyzer() + tree = ast.parse(code) + analyzer.visit(tree) + assert len(analyzer.structure) == 1 + assert analyzer.structure[0]["class_name"] == "MyClass" + + +def test_codeanalyzer_finds_multiple_classes(): + code = """ +class ClassA: + pass + + +class ClassB: + pass +""" + analyzer = CodeAnalyzer() + tree = ast.parse(code) + analyzer.visit(tree) + assert len(analyzer.structure) == 2 + class_names = sorted([c["class_name"] for c in analyzer.structure]) + assert class_names == ["ClassA", "ClassB"] + + +def test_codeanalyzer_finds_method(): + code = """ +class MyClass: + def my_method(self): + pass +""" + analyzer = CodeAnalyzer() + tree = ast.parse(code) + analyzer.visit(tree) + assert len(analyzer.structure) == 1 + assert len(analyzer.structure[0]["methods"]) == 1 + assert analyzer.structure[0]["methods"][0]["method_name"] == "my_method" + + +def test_codeanalyzer_finds_multiple_methods(): + code = """ +class MyClass: + def method_a(self): + pass + + def method_b(self): + pass +""" + analyzer = CodeAnalyzer() + tree = ast.parse(code) + analyzer.visit(tree) + assert len(analyzer.structure) == 1 + method_names = sorted([m["method_name"] for m in analyzer.structure[0]["methods"]]) + assert method_names == ["method_a", "method_b"] + + +def test_codeanalyzer_no_classes(): + code = """ +def top_level_function(): + pass +""" + analyzer = CodeAnalyzer() + tree = ast.parse(code) + analyzer.visit(tree) + assert len(analyzer.structure) == 0 + + +def test_codeanalyzer_class_with_no_methods(): + code = """ +class MyClass: + attribute = 123 +""" + analyzer = CodeAnalyzer() + tree = ast.parse(code) + analyzer.visit(tree) + assert len(analyzer.structure) == 1 + assert analyzer.structure[0]["class_name"] == "MyClass" + assert len(analyzer.structure[0]["methods"]) == 0