208 lines
5.7 KiB
Python
208 lines
5.7 KiB
Python
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
|