| // 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 specgen |
| |
| import ( |
| "testing" |
| ) |
| |
| func TestParseSpecDoc(t *testing.T) { |
| doc := `Add adds elements of |
| x and y. |
| |
| z[i] = x[i] + y[i] |
| ` |
| var root contextRoot |
| ctx := context{root: &root} |
| paras := parseSpecDoc(ctx, doc) |
| if err := root.gatherErrors(); err != nil { |
| t.Fatalf("unexpected error parsing spec doc: %v", err) |
| } |
| |
| expected := []struct { |
| kind ParagraphKind |
| text string |
| }{ |
| {SpecOwned, "Add adds elements of\nx and y."}, |
| {SpecOwned, "\tz[i] = x[i] + y[i]"}, |
| } |
| 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 := FormatComment(paras) |
| if err != nil { |
| t.Fatalf("unexpected error formatting comment: %v", err) |
| } |
| wantFormatted := `// Add adds elements of |
| // x and y. |
| // |
| // z[i] = x[i] + y[i] |
| ` |
| if formatted != wantFormatted { |
| t.Errorf("FormatComment mismatch:\ngot:\n%s\nwant:\n%s", formatted, wantFormatted) |
| } |
| } |
| |
| func TestParseSpecDocRejectsNotes(t *testing.T) { |
| doc := `Add adds elements. |
| |
| Asm: VPADDD` |
| |
| var root contextRoot |
| ctx := context{root: &root} |
| _ = parseSpecDoc(ctx, doc) |
| if err := root.gatherErrors(); err == nil { |
| t.Fatalf("expected error for doc containing implementation note, got nil") |
| } |
| } |
| |
| func TestFormatCommentOrdering(t *testing.T) { |
| tests := []struct { |
| name string |
| paras []Paragraph |
| wantErr bool |
| }{ |
| { |
| name: "valid order", |
| paras: []Paragraph{ |
| {Kind: SpecOwned, Text: "Spec\n"}, |
| {Kind: ImplementationNote, Text: "Asm: VFOO\n"}, |
| {Kind: DirectiveComment, Text: "go:noescape\n"}, |
| }, |
| wantErr: false, |
| }, |
| { |
| name: "spec owned after note", |
| paras: []Paragraph{ |
| {Kind: ImplementationNote, Text: "Asm: VFOO\n"}, |
| {Kind: SpecOwned, Text: "Spec\n"}, |
| }, |
| wantErr: true, |
| }, |
| { |
| name: "spec owned after directive", |
| paras: []Paragraph{ |
| {Kind: DirectiveComment, Text: "go:noescape\n"}, |
| {Kind: SpecOwned, Text: "Spec\n"}, |
| }, |
| wantErr: true, |
| }, |
| { |
| name: "note after directive", |
| paras: []Paragraph{ |
| {Kind: DirectiveComment, Text: "go:noescape\n"}, |
| {Kind: ImplementationNote, Text: "Asm: VFOO\n"}, |
| }, |
| wantErr: true, |
| }, |
| } |
| |
| for _, tc := range tests { |
| t.Run(tc.name, func(t *testing.T) { |
| _, err := FormatComment(tc.paras) |
| if (err != nil) != tc.wantErr { |
| t.Errorf("FormatComment() error = %v, wantErr %v", err, tc.wantErr) |
| } |
| }) |
| } |
| } |