use infiniloom_engine::parser::{Language, Parser, ParserError};
use infiniloom_engine::types::{SymbolKind, Visibility};
fn parse_and_find(code: &str, lang: Language, name: &str, kind: SymbolKind) -> bool {
let mut parser = Parser::new();
match parser.parse(code, lang) {
Ok(symbols) => symbols.iter().any(|s| s.name == name && s.kind == kind),
Err(_) => false,
}
}
fn parse_and_count(code: &str, lang: Language, kind: SymbolKind) -> usize {
let mut parser = Parser::new();
match parser.parse(code, lang) {
Ok(symbols) => symbols.iter().filter(|s| s.kind == kind).count(),
Err(_) => 0,
}
}
#[test]
fn test_c_function() {
let code = r#"
void hello() {
printf("Hello");
}
int add(int a, int b) {
return a + b;
}
static void private_func() {}
"#;
assert!(parse_and_find(code, Language::C, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::C, "add", SymbolKind::Function));
assert!(parse_and_find(code, Language::C, "private_func", SymbolKind::Function));
}
#[test]
fn test_c_struct() {
let code = r#"
struct Point {
int x;
int y;
};
struct Rectangle {
struct Point top_left;
struct Point bottom_right;
};
"#;
assert!(parse_and_find(code, Language::C, "Point", SymbolKind::Struct));
assert!(parse_and_find(code, Language::C, "Rectangle", SymbolKind::Struct));
}
#[test]
fn test_c_enum() {
let code = r#"
enum Color {
RED,
GREEN,
BLUE
};
enum Status {
OK = 0,
ERROR = 1
};
"#;
assert!(parse_and_find(code, Language::C, "Color", SymbolKind::Enum));
assert!(parse_and_find(code, Language::C, "Status", SymbolKind::Enum));
}
#[test]
fn test_c_includes() {
let code = r#"
#include <stdio.h>
#include <stdlib.h>
#include "myheader.h"
int main() { return 0; }
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::C).unwrap();
let imports: Vec<_> = symbols
.iter()
.filter(|s| s.kind == SymbolKind::Import)
.collect();
assert!(!imports.is_empty(), "Should detect #include as imports");
}
#[test]
fn test_cpp_function() {
let code = r#"
void hello() {
std::cout << "Hello" << std::endl;
}
template<typename T>
T add(T a, T b) {
return a + b;
}
"#;
assert!(parse_and_find(code, Language::Cpp, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Cpp, "add", SymbolKind::Function));
}
#[test]
fn test_cpp_class() {
let code = r#"
class Animal {
public:
virtual void speak() = 0;
};
class Dog : public Animal {
public:
void speak() override {
std::cout << "Woof!" << std::endl;
}
private:
std::string name;
};
"#;
assert!(parse_and_find(code, Language::Cpp, "Animal", SymbolKind::Class));
assert!(parse_and_find(code, Language::Cpp, "Dog", SymbolKind::Class));
}
#[test]
fn test_cpp_struct() {
let code = r#"
struct Vector3 {
float x, y, z;
float magnitude() const {
return sqrt(x*x + y*y + z*z);
}
};
"#;
assert!(parse_and_find(code, Language::Cpp, "Vector3", SymbolKind::Struct));
}
#[test]
fn test_csharp_class() {
let code = r#"
public class UserService {
private readonly IRepository _repo;
public UserService(IRepository repo) {
_repo = repo;
}
public User GetUser(int id) {
return _repo.Find(id);
}
}
"#;
assert!(parse_and_find(code, Language::CSharp, "UserService", SymbolKind::Class));
}
#[test]
fn test_csharp_interface() {
let code = r#"
public interface IRepository<T> {
T Find(int id);
void Save(T entity);
void Delete(int id);
}
interface IDisposable {
void Dispose();
}
"#;
assert!(parse_and_find(code, Language::CSharp, "IRepository", SymbolKind::Interface));
assert!(parse_and_find(code, Language::CSharp, "IDisposable", SymbolKind::Interface));
}
#[test]
fn test_csharp_struct() {
let code = r#"
public struct Point {
public int X { get; set; }
public int Y { get; set; }
}
"#;
assert!(parse_and_find(code, Language::CSharp, "Point", SymbolKind::Struct));
}
#[test]
fn test_csharp_enum() {
let code = r#"
public enum Status {
Active,
Inactive,
Pending
}
"#;
assert!(parse_and_find(code, Language::CSharp, "Status", SymbolKind::Enum));
}
#[test]
fn test_csharp_method() {
let code = r#"
public class Calculator {
public int Add(int a, int b) {
return a + b;
}
private int Multiply(int a, int b) {
return a * b;
}
}
"#;
assert!(parse_and_count(code, Language::CSharp, SymbolKind::Method) >= 1);
}
#[test]
fn test_ruby_method() {
let code = r#"
def hello
puts "Hello"
end
def add(a, b)
a + b
end
def self.class_method
"class method"
end
"#;
assert!(parse_and_find(code, Language::Ruby, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Ruby, "add", SymbolKind::Function));
}
#[test]
fn test_ruby_class() {
let code = r#"
class Animal
def initialize(name)
@name = name
end
def speak
raise NotImplementedError
end
end
class Dog < Animal
def speak
"Woof!"
end
end
"#;
assert!(parse_and_find(code, Language::Ruby, "Animal", SymbolKind::Class));
assert!(parse_and_find(code, Language::Ruby, "Dog", SymbolKind::Class));
}
#[test]
fn test_ruby_module() {
let code = r#"
module Helpers
def self.format(text)
text.strip.downcase
end
end
"#;
assert!(parse_and_find(code, Language::Ruby, "Helpers", SymbolKind::Class));
}
#[test]
fn test_bash_function() {
let code = r#"
#!/bin/bash
hello() {
echo "Hello, World!"
}
function greet {
echo "Greetings, $1!"
}
add() {
echo $(($1 + $2))
}
"#;
assert!(parse_and_find(code, Language::Bash, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Bash, "add", SymbolKind::Function));
}
#[test]
fn test_php_function() {
let code = r#"<?php
function hello() {
echo "Hello";
}
function add($a, $b) {
return $a + $b;
}
"#;
assert!(parse_and_find(code, Language::Php, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Php, "add", SymbolKind::Function));
}
#[test]
fn test_php_class() {
let code = r#"<?php
class UserService {
private $repository;
public function __construct($repo) {
$this->repository = $repo;
}
public function getUser($id) {
return $this->repository->find($id);
}
}
"#;
assert!(parse_and_find(code, Language::Php, "UserService", SymbolKind::Class));
}
#[test]
fn test_php_interface() {
let code = r#"<?php
interface Repository {
public function find($id);
public function save($entity);
}
"#;
assert!(parse_and_find(code, Language::Php, "Repository", SymbolKind::Interface));
}
#[test]
fn test_php_trait() {
let code = r#"<?php
trait Loggable {
public function log($message) {
echo $message;
}
}
"#;
assert!(parse_and_find(code, Language::Php, "Loggable", SymbolKind::Trait));
}
#[test]
fn test_kotlin_function() {
let code = r#"
fun hello() {
println("Hello")
}
fun add(a: Int, b: Int): Int {
return a + b
}
suspend fun fetchData(): String {
return "data"
}
"#;
assert!(parse_and_find(code, Language::Kotlin, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Kotlin, "add", SymbolKind::Function));
}
#[test]
fn test_kotlin_class() {
let code = r#"
class User(val name: String, val age: Int)
data class Point(val x: Int, val y: Int)
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
}
"#;
assert!(parse_and_find(code, Language::Kotlin, "User", SymbolKind::Class));
assert!(parse_and_find(code, Language::Kotlin, "Point", SymbolKind::Class));
}
#[test]
fn test_kotlin_object() {
let code = r#"
object Singleton {
fun doSomething() {
println("Singleton")
}
}
"#;
assert!(parse_and_find(code, Language::Kotlin, "Singleton", SymbolKind::Class));
}
#[test]
fn test_kotlin_interface() {
let code = r#"
interface Repository<T> {
fun find(id: Int): T?
fun save(entity: T)
}
"#;
assert!(parse_and_find(code, Language::Kotlin, "Repository", SymbolKind::Interface));
}
#[test]
fn test_swift_function() {
let code = r#"
func hello() {
print("Hello")
}
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
async func fetchData() -> String {
return "data"
}
"#;
assert!(parse_and_find(code, Language::Swift, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Swift, "add", SymbolKind::Function));
}
#[test]
fn test_swift_class() {
let code = r#"
class Animal {
var name: String
init(name: String) {
self.name = name
}
func speak() {
fatalError("Must override")
}
}
class Dog: Animal {
override func speak() {
print("Woof!")
}
}
"#;
assert!(parse_and_find(code, Language::Swift, "Animal", SymbolKind::Class));
assert!(parse_and_find(code, Language::Swift, "Dog", SymbolKind::Class));
}
#[test]
fn test_swift_struct() {
let code = r#"
struct Point {
var x: Double
var y: Double
func distance(to other: Point) -> Double {
let dx = x - other.x
let dy = y - other.y
return sqrt(dx*dx + dy*dy)
}
}
"#;
assert!(parse_and_find(code, Language::Swift, "Point", SymbolKind::Struct));
}
#[test]
fn test_swift_protocol() {
let code = r#"
protocol Drawable {
func draw()
var color: String { get }
}
"#;
assert!(parse_and_find(code, Language::Swift, "Drawable", SymbolKind::Interface));
}
#[test]
fn test_swift_enum() {
let code = r#"
enum Direction {
case north
case south
case east
case west
}
enum Result<T> {
case success(T)
case failure(Error)
}
"#;
assert!(parse_and_find(code, Language::Swift, "Direction", SymbolKind::Enum));
}
#[test]
fn test_scala_function() {
let code = r#"
def hello(): Unit = {
println("Hello")
}
def add(a: Int, b: Int): Int = a + b
def factorial(n: Int): Int = if (n <= 1) 1 else n * factorial(n - 1)
"#;
assert!(parse_and_find(code, Language::Scala, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Scala, "add", SymbolKind::Function));
}
#[test]
fn test_scala_class() {
let code = r#"
class User(val name: String, val age: Int)
case class Point(x: Int, y: Int)
abstract class Animal {
def speak(): String
}
"#;
assert!(parse_and_find(code, Language::Scala, "User", SymbolKind::Class));
assert!(parse_and_find(code, Language::Scala, "Point", SymbolKind::Class));
}
#[test]
fn test_scala_object() {
let code = r#"
object Singleton {
def doSomething(): Unit = {
println("Singleton")
}
}
"#;
assert!(parse_and_find(code, Language::Scala, "Singleton", SymbolKind::Class));
}
#[test]
fn test_scala_trait() {
let code = r#"
trait Drawable {
def draw(): Unit
def color: String
}
"#;
assert!(parse_and_find(code, Language::Scala, "Drawable", SymbolKind::Trait));
}
#[test]
fn test_haskell_function() {
let code = r#"
hello :: IO ()
hello = putStrLn "Hello"
add :: Int -> Int -> Int
add a b = a + b
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
"#;
assert!(parse_and_find(code, Language::Haskell, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Haskell, "add", SymbolKind::Function));
}
#[test]
fn test_haskell_data_type() {
let code = r#"
data Color = Red | Green | Blue
data Maybe a = Nothing | Just a
newtype UserId = UserId Int
"#;
assert!(parse_and_find(code, Language::Haskell, "Color", SymbolKind::Enum));
assert!(parse_and_find(code, Language::Haskell, "UserId", SymbolKind::Struct));
}
#[test]
fn test_elixir_function() {
let code = r#"
defmodule Math do
def add(a, b) do
a + b
end
defp private_helper(x) do
x * 2
end
end
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::Elixir);
assert!(result.is_ok(), "Elixir should parse");
}
#[test]
fn test_elixir_module() {
let code = r#"
defmodule MyApp.User do
defstruct [:name, :email, :age]
def new(name, email) do
%__MODULE__{name: name, email: email, age: 0}
end
end
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::Elixir);
assert!(result.is_ok(), "Elixir modules should parse");
}
#[test]
fn test_clojure_function() {
let code = r#"
(defn hello []
(println "Hello"))
(defn add [a b]
(+ a b))
(defn- private-fn [x]
(* x 2))
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::Clojure);
assert!(result.is_ok(), "Clojure should parse");
}
#[test]
fn test_clojure_defrecord() {
let code = r#"
(defrecord User [name email age])
(defprotocol Drawable
(draw [this])
(color [this]))
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::Clojure);
assert!(result.is_ok(), "Clojure records should parse");
}
#[test]
fn test_ocaml_function() {
let code = r#"
let hello () =
print_endline "Hello"
let add a b = a + b
let rec factorial n =
if n <= 1 then 1
else n * factorial (n - 1)
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::OCaml);
assert!(result.is_ok(), "OCaml should parse");
}
#[test]
fn test_ocaml_type() {
let code = r#"
type color = Red | Green | Blue
type 'a option = None | Some of 'a
type point = { x: float; y: float }
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::OCaml);
assert!(result.is_ok(), "OCaml types should parse");
}
#[test]
fn test_ocaml_module() {
let code = r#"
module Math = struct
let pi = 3.14159
let add a b = a + b
end
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::OCaml);
assert!(result.is_ok(), "OCaml modules should parse");
}
#[test]
fn test_lua_function() {
let code = r#"
function hello()
print("Hello")
end
function add(a, b)
return a + b
end
local function private_fn(x)
return x * 2
end
"#;
assert!(parse_and_find(code, Language::Lua, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::Lua, "add", SymbolKind::Function));
}
#[test]
fn test_lua_method() {
let code = r#"
function MyClass:new(name)
local obj = {name = name}
setmetatable(obj, self)
self.__index = self
return obj
end
function MyClass:greet()
print("Hello, " .. self.name)
end
"#;
assert!(parse_and_count(code, Language::Lua, SymbolKind::Method) >= 1);
}
#[test]
fn test_r_function() {
let code = r#"
hello <- function() {
print("Hello")
}
add <- function(a, b) {
a + b
}
factorial = function(n) {
if (n <= 1) 1 else n * factorial(n - 1)
}
"#;
assert!(parse_and_find(code, Language::R, "hello", SymbolKind::Function));
assert!(parse_and_find(code, Language::R, "add", SymbolKind::Function));
}
#[test]
fn test_fsharp_unsupported() {
let code = r#"
let hello () =
printfn "Hello"
let add a b = a + b
"#;
let mut parser = Parser::new();
let result = parser.parse(code, Language::FSharp);
assert!(result.is_err(), "F# should return error (not supported)");
if let Err(ParserError::UnsupportedLanguage(msg)) = result {
assert!(msg.contains("F#") || msg.contains("not") || msg.contains("supported"));
}
}
#[test]
fn test_function_extraction_consistency() {
let test_cases = vec![
(Language::Python, "def foo(): pass", "foo"),
(Language::JavaScript, "function foo() {}", "foo"),
(Language::TypeScript, "function foo(): void {}", "foo"),
(Language::Rust, "fn foo() {}", "foo"),
(Language::Go, "func foo() {}", "foo"),
(Language::C, "void foo() {}", "foo"),
(Language::Cpp, "void foo() {}", "foo"),
(Language::Ruby, "def foo; end", "foo"),
(Language::Php, "<?php function foo() {}", "foo"),
(Language::Kotlin, "fun foo() {}", "foo"),
(Language::Swift, "func foo() {}", "foo"),
(Language::Scala, "def foo = {}", "foo"),
(Language::Haskell, "foo x = x", "foo"),
(Language::Lua, "function foo() end", "foo"),
(Language::R, "foo <- function() {}", "foo"),
];
for (lang, code, expected_name) in test_cases {
let mut parser = Parser::new();
let result = parser.parse(code, lang);
assert!(result.is_ok(), "{:?} should parse without error", lang);
let symbols = result.unwrap();
let has_func = symbols.iter().any(|s| {
s.name == expected_name && matches!(s.kind, SymbolKind::Function | SymbolKind::Method)
});
if !has_func {}
}
}
#[test]
fn test_class_extraction_consistency() {
let test_cases = vec![
(Language::Python, "class Foo:\n pass", "Foo"),
(Language::JavaScript, "class Foo {}", "Foo"),
(Language::TypeScript, "class Foo {}", "Foo"),
(Language::Java, "class Foo {}", "Foo"),
(Language::CSharp, "class Foo {}", "Foo"),
(Language::Cpp, "class Foo {};", "Foo"),
(Language::Ruby, "class Foo; end", "Foo"),
(Language::Php, "<?php class Foo {}", "Foo"),
(Language::Kotlin, "class Foo {}", "Foo"),
(Language::Swift, "class Foo {}", "Foo"),
(Language::Scala, "class Foo", "Foo"),
];
for (lang, code, expected_name) in test_cases {
let found = parse_and_find(code, lang, expected_name, SymbolKind::Class);
assert!(found, "{:?} should find class '{}'", lang, expected_name);
}
}
#[test]
fn test_malformed_python() {
let code = "def foo(:\n pass"; let mut parser = Parser::new();
let result = parser.parse(code, Language::Python);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_malformed_javascript() {
let code = "function foo( { return 42; }"; let mut parser = Parser::new();
let result = parser.parse(code, Language::JavaScript);
assert!(result.is_ok() || result.is_err());
}
#[test]
fn test_empty_source_all_languages() {
let languages = vec![
Language::Python,
Language::JavaScript,
Language::TypeScript,
Language::Rust,
Language::Go,
Language::Java,
Language::C,
Language::Cpp,
Language::CSharp,
Language::Ruby,
Language::Bash,
Language::Php,
Language::Kotlin,
Language::Swift,
Language::Scala,
Language::Haskell,
Language::Elixir,
Language::Clojure,
Language::OCaml,
Language::Lua,
Language::R,
];
for lang in languages {
let mut parser = Parser::new();
let result = parser.parse("", lang);
assert!(result.is_ok(), "{:?} should handle empty string", lang);
let symbols = result.unwrap();
assert!(symbols.is_empty(), "{:?} empty source should yield no symbols", lang);
}
}
#[test]
fn test_whitespace_only_all_languages() {
let languages = vec![
Language::Python,
Language::JavaScript,
Language::TypeScript,
Language::Rust,
Language::Go,
Language::Java,
Language::C,
Language::Cpp,
Language::CSharp,
Language::Ruby,
Language::Bash,
Language::Php,
Language::Kotlin,
Language::Swift,
Language::Scala,
Language::Haskell,
Language::Elixir,
Language::Clojure,
Language::OCaml,
Language::Lua,
Language::R,
];
for lang in languages {
let mut parser = Parser::new();
let result = parser.parse(" \n\t\n ", lang);
assert!(result.is_ok(), "{:?} should handle whitespace", lang);
}
}
#[test]
fn test_rust_visibility() {
let code = r#"
pub fn public_fn() {}
fn private_fn() {}
pub(crate) fn crate_fn() {}
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Rust).unwrap();
let public_fn = symbols.iter().find(|s| s.name == "public_fn");
let private_fn = symbols.iter().find(|s| s.name == "private_fn");
if let Some(f) = public_fn {
assert_eq!(f.visibility, Visibility::Public);
}
if let Some(f) = private_fn {
assert_eq!(f.visibility, Visibility::Private);
}
}
#[test]
fn test_python_visibility_convention() {
let code = r#"
def public_func():
pass
def _protected_func():
pass
def __private_func():
pass
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Python).unwrap();
let public_fn = symbols.iter().find(|s| s.name == "public_func");
let protected_fn = symbols.iter().find(|s| s.name == "_protected_func");
let private_fn = symbols.iter().find(|s| s.name == "__private_func");
if let Some(f) = public_fn {
assert_eq!(f.visibility, Visibility::Public);
}
if let Some(f) = protected_fn {
assert_eq!(f.visibility, Visibility::Protected);
}
if let Some(f) = private_fn {
assert_eq!(f.visibility, Visibility::Private);
}
}
#[test]
fn test_python_signature_extraction() {
let code = r#"
def greet(name: str, age: int = 0) -> str:
return f"Hello {name}"
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Python).unwrap();
let func = symbols.iter().find(|s| s.name == "greet");
assert!(func.is_some());
if let Some(f) = func {
assert!(f.signature.is_some());
let sig = f.signature.as_ref().unwrap();
assert!(sig.contains("greet"));
}
}
#[test]
fn test_rust_signature_extraction() {
let code = r#"
fn process<T: Clone>(items: Vec<T>, filter: impl Fn(&T) -> bool) -> Vec<T> {
items.into_iter().filter(|x| filter(x)).collect()
}
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Rust).unwrap();
let func = symbols.iter().find(|s| s.name == "process");
assert!(func.is_some());
if let Some(f) = func {
assert!(f.signature.is_some());
}
}
#[test]
fn test_python_docstring_extraction() {
let code = r#"
def documented():
"""This is a docstring explaining the function."""
return 42
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Python).unwrap();
let func = symbols.iter().find(|s| s.name == "documented");
if let Some(f) = func {
if let Some(doc) = &f.docstring {
assert!(doc.contains("docstring") || doc.contains("explaining"));
}
}
}
#[test]
fn test_rust_doc_comment_extraction() {
let code = r#"
/// This is a doc comment for the function.
/// It can span multiple lines.
fn documented() -> i32 {
42
}
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Rust).unwrap();
let func = symbols.iter().find(|s| s.name == "documented");
if let Some(f) = func {
if let Some(doc) = &f.docstring {
assert!(doc.contains("doc comment") || doc.contains("function"));
}
}
}
#[test]
fn test_python_imports() {
let code = r#"
import os
import sys
from pathlib import Path
from typing import List, Dict, Optional
def main():
pass
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Python).unwrap();
let imports: Vec<_> = symbols
.iter()
.filter(|s| s.kind == SymbolKind::Import)
.collect();
assert!(imports.len() >= 2, "Should detect multiple Python imports");
}
#[test]
fn test_rust_use_statements() {
let code = r#"
use std::collections::HashMap;
use std::io::{Read, Write};
use crate::types::*;
fn main() {}
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Rust).unwrap();
let imports: Vec<_> = symbols
.iter()
.filter(|s| s.kind == SymbolKind::Import)
.collect();
assert!(!imports.is_empty(), "Should detect Rust use statements");
}
#[test]
fn test_javascript_imports() {
let code = r#"
import React from 'react';
import { useState, useEffect } from 'react';
import * as utils from './utils';
function App() {}
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::JavaScript).unwrap();
let imports: Vec<_> = symbols
.iter()
.filter(|s| s.kind == SymbolKind::Import)
.collect();
assert!(!imports.is_empty(), "Should detect JavaScript imports");
}
#[test]
fn test_python_call_extraction() {
let code = r#"
def process_data(data):
cleaned = clean_data(data)
validated = validate(cleaned)
result = transform(validated)
save_result(result)
return result
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Python).unwrap();
let func = symbols.iter().find(|s| s.name == "process_data");
assert!(func.is_some(), "Should find process_data function");
let _f = func.unwrap();
}
#[test]
fn test_rust_call_extraction() {
let code = r#"
fn process() {
let data = fetch_data();
let result = transform(data);
println!("Result: {:?}", result);
save(result);
}
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Rust).unwrap();
let func = symbols.iter().find(|s| s.name == "process");
assert!(func.is_some(), "Should find process function");
let _f = func.unwrap();
}
#[test]
fn test_line_numbers_accuracy() {
let code = r#"# Line 1
# Line 2
def first(): # Line 3
pass # Line 4
# Line 5
def second(): # Line 6
pass # Line 7
"#;
let mut parser = Parser::new();
let symbols = parser.parse(code, Language::Python).unwrap();
for symbol in &symbols {
if symbol.kind == SymbolKind::Function {
assert!(symbol.start_line > 0, "Start line should be positive");
assert!(symbol.end_line >= symbol.start_line, "End >= start");
}
}
let first = symbols.iter().find(|s| s.name == "first");
let second = symbols.iter().find(|s| s.name == "second");
if let (Some(f), Some(s)) = (first, second) {
assert!(s.start_line > f.start_line, "second() should be after first()");
}
}