blob: d15c913e66ab39d5e7b06bd46ac423a1a8174a5e [file]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package specdoc
import (
"go/ast"
"go/parser"
"go/token"
"simd/archsimd/_gen/specgen"
"testing"
)
func TestParseCommentAndFormat(t *testing.T) {
doc := `// Add adds elements of
// x and y.
//
// z[i] = x[i] + y[i]
//
// Asm: VPADDD, CPU Feature: AVX
//
// Deprecated: use Add2 instead.
//
//go:noescape
//go:noinline
`
src := "package p\n\n" + doc + "func Add()"
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "test.go", src, parser.ParseComments)
if err != nil {
t.Fatal(err)
}
fd := f.Decls[0].(*ast.FuncDecl)
paras := parseCommentGroup(fd.Doc)
expected := []struct {
kind specgen.ParagraphKind
text string
}{
{specgen.SpecOwned, "Add adds elements of\nx and y."},
{specgen.SpecOwned, "\tz[i] = x[i] + y[i]"},
{specgen.ImplementationNote, "Asm: VPADDD, CPU Feature: AVX"},
{specgen.ImplementationNote, "Deprecated: use Add2 instead."},
{specgen.DirectiveComment, "go:noescape"},
{specgen.DirectiveComment, "go:noinline"},
}
if len(paras) != len(expected) {
t.Fatalf("expected %d paragraphs, got %d", len(expected), len(paras))
}
for i, want := range expected {
if paras[i].Kind != want.kind {
t.Errorf("para %d: got kind %v, want %v", i, paras[i].Kind, want.kind)
}
if paras[i].Text != want.text {
t.Errorf("para %d: got text %q, want %q", i, paras[i].Text, want.text)
}
}
// Test FormatComment round-trip
formatted, err := specgen.FormatComment(paras)
if err != nil {
t.Fatalf("unexpected error formatting comment: %v", err)
}
if formatted != doc {
t.Errorf("FormatComment mismatch:\ngot:\n%s\nwant:\n%s", formatted, doc)
}
}