import pytest from pathlib import Path from src.parsers.base import BaseParser, Entity, EntityType, ParserResult from src.parsers.python import PythonParser from src.parsers.javascript import JavaScriptParser from src.parsers.go import GoParser from src.parsers.rust import RustParser class TestBaseParser: def test_entity_creation(self): entity = Entity( name="test_func", entity_type=EntityType.FUNCTION, file_path=Path("/test/file.py"), start_line=1, end_line=10, code="def test_func(): pass", ) assert entity.name == "test_func" assert entity.entity_type == EntityType.FUNCTION assert entity.start_line == 1 assert entity.end_line == 10 def test_parser_result(self): result = ParserResult( file_path=Path("/test/file.py"), language="python", ) assert result.file_path == Path("/test/file.py") assert result.language == "python" assert result.entities == [] assert result.imports == [] class TestPythonParser: def setup_method(self): self.parser = PythonParser() def test_parse_simple_function(self): code = """ def hello(): print("Hello, World!") """ result = self.parser.parse(Path("/test.py"), code) assert result.language == "python" assert len(result.entities) >= 1 def test_parse_class_with_methods(self): code = """ class MyClass: def method1(self): pass def method2(self): pass """ result = self.parser.parse(Path("/test.py"), code) assert result.language == "python" class_entities = [e for e in result.entities if e.entity_type == EntityType.CLASS] assert len(class_entities) == 1 def test_extract_imports(self): code = """ import os import sys from pathlib import Path """ result = self.parser.parse(Path("/test.py"), code) assert "os" in result.imports assert "sys" in result.imports def test_can_parse_py_file(self): assert self.parser.can_parse(Path("/test.py")) assert self.parser.can_parse(Path("/test.pyi")) assert not self.parser.can_parse(Path("/test.js")) class TestJavaScriptParser: def setup_method(self): self.parser = JavaScriptParser() def test_parse_function(self): code = """ function hello() { console.log("Hello"); } """ result = self.parser.parse(Path("/test.js"), code) assert result.language == "javascript" assert len(result.entities) >= 1 def test_parse_arrow_function(self): code = """ const add = (a, b) => a + b; """ result = self.parser.parse(Path("/test.js"), code) assert result.language == "javascript" def test_parse_class(self): code = """ class MyClass { constructor() {} method1() {} } """ result = self.parser.parse(Path("/test.js"), code) class_entities = [e for e in result.entities if e.entity_type == EntityType.CLASS] assert len(class_entities) == 1 def test_can_parse_js_file(self): assert self.parser.can_parse(Path("/test.js")) assert self.parser.can_parse(Path("/test.jsx")) assert not self.parser.can_parse(Path("/test.py")) class TestGoParser: def setup_method(self): self.parser = GoParser() def test_parse_function(self): code = """ func hello() { fmt.Println("Hello") } """ result = self.parser.parse(Path("/test.go"), code) assert result.language == "go" assert len(result.entities) >= 1 def test_parse_struct(self): code = """ type Person struct { Name string Age int } """ result = self.parser.parse(Path("/test.go"), code) assert result.language == "go" def test_can_parse_go_file(self): assert self.parser.can_parse(Path("/test.go")) assert not self.parser.can_parse(Path("/test.py")) class TestRustParser: def setup_method(self): self.parser = RustParser() def test_parse_function(self): code = """ fn hello() { println!("Hello"); } """ result = self.parser.parse(Path("/test.rs"), code) assert result.language == "rust" assert len(result.entities) >= 1 def test_parse_struct(self): code = """ struct Person { name: String, age: u32, } """ result = self.parser.parse(Path("/test.rs"), code) assert result.language == "rust" def test_parse_trait(self): code = """ trait Drawable { fn draw(&self); } """ result = self.parser.parse(Path("/test.rs"), code) assert result.language == "rust" def test_can_parse_rs_file(self): assert self.parser.can_parse(Path("/test.rs")) assert not self.parser.can_parse(Path("/test.py")) class TestParserFactory: def test_get_parser_for_python_file(self): parser = BaseParser.get_parser_for_file(Path("/test.py")) assert parser is not None assert isinstance(parser, PythonParser) def test_get_parser_for_js_file(self): parser = BaseParser.get_parser_for_file(Path("/test.js")) assert parser is not None assert isinstance(parser, JavaScriptParser) def test_get_parser_for_go_file(self): parser = BaseParser.get_parser_for_file(Path("/test.go")) assert parser is not None assert isinstance(parser, GoParser) def test_get_parser_for_rs_file(self): parser = BaseParser.get_parser_for_file(Path("/test.rs")) assert parser is not None assert isinstance(parser, RustParser) def test_get_parser_returns_none_for_unknown(self): parser = BaseParser.get_parser_for_file(Path("/test.xyz")) assert parser is None