@@ -2,7 +2,10 @@ package wikiindex_test
22
33import (
44 "context"
5+ "errors"
56 "fmt"
7+ "io/fs"
8+ "os"
69 "path/filepath"
710 "testing"
811
@@ -107,6 +110,79 @@ func TestBuilder_BuildsPackageFileSymbolTree(t *testing.T) {
107110 }
108111}
109112
113+ func TestBuilder_BuildTreeReturnsWikiTreeWithoutWritingIndex (t * testing.T ) {
114+ db := setupDB (t )
115+ tmpDir := t .TempDir ()
116+
117+ pkg := createNode (t , db , model.Node {QualifiedName : "github.com/example/project/internal/core" , Kind : model .NodeKindPackage , Name : "core" , FilePath : "internal/core" , StartLine : 1 , EndLine : 1 , Language : "go" })
118+ file := createNode (t , db , model.Node {QualifiedName : "internal/core/runtime.go" , Kind : model .NodeKindFile , Name : "internal/core/runtime.go" , FilePath : "internal/core/runtime.go" , StartLine : 1 , EndLine : 40 , Language : "go" })
119+ fn := createNode (t , db , model.Node {QualifiedName : "core.NewRuntime" , Kind : model .NodeKindFunction , Name : "NewRuntime" , FilePath : "internal/core/runtime.go" , StartLine : 10 , EndLine : 20 , Language : "go" })
120+ createTag (t , db , pkg .ID , model .TagIndex , "Core runtime package" )
121+ createTag (t , db , file .ID , model .TagIndex , "Runtime wiring" )
122+ createTag (t , db , fn .ID , model .TagIntent , "construct runtime" )
123+
124+ builder := & wikiindex.Builder {DB : db , OutDir : "docs" , IndexDir : filepath .Join (tmpDir , ".ccg" )}
125+ root , packages , files , err := builder .BuildTree (context .Background ())
126+ if err != nil {
127+ t .Fatalf ("BuildTree: %v" , err )
128+ }
129+ if packages != 1 || files != 1 {
130+ t .Fatalf ("counts = packages:%d files:%d, want 1/1" , packages , files )
131+ }
132+ if _ , err := os .Stat (filepath .Join (tmpDir , ".ccg" , "wiki-index.json" )); ! errors .Is (err , fs .ErrNotExist ) {
133+ t .Fatalf ("BuildTree wrote wiki-index.json or stat failed: %v" , err )
134+ }
135+ pkgNode := ragindex .FindNode (root , "package:internal/core" )
136+ if pkgNode == nil || pkgNode .Summary != "Core runtime package" {
137+ t .Fatalf ("package node = %#v" , pkgNode )
138+ }
139+ fileNode := ragindex .FindNode (root , "file:internal/core/runtime.go" )
140+ if fileNode == nil || fileNode .DocPath != filepath .Join ("docs" , "internal/core/runtime.go.md" ) {
141+ t .Fatalf ("file node = %#v" , fileNode )
142+ }
143+ symNode := ragindex .FindNode (root , "symbol:core.NewRuntime" )
144+ if symNode == nil || symNode .Details == nil || symNode .Details .QualifiedName != "core.NewRuntime" {
145+ t .Fatalf ("symbol node = %#v" , symNode )
146+ }
147+ }
148+
149+ func TestBuilder_BuildTreeScopesAnnotationsAndOrdersTags (t * testing.T ) {
150+ db := setupDB (t )
151+ alphaNode := createNode (t , db , model.Node {Namespace : "alpha" , QualifiedName : "alpha.Build" , Kind : model .NodeKindFunction , Name : "Build" , FilePath : "internal/alpha/build.go" , StartLine : 1 , EndLine : 10 , Language : "go" })
152+ betaNode := createNode (t , db , model.Node {Namespace : "beta" , QualifiedName : "beta.Build" , Kind : model .NodeKindFunction , Name : "Build" , FilePath : "internal/beta/build.go" , StartLine : 1 , EndLine : 10 , Language : "go" })
153+ createAnnotation (t , db , alphaNode .ID ,
154+ model.DocTag {Kind : model .TagSee , Value : "ccg://alpha/internal/alpha/build.go#Build" , Ordinal : 2 },
155+ model.DocTag {Kind : model .TagIntent , Value : "alpha build intent" , Ordinal : 0 },
156+ model.DocTag {Kind : model .TagDomainRule , Value : "alpha domain rule" , Ordinal : 1 },
157+ )
158+ createTag (t , db , betaNode .ID , model .TagIntent , "beta build intent" )
159+
160+ root , _ , _ , err := (& wikiindex.Builder {DB : db , OutDir : "docs" , Namespace : "alpha" }).BuildTree (context .Background ())
161+ if err != nil {
162+ t .Fatalf ("BuildTree: %v" , err )
163+ }
164+ if ragindex .FindNode (root , "symbol:beta.Build" ) != nil {
165+ t .Fatalf ("beta namespace node leaked into alpha tree: %#v" , root )
166+ }
167+ symNode := ragindex .FindNode (root , "symbol:alpha.Build" )
168+ if symNode == nil || symNode .Details == nil || symNode .Details .Annotation == nil {
169+ t .Fatalf ("missing alpha symbol annotation details: %#v" , symNode )
170+ }
171+ gotKinds := []model.TagKind {}
172+ for _ , tag := range symNode .Details .Annotation .Tags {
173+ gotKinds = append (gotKinds , tag .Kind )
174+ }
175+ wantKinds := []model.TagKind {model .TagIntent , model .TagDomainRule , model .TagSee }
176+ if len (gotKinds ) != len (wantKinds ) {
177+ t .Fatalf ("tag kinds = %#v, want %#v" , gotKinds , wantKinds )
178+ }
179+ for i := range wantKinds {
180+ if gotKinds [i ] != wantKinds [i ] {
181+ t .Fatalf ("tag kinds = %#v, want %#v" , gotKinds , wantKinds )
182+ }
183+ }
184+ }
185+
110186func TestBuilder_RespectsExclude (t * testing.T ) {
111187 db := setupDB (t )
112188 tmpDir := t .TempDir ()
0 commit comments