a06f331eb8
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
install-script / powershell-syntax (push) Has been cancelled
install-script / install (macos-14) (push) Has been cancelled
install-script / install (ubuntu-latest) (push) Has been cancelled
112 lines
2.7 KiB
Go
112 lines
2.7 KiB
Go
package languages
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/zzet/gortex/internal/graph"
|
|
)
|
|
|
|
func TestGoConstants_PlainConstEmitsKindConstant(t *testing.T) {
|
|
src := `package foo
|
|
|
|
const Pi = 3.14
|
|
const Greeting string = "hello"
|
|
`
|
|
fix := runGoExtract(t, src)
|
|
|
|
consts := fix.nodesByKind[graph.KindConstant]
|
|
if len(consts) != 2 {
|
|
t.Fatalf("expected 2 KindConstant, got %d: %+v", len(consts), consts)
|
|
}
|
|
got := map[string]bool{}
|
|
for _, c := range consts {
|
|
got[c.Name] = true
|
|
}
|
|
if !got["Pi"] || !got["Greeting"] {
|
|
t.Errorf("missing constants: %v", got)
|
|
}
|
|
|
|
// No const should leak as KindVariable now.
|
|
for _, v := range fix.nodesByKind[graph.KindVariable] {
|
|
if v.Name == "Pi" || v.Name == "Greeting" {
|
|
t.Errorf("const %q surfaced as KindVariable", v.Name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGoConstants_IotaBlockEmitsEnumMembers(t *testing.T) {
|
|
src := `package foo
|
|
|
|
type Color int
|
|
|
|
const (
|
|
Red Color = iota
|
|
Green
|
|
Blue
|
|
)
|
|
`
|
|
fix := runGoExtract(t, src)
|
|
|
|
enums := fix.nodesByKind[graph.KindEnumMember]
|
|
if len(enums) != 3 {
|
|
t.Fatalf("expected 3 KindEnumMember, got %d: %+v", len(enums), enums)
|
|
}
|
|
got := map[string]bool{}
|
|
for _, e := range enums {
|
|
got[e.Name] = true
|
|
}
|
|
if !got["Red"] || !got["Green"] || !got["Blue"] {
|
|
t.Errorf("missing enum members: %v", got)
|
|
}
|
|
|
|
// None of the iota members should leak as KindConstant or
|
|
// KindVariable.
|
|
for _, c := range fix.nodesByKind[graph.KindConstant] {
|
|
if c.Name == "Red" || c.Name == "Green" || c.Name == "Blue" {
|
|
t.Errorf("iota member %q surfaced as KindConstant", c.Name)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGoConstants_IotaWordBoundary(t *testing.T) {
|
|
// `iota` appears as a substring of an unrelated identifier — must
|
|
// NOT trigger enum classification.
|
|
src := `package foo
|
|
|
|
const Notiota = "no enum here"
|
|
`
|
|
fix := runGoExtract(t, src)
|
|
|
|
if len(fix.nodesByKind[graph.KindEnumMember]) != 0 {
|
|
t.Errorf("expected no enum members, got %+v", fix.nodesByKind[graph.KindEnumMember])
|
|
}
|
|
if len(fix.nodesByKind[graph.KindConstant]) != 1 {
|
|
t.Errorf("expected 1 KindConstant, got %d", len(fix.nodesByKind[graph.KindConstant]))
|
|
}
|
|
}
|
|
|
|
func TestGoConstants_BlankIdentifierSkipped(t *testing.T) {
|
|
src := `package foo
|
|
|
|
const _ = "skipped"
|
|
`
|
|
fix := runGoExtract(t, src)
|
|
if len(fix.nodesByKind[graph.KindConstant])+len(fix.nodesByKind[graph.KindEnumMember]) != 0 {
|
|
t.Errorf("blank identifier should not produce a const/enum node")
|
|
}
|
|
}
|
|
|
|
func TestGoConstants_VarStaysAsVariable(t *testing.T) {
|
|
src := `package foo
|
|
|
|
var Counter int
|
|
`
|
|
fix := runGoExtract(t, src)
|
|
if len(fix.nodesByKind[graph.KindVariable]) != 1 {
|
|
t.Fatalf("expected 1 KindVariable for var decl, got %d", len(fix.nodesByKind[graph.KindVariable]))
|
|
}
|
|
if len(fix.nodesByKind[graph.KindConstant]) != 0 {
|
|
t.Errorf("var should not produce KindConstant")
|
|
}
|
|
}
|