Source file src/simd/archsimd/_gen/gentools/gentools_test.go

     1  // Copyright 2026 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package gentools
     6  
     7  import (
     8  	"bytes"
     9  	"os"
    10  	"path/filepath"
    11  	"strings"
    12  	"testing"
    13  )
    14  
    15  func TestGoFileFormatting(t *testing.T) {
    16  	t.Parallel()
    17  
    18  	var outBuf bytes.Buffer
    19  	var files Files
    20  	files.Options = &Options{
    21  		Txtar:  true,
    22  		Output: &outBuf,
    23  	}
    24  
    25  	buf := files.NewGoFile("test.go")
    26  	buf.WriteString("package test\nfunc Foo() int { return 42 }\n")
    27  
    28  	err := files.Flush()
    29  	if err != nil {
    30  		t.Fatalf("Flush failed: %v", err)
    31  	}
    32  
    33  	outStr := outBuf.String()
    34  	expected := "-- src/test.go --\npackage test\n\nfunc Foo() int { return 42 }\n"
    35  	if outStr != expected {
    36  		t.Errorf("got txtar output:\n%q\nwant:\n%q", outStr, expected)
    37  	}
    38  }
    39  
    40  func TestFormattingError(t *testing.T) {
    41  	t.Parallel()
    42  
    43  	var errBuf bytes.Buffer
    44  	var files Files
    45  	files.Options = &Options{
    46  		ErrOutput: &errBuf,
    47  	}
    48  
    49  	buf := files.NewGoFile("bad.go")
    50  	buf.WriteString("package test\n\tfunc Foo( {\n") // invalid syntax with tab indentation
    51  
    52  	err := files.Flush()
    53  	if err == nil {
    54  		t.Fatalf("expected formatting error, got nil")
    55  	}
    56  	if !strings.Contains(err.Error(), "error formatting bad.go") {
    57  		t.Errorf("unexpected error message: %v", err)
    58  	}
    59  
    60  	const expectedErrOutput = "package test\n\tfunc Foo( {\n\t          ^\n2:12: expected ')', found '{'\n"
    61  	if errBuf.String() != expectedErrOutput {
    62  		t.Errorf("got error output:\n%q\nwant:\n%q", errBuf.String(), expectedErrOutput)
    63  	}
    64  }
    65  
    66  func TestWriteMode(t *testing.T) {
    67  	t.Parallel()
    68  
    69  	tmpDir := t.TempDir()
    70  	var files Files
    71  	files.Options = &Options{
    72  		GOROOT: tmpDir,
    73  		Write:  true,
    74  	}
    75  
    76  	gobuf := files.NewGoFile("pkg/a.go")
    77  	gobuf.WriteString("package pkg\nconst X = 1\n")
    78  
    79  	const expectedRawContent = "raw content\n"
    80  	rawbuf := files.NewRawFile("pkg/a.txt")
    81  	rawbuf.WriteString(expectedRawContent)
    82  
    83  	if err := files.Flush(); err != nil {
    84  		t.Fatalf("Flush failed: %v", err)
    85  	}
    86  
    87  	aGo, err := os.ReadFile(filepath.Join(tmpDir, "src", "pkg", "a.go"))
    88  	if err != nil {
    89  		t.Fatalf("reading a.go: %v", err)
    90  	}
    91  	if string(aGo) != "package pkg\n\nconst X = 1\n" {
    92  		t.Errorf("unexpected a.go content: %q", string(aGo))
    93  	}
    94  
    95  	aTxt, err := os.ReadFile(filepath.Join(tmpDir, "src", "pkg", "a.txt"))
    96  	if err != nil {
    97  		t.Fatalf("reading a.txt: %v", err)
    98  	}
    99  	if string(aTxt) != expectedRawContent {
   100  		t.Errorf("unexpected a.txt content: %q", string(aTxt))
   101  	}
   102  }
   103  
   104  func TestWriteAsideMode(t *testing.T) {
   105  	t.Parallel()
   106  
   107  	tmpDir := t.TempDir()
   108  	tmpDir2 := t.TempDir()
   109  	var files Files
   110  	files.Options = &Options{
   111  		GOROOT: tmpDir,
   112  		outDir: tmpDir2,
   113  		Write:  true,
   114  	}
   115  
   116  	gobuf := files.NewGoFile("pkg/a.go")
   117  	gobuf.WriteString("package pkg\nconst X = 1\n")
   118  
   119  	const expectedRawContent = "raw content\n"
   120  	rawbuf := files.NewRawFile("pkg/a.txt")
   121  	rawbuf.WriteString(expectedRawContent)
   122  
   123  	if err := files.Flush(); err != nil {
   124  		t.Fatalf("Flush failed: %v", err)
   125  	}
   126  
   127  	aGo, err := os.ReadFile(filepath.Join(tmpDir2, "src", "pkg", "a.go"))
   128  	if err != nil {
   129  		t.Fatalf("reading a.go: %v", err)
   130  	}
   131  	if string(aGo) != "package pkg\n\nconst X = 1\n" {
   132  		t.Errorf("unexpected a.go content: %q", string(aGo))
   133  	}
   134  
   135  	aTxt, err := os.ReadFile(filepath.Join(tmpDir2, "src", "pkg", "a.txt"))
   136  	if err != nil {
   137  		t.Fatalf("reading a.txt: %v", err)
   138  	}
   139  	if string(aTxt) != expectedRawContent {
   140  		t.Errorf("unexpected a.txt content: %q", string(aTxt))
   141  	}
   142  }
   143  
   144  func TestDiffMode(t *testing.T) {
   145  	t.Parallel()
   146  
   147  	tmpDir := t.TempDir()
   148  	targetFile := filepath.Join(tmpDir, "src", "pkg", "a.go")
   149  	os.MkdirAll(filepath.Dir(targetFile), 0755)
   150  	os.WriteFile(targetFile, []byte("package pkg\n\nconst X = 1\n"), 0644)
   151  
   152  	// Test matching content
   153  	var files1 Files
   154  	files1.Options = &Options{
   155  		GOROOT: tmpDir,
   156  		Diff:   true,
   157  	}
   158  	buf1 := files1.NewGoFile("pkg/a.go")
   159  	buf1.WriteString("package pkg\nconst X = 1\n")
   160  	if err := files1.Flush(); err != nil {
   161  		t.Errorf("expected no diff error, got: %v", err)
   162  	}
   163  
   164  	// Test non-matching content
   165  	var outBuf bytes.Buffer
   166  	var files2 Files
   167  	files2.Options = &Options{
   168  		GOROOT: tmpDir,
   169  		Diff:   true,
   170  		Output: &outBuf,
   171  	}
   172  	buf2 := files2.NewGoFile("pkg/a.go")
   173  	buf2.WriteString("package pkg\nconst X = 2\n")
   174  
   175  	err := files2.Flush()
   176  	if err == nil {
   177  		t.Errorf("expected diff error, got nil")
   178  	}
   179  
   180  	if !strings.Contains(outBuf.String(), "-const X = 1") || !strings.Contains(outBuf.String(), "+const X = 2") {
   181  		t.Errorf("unexpected diff output:\n%s", outBuf.String())
   182  	}
   183  }
   184  

View as plain text