mirror of
https://github.com/DeusData/codebase-memory-mcp.git
synced 2026-10-27 06:53:11 +08:00
204 lines
3.9 KiB
Go
204 lines
3.9 KiB
Go
package parser
|
|
|
|
import (
|
|
"testing"
|
|
|
|
tree_sitter "github.com/tree-sitter/go-tree-sitter"
|
|
|
|
"github.com/DeusData/codebase-memory-mcp/internal/lang"
|
|
)
|
|
|
|
func TestParseGo(t *testing.T) {
|
|
source := []byte(`package main
|
|
|
|
func Hello() string {
|
|
return "hello"
|
|
}
|
|
|
|
func Add(a, b int) int {
|
|
return a + b
|
|
}
|
|
`)
|
|
tree, err := Parse(lang.Go, source)
|
|
if err != nil {
|
|
t.Fatalf("Parse Go: %v", err)
|
|
}
|
|
defer tree.Close()
|
|
|
|
root := tree.RootNode()
|
|
if root == nil {
|
|
t.Fatal("root node is nil")
|
|
}
|
|
|
|
var funcCount int
|
|
Walk(root, func(n *tree_sitter.Node) bool {
|
|
if n.Kind() == "function_declaration" {
|
|
funcCount++
|
|
}
|
|
return true
|
|
})
|
|
if funcCount != 2 {
|
|
t.Errorf("expected 2 function_declarations, got %d", funcCount)
|
|
}
|
|
}
|
|
|
|
func TestParsePython(t *testing.T) {
|
|
source := []byte(`def greet(name):
|
|
return f"Hello, {name}"
|
|
|
|
class MyClass:
|
|
def method(self):
|
|
pass
|
|
`)
|
|
tree, err := Parse(lang.Python, source)
|
|
if err != nil {
|
|
t.Fatalf("Parse Python: %v", err)
|
|
}
|
|
defer tree.Close()
|
|
|
|
root := tree.RootNode()
|
|
var funcCount, classCount int
|
|
Walk(root, func(n *tree_sitter.Node) bool {
|
|
switch n.Kind() {
|
|
case "function_definition":
|
|
funcCount++
|
|
case "class_definition":
|
|
classCount++
|
|
}
|
|
return true
|
|
})
|
|
if funcCount != 2 {
|
|
t.Errorf("expected 2 function_definitions, got %d", funcCount)
|
|
}
|
|
if classCount != 1 {
|
|
t.Errorf("expected 1 class_definition, got %d", classCount)
|
|
}
|
|
}
|
|
|
|
func TestParseKotlin(t *testing.T) {
|
|
source := []byte(`fun greet(name: String): String {
|
|
return "Hello, $name"
|
|
}
|
|
|
|
class MyService {
|
|
fun process(): Unit {}
|
|
}
|
|
|
|
object Singleton {
|
|
fun instance(): Singleton = this
|
|
}
|
|
`)
|
|
tree, err := Parse(lang.Kotlin, source)
|
|
if err != nil {
|
|
t.Fatalf("Parse Kotlin: %v", err)
|
|
}
|
|
defer tree.Close()
|
|
|
|
root := tree.RootNode()
|
|
var funcCount, classCount, objectCount int
|
|
Walk(root, func(n *tree_sitter.Node) bool {
|
|
switch n.Kind() {
|
|
case "function_declaration":
|
|
funcCount++
|
|
case "class_declaration":
|
|
classCount++
|
|
case "object_declaration":
|
|
objectCount++
|
|
}
|
|
return true
|
|
})
|
|
if funcCount != 3 {
|
|
t.Errorf("expected 3 function_declarations, got %d", funcCount)
|
|
}
|
|
if classCount != 1 {
|
|
t.Errorf("expected 1 class_declaration, got %d", classCount)
|
|
}
|
|
if objectCount != 1 {
|
|
t.Errorf("expected 1 object_declaration, got %d", objectCount)
|
|
}
|
|
}
|
|
|
|
func TestAllLanguagesLoad(t *testing.T) {
|
|
for _, l := range lang.AllLanguages() {
|
|
_, err := GetLanguage(l)
|
|
if err != nil {
|
|
t.Errorf("GetLanguage(%s): %v", l, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestParseCSharp(t *testing.T) {
|
|
source := []byte(`using System;
|
|
|
|
namespace MyApp {
|
|
public class Greeter {
|
|
public string Greet(string name) {
|
|
return $"Hello, {name}";
|
|
}
|
|
|
|
private void Helper() {}
|
|
}
|
|
|
|
public enum Color { Red, Green, Blue }
|
|
}
|
|
`)
|
|
tree, err := Parse(lang.CSharp, source)
|
|
if err != nil {
|
|
t.Fatalf("Parse C#: %v", err)
|
|
}
|
|
defer tree.Close()
|
|
|
|
root := tree.RootNode()
|
|
if root == nil {
|
|
t.Fatal("root node is nil")
|
|
}
|
|
|
|
var classCount, methodCount int
|
|
Walk(root, func(n *tree_sitter.Node) bool {
|
|
switch n.Kind() {
|
|
case "class_declaration":
|
|
classCount++
|
|
case "method_declaration":
|
|
methodCount++
|
|
}
|
|
return true
|
|
})
|
|
if classCount != 1 {
|
|
t.Errorf("expected 1 class_declaration, got %d", classCount)
|
|
}
|
|
if methodCount != 2 {
|
|
t.Errorf("expected 2 method_declarations, got %d", methodCount)
|
|
}
|
|
}
|
|
|
|
func TestNodeText(t *testing.T) {
|
|
source := []byte(`package main
|
|
|
|
func Hello() string {
|
|
return "hello"
|
|
}
|
|
`)
|
|
tree, err := Parse(lang.Go, source)
|
|
if err != nil {
|
|
t.Fatalf("Parse: %v", err)
|
|
}
|
|
defer tree.Close()
|
|
|
|
root := tree.RootNode()
|
|
Walk(root, func(n *tree_sitter.Node) bool {
|
|
if n.Kind() == "function_declaration" {
|
|
nameNode := n.ChildByFieldName("name")
|
|
if nameNode == nil {
|
|
t.Error("function has no name node")
|
|
return false
|
|
}
|
|
name := NodeText(nameNode, source)
|
|
if name != "Hello" {
|
|
t.Errorf("expected Hello, got %s", name)
|
|
}
|
|
return false
|
|
}
|
|
return true
|
|
})
|
|
}
|